Ähnlich wie die Chat-Completions-API unterstützt auch die Assistants-API Function Calling. Mit Function Calling kannst du der Assistants-API Funktionen beschreiben und bekommst intelligent zurückgeliefert, welche Funktionen mit welchen Argumenten aufgerufen werden müssen.
In diesem Beispiel erstellen wir einen Wetter-Assistenten und definieren zwei Funktionen, get_current_temperature und get_rain_probability, als Werkzeuge, die der Assistant aufrufen kann. In unserem Beispiel mit parallelem Function Calling fragen wir den Assistant, wie das Wetter heute in San Francisco ist und wie hoch die Regenwahrscheinlichkeit ist. Außerdem zeigen wir, wie sich die Antwort des Assistants per Streaming ausgeben lässt.Beim Erstellen deines Assistants definierst du die Funktionen zuerst unter dem Tools-Parameter des Assistants.
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;
Schritt 2: Einen Thread erstellen und Messages hinzufügen
Erstelle einen Thread, sobald ein Nutzer ein Gespräch beginnt, und füge dem Thread Messages hinzu, sobald der Nutzer Fragen stellt.
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;
Schritt 3: OnFunctionCall-Ereignis behandeln
Wenn die Komponente erkennt, dass ein Funktionsparameter-Wert benötigt wird, wird das Ereignis OnFunctionCall aufgerufen. Über den Parameter Request._Function erfährst du die Details der Anfrage, und mit Response.Output sendest du die Antwort.
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;
});
Delphi-Demo
Unten findest du die für Windows kompilierte Delphi-Demo.
