Flutter OpenAI接口集成插件openai_dart的使用

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

Flutter OpenAI接口集成插件openai_dart的使用

简介

openai_dart 是一个用于与OpenAI API交互的非官方Dart客户端。它支持所有平台,并且是类型安全、文档齐全和经过测试的。此外,它还支持自定义HTTP客户端、代理设置以及Azure OpenAI API的部分功能。

功能特性

  • 完全类型安全:所有API调用都是类型安全的。
  • 多平台支持:适用于Flutter Web、移动端和桌面端。
  • 认证支持:支持组织级别的认证。
  • 自定义配置:支持自定义基础URL、头部信息和查询参数。
  • 兼容其他API:可以用于消费与OpenAI API兼容的其他服务。

使用方法

认证

首先需要通过API Key进行认证。请确保您的API Key保存在环境变量中或安全的地方,不要将其暴露在客户端代码中。

final openaiApiKey = Platform.environment['OPENAI_API_KEY'];
final client = OpenAIClient(apiKey: openaiApiKey);

如果您属于多个组织,还可以指定特定的组织ID:

final client = OpenAIClient(
  apiKey: openaiApiKey,
  organization: 'org-dtDDtkEGoFccn5xaP5W1p3Rr',
);

示例Demo

聊天完成 (Chat Completions)

创建一个简单的聊天对话:

Future<void> _chatCompletions(final OpenAIClient client) async {
  final res = await client.createChatCompletion(
    request: const CreateChatCompletionRequest(
      model: ChatCompletionModel.modelId('gpt-4'),
      messages: [
        ChatCompletionMessage.system(
          content: 'You are a helpful assistant.',
        ),
        ChatCompletionMessage.user(
          content: ChatCompletionUserMessageContent.string('Hello!'),
        ),
      ],
      temperature: 0,
    ),
  );
  print(res.choices.first.message.content);
}

文本补全 (Completions)

生成一段文本补全:

Future<void> _completions(final OpenAIClient client) async {
  final res = await client.createCompletion(
    request: const CreateCompletionRequest(
      model: CompletionModel.modelId('gpt-3.5-turbo-instruct'),
      prompt: CompletionPrompt.string('Say this is a test'),
      maxTokens: 7,
      temperature: 0,
    ),
  );
  print(res.choices.first.text);
}

词向量 (Embeddings)

获取输入文本的词向量表示:

Future<void> _embeddings(final OpenAIClient client) async {
  final res = await client.createEmbedding(
    request: const CreateEmbeddingRequest(
      model: EmbeddingModel.modelId('text-embedding-3-small'),
      input: EmbeddingInput.string('The food was delicious and the waiter...'),
    ),
  );
  print(res.data.first.embeddingVector);
}

细调模型 (Fine-Tuning)

列出所有的细调任务:

Future<void> _fineTuning(final OpenAIClient client) async {
  final res = await client.listPaginatedFineTuningJobs();
  print(res.data.first.id);
}

图像生成 (Images)

根据提示生成图像:

Future<void> _images(final OpenAIClient client) async {
  final res = await client.createImage(
    request: const CreateImageRequest(
      model: CreateImageRequestModel.model(ImageModels.dallE3),
      prompt: 'A cute baby sea otter',
      quality: ImageQuality.hd,
      size: ImageSize.v1024x1792,
      style: ImageStyle.natural,
    ),
  );
  print(res.data.first.url);
}

模型管理 (Models)

列出所有可用的模型:

Future<void> _models(final OpenAIClient client) async {
  final res1 = await client.listModels();
  print(res1.data.first.id);
  final res2 = await client.retrieveModel(model: 'gpt-4');
  print(res2.ownedBy);
}

内容审核 (Moderations)

检查文本是否包含有害内容:

Future<void> _moderations(final OpenAIClient client) async {
  final res = await client.createModeration(
    request: const CreateModerationRequest(
      model: ModerationModel.model(ModerationModels.omniModerationLatest),
      input: ModerationInput.string('I want to kill them.'),
    ),
  );
  print(res.results.first.categories.violence);
  print(res.results.first.categoryScores.violence);
}

高级用法

自定义HTTP客户端

您可以提供自己的HTTP客户端实现以进行更深入的定制:

final client = OpenAIClient(
  apiKey: 'OPENAI_API_KEY',
  client: MyHttpClient(),
);

使用代理

如果您需要通过代理服务器访问API,可以通过以下方式设置:

  • HTTP代理

    final client = OpenAIClient(
      baseUrl: 'https://my-proxy.com',
      headers: {
        'x-my-proxy-header': 'value',
      },
    );
    
  • SOCKS5代理

    使用 socks5_proxy 包来配置SOCKS5代理:

    final baseHttpClient = HttpClient();
    SocksTCPClient.assignToHttpClient(baseHttpClient, [
      ProxySettings(InternetAddress.loopbackIPv4, 1080),
    ]);
    final httpClient = IOClient(baseClient);
    
    final client = OpenAIClient(
      client: httpClient,
    );
    

总结

openai_dart 提供了一个强大而灵活的方式来集成OpenAI API到您的Flutter应用中。无论是简单的聊天对话还是复杂的模型训练和部署,这个库都能满足您的需求。希望上述示例能够帮助您快速上手并充分利用其功能。

如果有任何问题或需要进一步的帮助,请参考官方文档或加入社区讨论。


更多关于Flutter OpenAI接口集成插件openai_dart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter OpenAI接口集成插件openai_dart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中集成并使用openai_dart插件来与OpenAI接口进行交互的代码示例。这个示例展示了如何使用OpenAI的API进行文本生成。

首先,确保你已经在pubspec.yaml文件中添加了openai_dart依赖:

dependencies:
  flutter:
    sdk: flutter
  openai_dart: ^最新版本号  # 替换为实际可用的最新版本号

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

接下来,你需要创建一个OpenAI API密钥(如果你还没有的话),可以在OpenAI的网站上获取。请确保不要将这个密钥硬编码到你的应用程序中,最好是使用环境变量或安全的密钥管理服务。

以下是一个完整的Flutter应用示例,展示了如何使用openai_dart进行文本生成:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter OpenAI Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final OpenAI openAI = OpenAI(apiKey: 'YOUR_OPENAI_API_KEY'); // 请替换为你的API密钥
  String generatedText = '';

  Future<void> generateText() async {
    try {
      var response = await openAI.createCompletion(
        engine: 'davinci',
        prompt: 'Once upon a time',
        maxTokens: 150,
        temperature: 0.7,
      );

      setState(() {
        generatedText = response.data!.choices!.first.text;
      });
    } catch (e) {
      print('Error: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter OpenAI Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Generated Text:',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 20),
            Expanded(
              child: Text(
                generatedText,
                style: TextStyle(fontSize: 18),
                maxLines: null, // 允许文本换行
              ),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: generateText,
              child: Text('Generate Text'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中:

  1. 我们创建了一个OpenAI实例,并传入了API密钥。
  2. 使用createCompletion方法生成文本。这里我们指定了enginedavinciprompt为"Once upon a time",并设置了maxTokenstemperature参数。
  3. 当点击按钮时,generateText方法会被调用,生成的文本会显示在界面上。

请确保将YOUR_OPENAI_API_KEY替换为你自己的OpenAI API密钥。

注意:在实际应用中,处理API密钥时应采取安全措施,避免直接在代码中硬编码密钥。你可以使用环境变量、Flutter的dotenv包或其他安全的密钥管理服务。

回到顶部