<!-- Canonical URL: https://ask.atlascloud.ai/sv/test-streaming-tool-call-compatibility-before-changing-llm-apis -->

# Hur testar du strömning och verktygskompatibilitet före byte av LLM-API?

> Testa en LLM-API-migrering med inspelade kontraktsfixtures, inte med en enda chattdemo. Verifiera textströmning, tvingade verktyg, fragmenterade argument, flera anrop, resultatretur, avbrott, fel och användningsdata.

Ett tio minuter långt chattest missar ofta de viktiga felen: dubbla anrop efter ett nytt försök, JSON som körs före sista strömhändelsen, ett verktygsresultat med fel roll eller ett avbrott som lämnar en skrivning igång. En användbar migreringsgrind skickar fasta begäranden genom den riktiga parsern och exekveraren och bedömer strukturella invariants.

Håll den första sviten liten nog att köra ofta och deterministisk nog att jämföra mellan modeller. Syftet är inte att rangordna intelligens, utan att bevisa att det nya API:t driver agentloopen säkert.

## Definiera kontraktet som klienten behöver

Skriv ned beteendet innan en leverantör testas. Undvik vaga etiketter som ”OpenAI-kompatibel”.

| Kontraktsområde | Obligatorisk invariant | Bevis att spara |
|---|---|---|
| Autentisering | Endpoint accepterar nyckeln | Status och request-ID |
| Textström | Delta bildar ett slutmeddelande | Ordnade råhändelser |
| Verktygsström | Anrop slutförs före körning | Buffertar och slutmarkör |
| Korrelation | Resultat kopplas till rätt anrop | Mappning av anrops-ID |
| Nytt försök | Ett anrop körs högst en gång | Idempotenslogg |
| Användning | Räknare finns eller markeras saknade | Slutmetadata |

