Flutter聊天机器人集成插件chat_gpt_sdk的使用

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

Flutter聊天机器人集成插件chat_gpt_sdk的使用

简介

ChatGPT是由OpenAI在2022年11月推出的聊天机器人,基于OpenAI的GPT-3.5大型语言模型,并通过监督学习和强化学习技术进行了微调。本文将介绍如何在Flutter应用中集成chat_gpt_sdk插件,实现与ChatGPT的交互。

安装插件

首先,在pubspec.yaml文件中添加chat_gpt_sdk依赖:

dependencies:
  flutter:
    sdk: flutter
  chat_gpt_sdk: ^3.1.4

运行flutter pub get以安装插件。

创建OpenAI实例

在开始使用之前,需要创建一个OpenAI实例。你需要从OpenAI获取API密钥和组织ID(如果有的话)。

import 'package:chat_gpt_sdk/chat_gpt_sdk.dart';

final openAI = OpenAI.instance.build(
  token: 'your-api-key',
  baseOption: HttpSetup(receiveTimeout: const Duration(seconds: 5)),
  enableLog: true,
);

更改访问令牌

如果你需要更改访问令牌,可以使用以下方法:

openAI.setToken('new-access-token');
// 获取当前令牌
String currentToken = openAI.token;

完成文本请求

使用FutureBuilder完成文本请求

void _translateEngToThai() async {
  final request = CompleteText(
    prompt: 'Translate this text to Thai: Hello World!',
    maxTokens: 200,
    model: TextDavinci3Model(),
  );

  final response = await openAI.onCompletion(request: request);
  print(response?.choices.last.text);
}

// UI代码示例
Future<CompleteResponse?>? _translateFuture;

@override
void initState() {
  super.initState();
  _translateFuture = openAI.onCompletion(request: request);
}

@override
Widget build(BuildContext context) {
  return FutureBuilder<CompleteResponse?>(
    future: _translateFuture,
    builder: (context, snapshot) {
      if (snapshot.connectionState == ConnectionState.done) {
        return Text(snapshot.data?.choices.last.text ?? '');
      } else {
        return CircularProgressIndicator();
      }
    },
  );
}

使用Server-Sent Events (SSE) 完成文本请求

void completeWithSSE() {
  final request = CompleteText(
    prompt: "Hello world",
    maxTokens: 200,
    model: TextDavinci3Model(),
  );

  openAI.onCompletionSSE(request: request).listen((it) {
    debugPrint(it.choices.last.text);
  });
}

聊天完成请求

基本聊天完成请求

void chatComplete() async {
  final request = ChatCompleteText(
    messages: [
      {'role': 'user', 'content': 'Hello!'}
    ],
    maxToken: 200,
    model: Gpt4ChatModel(),
  );

  final response = await openAI.onChatCompletion(request: request);
  for (var element in response!.choices) {
    print("data -> ${element.message?.content}");
  }
}

使用Server-Sent Events (SSE) 进行聊天完成请求

void chatCompleteWithSSE() {
  final request = ChatCompleteText(
    messages: [
      {'role': 'user', 'content': 'Hello!'}
    ],
    maxToken: 200,
    model: Gpt4ChatModel(),
  );

  openAI.onChatCompletionSSE(request: request).listen((it) {
    debugPrint(it.choices.last.message?.content);
  });
}

功能调用与图像输入

功能调用

void gptFunctionCalling() async {
  final request = ChatCompleteText(
    messages: [
      Messages(
        role: Role.user,
        content: "What is the weather like in Boston?",
        name: "get_current_weather"
      ).toJson(),
    ],
    maxToken: 200,
    model: Gpt41106PreviewChatModel(),
    tools: [
      {
        "type": "function",
        "function": {
          "name": "get_current_weather",
          "description": "Get the current weather in a given location",
          "parameters": {
            "type": "object",
            "properties": {
              "location": {
                "type": "string",
                "description": "The city and state, e.g. San Francisco, CA"
              },
              "unit": {
                "type": "string",
                "enum": ["celsius", "fahrenheit"]
              }
            },
            "required": ["location"]
          }
        }
      }
    ],
    toolChoice: 'auto',
  );

  ChatCTResponse? response = await openAI.onChatCompletion(request: request);
  debugPrint("$response");
}

图像输入

void imageInput() async {
  final request = ChatCompleteText(
    messages: [
      {
        "role": "user",
        "content": [
          {"type": "text", "text": "What’s in this image?"},
          {
            "type": "image_url",
            "image_url": {
              "url": "https://example.com/image.jpg"
            }
          }
        ]
      }
    ],
    maxToken: 200,
    model: Gpt4VisionPreviewChatModel(),
  );

  ChatCTResponse? response = await openAI.onChatCompletion(request: request);
  debugPrint("$response");
}

示例Demo

以下是一个简单的Flutter应用示例,展示如何使用chat_gpt_sdk进行文本翻译功能:

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: TranslateScreen(),
    );
  }
}

class TranslateScreen extends StatefulWidget {
  @override
  _TranslateScreenState createState() => _TranslateScreenState();
}

class _TranslateScreenState extends State<TranslateScreen> {
  final _txtWord = TextEditingController();
  late OpenAI openAI;
  Future<CompleteResponse?>? _translateFuture;

  @override
  void initState() {
    openAI = OpenAI.instance.build(
      token: 'your-api-key',
      baseOption: HttpSetup(receiveTimeout: const Duration(seconds: 20)),
      enableLog: true,
    );
    super.initState();
  }

