Function Calling OpenAI

· Fonctionnalités

 Comme l'API Chat Completions, l'API Assistants prend en charge le function calling. Le function calling te permet de décrire des fonctions à l'API Assistants et de lui faire renvoyer intelligemment les fonctions à appeler ainsi que leurs arguments.

Dans cet exemple, nous allons créer un assistant météo et définir deux fonctions, get_current_temperature et get_rain_probability, comme outils que l'Assistant peut appeler. Dans notre exemple qui utilise le function calling parallèle, nous demanderons à l'Assistant la météo de San Francisco aujourd'hui et les chances de pluie. Nous montrons aussi comment afficher la réponse de l'Assistant en streaming.

Lors de la création de ton assistant, tu définis d'abord les fonctions sous le paramètre tools de l'assistant. 

Assistant := TsgcAIOpenAIAssistant.Create(nil);
Assistant.OpenAIOptions.ApiKey := 'sk-askdjfalskdjfl23kjkjasdefasdfj';
Assistant.AssistantOptions.Name := 'Delphi Weather Bot';
Assistant.AssistantOptions.Instructions.Text := 'You are a weather bot. Use the provided functions to answer questions.';
Assistant.AssistantOptions.Model := 'gpt-4o';
Assistant.AssistantOptions.Tools.Functions.Enabled := False;
Assistant.AssistantOptions.Tools.Functions.Functions.Text := '[{"type":"function","function":{"name":"get_current_temperature","description":"Get the current temperature for a specific location","parameters":{"type":"object","properties":{"location":{"type":"string","description":"The city and state, e.g., San Francisco, CA"},"unit":{"type":"string","enum":["Celsius","Fahrenheit"],"description":"The temperature unit to use. Infer this from the user location."}},"required":["location","unit"]}}},{"type":"function","function":{"name":"get_rain_probability","description":"Get the probability of rain for a specific location","parameters":{"type":"object","properties":{"location":{"type":"string","description":"The city and state, e.g., San Francisco, CA"}},"required":["location"]}}}]'
Assistant.AssistantOptions.Tools.FileSearch.Enabled := False;
Assistant.AssistantOptions.Tools.CodeInterpreter.Enabled := False; 

Étape 2 : créer un Thread et ajouter des Messages

Crée un Thread lorsqu'un utilisateur démarre une conversation et ajoute des Messages au Thread au fur et à mesure que l'utilisateur pose des questions. 

procedure SendMessage()
var
  i: Integer;
  oMessage: TsgcOpenAIClass_Message;
  oMessages: TsgcOpenAIClass_Response_List_Messages;
  oRun: TsgcOpenAIClass_Run;
begin
  DoLog('[user]: ' + memoMessage.Lines.Text);
  Screen.Cursor := crHourGlass;
  Try
    oMessage := Assistant.CreateMessageText('thread_id', 'What is the weather in San Francisco today and the likelihood it will rain?');
    if Assigned(oMessage) then
    begin
      oRun := Assistant.CreateRunAndWait('thread_id');
      if Assigned(oRun) then
      begin
        oMessages := Assistant.GetMessages('thread_id', oRun.Id);
        if Assigned(oMessages) and (Length(oMessages.Messages) > 0) then
        begin
          memoMessage.Lines.Text := '';
          for i := 0 to Length(oMessages.Messages) - 1 do
            DoLog('[assistant]: ' + DoFormatResponse(oMessages.Messages[i]
              .ContentText + #13#10));
        end;
      end;
    end;
  Finally
    Screen.Cursor := crDefault;
  End;
end;  

Étape 3 : gérer l'événement OnFunctionCall

Lorsque le composant détecte qu'une valeur de paramètre de fonction est requise, l'événement OnFunctionCall est appelé. Utilise le paramètre Request._Function pour connaître les détails de la requête et Response.Output pour envoyer la réponse. 

procedure TFRMOpenAIAssistant.AssistantFunctionCall(Sender: TObject;
  const aRequest: TsgcOpenAIClass_ToolCall;
  const aResponse: TsgcHTTPOpenAI_ToolCall_Response);
begin
  if aRequest._Function._Name = 'get_current_temperature' then
    aResponse.Output := 30
  else if aRequest._Function._Name = 'get_rain_probability' then
    aResponse.Output := 10;
end; 
});

Démo Delphi

Tu trouveras ci-dessous la démo Delphi compilée pour Windows.