AutoIt Requires Chilkat v11.4.0+
AutoIt
Streaming AI with Manual AI Tool Function Calling
See more AI Examples
Demonstrates how to get AI responses in streaming mode, including manual tool function calls.Chilkat AutoIt Downloads
Local $bSuccess = False
; Create the following JSON to define tool functions available for the AI to use.
; Note: You'll use the following JSON format regardless of the AI provider, whether
; it be ChatGPT, Gemini, Claude, Grok, etc. Chilkat automatically converts to the required
; format needed for a given AI provider.
; In this example, the application is providing a single function the AI may choose to call.
; {
; "tools": [
; {
; "name": "get_horoscope",
; "description": "Get today's horoscope for an astrological sign.",
; "parameters": {
; "properties": {
; "sign": {
; "type": "string",
; "description": "An astrological sign like Taurus or Aquarius"
; }
; }
; }
; }
; ]
; }
$oJsonTools = ObjCreate("Chilkat.JsonObject")
Local $iToolIdx = 0
$oJsonTools.I = $iToolIdx
$oJsonTools.UpdateString("tools[i].name","get_horoscope")
$oJsonTools.UpdateString("tools[i].description","Get today's horoscope for an astrological sign.")
$oJsonTools.UpdateString("tools[i].parameters.properties.sign.type","string")
$oJsonTools.UpdateString("tools[i].parameters.properties.sign.description","An astrological sign like Taurus or Aquarius")
; More tools can be added as desired..
$oJsonTools.EmitCompact = False
ConsoleWrite($oJsonTools.Emit() & @CRLF)
$oAi = ObjCreate("Chilkat.Ai")
; Register the tools that will be made available to the AI.
$oAi.RegisterManualTools($oJsonTools)
; The provider can be "openai", "google", "claude", "grok", "mistral", "custom", etc.
$oAi.Provider = "openai"
; Use your provider's API key.
$oAi.ApiKey = "MY_API_KEY"
; Choose a model.
$oAi.Model = "gpt-5.6-luna"
; Tool function calling must always occur within a conversation.
Local $sConversation_name = "convo_astrology"
Local $sysMessage = "You are a helpful astrologer"
Local $sDevMessage = "Respond only with markdown."
$oAi.NewConvo($sConversation_name,$sysMessage,$sDevMessage)
; Provide inputs
$oAi.InputAddText("What is my horoscope? I am an Aquarius.")
; Get the response in streaming mode.
$oAi.Streaming = True
; In streaming mode, if we receive an AI event that is a request for tool use,
; we'll need to make the call to the JavaScript and then continue with a followup Ask,
; until the final response is received.
$oSbEventName = ObjCreate("Chilkat.StringBuilder")
$oSbDelta = ObjCreate("Chilkat.StringBuilder")
$oSbFullResponse = ObjCreate("Chilkat.StringBuilder")
; When PollAi returns with an event, it's highly unlikely the
; call to NextAiEvent does not immediately return. Setting a max
; timeout is just a precaution..
Local $iMaxWaitMs = 5000
$oJsonFn = ObjCreate("Chilkat.JsonObject")
Local $bFinished = False
Local $iNumAsks = 0
; Set a max # of followup Asks to prevent any unexpected infinite looping.
While Not $bFinished And ($iNumAsks < 10)
; Send the request to the AI model.
$bSuccess = $oAi.Ask("text")
If ($bSuccess = False) Then
ConsoleWrite($oAi.LastErrorText & @CRLF)
Exit
EndIf
Local $bMadeFunctionCalls = False
Local $bStreamingDone = False
While Not $bStreamingDone
Local $iResult = $oAi.PollAi(False)
If ($iResult < 0) Then
ConsoleWrite($oAi.LastErrorText & @CRLF)
ConsoleWrite("Failed." & @CRLF)
Exit
EndIf
If ($iResult > 0) Then
; We have an event..
$bSuccess = $oAi.NextAiEvent($iMaxWaitMs,$oSbEventName,$oSbDelta)
If ($bSuccess = False) Then
ConsoleWrite($oAi.LastErrorText & @CRLF)
Exit
EndIf
; Is this an event where the AI is requesting a function call?
If ($oSbEventName.ContentsEqual("function_call",True)) Then
$oJsonFn.LoadSb($oSbDelta)
; Note: Chilkat will convert responses from all AI providers to this format:
; {
; "function_call": [
; {
; "name": "get_horoscope",
; "call_id": "call_RYmeysYQFocFc7Z2ofkv61dW",
; "arguments": "{\"sign\":\"Aquarius\"}",
; "args": {
; "sign": "Aquarius"
; }
; }
; ]
; }
Local $iNumFnCalls = $oJsonFn.SizeOfArray("function_call")
Local $iFn_idx = 0
While ($iFn_idx < $iNumFnCalls)
$oJsonFn.I = $iFn_idx
$oSbFnName = ObjCreate("Chilkat.StringBuilder")
$oJsonFn.StringOfSb("function_call[i].name",$oSbFnName)
Local $sCallId = $oJsonFn.StringOf("function_call[i].call_id")
If ($oSbFnName.ContentsEqual("get_horoscope",True) = True) Then
; The get_horoscope function (as defined above) has one argument named "sign".
Local $sZodiac_sign = $oJsonFn.StringOf("function_call[i].args.sign")
ConsoleWrite("zodiac_sign = " & $sZodiac_sign & @CRLF)
; Insert application code here to call your app's get_horoscope function, passing the zodiac_sign to it..
; For this example, we'll pretend the app's get_horoscope function returned the following:
Local $sApplicationFnCallResult = "Aquarius: Next Tuesday you will befriend a baby otter."
; Provide the tool call result as an input for the followup Ask.
$oAi.InputAddFnResult($sCallId,$sApplicationFnCallResult)
$bMadeFunctionCalls = True
EndIf
; Your application would add code to check for and handle each possible function call.
$iFn_idx = $iFn_idx + 1
Wend
Else
If (Not $oSbEventName.ContentsEqual("empty",True)) Then
$oSbFullResponse.AppendSb($oSbDelta)
If ($oSbEventName.ContentsEqual("null_terminator",True)) Then
$bStreamingDone = True
EndIf
EndIf
EndIf
Else
; No event arrived, so wait a short time rather than spin in a loop..
$oAi.SleepMs 100
EndIf
Wend
If (Not $bMadeFunctionCalls) Then
$bFinished = True
EndIf
$iNumAsks = $iNumAsks + 1
Wend
ConsoleWrite("Full Response:" & @CRLF)
ConsoleWrite($oSbFullResponse.GetAsString() & @CRLF)