Flutter TikTok API访问插件flutter_tiktoken的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

Flutter TikTok API访问插件flutter_tiktoken的使用

flutter_tiktoken介绍

flutter_tiktoken 是一个用于Flutter平台的离线包,提供了一个快速的BPE(Byte Pair Encoding)分词器,主要用于OpenAI模型。这个包是基于mvitlov/tiktoken的一个副本,并修复了在release模式下构建时花费过多时间的问题(超过一小时)。

以下是OpenAI官方计算和flutter_tiktoken计算结果的对比图:

Open Ai Official Calcuate flutter_tiktoken
Snip20230621_3 Simulator Screenshot - iPhone 14 - 2023-06-21 at 18 43 10

使用方法

初始化 flutter_tiktoken

在应用程序启动时,需要初始化flutter_tiktoken

void main() async {
  WidgetsFlutterBinding.ensureInitialized(); // 确保Flutter绑定已初始化
  await TiktokenDataProcessCenter().initata(); // 初始化flutter_tiktoken数据处理中心
  runApp(const MyApp()); // 启动应用程序
}
计算Token数量

通过调用 _calcuateTokens 方法来计算给定文本的Token数量。

static int _calcuateTokens(
      {required String text, String modelName = 'gpt-4'}) {
    final encoding = encodingForModel(modelName); // 获取指定模型的编码
    final numTokens = encoding.encode(text).length; // 编码文本并获取Token长度
    return numTokens; // 返回Token数量
}

完整示例Demo

以下是一个完整的Flutter应用程序示例,展示了如何使用flutter_tiktoken插件来计算输入文本的Token数量。

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_tiktoken/flutter_tiktoken.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized(); // 确保Flutter绑定已初始化
  await TiktokenDataProcessCenter().initata(); // 初始化flutter_tiktoken数据处理中心
  runApp(const MyApp()); // 启动应用程序
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue, // 主题颜色为蓝色
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'), // 设置首页
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  var textController = TextEditingController();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title), // 设置应用栏标题
      ),
      body: Padding(
        padding: const EdgeInsets.all(15),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          mainAxisAlignment: MainAxisAlignment.start,
          children: <Widget>[
            const Text('GPT-3 or GPT-4'), // 提示文本
            const SizedBox(height: 15), // 垂直间距
            SizedBox(
              width: double.infinity,
              height: 200,
              child: CupertinoTextField(
                style: const TextStyle(fontSize: 15), // 输入框样式
                textAlignVertical: TextAlignVertical.top,
                textAlign: TextAlign.start,
                placeholderStyle: const TextStyle(fontSize: 15, color: CupertinoColors.placeholderText),
                placeholder: 'Enter some things', // 输入提示
                maxLines: 20,
                controller: textController, // 控制器
                onSubmitted: (v) { // 输入提交事件
                  if (v.isEmpty) {
                    return;
                  }
                  setState(() {
                    _counter = _calcuateTokens(text: v); // 计算Token数量
                  });
                },
              ),
            ),
            const SizedBox(height: 15), // 垂直间距
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              crossAxisAlignment: CrossAxisAlignment.center,
              children: [
                Text('Tokens: $_counter', style: Theme.of(context).textTheme.headlineMedium), // 显示Token数量
                CupertinoButton(
                    child: const Text('Calcuate'), // 按钮文本
                    onPressed: () {
                      var v = textController.text; // 获取输入框内容
                      if (v.isEmpty) {
                        return;
                      }
                      setState(() {
                        _counter = _calcuateTokens(text: v); // 计算Token数量
                      });
                    })
              ],
            ),
          ],
        ),
      ),
    );
  }

  static int _calcuateTokens(
      {required String text, String modelName = 'gpt-4'}) {
    final encoding = encodingForModel(modelName); // 获取指定模型的编码
    final numTokens = encoding.encode(text).length; // 编码文本并获取Token长度
    return numTokens; // 返回Token数量
  }
}

更多关于Flutter TikTok API访问插件flutter_tiktoken的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter TikTok API访问插件flutter_tiktoken的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用 flutter_tiktoken 插件来访问 TikTok API 的代码示例。请注意,这个示例假设你已经有一个有效的 TikTok 开发者账号,并且已经创建了应用,获取了必要的 API 凭证(如 API Key 和 Client Secret)。

