Antwoord genereren van model

Levert een tekstrespons van een AI-model op basis van een gebruikersprompt op.

Opties 

  • Accountnaam is een tekstexpressie voor de naam van de te gebruiken AI-account. Gebruik in het huidige bestand de scriptstap AI-account configureren scriptstap om het account in te stellen en deze naam toe te wijzen op elk moment voordat deze scriptstap wordt uitgevoerd.

  • Model is de naam van het te gebruiken tekstgeneratiemodel. Geef de modelnaam op als tekstexpressie. Zie de technische specificaties van FileMaker voor ondersteunde modellen.

  • Gebruikersprompt is een tekstexpressie voor het verzoek of de vraag in natuurlijke taal die naar het model moet worden verzonden. Dit is meestal het verzoek dat door de gebruiker wordt gedaan.

  • In de modus Agentic wordt bepaald hoe deze scriptstap automatische interacties tussen hulpprogramma's verwerkt:

    • Aan: Maakt geautomatiseerde interactie in meerdere stappen mogelijk waarbij het model herhaaldelijk tools kan oproepen tot een eindresultaat.

    • Uit: Voert één interactie uit en stopt na de eerste aanroep van het hulpmiddel zonder de aanroep van het hulpmiddel uit te voeren of een resultaat in Antwoord terug te sturen, zodat handmatige verwerking en foutopsporing mogelijk zijn. Als er geen gereedschapsaanroepen worden gedaan, retourneert het resultaat van het model in Antwoord.

  • Antwoord geeft het veld of de variabele aan waar het resultaat van de scriptstap moet worden opgeslagen. Als u een veld opgeeft en Stream selecteert, moet het veld zich in de huidige lay-out bevinden.

  • Instructies is een tekstexpressie die aanvullende context of gedragsrichtlijnen voor het model biedt.

  • Berichten geeft het veld of de variabele aan die de berichtgeschiedenis bevat om de modelcontext van eerdere interacties weer te geven. De berichten zijn een matrix van JSON-objecten. Elk JSON-object moet key-value paren bevatten voor de tekst van het bericht (inhoud) en wie de inhoud (rol) heeft geleverd, ofwel de gebruiker ("gebruiker”) of het model ("assistent”). Bijvoorbeeld:

    Kopiëren

      {
        "content": "wat is de temperatuur in Cupertino?",
        "role": "user"
      },
      {
        "content": "de temperatuur in Cupertino is 72 graden Fahrenheit.",
        "role": "assistant"
      }
    ]
  • Berichtgeschiedenis opslaan op geeft de variabele aan waar de scriptstap de berichtgeschiedenis opslaat. De indeling is hetzelfde als voor Berichten, waarbij het berichtpaar voor de huidige uitvoering van deze scriptstap aan het einde wordt toegevoegd.

    Als u wilt dat de berichtgeschiedenis blijft bestaan nadat het huidige script is beëindigd, gebruikt u een globale variabele (die blijft bestaan totdat de FileMaker-clientsessie is beëindigd) of slaat u de waarde van de variabele op in een veld. Zie Variabelen gebruiken of de scriptstap Veld instellen scriptstap.

  • Berichtgeschiedenis aantal is een numerieke expressie die bepaalt hoeveel eerdere berichtparen (vraag van de gebruiker en antwoord van de assistent) moeten worden opgenomen in de variabele die is opgegeven bij Berichtgeschiedenis opslaan op.

  • Temperatuur regelt de willekeur of creativiteit van de reactie van een model op een prompt. Lage waarden leveren meer deterministische, feitelijke resultaten op. Hoge waarden genereren creatievere, onverwachte of minder samenhangende resultaten. Raadpleeg de documentatie van de modelprovider voor geldige bereiken voor het specifieke model dat u gebruikt.

  • Gereedschapsdefinities specificeert een JSON-array met beschikbare tools die het model kan aanroepen tijdens de verwerking. Zie "Gereedschapsdefinities" hieronder.

  • Gereedschapsoproepen van model geeft aan waar informatie moet worden opgeslagen over gereedschapsoproepen die door het model zijn gedaan. Dit kan handig zijn voor het opsporen van fouten of het controleren van het gebruik van gereedschappen door het model.

  • Stream regelt hoe de respons wordt geleverd:

    • Aan: Het antwoord wordt opgevraagd en stapsgewijs geleverd (woord voor woord of in zinsdelen). Dit kan ervoor zorgen dat de FileMaker-client sneller reageert.

    • Uit: Het volledige antwoord wordt opgehaald voordat het beschikbaar wordt gemaakt. Dit kan ertoe leiden dat de FileMaker-client niet meer reageert tijdens het wachten op de volledige reactie.

  • Parameters is een tekstexpressie voor een JSON-object dat bestaat uit sleutel-waarde-paren voor aanvullende parameters die worden ondersteund door de modelprovider. Bijvoorbeeld: {"temperatuur": 0,7, "zaad": 42}. Raadpleeg de documentatie van de modelprovider voor sleutelnamen van ondersteunde parameters en hun geldige bereiken.

  • JavaScript uitvoeren in Web Viewer specificeert JavaScript-code die moet worden uitgevoerd in een doel-webviewer nadat de scriptstap is voltooid. Deze optie is vergelijkbaar met het uitvoeren van de JavaScript in Web Viewer uitvoeren scriptstap als de volgende scriptstap, behalve dat de respons kan worden doorgegeven aan de JavaScript-functie en het antwoord kan worden gestreamd naar de webviewer wanneer de optie Stream is ingeschakeld.

    • Web Viewer geeft de objectnaam van een webviewer in de huidige lay-out.

    • Functienaam is de naam van de JavaScript-functie die in de webviewer moet worden aangeroepen.

