Claude supports tool use (function calling), allowing you to define tools that Claude can invoke during a conversation. When Claude decides to use a tool, it returns a tool_use content block. You then execute the tool and send back the result as a tool_result content block.
Define a weather tool and handle the tool use loop.
Anthropic := TsgcHTTP_API_Anthropic.Create(nil);
Anthropic.AnthropicOptions.ApiKey := 'API_KEY';
// Step 1: Create request with tools
oRequest := TsgcAnthropicClass_Request_Messages.Create;
Try
oRequest.Model := 'claude-sonnet-4-20250514';
oRequest.MaxTokens := 4096;
// Define user message
oMessage := TsgcAnthropicClass_Request_Message.Create;
oMessage.Role := 'user';
oMessage.Content := 'What is the weather in San Francisco?';
SetLength(oMessages, 1);
oMessages[0] := oMessage;
oRequest.Messages := oMessages;
// Define tool
oTool := TsgcAnthropicClass_Request_Tool.Create;
oTool.Name := 'get_weather';
oTool.Description := 'Get the current weather in a given location';
oTool.InputSchema :=
'{"type":"object","properties":{"location":{"type":"string",' +
'"description":"The city and state"}},"required":["location"]}';
SetLength(oTools, 1);
oTools[0] := oTool;
oRequest.Tools := oTools;
// Step 2: Send request
oResponse := Anthropic.CreateMessage(oRequest);
Try
// Step 3: Check if Claude wants to use a tool
if oResponse.StopReason = 'tool_use' then
begin
// Find the tool_use content block
for i := 0 to Length(oResponse.Content) - 1 do
begin
if oResponse.Content[i].ContentType = 'tool_use' then
begin
vToolUseId := oResponse.Content[i].Id;
vToolName := oResponse.Content[i].Name;
vToolInput := oResponse.Content[i].Input;
// Step 4: Execute your tool (get_weather) and get result
vToolResult := '72 degrees and sunny';
Break;
end;
end;
// Step 5: Send tool result back
// Build new message array with assistant response + tool result
// ... (continue the conversation with tool_result content block)
end;
Finally
oResponse.Free;
End;
Finally
oMessage.Free;
oTool.Free;
oRequest.Free;
End;