  void _translateEngToThai() async {
    final request = CompleteText(
      prompt: 'Translate this text to Thai: ${_txtWord.text}',
      maxTokens: 200,
      model: TextDavinci3Model(),
    );

    setState(() {
      _translateFuture = openAI.onCompletion(request: request);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Translate App')),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            TextField(
              controller: _txtWord,
              decoration: InputDecoration(hintText: 'Enter text to translate'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _translateEngToThai,
              child: Text('Translate'),
            ),
            SizedBox(height: 20),
            FutureBuilder<CompleteResponse?>(
              future: _translateFuture,
              builder: (context, snapshot) {
                if (snapshot.connectionState == ConnectionState.waiting) {
                  return CircularProgressIndicator();
                } else if (snapshot.hasError) {
                  return Text('Error: ${snapshot.error}');
                } else if (snapshot.hasData) {
                  return Text('Translated Text: ${snapshot.data?.choices.last.text}');
                } else {
                  return Text('No translation yet.');
                }
              },
            ),
          ],
        ),
      ),
    );
  }
}

这个示例展示了如何在Flutter应用中集成chat_gpt_sdk插件,实现简单的文本翻译功能。你可以根据自己的需求扩展这个示例,实现更多复杂的功能。


更多关于Flutter聊天机器人集成插件chat_gpt_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter聊天机器人集成插件chat_gpt_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中集成并使用chat_gpt_sdk插件来创建一个简单聊天机器人的示例代码。这个示例假定你已经设置好了Flutter开发环境,并且已经创建了一个新的Flutter项目。

第一步:添加依赖

首先,你需要在pubspec.yaml文件中添加chat_gpt_sdk的依赖:

dependencies:
  flutter:
    sdk: flutter
  chat_gpt_sdk: ^最新版本号  # 请替换为实际的最新版本号

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

第二步:配置ChatGPT API密钥

你需要在ChatGPT的官方网站上申请一个API密钥,并在你的Flutter项目中配置它。为了安全起见,建议将API密钥存储在环境变量或.env文件中。这里我们假设你已经将API密钥存储在一个名为.env的文件中,内容如下:

CHAT_GPT_API_KEY=你的API密钥

然后,你可以使用flutter_dotenv包来读取这个环境变量。首先,在pubspec.yaml中添加flutter_dotenv的依赖:

dependencies:
  flutter:
    sdk: flutter
  chat_gpt_sdk: ^最新版本号
  flutter_dotenv: ^最新版本号

运行flutter pub get后,在项目根目录创建一个名为.env的文件,并将你的API密钥添加进去。然后在你的应用入口(通常是main.dart)中添加以下代码来加载环境变量:

import 'package:flutter_dotenv/flutter_dotenv.dart';

void main() async {
  await dotenv.load();
  runApp(MyApp());
}

第三步:创建聊天界面

接下来,我们创建一个简单的聊天界面。在lib目录下创建一个新的Dart文件,比如chat_screen.dart,并添加以下代码:

import 'package:flutter/material.dart';
import 'package:chat_gpt_sdk/chat_gpt_sdk.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';

class ChatScreen extends StatefulWidget {
  @override
  _ChatScreenState createState() => _ChatScreenState();
}

class _ChatScreenState extends State<ChatScreen> {
  final TextEditingController _controller = TextEditingController();
  final List<String> _messages = [];
  ChatGPTClient? _chatGPTClient;

  @override
  void initState() {
    super.initState();
    String apiKey = dotenv.env['CHAT_GPT_API_KEY'] ?? '';
    _chatGPTClient = ChatGPTClient(apiKey);
  }

  void _sendMessage() async {
    if (_controller.text.isNotEmpty) {
      // 这里假设用户输入的消息直接添加到消息列表中作为用户发送的消息
      setState(() {
        _messages.add('你: $_controller.text');
      });

      // 清空输入框
      _controller.clear();

      // 发送消息到ChatGPT并获取回复
      String? response = await _chatGPTClient?.sendMessage(_controller.text);
      if (response != null) {
        setState(() {
          _messages.add('ChatGPT: $response');
        });
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('ChatGPT 聊天'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Expanded(
              child: ListView.builder(
                itemCount: _messages.length,
                itemBuilder: (context, index) {
                  return Padding(
                    padding: const EdgeInsets.symmetric(vertical: 4.0),
                    child: Text(
                      _messages[index],
                      style: TextStyle(
                        color: _messages[index].startsWith('你:') ? Colors.blue : Colors.black,
                      ),
                    ),
                  );
                },
              ),
            ),
            TextField(
              controller: _controller,
              decoration: InputDecoration(
                hintText: '输入你的消息...',
                border: OutlineInputBorder(),
              ),
              onEditingComplete: _sendMessage,
            ),
            Button(
              onPressed: _sendMessage,
              child: Text('发送'),
            ),
          ],
        ),
      ),
    );
  }
}

注意:上面的代码中,ChatGPTClient类及其sendMessage方法可能需要根据chat_gpt_sdk的实际API进行调整。如果chat_gpt_sdk没有直接提供这样的方法,你可能需要查阅其文档来了解如何正确地发送请求并处理响应。

第四步:在应用中导航到聊天界面

最后,在你的主应用文件(通常是main.dart)中,添加代码来导航到聊天界面:

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

void main() async {
  await dotenv.load();
  runApp(MyApp());
}

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

现在,你应该能够运行你的Flutter应用,并看到一个简单的聊天界面,可以与ChatGPT进行交互。请确保你已经正确配置了API密钥,并且chat_gpt_sdk插件的API与你使用的版本相匹配。

回到顶部