Compatibiliteit 

Product Ondersteund
FileMaker Pro Ja
FileMaker Go Ja
FileMaker WebDirect Ja
FileMaker Server Ja
FileMaker Cloud Ja
FileMaker Data API Ja
Custom Web Publishing Ja

Afkomstig uit versie 

22.0

Beschrijving 

Deze scriptstap vergemakkelijkt interactie in meerdere stappen tussen uw aangepaste app en AI-modellen, waardoor het model gegevens kan openen en manipuleren door middel van gereedschapsoproepen wanneer nodig. De scriptstap werkt in twee verschillende modi op basis van de optie Agentic-modus, die elk verschillende niveaus van automatisering en controle over de interactie bieden.

De interactie tussen deze scriptstap en het model volgt meestal de volgende stappen:

  1. Deze scriptstap verzendt de Gebruikersprompt, eventuele Instructies, gesprekscontext van Berichten en beschikbare Gereedschapsdefinities naar het geconfigureerde Model.

  2. Het model analyseert de prompt en bepaalt of het een directe reactie kan geven of hulpmiddelen moet gebruiken om aanvullende informatie te verzamelen of acties uit te voeren.

  3. Als er gereedschappen nodig zijn, genereert het model gereedschapsoproepen met de juiste parameters op basis van de beschikbare gereedschapsdefinities en het verzoek van de gebruiker.

  4. Deze scriptstap ontvangt de gereedschapsoproepen van het model en de FileMaker-client voert deze uit. De uitvoering van het hulpprogramma kan de vooraf gedefinieerde hulpprogramma's omvatten, zoals SQL-query's, of oproepen van uw eigen aangepaste functies.

  5. Deze scriptstap stuurt de resultaten van de uitvoering van de tool terug naar het model, zodat het model de gegevens ontvangt of de bevestiging krijgt die nodig is om de verwerking voort te zetten.

  6. Als het model vaststelt dat extra gereedschappen nodig zijn om de prompt volledig te beantwoorden, kan het meer gereedschapsoproepen genereren (herhaal stap 3-5). Dit iteratieve proces gaat door totdat het model voldoende informatie heeft om een uitgebreide respons te geven.

  7. Nadat het model alle noodzakelijke gereedschapsinteracties heeft voltooid, genereert het een definitieve reactie die de resultaten van het gereedschap bevat en de oorspronkelijke gebruikersprompt behandelt.

  8. Deze scriptstap ontvangt het definitieve antwoord, slaat het op in het opgegeven Antwoorddoel en werkt optioneel de geschiedenis van interacties bij in Berichtgeschiedenis opslaan op.

