OpenAI Assistants 流式响应

· 功能

OpenAI 助手客户端已改进,在调用运行线程时支持流式响应。此前需要轮询运行对象状态直到完成。现在您可以使用新的流式事件来处理流式消息。


流式事件

无需等待助手的完整响应,您可以使用 Server-Sent Events 来流式传输响应。只需在使用 CreateRun 函数时传入参数 Stream = True,响应即会使用流式传输。

以下事件用于处理流式响应:

步骤 1:创建助手

助手代表一个可配置的实体,通过模型、指令和工具等参数响应用户消息。

// ... create a new assistant
oAssistant := TsgcAIOpenAIAssistant.Create(nil);
// ... set your api key
oAssistant.OpenAIOptions.ApiKey := txtAPIKey.Text;
// ... assistant options
oAssistant.AssistantOptions.Name := 'Math Tutor';
oAssistant.AssistantOptions.Instructions.Text := 'You are a personal math tutor. Write and run code to answer math questions.';
oAssistant.AssistantOptions.Model := 'gpt-4o';
// ... create the assistant
oAssistant.CreateAssistant(); 

步骤 2:创建线程

线程代表用户与一个或多个助手之间的对话。当用户(或您的 AI 应用程序)开始与助手对话时,可以创建一个线程。

oThread := oAssistant.CreateThread; 

步骤 3:向线程添加消息并使用流式传输运行

在此输入您的文本……

procedure SendMessage(const oAssistant: TsgcAIOpenAIAssistant; const oThread: TsgcAIClass_Thread; const aMessage: string);
var
  i: Integer;
  oMessage: TsgcOpenAIClass_Message;
  oMessages: TsgcOpenAIClass_Response_List_Messages;
  oRun: TsgcOpenAIClass_Run;
begin
  DoLog('[user]: ' + aMessage);
  oMessage := oAssistant.CreateMessageText(oThread.Id, aMessage);
  if Assigned(oMessage) then
    oRun := oAssistant.CreateRun(oThread.Id, True);
end; 

步骤 4:处理响应

使用事件 OnStreamMessageDelta 读取服务器推送的流式消息。

procedure OnStreamMessageDelta(Sender: TObject; const aMessageDelta: TsgcOpenAIClass_MessageDelta; const aRaw: string);
var
  i: Integer;
  vResponse: string;
  vType: string;
begin
  for i := Low(aMessageDelta.Content) to High(aMessageDelta.Content) do
  begin
    vType := aMessageDelta.Content[i]._Type;
    if vType = 'text' then
    begin
      vResponse := TsgcOpenAIClass_MessageDeltaContent_Text
        (aMessageDelta.Content[i]).Value;
    end;
  end;
end; 

OpenAI Delphi 示例

以下压缩文件包含使用 sgcWebSockets 库为 Windows 构建的助手示例源代码。