Sample code for 30+ languages & platforms
Delphi DLL

AI Ask with Multiple Tool Function Callbacks

See more AI Examples

This example demonstrates asking a two-part question that should cause the AI to respond with two tool call requests.

Chilkat Delphi DLL Downloads

Delphi DLL
uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Ai, StringBuilder;

...

procedure TForm1.Button1Click(Sender: TObject);
var
success: Boolean;
sbJs: HCkStringBuilder;
ai: HCkAi;
evalOnly: Boolean;
allowAllKeyword: Boolean;
conversation_name: PWideChar;
sysMessage: PWideChar;
devMessage: PWideChar;
sbResponse: HCkStringBuilder;

begin
success := False;

// ----------------------------------------------------------------------------------
// The Javascript file loaded here is shown at the bottom of this page.
// -----------------------------------------------------------------------------------

// Load JavaScript containing the tool functions.
sbJs := CkStringBuilder_Create();
success := CkStringBuilder_LoadFile(sbJs,'qa_data/js_tools/toolset_6.js','utf-8');
if (success = False) then
  begin
    Memo1.Lines.Add(CkStringBuilder__lastErrorText(sbJs));
    Exit;
  end;

ai := CkAi_Create();

// Register the tools that will be made available to the AI.
evalOnly := False;
allowAllKeyword := True;
CkAi_RegisterJsTools(ai,sbJs,evalOnly,allowAllKeyword);

// The provider can be "openai", "google", "claude", "grok", "mistral", "custom", etc.
CkAi_putProvider(ai,'openai');
// Use your provider's API key.
CkAi_putApiKey(ai,'MY_API_KEY');
// Choose a model.
CkAi_putModel(ai,'gpt-5-mini');

// Tool function calling must always occur within a conversation.
conversation_name := 'example_convo';
sysMessage := 'You are a helpful assistant';
devMessage := 'Respond with markdown';
CkAi_NewConvo(ai,conversation_name,sysMessage,devMessage);

// Provide inputs
CkAi_InputAddText(ai,'What is my horoscope? I am an Aquarius.  Also, what''s the weather in Chicago?');

// Send inputs, tool functions, etc. and ask for a "text" response.
// If the AI responds with tool calls, Chilkat automatically handles them by calling your JavaScript
// tool functions as directed by the AI, and sending results back to the AI until the final
// response is received.
success := CkAi_Ask(ai,'text');
if (success = False) then
  begin
    Memo1.Lines.Add(CkAi__lastErrorText(ai));
    Exit;
  end;

// Get the AI response.
sbResponse := CkStringBuilder_Create();
CkAi_GetOutputTextSb(ai,sbResponse);
Memo1.Lines.Add(CkStringBuilder__getAsString(sbResponse));

CkStringBuilder_Dispose(sbJs);
CkAi_Dispose(ai);
CkStringBuilder_Dispose(sbResponse);

end;