De optie Agentic-modus bepaalt hoe de interactie wordt afgehandeld:

  • Aan: Maakt geautomatiseerde interactie in meerdere stappen met hulpmiddelen mogelijk, waarbij de volledige workflow (stap 1-8) automatisch wordt uitgevoerd. Wanneer het AI-model bepaalt dat er hulpmiddelen nodig zijn om aan het verzoek te voldoen, roept het automatisch de juiste gereedschappen op en gaat het verder met de verwerking tot het eindresultaat is behaald. Het model kan naar behoefte meerdere rondes met gereedschapsoproepen uitvoeren, waarbij elke ronde voortbouwt op de resultaten van eerdere gereedschapsuitvoeringen. Deze modus is bedoeld voor complexe taken waarvoor interactie met meerdere tools vereist is, zoals het analyseren van gegevens in meerdere tabellen, het genereren van rapporten of het uitvoeren van bewerkingen in meerdere stappen.

  • Uit: Voert één interactie uit met het AI-model, voert alleen stap 1-3 uit en stopt na de eerste oproep van het gereedschap. Als het model bepaalt dat er gereedschappen nodig zijn, stopt de scriptstap en wordt de gereedschapsoproepinformatie geretourneerd in Gereedschapsoproepen van model in plaats van de gereedschappen automatisch uit te voeren. Deze modus is handig voor het opsporen van fouten in de interactie tussen hulpprogramma's, het begrijpen van de gereedschappen die het model wil gebruiken of wanneer u handmatige controle wilt over de uitvoering van het gereedschap. U kunt de gereedschapsoproepen onderzoeken en vervolgens beslissen of u deze handmatig wilt uitvoeren of de aanpak wilt wijzigen.

De informatiestroom tussen deze scriptstap en het model zorgt ervoor dat gevoelige gegevens veilig blijven terwijl AI-gestuurde functionaliteit wordt ingeschakeld. Het model ontvangt alleen de informatie die expliciet wordt verstrekt door middel van prompts, instructies en resultaten van het gereedschap. Het heeft geen directe toegang tot uw FileMaker-database of bestanden. Gereedschapsoproepen worden uitgevoerd binnen de gecontroleerde FileMaker-omgeving, zodat u volledige controle hebt over gegevenstoegang en -bewerkingen via FileMaker-accounts en -bevoegdheden terwijl u de analytische en redenerende mogelijkheden van het model benut.

Gereedschapsdefinities

Het gebruik van gereedschap (ook wel functieaanroepen genoemd door sommige modelproviders) stelt het model in staat terug te bellen naar uw FileMaker Pro-app om iets te doen of te leveren dat het model nodig heeft om zijn definitieve reactie te genereren. In de agentische modus kan het model meerdere gereedschappen herhaaldelijk oproepen totdat het klaar is. In de optie Gereedschapsdefinities kunt u de volgende hulpmiddelen definiëren:

  • execute_sql: Een vooraf gedefinieerd hulpprogramma dat de opgegeven SQL-query uitvoert en in staat is een SQL-instructie uit te voeren die door het model wordt doorgegeven, op dezelfde manier als de scriptstap Voer SQL-query uit met natuurlijke taal scriptstap.

  • retrieve_image: een vooraf gedefinieerd hulpprogramma waarmee een afbeelding wordt opgehaald uit het containerveld dat is opgegeven door een SQL-query, tabelnaam en veldnaam van de container.

  • Aangepaste functies: Alle aangepaste functies die in uw bestand zijn gedefinieerd. Zie Eigen functies gebruiken.

Gereedschapsdefinities worden gespecificeerd met de JSON-indeling die door de modelprovider is vereist. In het algemeen is de definitie een matrix van objecten waarbij elk de naam van een hulpmiddel specificeert, een gedetailleerde beschrijving van wat het hulpmiddel doet en welke regels het model moet volgen bij het gebruik ervan, en voor elke invoerparameter de naam, het gegevenstype en de beschrijving. De beschrijvingen moeten zo gedetailleerd zijn als nodig is om ervoor te zorgen dat het model het gereedschap betrouwbaar kan gebruiken. Als u de vooraf gedefinieerde hulpmiddelen gebruikt, begin dan met de onderstaande definities. Wijzig deze indien nodig om optimale resultaten te verkrijgen voor de modellen die u gebruikt.

Om u te helpen bij het opsporen van fouten in uw gereedschapsdefinities, stelt u de optie Gereedschapsoproepen van model in op een veld of variabele waar u kunt zien hoe en of het model de gereedschappen noemt. Dit kan helpen onthullen wat u mogelijk moet toevoegen of wijzigen in de beschrijvingen die u in de apparaatdefinities opgeeft.

Raadpleeg de documentatie van de modelprovider voor de specifieke JSON-indeling die wordt gebruikt voor definities van tools en aanroepen van tools, bijvoorbeeld Anthropic, Cohere en OpenAI.

execute_sql

Functienaam

execute_sql

 

