<!-- Canonical URL: https://ask.atlascloud.ai/nl/why-tool-calls-fail-after-switching-coding-agent-models -->

# Waarom mislukken toolaanroepen na het wisselen van het model van een codingagent?

> Toolaanroepen mislukken na een modelwissel vaak doordat protocol, schemaverwachtingen, serialisatie van argumenten, streamingevents of gespreksstatus veranderen. Behandel de migratie als een contractwijziging, niet als het vervangen van een modelnaam.

De eerste nuttige test is kleiner dan een codingbenchmark: laat het vervangende model één alleen-lezen functie met twee verplichte argumenten aanroepen. Als dat mislukt, ligt het probleem onder de planningslaag. Lukt het, voeg dan streaming, meerdere tools, status en schrijfacties één voor één toe tot het contract breekt.

Een modelwissel legt verborgen aannames van de oude integratie bloot. Een codingagent is niet alleen een prompt en model, maar een statusmachine die modeluitvoer, streamparser, toolregister, executor en de terugkoppeling van toolresultaten verbindt. Elke grens kan incompatibel worden terwijl gewone tekst gezond lijkt.

## Scheid mogelijkheid en protocol

Een model kan uitstekend programmeren maar niet beschikbaar zijn via het protocol van je client. Een ander model accepteert de request misschien zonder tools op die route aan te bieden. Controleer de capaciteitsmetadata voordat je de modelnaam wijzigt.