首先,确保在你的 pubspec.yaml 文件中添加 flutter_tiktoken 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_tiktoken: ^最新版本号  # 请替换为实际的最新版本号

然后运行 flutter pub get 来安装依赖。

接下来,在你的 Flutter 项目中,你可以按照以下步骤使用 flutter_tiktoken 插件来访问 TikTok API。

import 'package:flutter/material.dart';
import 'package:flutter_tiktoken/flutter_tiktoken.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  TikTokClient? _tikTokClient;
  String? _responseData;

  @override
  void initState() {
    super.initState();
    _initializeTikTokClient();
  }

  Future<void> _initializeTikTokClient() async {
    // 替换为你的 TikTok API Key 和 Client Secret
    String apiKey = 'YOUR_API_KEY';
    String clientSecret = 'YOUR_CLIENT_SECRET';

    TikTokCredentials credentials = TikTokCredentials(apiKey: apiKey, clientSecret: clientSecret);
    _tikTokClient = TikTokClient(credentials: credentials);

    // 获取用户趋势标签示例(需要用户授权访问更多数据)
    try {
      TikTokTrendingTagsResponse? response = await _tikTokClient!.getTrendingTags();
      setState(() {
        _responseData = response?.data?.toString();
      });
    } catch (e) {
      print('Error fetching trending tags: $e');
      setState(() {
        _responseData = 'Error fetching data';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('TikTok API Access Example'),
        ),
        body: Center(
          child: _responseData == null
              ? CircularProgressIndicator()
              : Text(_responseData!),
        ),
      ),
    );
  }
}

class TikTokClient {
  final TikTokCredentials credentials;

  TikTokClient({required this.credentials});

  Future<TikTokTrendingTagsResponse?> getTrendingTags() async {
    // 这里假设 TikTok API 提供了获取趋势标签的端点,实际使用中需要参考 TikTok API 文档
    // 以下是一个假设的端点和请求方法,实际使用时需要替换为真实的 API 端点和参数
    String url = 'https://api.tiktok.com/trending/tags'; // 替换为真实的 API 端点
    Map<String, String> headers = {
      'Authorization': 'Bearer ${await credentials.getAccessToken()}', // 假设有获取 access token 的方法
      'Content-Type': 'application/json',
    };

    final response = await http.get(Uri.parse(url), headers: headers);

    if (response.statusCode == 200) {
      return TikTokTrendingTagsResponse.fromJson(jsonDecode(response.body));
    } else {
      throw Exception('Failed to fetch trending tags: ${response.statusCode}');
    }
  }
}

class TikTokCredentials {
  final String apiKey;
  final String clientSecret;

  TikTokCredentials({required this.apiKey, required this.clientSecret});

  // 这是一个假设的获取 access token 的方法,实际中需要根据 TikTok OAuth 流程来实现
  Future<String?> getAccessToken() async {
    // 这里应该实现 OAuth2 流程来获取 access token
    // 由于这是一个示例,我们直接返回一个模拟的 token
    return 'FAKE_ACCESS_TOKEN';
  }
}

// 假设的响应模型类,实际中需要根据 TikTok API 的响应结构来定义
class TikTokTrendingTagsResponse {
  dynamic data;

  TikTokTrendingTagsResponse({required this.data});

  factory TikTokTrendingTagsResponse.fromJson(Map<String, dynamic> json) {
    return TikTokTrendingTagsResponse(
      data: json['data'], // 替换为实际的字段名
    );
  }
}

注意

  1. API 端点和请求方法:上述代码中的 API 端点和请求方法是假设的,实际使用时需要参考 TikTok API 文档。
  2. OAuth 流程:获取 access token 的部分是一个假设的实现,实际中你需要根据 TikTok 的 OAuth2 流程来实现。
  3. 错误处理:在实际应用中,你需要添加更多的错误处理逻辑,比如处理网络错误、API 错误码等。
  4. 模型类TikTokTrendingTagsResponse 类是一个假设的响应模型类,你需要根据 TikTok API 的实际响应结构来定义。

希望这个示例能帮助你开始使用 flutter_tiktoken 插件来访问 TikTok API。如果有任何问题或需要进一步的帮助,请随时提问。

回到顶部