开启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;
关键说明
- 流式模式下,不能通过
Chat.Choices直接获取结果,必须通过OnStreamChunkReceived事件接收每一块返回的token内容。 - 每块数据的
Delta.Content就是当前新增的文本片段,需要逐段输出或拼接,而非等待完整响应。 - 必须调用
Chat.Execute触发请求,否则不会开始接收流式数据。
内容的提问来源于stack exchange,提问作者user1009073
相关产品推荐
相关产品推荐

