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.
wolfplus 78ea4618cf add 2 years ago
..
android add 2 years ago
ios/Classes add 2 years ago
lib add 2 years ago
README.md init 2 years ago
pubspec.yaml add 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助手',
);

注意事项

  1. 确保在使用前已正确初始化服务
  2. 对于流式请求,确保在不需要时取消订阅
  3. 处理函数调用时,确保提供有效的结果格式
  4. 网络请求可能会失败,请确保加入适当的错误处理

许可证

MIT License