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.
