Flutter费用计算插件tokencost的使用

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

Flutter费用计算插件tokencost的使用

简介

tokencost 是一个用于客户端侧的Token计数和价格估算插件,适用于大型语言模型(LLM)应用程序和AI代理。它可以帮助你计算使用主要大型语言模型(LLM)API时的USD费用,通过估算提示(prompt)和完成(completion)的成本。

该插件源自Python的tokencost包,并进行了移植。你可以通过以下链接查看原始项目:AgentOps-AI/tokencost

功能特点

  • LLM价格跟踪:主要LLM提供商经常添加新模型并更新定价,tokencost帮助跟踪最新的价格变化。
  • Token计数:在发送OpenAI请求之前准确计数提示中的Token。
  • 易于集成:通过一个函数即可获取提示或完成的成本。

安装

在使用tokencost之前,必须确保你的机器上已安装Dart SDK。你可以通过以下命令安装tokencost

dart pub add tokencost

使用示例

1. 基本用法

以下是一个简单的示例,展示了如何使用tokencost计算提示和完成的成本:

import 'package:tokencost/tokencost.dart';

void main() async {
  // 获取TokenCost实例
  final tokenCost = await TokenCost.getInstance();

  // 定义模型和提示
  const model = 'gpt-3.5-turbo';
  final prompt = [
    {
      'role': 'user',
      'content': 'Hello world',
    },
  ];
  const completion = 'How may I assist you today?';

  // 计算提示和完成的成本
  final promptCost = tokenCost.calculatePromptCost(prompt, model);
  final completionCost = tokenCost.calculateCompletionCost(completion, model);

  // 打印总成本
  print('$promptCost + $completionCost = ${promptCost + completionCost}');
  // 输出示例: $0.0000135 + $0.0000140 = $0.0000275
}
2. 结合OpenAI API使用

如果你需要结合OpenAI API来获取完成内容并计算成本,可以参考以下示例:

import 'package:tokencost/tokencost.dart';
import 'package:dart_openai/dart_openai.dart';

void main() async {
  // 获取TokenCost实例
  final tokenCost = await TokenCost.getInstance();

  // 定义模型和提示
  const model = 'gpt-3.5-turbo';
  const prompt = [{'role': 'user', 'content': 'Say this is a test'}];

  // 调用OpenAI API获取完成内容
  OpenAICompletionModel chatCompletion = await OpenAI.instance.completion.create(
    model: model,
    messages: prompt,
  );

  // 获取完成内容
  final completion = chatCompletion.choices.first.message.content;

  // 计算提示和完成的成本
  final promptCost = tokenCost.calculatePromptCost(prompt, model);
  final completionCost = tokenCost.calculateCompletionCost(completion, model);

  // 打印总成本
  print('$promptCost + $completionCost = ${promptCost + completionCost}');
  // 输出示例: $0.00001800 + $0.00001000 = $0.00002800

  // 打印总成本(以美元为单位)
  print('Cost USD: ${(promptCost + completionCost)}');
  // 输出示例: Cost USD: $2.8e-05
}
3. 使用字符串提示

如果你有字符串形式的提示,可以直接使用calculatePromptCost函数进行成本计算:

import 'package:tokencost/tokencost.dart';

void main() async {
  // 获取TokenCost实例
  final tokenCost = await TokenCost.getInstance();

  // 定义提示和响应
  const promptString = 'Hello world';
  const response = 'How may I assist you today?';
  const model = 'gpt-3.5-turbo';

  // 计算提示的成本
  final promptCost = tokenCost.calculatePromptCost(promptString, model);

  // 打印成本
  print('Cost: $promptCost');
  // 输出示例: Cost: $3e-06
}
4. Token计数

你还可以使用tokencost来计算提示中的Token数量。以下是两个示例,分别展示了如何对消息列表和字符串提示进行Token计数:

import 'package:tokencost/tokencost.dart';

void main() async {
  // 获取TokenCost实例
  final tokenCost = await TokenCost.getInstance();

  // 定义消息提示
  const messagePrompt = [{'role': 'user', 'content': 'Hello world'}];

  // 计算消息列表中的Token数量
  print(tokenCost.countMessageTokens(messagePrompt, 'gpt-3.5-turbo'));
  // 输出示例: 9

  // 计算字符串提示中的Token数量
  print(tokenCost.countStringTokens('Hello world', 'gpt-3.5-turbo'));
  // 输出示例: 2
}

连续集成

