You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
1 year ago | |
|---|---|---|
| .. | ||
| android | 1 year ago | |
| ios | 1 year ago | |
| lib | 1 year ago | |
| LICENSE | 2 years ago | |
| README.md | 2 years ago | |
| pubspec.yaml | 2 years ago | |
README.md
OpenAI Service Plugin
一个用于Flutter应用的OpenAI服务插件,支持Android和iOS平台。
功能
- 支持文本生成(completions)
- 支持流式输出(streaming)
- 支持函数调用(function calling)
- 支持自定义API基础URL
- 支持自定义模型选择
安装
在你的pubspec.yaml文件中添加以下依赖:
dependencies:
open_ai_service:
path: 本地路径/open_ai_service
使用方法
初始化服务
import 'package:open_ai_service/open_ai_service.dart';
final openAIService = OpenAIService();
// 初始化服务
await openAIService.initialize(
apiKey: 'your_openai_api_key',
baseUrl: 'https://api.openai.com/v1/chat/completions', // 可选
model: 'gpt-4-turbo', // 可选
);
发送非流式请求
// 创建消息
final userMessage = await openAIService.createUserMessage('你好,请介绍一下自己');
// 发送请求
final response = await openAIService.sendMessage(
messages: [userMessage],
systemPrompt: '你是一个有用的AI助手',
);
print('AI回复: $response');
发送流式请求(回调方式)
// 创建消息
final userMessage = await openAIService.createUserMessage('写一个短故事');
// 发送流式请求
await openAIService.sendMessageStream(
messages: [userMessage],
systemPrompt: '你是一个善于讲故事的AI助手',
);
// 处理事件
final subscription = openAIService.processEvents(
onToken: (token) {
// 处理每个返回的token
print(token);
},
onComplete: () {
// 处理完成事件
print('生成完成');
},
onError: (error) {
// 处理错误
print('错误: $error');
},
onFunctionCall: (functionCall) {
// 处理函数调用
print('函数调用: ${functionCall['name']}');
},
);
// 在不需要时取消订阅
subscription.cancel();
发送流式请求(Stream方式)
// 创建消息
final userMessage = await openAIService.createUserMessage('写一个短故事');
// 获取字符串流
final stream = openAIService.streamMessage(
messages: [userMessage],
systemPrompt: '你是一个善于讲故事的AI助手',
);
// 使用流
final StringBuilder responseBuilder = StringBuilder();
stream.listen(
(token) {
// 处理每个token
responseBuilder.write(token);
print(token); // 实时输出
},
onDone: () {
// 流结束
print('完整回复: ${responseBuilder.toString()}');
},
onError: (error) {
// 错误处理
print('错误: $error');
}
);
注册函数
// 注册一个函数
await openAIService.registerFunction(
name: 'get_weather',
description: '获取指定城市的天气信息',
parameters: {
'type': 'object',
'properties': {
'city': {
'type': 'string',
'description': '城市名称',
},
'date': {
'type': 'string',
'description': '日期,格式为YYYY-MM-DD',
},
},
'required': ['city'],
},
);
处理函数调用
// 创建消息
final userMessage = await openAIService.createUserMessage('明天北京的天气如何?');
// 发送流式请求
await openAIService.sendMessageStream(
messages: [userMessage],
systemPrompt: '你是一个有用的AI助手',
);
// 处理事件
openAIService.processEvents(
onToken: (token) {
print(token);
},
onComplete: () {
print('生成完成');
},
onError: (error) {
print('错误: $error');
},
onFunctionCall: (functionCall) {
// 处理函数调用
final name = functionCall['name'];
final arguments = functionCall['arguments'];
print('收到函数调用: $name, 参数: $arguments');
// 假设处理了函数调用并获得结果
final result = '{"temperature": 25, "condition": "sunny"}';
// 发送函数调用结果
openAIService.sendFunctionCallResult(
messages: [userMessage],
systemPrompt: '你是一个有用的AI助手',
functionCall: functionCall,
functionResult: result,
);
},
);
使用Stream API处理函数调用
// 创建消息和响应处理器
final userMessage = await openAIService.createUserMessage('明天北京的天气如何?');
final responseBuilder = StringBuilder();
// 处理事件流以捕获函数调用
final subscription = openAIService.processEvents(
onFunctionCall: (functionCall) async {
// 取消当前事件监听
subscription.cancel();
// 处理函数调用
final name = functionCall['name'];
final arguments = functionCall['arguments'];
print('收到函数调用: $name, 参数: $arguments');
// 假设处理了函数调用并获得结果
final result = '{"temperature": 25, "condition": "sunny"}';
// 使用Stream API发送函数调用结果
final resultStream = openAIService.streamFunctionResult(
messages: [userMessage],
systemPrompt: '你是一个有用的AI助手',
functionCall: functionCall,
functionResult: result,
);
// 处理结果流
resultStream.listen(
(token) {
responseBuilder.write(token);
print(token); // 实时输出
},
onDone: () {
print('完整回复: ${responseBuilder.toString()}');
},
onError: (error) {
print('错误: $error');
}
);
}
);
// 启动请求
await openAIService.sendMessageStream(
messages: [userMessage],
systemPrompt: '你是一个有用的AI助手',
);
注意事项
- 确保在使用前已正确初始化服务
- 对于流式请求,确保在不需要时取消订阅
- 处理函数调用时,确保提供有效的结果格式
- 网络请求可能会失败,请确保加入适当的错误处理