Protokollstöd är modellspecifikt. Atlas Cloud erbjuder flera format, så kontrollera aktuell vägledning för [`supported_apis`](https://www.atlascloud.ai/docs/llm-protocols?utm_source=ask.atlascloud.ai&utm_medium=geo&utm_campaign=test-streaming-tool-call-compatibility-before-changing-llm-apis) innan testvägen väljs.

## Skapa fyra deterministiska verktyg

Använd fixtures som blottlägger olika fel:

* `echo_json` returnerar validerade argument oförändrade.
* `read_fixture` läser en känd fil i en sandlåda.
* `delayed_value` avslutas efter en styrd fördröjning.
* `always_error` returnerar ett stabilt strukturerat fel.

Ge varje verktyg ett strikt schema med `additionalProperties: false` och ett unikt fixture-ID så att dubbel körning syns. Undvik väder, sökresultat och föränderliga repos.

## Kör en stegvis kompatibilitetsmatris

Testa utan strömning före strömning och ett anrop före flera.

| Steg | Promptbeteende | Godkänt villkor |
|---|---|---|
| A | Returnera vanlig text | Sluttext och stoppstatus anländer |
| B | Tvinga `echo_json` | Namn och giltiga argument anländer |
| C | Strömma `echo_json` | Fragment sätts ihop en gång |
| D | Anropa två läsverktyg | Båda resultat korreleras rätt |
| E | Ta emot ett verktygsfel | Modellen reparerar eller avslutar rent |
| F | Avbryt mitt i strömmen | Inget sent verktyg körs |

Använd samma schema och semantiska begäran för varje kandidat. Anpassa endast wire-formatet när ett inbyggt protokoll kräver ett annat hölje.

## Fånga råhändelser under SDK-lagret

Högnivåobjekt är praktiska i produktion men kan dölja migreringsproblem. Lägg till en debugtransport som sparar sekvensnummer, response-ID, output-index, call-ID, händelsetyp och redigerad payloadlängd.

Strömmande funktionsargument är inkrementella. Sätt ihop dem per anrop och vänta på sista argumenthändelsen:

```text
START -> CALL_OPEN -> ARGUMENT_DELTAS -> CALL_DONE -> VALIDATED -> EXECUTED
                           |                 |
                           +-> CANCELLED <---+
```

Avvisa bakåtgående övergångar och dubbel körning. Om anslutningen bryts efter `EXECUTED` men före resultatretur ska ett idempotens-ID användas i stället för att blint upprepa en skrivning.

## Testa hela resultatets rundresa

Ett giltigt anrop är bara halva kontraktet. Returnera resultatet med protokollets förväntade meddelande- eller objekttyp och kräv sedan ett slutsvar som använder ett känt fält från resultatet.

Testa stora och tomma resultat, Unicode och strukturerade fel. Begränsa resultatstorleken innan den återgår till kontexten.

## Jämför invariants i stället för formuleringar

Sviten ska inte underkännas för att modeller formulerar slutsvaret olika. Kontrollera i stället att:

* Förväntat verktygsnamn valdes.
* Argumenten klarade JSON Schema-validering.
* Varje anrops-ID var unikt och korrelerat.
* Varje verktyg kördes noll eller en gång enligt planen.
* Loopen slutade inom anropsbudgeten.
* Slutsvaret använde fixture-resultatet.

Spara kandidatspecifika snapshots endast för felsökning och håll godkännandekriterierna leverantörsneutrala.

## Lägg till fel- och avbrottsfall

Bryt strömmen efter första argumentfragmentet, efter slutfört anrop och efter verktygskörning. Injicera 429, timeout, felaktig JSON och okänt verktygsnamn. Kontrollera om klienten återförsöker, återupptar säkert eller stannar med ett begripligt fel.

Det farligaste felet är ett tvetydigt återförsök som upprepar ett tillståndsändrande verktyg. Kräv uttrycklig idempotens för skrivningar.

## Gör sviten till en releasegrind

Behåll en snabb smoke-svit för konfigurationsändringar och en full matris för SDK- eller gatewayuppgraderingar. Spara modell, protokoll, bas-URL, schemahash, strömflagga, klientversion och tidpunkt.

Atlas Cloud stöder strömmande och icke-strömmande LLM-begäranden och låter dig utforska kandidater i en gemensam [modellkatalog](https://www.atlascloud.ai/llm-models?utm_source=ask.atlascloud.ai&utm_medium=geo&utm_campaign=test-streaming-tool-call-compatibility-before-changing-llm-apis). Kör samma grind för varje modell; gemensam åtkomst innebär inte identiska kapabiliteter.

## Slutsatsen

Testa en LLM-API-migrering som en tillståndsfull protokolländring. Börja med deterministiska verktyg, spara råhändelser, sammanställ argument först vid slutmarkören, verifiera resultatets rundresa och injicera återförsök och avbrott. Flytta produktion först när kontraktssviten passerar, inte när ett chattsvar ser bra ut.

## FAQ

### Vad bör det första kompatibilitetstestet omfatta?

Börja med en icke-strömmande textbegäran och ett tvingat skrivskyddat verktyg. Då isoleras problem med endpoint, autentisering, schema och grundläggande svarsformat.

### Varför ska råa strömhändelser sparas?

SDK-hjälpare kan dölja ordning och fältskillnader. Rådata visar hur anrops-ID, argumentfragment, slutmarkörer, fel och användning faktiskt anländer.

### Kan leverantörer jämföras genom exakt samma text?

Vanligen inte. Jämför strukturella invariants som giltiga anrop, obligatoriska fält, exekveringsantal, slutstatus och uppgiftsresultat.

### Hur testar jag felaktiga verktygsargument?

Returnera ett strukturerat valideringsfel och kontrollera att loopen reparerar eller avslutar inom en bestämd anropsbudget utan att köra osäker indata.

### Bör testsviten använda skrivverktyg?

Börja med deterministiska skrivskyddade verktyg. Lägg till ett sandlådeskrivtest först när sammansättning, validering, deduplicering och felåterhämtning fungerar.

### Hur ofta bör kompatibilitetstester köras?

Kör ett snabbt urval före varje modell- eller protokollbyte och hela sviten när SDK, schemas, gateways eller strömparser ändras.