Functiebeschrijving

Respond to the user’s questions by executing the appropriate SQL query using this function. Strictly follow these rules:\r 1. The input should be a fully formed SQL query.\r2. Perform separate SQL instead of one nested SQL.\r3. Escaping special characters for SQL query.\r 4. If the result of the toolCall is a raw string that reads 'empty' or 'null', the answer should contain the quoted raw string, which is case sensitive.\r 5. Convert the user’s request into an SQL query using standard SQL syntax only. Ensure that table names and field names match exactly as they appear in the database schema.

 

Parameternaam

sql_query

 

Parameterbeschrijving

Generate a fully formed SQL query based on following rules:\r 1. Enclose all table and field names in double quotes.\r2. Format dates as \"DATE 'YYYY-MM-DD'\", times as \"TIME 'HH:MM:SS'\" and timestamps as \"TIMESTAMP 'YYYY-MM-DD HH:MM:SS'\".\r3. Return queries in plain text (not JSON).\r 4. Use \"FETCH FIRST n ROW ONLY\" instead of \"LIMIT\".\r 5. Support single queries only.\r 6. No semicolon is needed at the end of SQL query.\r 7. Don't generate nested SQL queries.\r 8. Use \"LIKE\" instead of \"ILIKE\".\r 9. Houd alle vergelijkingen hoofdlettergevoelig.\r 10. Do not include fields that are not included in the question.\r 11. Use unquoted ROWID in queries.\r 12. Only utilize the following database schema:\r

Voeg het schema dat u wilt gebruiken aan het einde van deze beschrijving toe. Geef het schema op in Data Definition Language (DDL) zoals geretourneerd door de GetTableDDL functie voor de voorvallen die u wilt opnemen in de tabel.

 

Retourneert: Het resultaat van de SQL-query als een tekenreeks.

retrieve_image

Functienaam

retrieve_image

 

Functiebeschrijving

Deze functie MOET worden aangeroepen wanneer de gebruiker vraagt om beeldgerelateerde gegevens, zoals foto's, profielfoto's, avatars of een visuele voorstelling die in de database is opgeslagen. Gebruik dit om beeldgegevens op te halen door een SQL-query samen te stellen die de ROWID (niet-aangehaald) van de relevante rij retourneert. Geef dit altijd de voorkeur boven andere functies voor het ophalen van afbeeldingen.

 

Naam parameter 1

sql_query

 

Beschrijving parameter 1

Een SQL-query die wordt gebruikt om de ROWID van de rij met de gewenste afbeelding te vinden. Voorbeeld: SELECT ROWID FROM \"Contacten\" WHERE \"Achternaam\" = 'Smith'. \r\r gebruik alleen het volgende databaseschema:\r

Voeg het schema dat u wilt gebruiken aan het einde van deze beschrijving toe. Geef het schema op in Data Definition Language (DDL) zoals geretourneerd door de GetTableDDL functie voor de voorvallen die u wilt opnemen in de tabel.

 

Naam parameter 2

tabel

 

Beschrijving parameter 2

De naam van de tabel met het afbeeldingsveld.

 

Naam parameter 3

veld

 

Beschrijving parameter 3

Het veld waar de afbeelding wordt opgeslagen.

 

Retourneert: JSON-gegevens in de volgende indeling, die de afbeelding bevatten als een Base64-gecodeerde string.

Kopiëren
[
  {
    "data": "/9j/4AAQ...//2Q=="
  }
]

Eigen functies

Volg deze richtlijnen voor apparaatdefinities om aangepaste functies aan te roepen:

  • Voor de functie:

    • Gebruik in de sleutel naam exact de naam van de aangepaste functie zoals gedefinieerd in het dialoogvenster aangepaste functie bewerken.

    • Geef in de sleutel beschrijving een gedetailleerde beschrijving van wat de aangepaste functie doet en welke regels het model moet volgen bij het gebruik ervan.

  • Voor parameters:

    • Definieer precies hetzelfde aantal parameters en in dezelfde volgorde als de parameters die zijn gedefinieerd in het dialoogvenster aangepaste functie bewerken. De parameternamen hoeven niet hetzelfde te zijn.

    • Geef in de sleutel beschrijving een gedetailleerde beschrijving van wat het model moet bieden in de parameter.

    • Stel de waarde van de sleutel type in op "tekenreeks" (parameters worden altijd behandeld als tekst).