tokencost内置了GitHub Actions工作流,由Very Good Workflows提供支持。每次拉取请求和推送时,CI会自动格式化、检查和测试代码,确保代码的一致性和正确性。项目使用Very Good Analysis进行严格的分析选项设置,并使用Very Good Workflows强制执行代码覆盖率。

运行测试

要运行所有单元测试,可以使用以下命令:

dart pub global activate coverage 1.2.0
dart test --coverage=coverage
dart pub global run coverage:format_coverage --lcov --in=coverage --out=coverage/lcov.info

生成的覆盖率报告可以通过以下命令查看:

# 生成覆盖率报告
genhtml coverage/lcov.info -o coverage/

# 打开覆盖率报告
open coverage/index.html

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

1 回复

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


当然,以下是如何在Flutter项目中使用tokencost插件来进行费用计算的示例代码。请注意,tokencost这个名称并不是一个广泛认知的Flutter插件,所以我将假设它是一个自定义的或小众的插件,其功能是根据代币价格和数量计算费用。如果这不是你具体提到的插件,你可以根据实际的插件文档进行调整。

首先,你需要确保你的Flutter项目已经添加了这个插件。假设这个插件在pubspec.yaml文件中可以这样添加:

dependencies:
  flutter:
    sdk: flutter
  tokencost: ^x.y.z  # 替换为实际的版本号

然后运行flutter pub get来安装插件。

接下来,是一个使用tokencost插件的示例代码。这个示例假设插件提供了一个TokenCostCalculator类,该类有一个方法calculateCost,接受代币价格、数量和可能的交易费用参数。

import 'package:flutter/material.dart';
import 'package:tokencost/tokencost.dart';  // 假设插件的import路径

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Token Cost Calculator Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: TokenCostCalculatorScreen(),
    );
  }
}

class TokenCostCalculatorScreen extends StatefulWidget {
  @override
  _TokenCostCalculatorScreenState createState() => _TokenCostCalculatorScreenState();
}

class _TokenCostCalculatorScreenState extends State<TokenCostCalculatorScreen> {
  final _formKey = GlobalKey<FormState>();
  double _tokenPrice = 0.0;
  int _tokenQuantity = 0;
  double _transactionFee = 0.02; // 假设交易费用为2%
  double _totalCost = 0.0;

  void _calculateCost() {
    if (_formKey.currentState!.validate()) {
      _formKey.currentState!.save();

      // 使用TokenCostCalculator计算费用
      final calculator = TokenCostCalculator();
      _totalCost = calculator.calculateCost(_tokenPrice, _tokenQuantity, _transactionFee);

      // 更新UI
      setState(() {});
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Token Cost Calculator'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Form(
          key: _formKey,
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              TextFormField(
                decoration: InputDecoration(labelText: 'Token Price (USD)'),
                keyboardType: TextInputType.numberWithOptions(decimal: true),
                validator: (value) {
                  if (value == null || value.isEmpty || double.tryParse(value) == null) {
                    return 'Please enter a valid price.';
                  }
                  return null;
                },
                onSaved: (value) {
                  _tokenPrice = double.parse(value!);
                },
              ),
              SizedBox(height: 16),
              TextFormField(
                decoration: InputDecoration(labelText: 'Token Quantity'),
                keyboardType: TextInputType.number,
                validator: (value) {
                  if (value == null || value.isEmpty || int.tryParse(value) == null) {
                    return 'Please enter a valid quantity.';
                  }
                  return null;
                },
                onSaved: (value) {
                  _tokenQuantity = int.parse(value!);
                },
              ),
              SizedBox(height: 16),
              ElevatedButton(
                onPressed: _calculateCost,
                child: Text('Calculate Cost'),
              ),
              SizedBox(height: 24),
              Text(
                'Total Cost: \$$_totalCost.toStringAsFixed(2)',
                style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

// 假设TokenCostCalculator类在tokencost插件中定义如下
// 注意:这部分代码是基于假设的,实际使用时请参照插件的文档
class TokenCostCalculator {
  double calculateCost(double price, int quantity, double fee) {
    double totalCost = price * quantity;
    totalCost += totalCost * fee; // 添加交易费用
    return totalCost;
  }
}

请注意,TokenCostCalculator类的定义是基于假设的,并且实际的tokencost插件可能有不同的API。你应该查阅插件的官方文档来了解如何正确使用它。如果tokencost插件并没有提供这样的类和方法,你可能需要查找类似的插件或自己实现这个功能。

回到顶部