Verktøy og strukturerte utdata
Funksjonskall og utdata i JSON Schema-format i alle dialekter i katalogen, der routeren bare velger modeller som kan betjene dem.
Send OpenAI-listen tools og response_format slik du allerede gjør. Stav oversetter dem for hver inferensleverandør, og når du ruter, vurderes bare modeller som støtter dem.
Funksjonskall
import json
tools = [{
"type": "function",
"function": {
"name": "get_invoice",
"description": "Look up an invoice by number.",
"parameters": {
"type": "object",
"properties": {"invoice_no": {"type": "string"}},
"required": ["invoice_no"],
},
},
}]
messages = [{"role": "user", "content": "What's the total on INV-4471?"}]
resp = client.chat.completions.create(model="auto", messages=messages, tools=tools)
call = resp.choices[0].message.tool_calls[0]
print(call.function.name, call.function.arguments)
Applikasjonen din kjører verktøyet. Legg til assistentmeldingen, legg til en tool-melding med resultatet, og send en ny forespørsel:
messages.append(resp.choices[0].message)
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": json.dumps(lookup_invoice(call.function.arguments)),
})
final = client.chat.completions.create(model="auto", messages=messages, tools=tools)
Deltaer for verktøykall strømmes som normalt.
| Parameter | Virkemåte |
|---|---|
tools (type: function eller custom) | Oversettes for OpenAI-kompatible modeller og modeller fra Anthropic, Google og Mistral |
tool_choice | Støttes i alle dialekter. For Anthropic-modeller sendes den sammen med tools, så den gjør ingenting alene |
parallel_tool_calls | Bare for OpenAI-kompatible modeller. Ellers: 400 med navnet på parameteren |
allowed_tools | Bare for OpenAI-kompatible modeller. Begrenser hvilke verktøy som kan kalles uten å endre tools-listen, slik at promptbufferen holdes varm |
Verktøy drevet av leverandøren (web_search, file_search, code_interpreter, …) | Fjernes og føres opp i X-Stav-Dropped-Params. Ingen leverandør i dette API-et kjører dem |
Ruting med verktøy
Når model er auto eller en router, vil det å sende tools begrense kandidatene til modeller som støtter funksjonskall. Kandidater for automatisk bytte må oppfylle samme regel.
Strukturerte utdata
response_format godtar:
{"type": "text"} # standard
{"type": "json_object"} # all gyldig JSON
{"type": "json_schema", "json_schema": {...}} # i henhold til skjema, bare strict
{"type": "grammar"} (regex eller EBNF) gir 400 unsupported_parameter. Ingen inferensleverandør på Stav tilbyr dette. For et fast sett med etiketter, bruk json_schema med en enum.
JSON-skjema
resp = client.chat.completions.create(
model="auto",
messages=[{"role": "user", "content": contract_text}],
response_format={
"type": "json_schema",
"json_schema": {
"name": "clause_extraction",
"strict": True,
"schema": {
"type": "object",
"properties": {
"governing_law"
strict må være true. En manglende eller false verdi avvises med en 400-feil: et skjema som bare håndheves noen ganger, gir deg ingen garanti. Hvis du vil ha ustrukturert JSON, bruk json_object og valider selv.
Støtte etter dialekt
json_object | json_schema | |
|---|---|---|
| OpenAI-kompatibel | Ja | Ja |
| Mistral | Ja | Ja |
| Ja | Ja | |
| Anthropic | Nei – 501, bruk json_schema | Ja (innebygde strukturerte utdata) |
Ruting med skjemaer
json_schema begrenser ruting til modeller med støtte for strukturerte utdata. json_object begrenser det til modeller med JSON-modus eller strukturerte utdata.
grammar
Forespørselsskjemaet godtar også {"type": "grammar", ...} (regex eller EBNF). Ingen inferensleverandør i katalogen støtter dette i dag, så det gir 501. Bruk json_schema eller en enum i et skjema i stedet.
Kombinere verktøy, skjemaer og resonnering
resp = client.chat.completions.create(
model="auto",
messages=messages,
tools=tools,
response_format={"type": "json_schema", "json_schema": schema},
reasoning_effort="medium",
)
Med auto vurderer routeren bare modeller som støtter alle tre. Se Resonnering.
Når en egenskap krever et annet API
Noen modeller støtter en egenskap på ett leverandør-API, men ikke på et annet. For eksempel kan en modell godta verktøy på Chat Completions bare med reasoning_effort: "none", og med et hvilket som helst nivå på leverandørens Responses-API.
Stav måler dette per leverandørendepunkt og per API, og bekrefter det med en ekte forespørsel før vi bruker det. Når forespørselen din trenger en egenskap som det naturlige API-et ikke kan levere med parameterne dine, sender Stav den til det API-et på samme endepunkt som kan levere den:
- Vi endrer aldri en parameter du har sendt. Vi flytter aldri forespørselen til et annet endepunkt eller en annen leverandør.
X-Stav-Upstream-Surfaceoppgir navnet på API-et som betjente forespørselen, og Arbeidsområdet ditt → Overvåk → Forespørselslogg viser én linje for den.- Svaret kommer tilbake i det formatet du ba om.
- Når leverandøren betjener forespørselen gjennom sitt Responses-API, ber vi dem om å ikke lagre noe (
store: false).
Hvis ingen API-er på endepunktet kan levere dette med parameterne dine, avvises forespørselen med 400 capability_unreachable. param oppgir navnet på parameteren, og meldingen sier hvilke verdier som fungerer. Se Feil.
Resonnering over flere verktøyrunder. Når en runde ble betjent gjennom Responses-API-et, tar assistentmeldingen med seg stav_reasoning_state (på /v1/messages, signature i en thinking-blokk; på /v1/responses, encrypted_content i et reasoning-element). Send meldingen tilbake uendret i neste runde, så fortsetter modellen resonneringen. Tilstanden er skjult og signert, fungerer bare på det samme leverandørendepunktet, og blir aldri lagret eller loggført. Hvis klienten din fjerner den, avvises ikke forespørselen; modellen starter bare resonneringen på nytt.
Gemini-tankesignaturer. Gemini 3-modeller signerer hvert funksjonskall og vil ha signaturen tilbake i neste runde. På /v1/chat/completions ligger den på verktøykallet, under extra_content.google.thought_signature, slik Google sender den. På /v1/messages og /v1/responses ligger den inne i den samme tilstanden. I begge tilfeller: send assistentrunden tilbake uendret. Hvis en signatur går tapt, fungerer forespørselen likevel; Google hopper da over kontrollen sin for det funksjonskallet, noe som kan gi dårligere kvalitet på svaret.
Promptbufring
Markører for cache_control på meldinger, verktøy eller systemprompten respekteres på modeller fra Anthropic, både på /v1/chat/completions og /v1/messages. På alle andre dialekter har de ingen effekt og forårsaker ingen feil. OpenAI, xAI og Mistral bufrer prefikser på egen hånd.
Bufferlesing vises som usage.prompt_tokens_details.cached_tokens, som er en del av prompt_tokens, ikke et tillegg til det.
Andre API-er
/v1/messages— Anthropic-toolsmedinput_schemafungerer på alle modeller. Serververktøy fra Anthropic utelates og føres opp iX-Stav-Dropped-Params, med mindre leverandørendepunktet betjener Messages-API-et selv (Claude-modeller). Da videresendes forespørselen uendret. Se Migrering fra Anthropic-SDK-et./v1/responses— funksjonsverktøy fungerer på alle modeller. Verktøy drevet av leverandøren fungerer bare der leverandørendepunktet betjener Responses-API-et selv (OpenAI- og xAI-modeller). Da videresendes forespørselen uendret. Se Migrering fra OpenAI-SDK-et.
Hva Stav ikke tilbyr
- Ingen verktøykjøring på serversiden på de oversatte stiene. Dine
toolser dine funksjoner. - Ingen vektordatabase eller endepunkt for rerangering.
/v1/embeddingser tilgjengelig for din egen behandlingskjede for gjenfinning. Den eneste filopplastingen er/v1/audio/transcriptions— lyd inn, tekst ut; det er ikke et vedlegg til en runde i chatten. - Bilder som inndata støttes. Send innholdsblokker med bilder; rutingen begrenser kandidatgruppen til modeller med bildeforståelse.