Opmerkingen 

  • Veelvoorkomende foutberichten zijn "geen gereedschapsoproepen aanwezig voor de prompt" wanneer het model niet kan bepalen welke gereedschappen moeten worden gebruikt, en "functie niet gevonden" wanneer een gereedschapsdefinitie verwijst naar een aangepaste functie die niet bestaat.

Voorbeeld 1 

Hiermee configureert u een AI-account, gaat u naar de indeling Contacten en geeft u een dialoogvenster weer waarin de gebruiker een vraag kan invoeren. Met de scriptstap Antwoord genereren van model worden vervolgens de prompt en de recente berichtgeschiedenis naar het model verzonden en het resultaat naar het veld antwoord gestreamd. Voor een eenvoudige vraag-en-antwoord-interactie zoals deze, is de Agentic-modus niet geselecteerd. Om de context met het model te behouden tijdens de huidige FileMaker-clientsessie, worden in de scriptstap de meest recente 10 berichten opgeslagen in de globale variabele $$Messages via de optie Berichtgeschiedenis opslaan op. Via de optie Berichten stuurt de scriptstap de waarde van de variabele $$Messages naar het model wanneer dit script vervolgens in dezelfde sessie wordt uitgevoerd. Omdat de optie Gereedschapsdefinities niet wordt gebruikt, kan het model geen vragen over uw gegevens beantwoorden.

Kopiëren
AI-account configureren [ Accountnaam: "mijn-account" ; Modelprovider: OpenAI ; API-sleutel: Global::API_Key ] 

Ga naar lay-out [ "Contacten" (Contacten) ]

Aangepast dialoogvenster tonen [ "Vraag invoeren" ; $UserPrompt ]

Antwoord genereren van model [ Accountnaam: "mijn-account" ; Model: Global::ModelName ; Gebruikersprompt: $UserPrompt ; Antwoord: Contacts::Response ; Berichten: $$Messages ; Berichtgeschiedenis opslaan op: $$Messages ; Berichtgeschiedenis aantal: 10 ; Stream ]

Voorbeeld 2 

Hiermee configureert u een AI-account, gaat u naar de indeling Contacten en stuurt u vervolgens een prompt naar het model waarin u wordt gevraagd naar gegevens in de tabel Contacten. Dit model maakt gebruik van gereedschappen om een reactie te genereren. Omdat er maximaal 10 berichten worden opgeslagen via $$Messages in het globaalveld Berichten, blijft de context behouden in de FileMaker-clientsessies.

Kopiëren
AI-account configureren [ Accountnaam: "mijn-account" ; Modelprovider: OpenAI ; API-sleutel: Global::API_Key ] 

Ga naar lay-out [ "Contacten" (Contacten) ]

