Værktøjer og struktureret uddata
Værktøjskald og JSON Schema-uddata på tværs af alle dialekter i kataloget, hvor routeren kun vælger modeller, der kan betjene dem.
Send OpenAI-listen tools og response_format, som du plejer. Stav oversætter dem til hver enkelt inferensleverandør, og når du ruter, medtages kun modeller, der understøtter dem.
Værktøjskald
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": "Hvad er totalbeløbet på 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)
Din applikation kører værktøjet. Tilføj assistentens besked, tilføj en tool-besked med resultatet, og kald igen:
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)
Tool-call-deltas streames som normalt.
| Parameter | Adfærd |
|---|---|
tools (type: function eller custom) | Oversættes til OpenAI-kompatible, Anthropic-, Google- og Mistral-modeller |
tool_choice | Overholdes på alle dialekter. På Anthropic-modeller sendes den sammen med tools, så den gør intet alene |
parallel_tool_calls | Kun OpenAI-kompatible modeller. Ellers: 400 med angivelse af parameteren |
allowed_tools | Kun OpenAI-kompatible modeller. Begrænser hvilke værktøjer der må kaldes uden at ændre tools-listen, så din promptcaching forbliver aktiv |
Værktøjer drevet af leverandøren (web_search, file_search, code_interpreter, …) | Fjernet og anført i X-Stav-Dropped-Params. Ingen leverandør på dette API kører dem |
Routing med værktøjer
Når model er auto eller en router, vil afsendelse af tools begrænse kandidatgruppen til modeller, der understøtter værktøjskald. Kandidater til automatisk skift opfylder samme regel.## Struktureret uddata
response_format accepterer:
{"type": "text"} # standard
{"type": "json_object"} # enhver gyldig JSON
{"type": "json_schema", "json_schema": {...}} # følger skemaet, kun strict
{"type": "grammar"} (regex eller EBNF) giver en 400 unsupported_parameter. Ingen inferensleverandør på Stav tilbyder dette. For et fast sæt etiketter skal du bruge json_schema med en enum.
JSON Schema
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 skal være true. En manglende eller false værdi afvises med en 400: Et skema, der kun håndhæves nogle gange, giver dig ingen garanti. Hvis du vil have løs JSON, skal du bruge json_object og selv validere.
Support efter dialekt
json_object | json_schema | |
|---|---|---|
| OpenAI-kompatibel | Ja | Ja |
| Mistral | Ja | Ja |
| Ja | Ja | |
| Anthropic | Nej — 501, brug json_schema | Ja (indbygget struktureret uddata) |
Routering med skemaer
json_schema begrænser routering til modeller med support for struktureret uddata. json_object begrænser den til modeller med en JSON-tilstand eller struktureret uddata.
grammar
Forespørgselsskemaet accepterer også {"type": "grammar", ...} (regex eller EBNF). Ingen inferensleverandør i kataloget understøtter det i dag, så det returnerer 501. Brug json_schema eller en enum i et skema i stedet.
Kombination af værktøjer, skemaer og ræsonnering
resp = client.chat.completions.create(
model="auto",
messages=messages,
tools=tools,
response_format={"type": "json_schema", "json_schema": schema},
reasoning_effort="medium",
)
Med auto overvejer routeren kun modeller, der understøtter alle tre. Se Ræsonnering.
Når en egenskab kræver et andet API
Nogle modeller understøtter en egenskab på én leverandørs API, men ikke på et andet. For eksempel kan en model acceptere værktøjer på Chat Completions kun med reasoning_effort: "none", men med ethvert niveau på leverandørens Responses-API.
Stav måler dette per leverandørendepunkt og per API og verificerer det med en rigtig forespørgsel, før det bruges. Når din forespørgsel kræver en egenskab, som det naturlige API ikke kan levere med dine parametre, sender Stav den til det API på samme endepunkt, der kan:
- Vi ændrer aldrig en parameter, du har sendt. Vi flytter aldrig forespørgslen til et andet endepunkt eller en anden leverandør.
X-Stav-Upstream-Surfaceangiver det API, der betjente forespørgslen, og Dit arbejdsområde → Overvåg → Forespørgselslog viser én linje for den.- Svaret kommer tilbage i det format, du bad om.
- Når leverandøren betjener forespørgslen gennem sit Responses-API, beder Stav den om ikke at opbevare noget (
store: false).
Hvis intet API på endepunktet kan levere det med dine parametre, afvises forespørgslen med 400 capability_unreachable. param angiver parameteren, og meddelelsen fortæller, hvilke værdier der virker. Se Fejl.
Ræsonnering over flere runder med værktøjer. Når en runde blev betjent gennem Responses-API'et, indeholder assistentens besked stav_reasoning_state (på /v1/messages er det signature fra en thinking-blok; på /v1/responses er det encrypted_content fra et reasoning-element). Send beskeden uændret tilbage i næste runde, så fortsætter modellen sin ræsonnering. Tilstanden er uigennemsigtig og signeret, virker kun på det samme leverandørendepunkt og bliver aldrig opbevaret eller logget. Hvis din klient fjerner den, sker der ingen fejl; modellen starter blot sin ræsonnering forfra.
Gemini-tankesignaturer. Gemini 3-modeller signerer hvert funktionskald og kræver signaturen tilbage i næste runde. På /v1/chat/completions findes den på værktøjskaldet under extra_content.google.thought_signature, præcis som Google sender den. På /v1/messages og /v1/responses findes den i den samme tilstand. I begge tilfælde: send assistentens runde uændret tilbage. Hvis en signatur går tabt, virker forespørgslen stadig; Google springer så blot sit tjek over for det funktionskald, hvilket kan give en lavere kvalitet i svaret.
Promptcaching
cache_control-markører på beskeder, værktøjer eller systemprompten overholdes på Anthropic-modeller, både på /v1/chat/completions og /v1/messages. På alle andre dialekter har de ingen effekt og giver ingen fejl. OpenAI, xAI og Mistral cacher præfikser på egen hånd.
Cachelæsninger vises som usage.prompt_tokens_details.cached_tokens, en del af prompt_tokens, ikke en tilføjelse til det.
Andre API'er
/v1/messages— Anthropictoolsmedinput_schemafungerer på alle modeller. Anthropic-serverværktøjer udelades og navngives iX-Stav-Dropped-Params, medmindre leverandørendepunktet selv betjener Messages-API'et (Claude-modeller), hvor forespørgslen videresendes uændret. Se Anthropic SDK-migrering./v1/responses— funktionsværktøjer fungerer på alle modeller. Værktøjer, der drives af leverandøren, fungerer kun, hvor leverandørendepunktet selv betjener Responses-API'et (OpenAI- og xAI-modeller), hvor forespørgslen videresendes uændret. Se OpenAI SDK-migrering.
Hvad Stav ikke tilbyder
- Ingen eksekvering af værktøjer på serversiden på de oversatte stier. Dine
toolser dine egne funktioner. - Ingen vector store eller rerank-endepunkt.
/v1/embeddingser tilgængelig til din egen behandlingskæde for hentning af data. Den eneste filupload er/v1/audio/transcriptions— lyd ind, tekst ud; det er ikke en vedhæftning til en runde i chatten. - Billedforståelse er understøttet. Send billedindholdsblokke; routeren begrænser kandidatgruppen til modeller med egenskaber til billedforståelse.