Flutter费用计算插件tokencost的使用
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
更多关于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
插件并没有提供这样的类和方法,你可能需要查找类似的插件或自己实现这个功能。