Variabele instellen [ $Instructions ; Waarde: "U bent een behulpzame assistent die kan zoeken database informatie. Geef altijd duidelijke, opgemaakte antwoorden.” ]

Variabele instellen [ $UserPrompt ; "Hoeveel contacten hebben we van Acme Anvils, en wat zijn hun namen en e-mailadressen? Voeg een sterretje toe aan de contactpersonen in een stad waar we een verkoopkantoor hebben.” ]

Respons genereren van Model [ Accountnaam: "mijn-account" ; Model: Global::ModelName ; Gebruikersprompt: $UserPrompt ; Antwoord: Contacts::Response ; Gereedschapsoproepen van model: $$ToolCalls ; Instructies: $Instructions ; Berichten: Global::Messages ; Berichtgeschiedenis opslaan op: $$Messages ; Berichtgeschiedenis aantal: 10 ; Gereedschapsdefinities: Global::ToolDefinitions ; Stream ]

Veld instellen [ Global::Messages ; $$Messages ]

Het veld ToolDefinitions bevat het volgende met behulp van de JSON-indeling voor OpenAI van de modelprovider:

Kopiëren
[
  {
    "function": {
      "description": "Respond to the user’s questions by executing the appropriate SQL query using this function. Strictly follow these rules:\r 1. The input should be a fully formed SQL query.\r2. Perform separate SQL instead of one nested SQL.\r3. Escaping special characters for SQL query.\r 4. If the result of the toolCall is a raw string that reads 'empty' or 'null', the answer should contain the quoted raw string, which is case sensitive.\r 5. Convert the user’s request into an SQL query using standard SQL syntax only. Ensure that table names and field names match exactly as they appear in the database schema.",
        "name": "execute_sql",
        "parameters": {
          "properties": {
            "sql_query": {
              "description": "Generate a fully formed SQL query based on following rules:\r 1. Enclose all table and field names in double quotes.\r2. Format dates as \"DATE 'YYYY-MM-DD'\", times as \"TIME 'HH:MM:SS'\" and timestamps as \"TIMESTAMP 'YYYY-MM-DD HH:MM:SS'\".\r3. Return queries in plain text (not JSON).\r 4. Use \"FETCH FIRST n ROW ONLY\" instead of \"LIMIT\".\r 5. Support single queries only.\r 6. No semicolon is needed at the end of SQL query.\r 7. Don't generate nested SQL queries.\r 8. Use \"LIKE\" instead of \"ILIKE\".\r 9. Houd alle vergelijkingen hoofdlettergevoelig.\r 10. Do not include fields that are not included in the question.\r 11. Use unquoted ROWID in queries.\r 12. Only utilize the following database schema:\rCREATE TABLE \"Contacts\" (\r\"First Name\" varchar(255),\r\"Last Name\" varchar(255),\r\"Email\" varchar(255),\r\r\"City\" varchar(255),\r\"Company\" varchar(255)\r);\r\r",
              "type": "string"
            }
          },
          "type": "object",
          "required": ["sql_query"]
        }
      },
      "type": "function"
  },
  {
    "function": {
      "description": "Controleer of ons bedrijf een verkoopkantoor in een bepaalde plaats heeft. Als dit het geval is, retourneert deze functie 'ja'; anders wordt 'nee' geretourneerd.”,
"name": "CityHasSalesOffice",
        "parameters": {
          "properties": {
            "city": {
              "description": "De naam van een plaats",
              "type": "string"
            }
          },
          "type": "object",
          "required": ["city"]
        }
      },
      "type": "function"
  }
]

Gebruik voor execute_sql de hierboven gegeven functiebeschrijving en parameterbeschrijving. Gebruik in de parameter sql_query de bovenstaande beschrijving gevolgd door het schema voor de tabel Contacten.

De aangepaste functie CityHasSalesOffice retourneert "ja" of "nee", afhankelijk van het feit of de opgegeven stad een verkoopkantoor heeft.

Mogelijke reactie gestreamd naar het veld Antwoord:

Kopiëren
We hebben 4 contacten van Acme Anvils. Hier zijn hun namen, e-mailadressen en een sterretje dat aangeeft of ze zich in een stad met een verkoopkantoor bevinden:

1. Alea Marks, aleamarks165@example.com
2. Kelly Holden, kellyholden1361@example.com *
3. Kelsey Cummings, kelseycummings1396@example.com
4. Kuame Savage, kuamesavage7146@example.com

De variabele $$ToolCalls bevat verschillende aanroepen om_sql en CityHasSalesOffice uit te voeren.

Kopiëren
[
  {
    "index": 0,
    "id": "call_e7...",
    "type": "function",
    "function": {
      "name": "execute_sql",
      "arguments": "{\"sql_query\":\"SELECT COUNT(*) FROM \\\"Contacten\\\" WHERE \\\"Bedrijf\\\" = 'Acme Anvils'\"}"
    }
  },
  {
    "index": 0,
    "id": "call_o0...",
    "type": "function",
    "function": {
      "name": "execute_sql",
      "arguments": "{\"sql_query\":\"SELECT \\\"Voornaam\\\", \\\"Achternaam\\\", \\\"E-mailadres\\\", \\\"Plaats\\\" FROM \\\"Contacten\\\" WHERE \\\"Bedrijf\\\" = 'Acme Anvils'\"}"
    }
  },
  {
    "index": 0,
    "id": "call_ev...",
    "type": "function",
    "function": {
      "name": "CityHasSalesOffice",
      "arguments": "{\"city\": \"Onitsha\"}"
    }
  },
  {
    "index": 1,
    "id": "call_IC...",
    "type": "function",
    "function": {
      "name": "CityHasSalesOffice",
      "arguments": "{\"city\": \"Berlijn\"}"
    }
  },
  {
    "index": 2,
    "id": "call_Pw...",
    "type": "function",
    "function": {
      "name": "CityHasSalesOffice",
      "arguments": "{\"city\": \"Saint-Malo\"}"
    }
  },
  {
    "index": 3,
    "id": "call_Uy...",
    "type": "function",
    "function": {
      "name": "CityHasSalesOffice",
      "arguments": "{\"city\": \"Wanneroo\"}"
    }
  }
]