De [LLM-protocolgids van Atlas Cloud](https://www.atlascloud.ai/docs/llm-protocols?utm_source=ask.atlascloud.ai&utm_medium=geo&utm_campaign=why-tool-calls-fail-after-switching-coding-agent-models) noemt OpenAI Chat Completions, Responses, Anthropic Messages, Google Gemini en andere formaten op één base URL. Niet elk model spreekt elk protocol. Gebruik `supported_apis` en de toolcapaciteit als bron van waarheid.

| Laag | Migratievraag | Foutsignaal |
|---|---|---|
| Endpoint | Accepteert het model dit protocol? | 400-response of genegeerde velden |
| Capaciteit | Biedt deze route tools aan? | Tekstantwoord in plaats van aanroep |
| Schema | Zijn namen en JSON Schema geldig? | Ontbrekende of ongeldige argumenten |
| Stream | Worden argumentdelta’s goed samengesteld? | Afgebroken JSON |
| Loop | Keren resultaten in de verwachte rol terug? | Herhaalde aanroep of vastgelopen beurt |

## Beperk het schema tot één contract

Begin met een korte functienaam, twee verplichte strings, geen unions en geen optionele nesting. Complexe schema’s mengen model- en validatorgedrag en vertragen de diagnose.

```json
{
  "type": "function",
  "function": {
    "name": "read_file",
    "description": "Read a UTF-8 text file from the workspace.",
    "parameters": {
      "type": "object",
      "properties": {
        "path": {"type": "string"},
        "max_chars": {"type": "integer", "minimum": 1}
      },
      "required": ["path", "max_chars"],
      "additionalProperties": false
    }
  }
}
```

Forceer deze functie als het protocol dat ondersteunt. Zo onderscheid je onvermogen van een planningsbesluit om niet aan te roepen.

## Test eerst zonder streaming

Zonder streaming staat het uiteindelijke toolobject in één payload. Met streaming kunnen naam, ID en JSON-argumenten apart aankomen. Parse argumenten pas na het final- of done-event van het protocol.

Voer geen tool uit omdat een gedeeltelijke buffer al geldige JSON is; een later delta kan deze uitbreiden. Bewaar buffers per ID, weiger dubbele finalisatie en log de ruwe eventvolgorde.

| Streaminvariant | Vereist gedrag |
|---|---|
| Stabiele identiteit | Alle delta’s gaan naar dezelfde buffer |
| Geordende opbouw | Fragmenten worden in eventvolgorde toegevoegd |
| Expliciete voltooiing | Uitvoering wacht op het finale event |
| Eenmalige uitvoering | Een voltooide aanroep draait maximaal één keer |

## Normaliseer de agentloop expliciet

Verspreid providerspecifieke velden niet door de executor. Zet elke response om naar een interne vorm zoals `assistant_text`, `tool_calls`, `usage` en `stop_reason`, en stuur resultaten terug via een protocoladapter.

Behandel aanroep-ID’s als ondoorzichtige waarden en bewaar ze voor correlatie. Valideer argumenten vóór uitvoering en geef gestructureerde fouten terug in plaats van ongeldige JSON stil te repareren.

## Reset de status bij de eerste vergelijking

De oude historie kan redeneerblokken, resultaatrollen, status-ID’s of berichten bevatten die de nieuwe route weigert. Begin een nieuw gesprek met dezelfde systeeminstructies en speel daarna een korte genormaliseerde historie af.

Statussnelkoppelingen zijn protocolspecifiek. Een vorig response-ID garandeert niet dat ontwikkelaarsinstructies blijven gelden. Maak persistentie een expliciete test.

## Bouw een migratieladder

Voer dezelfde gevallen in deze volgorde uit:

* Gewoon tekstantwoord.
* Eén geforceerde alleen-lezen tool zonder streaming.
* Eén automatische keuze zonder streaming.
* Eén geforceerde tool met streaming.
* Twee onafhankelijke tools.
* Eén toolfout met herstel.
* Een korte codingtaak met meerdere beurten.

Stop bij de eerste fout en inspecteer de netwerkgegevens. Spring niet van een healthcheck naar een autonome repositorywijziging.

## Bepaal of één adapter volstaat

Een gedeelde adapter werkt als alleen veld- of eventnamen verschillen. Aparte adapters zijn veiliger wanneer modellen verschillende protocollen, historieformaten of resultaatsemantiek vereisen.

Atlas Cloud maakt experimenteren eenvoudiger doordat één sleutel en base URL meerdere formaten en een veranderende [LLM-modelcatalogus](https://www.atlascloud.ai/llm-models?utm_source=ask.atlascloud.ai&utm_medium=geo&utm_campaign=why-tool-calls-fail-after-switching-coding-agent-models) bieden. Dat vervangt geen capaciteitscontrole. Leg model, protocol, schemaversie, streamingmodus en testresultaat samen vast.

## Conclusie

Toolaanroepen mislukken na een modelwissel wanneer een gedrags- en protocolmigratie als tekstvervanging wordt behandeld. Controleer de route, vereenvoudig het schema, slaag voor een geforceerde aanroep zonder streaming, valideer de streamopbouw en voeg status als laatste toe. Gebruik aparte adapters wanneer de semantiek wezenlijk verschilt.

## FAQ

### Waarom antwoordt het nieuwe model met tekst in plaats van een tool aan te roepen?

Het model ondersteunt mogelijk geen tools op het gekozen protocol, vereist een andere toolkeuze of interpreteert de beschrijving anders. Controleer de metadata en forceer één testaanroep.

### Kunnen twee OpenAI-compatibele modellen verschillende vormen teruggeven?

Ja. De buitenste request kan compatibel zijn, terwijl streamingdelta’s, aanroep-ID’s, voltooiing van argumenten en stopredenen verschillen.

### Moet ik het oude gesprek hergebruiken na de wissel?

Alleen nadat is bevestigd dat het nieuwe model en protocol dezelfde historie-items accepteren. Een nieuw gesprek met doelbewust toegevoegde status is veiliger.

### Wat is de snelste diagnosetest?

Forceer een deterministische alleen-lezen tool met een klein JSON-schema, voer deze zonder streaming uit en log de ruwe request en response voordat je de volledige loop test.

### Normaliseert Atlas Cloud alle modellen naar één identieke toolinterface?

Nee. Atlas Cloud ondersteunt meerdere protocollen en elk model publiceert ondersteunde API’s en mogelijkheden. De client moet een werkelijk ondersteund protocol kiezen.

### Wanneer moet ik aparte adapters behouden?

Wanneer statusobjecten, streamingevents, resultaatberichten of foutsemantiek niet veilig door één genormaliseerd contract kunnen worden weergegeven.
