You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flutter应用中调用chat.openai.com创建的自定义GPT

对接自定义GPT的解决方案

要对接你在chat.openai.com创建的自定义GPT,需要使用OpenAI的Assistant API(自定义GPT本质是基于Assistant构建的),以下是针对你现有代码的修改方案:

步骤1:获取自定义GPT的Assistant ID

  1. 登录OpenAI平台,进入「GPTs Builder」打开你的自定义GPT
  2. 切换到「Configure」标签页,在「API」区域找到并复制你的Assistant ID
  3. 也可以直接在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 23:45:11