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

开启DelphiOpenAI的ChatGPT流式响应时遇EConversionError问题求助

解决DelphiOpenAI流式响应的EConversionError问题

开启流式响应后出现转换错误,核心原因是流式模式下API返回的是分块的服务器推送事件(SSE)数据,而非完整JSON对象,原代码中直接遍历Chat.Choices的同步获取逻辑不再适用。需要改用事件驱动的方式处理分块数据,具体修改如下:

正确实现代码

var buf : TStringlist;
begin
  ...
  // 绑定流式分块接收事件
  OpenAI.Chat.OnStreamChunkReceived := procedure(const Chunk: TChatStreamChunk)
    begin
      if Chunk.Choices.Count > 0 then
      begin
        var Content := Chunk.Choices[0].Delta.Content;
        if not Content.IsEmpty then
        begin
          // 逐token输出内容(模拟官网实时打字效果)
          Write(Content);
          // 追加到缓存列表(按需拼接完整内容)
          buf.Append(Content);
        end;
      end;
    end;

  var Chat := OpenAI.Chat.Create(
    procedure(Params: TChatParams)
    begin
      Params.Messages([TChatMessageBuild.Create(TMessageRole.User, Buf.Text)]);
      Params.MaxTokens(1024);
      Params.Stream(True); // 开启流式响应
    end);
  try
    // 触发流式请求,事件回调会处理分块数据
    Chat.Execute;
  finally
    Chat.Free;
    OpenAI.Chat.OnStreamChunkReceived := nil; // 清空事件绑定
  end;
end;

关键说明

  1. 流式模式下,不能通过Chat.Choices直接获取结果,必须通过OnStreamChunkReceived事件接收每一块返回的token内容。
  2. 每块数据的Delta.Content就是当前新增的文本片段,需要逐段输出或拼接,而非等待完整响应。
  3. 必须调用Chat.Execute触发请求,否则不会开始接收流式数据。

内容的提问来源于stack exchange,提问作者user1009073

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 06:52:12