如何在Flutter应用中调用chat.openai.com创建的自定义GPT
对接自定义GPT的解决方案
要对接你在chat.openai.com创建的自定义GPT,需要使用OpenAI的Assistant API(自定义GPT本质是基于Assistant构建的),以下是针对你现有代码的修改方案:
步骤1:获取自定义GPT的Assistant ID
- 登录OpenAI平台,进入「GPTs Builder」打开你的自定义GPT
- 切换到「Configure」标签页,在「API」区域找到并复制你的Assistant ID
- 也可以直接在OpenAI Dashboard的「Assistants」页面找到对应GPT的ID
步骤2:修改Flutter代码
1. 添加线程ID变量
在_HomeState类中添加线程ID成员变量,用于复用对话线程(保持历史上下文):
String? _threadId;
2. 重构getChatResponse方法
替换原来的getChatResponse方法,改为使用Assistant API流程:
Future<void> getChatResponse(ChatMessage m) async { m.text = m.text.trim(); setState(() { messages.insert(0, m); typingUsers.add(gpt); }); try { // 1. 创建线程(首次对话)或复用已有线程 if (_threadId == null) { final thread = await openAI.createThread(); _threadId = thread.id; } // 2. 向线程添加用户消息 await openAI.createMessage( threadId: _threadId!, message: m.text, role: Role.user, ); // 3. 运行Assistant(替换为你的自定义GPT的Assistant ID) final run = await openAI.createRun( threadId: _threadId!, assistantId: 'YOUR_ASSISTANT_ID', ); // 4. 轮询等待运行完成 Run completedRun; do { await Future.delayed(const Duration(milliseconds: 500)); completedRun = await openAI.retrieveRun( threadId: _threadId!, runId: run.id, ); } while (completedRun.status != RunStatus.completed && completedRun.status != RunStatus.failed); if (completedRun.status == RunStatus.failed) { setState(() { messages.insert(0, ChatMessage( user: gpt, createdAt: DateTime.now(), text: '对话出错,请重试', )); }); return; } // 5. 获取Assistant的回复消息 final messagesResponse = await openAI.listMessages( threadId: _threadId!, ); // 提取回复内容并更新UI for (var msg in messagesResponse.messages) { if (msg.role == Role.assistant && msg.content.isNotEmpty) { setState(() { messages.insert(0, ChatMessage( user: gpt, createdAt: DateTime.now(), text: msg.content.first.text.value, )); }); } } } catch (e) { setState(() { messages.insert(0, ChatMessage( user: gpt, createdAt: DateTime.now(), text: '请求失败:${e.toString()}', )); }); } finally { typingUsers.remove(gpt); } }
3. 注意事项
- 替换代码中的
YOUR_ASSISTANT_ID为你实际的Assistant ID - 确保你的OpenAI API Key拥有Assistant API的调用权限(在OpenAI Dashboard的API Keys页面确认权限)
- 线程ID可以持久化存储(比如SharedPreferences),这样重启App后可以继续之前的对话
- 如果自定义GPT配置了工具(比如联网、代码解释器),需要额外处理工具调用的逻辑(上述代码仅处理纯文本回复)
替代方案(仅适用于无工具的自定义GPT)
如果你的自定义GPT没有配置工具,仅依赖预设的System Prompt,也可以直接在普通ChatCompletion中加入预设的System Prompt:
// 在构建history时,添加系统消息到最前面 List<Messages> history = [ Messages(role: Role.system, content: 'YOUR_CUSTOM_GPT_SYSTEM_PROMPT'), // 替换为自定义GPT的预设提示词 ...messages.reversed.map((e) { if (e.user == user) { return Messages(role: Role.user, content: e.text); } else { return Messages(role: Role.assistant, content: e.text); } }).toList() ];
这种方式不需要使用Assistant API,但无法复用自定义GPT的工具配置。
内容的提问来源于stack exchange,提问作者iShah
相关产品推荐
相关产品推荐

