OpenAI Assistants Streaming

· Características

El OpenAI Assistant Client se ha mejorado para implementar las respuestas en streaming al llamar a un run thread. Antes de esta nueva funcionalidad, era necesario hacer polling del estado del objeto run hasta que se completara. Ahora puedes usar los nuevos eventos Stream para gestionar los mensajes en streaming.


Eventos de streaming

En lugar de esperar la respuesta completa del assistant, puedes recibir la respuesta en streaming usando Server-Sent Events. Solo tienes que pasar el parámetro Stream = True al usar la función CreateRun y la respuesta se devolverá en streaming.

Los siguientes eventos se usan para gestionar las respuestas en streaming

Paso 1: crear un Assistant

Un Assistant representa una entidad que se puede configurar para responder a los mensajes de un usuario usando varios parámetros como modelo, instrucciones y herramientas. 

// ... 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(); 

Paso 2: crear un Thread

Un Thread representa una conversación entre un usuario y uno o varios Assistants. Puedes crear un Thread cuando un usuario (o tu aplicación de IA) inicia una conversación con tu Assistant. 

oThread := oAssistant.CreateThread; 

Paso 3: añadir un Message al Thread y ejecutarlo usando streaming

Introduce aquí tu texto ...

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; 

Paso 4: gestionar la respuesta

Usa el evento OnStreamMessageDelta para leer el mensaje en streaming enviado por el servidor. 

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; 

Ejemplo OpenAI en Delphi

El siguiente archivo comprimido contiene el código fuente de la demo de Assistants compilada para Windows usando la librería sgcWebSockets.