Chat-voltooiingen
Genereer chatreacties voor meer dan 100 modellen vanuit één API. Drop-in compatibel met OpenAI Chat-voltooiingen, antropische berichten en antropische reacties.
Authenticatie
Voor elk verzoek is een Bearer-token nodig (uw Airforce API-sleutel). Het antropische x-api-key header wordt ook geaccepteerd op /v1/messages voor SDK-compatibiliteit.
Authorization: Bearer sk-air-YOUR_API_KEY
# alt for /v1/messages:
x-api-key: sk-air-YOUR_API_KEYPOST /v1/chat/completions
OpenAI-compatibele chatvoltooiingen. Werkt samen met de ambtenaar openai SDK door te overschrijven base_url naar https://api.airforce/v1.
https://api.airforce/v1/chat/completionsLichaam aanvragen
| Parameter | Type | Required | Description |
|---|---|---|---|
| model | string | Required | Model-ID. Gebruik GET /v1/models om beschikbare ID's te ontdekken. |
| messages | array | Required | Gespreksgeschiedenis. Elk item heeft { rol: "systeem" | "gebruiker" | "assistent" | "gereedschap", inhoud }. Inhoud is een string of een array van inhoudsblokken (visie, zie hieronder). |
| max_tokens | integer | Optional | Maximaal aantal tokens dat moet worden gegenereerd. Gemaximeerd op de max_output_tokens van het model. |
| temperature | float | Optional | Bemonsteringstemperatuur, 0–2. Lager is deterministischer. De standaardinstelling is afhankelijk van de upstreamprovider. |
| top_p | float | Optional | Kernbemonstering. Gebruik temperatuur of top_p, niet beide. |
| stream | boolean | Optional | Wanneer dit waar is, is het antwoord een stroom van door de server verzonden gebeurtenissen. Zie "Streamen" hieronder. |
| stream_options | object | Optional | { include_usage: boolean }. Wanneer include_usage waar is, draagt het laatste SSE-deel het gebruiksblok. |
| stop | string | array | Optional | Maximaal 4 stopsequenties. De generatie stopt zodra er één is geproduceerd. |
| tools | array | Optional | Functiedefinities die het model kan aanroepen. Zie "Gereedschapsoproep" hieronder. |
| tool_choice | string | object | Optional | "auto" (standaard), "none", of { type: "function", function: { name } } om een specifieke oproep te forceren. |
| response_format | object | Optional | { type: "json_object" } dwingt het model om geldige JSON uit te zenden. Genegeerd voor modellen die dit niet ondersteunen. |
| reasoning_effort | string | Optional | OpenAI o1/o3-stijl redeneerdiepte: "laag" | "gemiddeld" | "hoog". Zie "Redeneren en denken". |
| thinking | string | object | Optional | Cross-provider denken switch. "aan" | "uit" | "auto", of antropische vorm {type: "enabled", budget_tokens: N }. Zie "Redeneren en denken". |
| thinking_budget | integer | Optional | Tokenlimiet voor de redeneringstracering van het model (wanneer de provider er een openbaart). |
| ignore_defaults | boolean | Optional | Sla de opgeslagen standaardparameters per model van de gebruiker (geconfigureerd in het dashboard) voor dit verzoek over. |
Eenvoudig voorbeeld
curl https://api.airforce/v1/chat/completions \
-H "Authorization: Bearer sk-air-YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5.1-chat",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "What is the capital of France?"}
],
"max_tokens": 200,
"temperature": 0.7
}'Reactie vorm
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Optional | Stabiele voltooiings-ID, b.v. "chatcmpl-abc123". |
| object | string | Optional | "chat.completion" voor niet-gestreamd, "chat.completion.chunk" voor gestreamd. |
| created | integer | Optional | Unix-tijdstempel (seconden). |
| model | string | Optional | Echo van de gevraagde model-ID. |
| choices | array | Optional | Reeks voltooiingskandidaten: [{ index, bericht: { rol, inhoud, tool_calls? }, finish_reason }]. |
| choices[].finish_reason | string | Optional | "stoppen" | "lengte" | "tool_calls" | "inhoud_filter". |
| usage | object | Optional | { prompt_tokens, completion_tokens, total_tokens, completion_tokens_details?, prompt_tokens_details?, cache_creation_input_tokens?, cache_creation? }. completion_tokens_details.reasoning_tokens wordt ingesteld wanneer het model een reasoning-spoor produceerde. Cache-velden verschijnen wanneer de upstream prompt-caching info teruggaf: prompt_tokens_details.cached_tokens rapporteert cache-reads (OpenAI-standaard), cache_creation_input_tokens aggregeert writes, en cache_creation.ephemeral_5m_input_tokens / ephemeral_1h_input_tokens geven de TTL-splitsing. |
{
"id": "chatcmpl-abc123",
"object": "chat.completion",
"created": 1710000000,
"model": "gpt-5.1-chat",
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": "The capital of France is Paris."
},
"finish_reason": "stop"
}],
"usage": {
"prompt_tokens": 20,
"completion_tokens": 8,
"total_tokens": 28
}
}Redeneren & denken
Modellen die uitgebreid redeneren ondersteunen, leggen een denkspoor bloot naast de reguliere output. Airforce normaliseert drie verschillende upstream-conventies in één reeks canonieke parameters die overal werken.
Rekening supports_reasoning: true op een model in GET /v1/models om te weten welke ID's deze parameters accepteren.
Modellen met redeneerondersteuning
…· liveCanonieke parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| reasoning_effort | string | Optional | "laag" | "gemiddeld" | "hoog". OpenAI o1/o3, GPT-5 redeneermodellen en elke router die daarop in kaart brengt. |
| thinking | string | object | Optional | "aan" | "uit" | "auto" voor een snelle schakelaar, of { type: "enabled", budget_tokens: N } voor de antropisch-native vorm. Kaarten voor uitgebreid denken van Claude, Gemini-denken en DeepSeek-redeneren. |
| thinking_budget | integer | Optional | Het maximale aantal tokens dat het model mag besteden aan redeneren voordat zichtbare uitvoer wordt uitgezonden. Spiegelt budget_tokens. |
Redeneringsinspanning (OpenAI-stijl)
curl https://api.airforce/v1/chat/completions \
-H "Authorization: Bearer sk-air-YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "o3-mini",
"messages": [{"role": "user", "content": "Prove the Pythagorean theorem."}],
"reasoning_effort": "high"
}'Uitgebreid denken (antropische stijl)
curl https://api.airforce/v1/chat/completions \
-H "Authorization: Bearer sk-air-YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4.6",
"messages": [{"role": "user", "content": "Plan a 7-day Italy trip."}],
"thinking": {"type": "enabled", "budget_tokens": 4000}
}'Het redeneringsspoor zelf verschijnt in choices[0].message.reasoning_content (OpenAI-vorm) of zoals thinking blokkeert binnen content (Antropische vorm). Redeneringstokens worden gefactureerd en gerapporteerd usage.completion_tokens_details.reasoning_tokens.
Visie & beeldinvoer
Modellen met supports_vision: true accepteer afbeeldingen die zijn ingesloten als inhoudsblokken. Een openbare URL of een base64-gegevens-URL werkt; groottelimieten zijn afhankelijk van het stroomopwaartse model.
Modellen met zichtondersteuning
…· livecurl https://api.airforce/v1/chat/completions \
-H "Authorization: Bearer sk-air-YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5.1-chat",
"messages": [{
"role": "user",
"content": [
{"type": "text", "text": "What is in this image?"},
{"type": "image_url", "image_url": {"url": "https://example.com/cat.jpg"}}
]
}]
}'Gereedschap bellen
Modellen met supports_tools: true kan functies aanroepen die u definieert. Het model retourneert a tool_calls reeks; u voert de oproep uit en stuurt het resultaat vervolgens terug in a tool bericht.
Modellen met ondersteuning voor het oproepen van gereedschap
…· liveVerzoek
curl https://api.airforce/v1/chat/completions \
-H "Authorization: Bearer sk-air-YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5.1-chat",
"messages": [{"role": "user", "content": "What is the weather in Paris?"}],
"tools": [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get current weather for a location",
"parameters": {
"type": "object",
"properties": {
"location": {"type": "string", "description": "City name"}
},
"required": ["location"]
}
}
}],
"tool_choice": "auto"
}'Reactie met gereedschapsoproep
{
"id": "chatcmpl-abc123",
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": null,
"tool_calls": [{
"id": "call_1",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\"location\":\"Paris\"}"
}
}]
},
"finish_reason": "tool_calls"
}]
}Opvolging met gereedschapsresultaat
{
"model": "gpt-5.1-chat",
"messages": [
{"role": "user", "content": "What is the weather in Paris?"},
{
"role": "assistant",
"content": null,
"tool_calls": [{
"id": "call_1",
"type": "function",
"function": {"name": "get_weather", "arguments": "{\"location\":\"Paris\"}"}
}]
},
{"role": "tool", "tool_call_id": "call_1", "content": "{\"temp_c\": 14, \"sky\": \"cloudy\"}"}
]
}Streamen
Set stream: true om gedeeltelijke voltooiingen te ontvangen als door de server verzonden gebeurtenissen. Elke gebeurtenis is één JSON-stuk met dezelfde vorm als het niet-gestreamde antwoord, behalve message wordt vervangen door delta. De stroom eindigt met data: [DONE].
curl https://api.airforce/v1/chat/completions \
-H "Authorization: Bearer sk-air-YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5.1-chat",
"messages": [{"role": "user", "content": "Write a haiku about Berlin."}],
"stream": true,
"stream_options": {"include_usage": true}
}'Draad formaat
data: {"id":"chatcmpl-abc123","object":"chat.completion.chunk","created":1710000000,"model":"gpt-5.1-chat","choices":[{"index":0,"delta":{"role":"assistant"},"finish_reason":null}]}
data: {"id":"chatcmpl-abc123","object":"chat.completion.chunk","created":1710000000,"model":"gpt-5.1-chat","choices":[{"index":0,"delta":{"content":"Cold "},"finish_reason":null}]}
data: {"id":"chatcmpl-abc123","object":"chat.completion.chunk","created":1710000000,"model":"gpt-5.1-chat","choices":[{"index":0,"delta":{"content":"stone "},"finish_reason":null}]}
…
data: {"id":"chatcmpl-abc123","object":"chat.completion.chunk","created":1710000000,"model":"gpt-5.1-chat","choices":[{"index":0,"delta":{},"finish_reason":"stop"}],"usage":{"prompt_tokens":12,"completion_tokens":17,"total_tokens":29}}
data: [DONE]POST /v1/messages
Antropisch-compatibele berichten-API. Werkt samen met de ambtenaar @anthropic-ai/sdk door in te stellen baseURL naar https://api.airforce. Doorsturen naar OpenAI/Google/etc. transparant voor niet-Claude-modellen.
https://api.airforce/v1/messagesLichaam aanvragen
| Parameter | Type | Required | Description |
|---|---|---|---|
| model | string | Required | Model-ID (antropisch formaat of gerouteerde alias). |
| messages | array | Required | Elk item: { rol: "gebruiker" | "assistent", inhoud: string | matrix }. |
| max_tokens | integer | Required | Vereist door Anthropic. Tokenlimiet voor het antwoord. |
| system | string | array | Optional | Systeemprompt. Geef een array door van { type: "text", text, cache_control? } blokken om in de cache opgeslagen prefixsegmenten te markeren. Zie "Promptcaching". |
| temperature | float | Optional | 0–1. |
| top_p | float | Optional | Kernbemonstering. |
| top_k | integer | Optional | Beperk de bemonsteringspool tot top-K-tokens. |
| stop_sequences | array | Optional | Maximaal 4 stopsequenties. |
| stream | boolean | Optional | Indien waar, wordt er een SSE-gebeurtenisstroom in antropische stijl uitgezonden (zie "Streaming"). |
| tools | array | Optional | Antropische gereedschapsdefinities: { naam, beschrijving, input_schema }. Het antwoord kan tool_use-inhoudsblokken bevatten. |
| tool_choice | object | Optional | {type: "automatisch" | "elke" | "gereedschap", naam? }. |
| thinking | object | Optional | Antropisch uitgebreid denken: { type: "enabled", budget_tokens: N }. |
Voorbeeld
curl https://api.airforce/v1/messages \
-H "x-api-key: sk-air-YOUR_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4.6",
"max_tokens": 256,
"system": "You are a helpful assistant.",
"messages": [
{"role": "user", "content": "Hello, Claude!"}
]
}'Reactie vorm
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Optional | Bericht-ID, b.v. "msg_01ABCxyz". |
| type | string | Optional | Altijd "bericht". |
| role | string | Optional | Altijd "assistent". |
| content | array | Optional | Reeks inhoudsblokken: { type: "text" | "tool_use" | "denken", … }. |
| model | string | Optional | Echo van het gevraagde model. |
| stop_reason | string | Optional | "eind_bocht" | "max_tokens" | "stop_reeks" | "tool_gebruik". |
| usage | object | Optional | { input_tokens, output_tokens, cache_read_input_tokens?, cache_creation_input_tokens?, cache_creation? }. Cache-velden verschijnen wanneer prompt caching is gebruikt. cache_creation.ephemeral_5m_input_tokens en ephemeral_1h_input_tokens geven de write-splitsing per TTL. |
Streaming-evenementen
Anthropic SSE gebruikt benoemde gebeurtenissen in plaats van eenmalige JSON-brokken. Elk evenement heeft zowel een event: naam en een data: JSON-payload.
event: message_start
data: {"type":"message_start","message":{"id":"msg_01","role":"assistant","content":[],"model":"claude-sonnet-4.6","stop_reason":null,"usage":{"input_tokens":12,"output_tokens":1}}}
event: content_block_start
data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}
event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Hello"}}
event: content_block_stop
data: {"type":"content_block_stop","index":0}
event: message_delta
data: {"type":"message_delta","delta":{"stop_reason":"end_turn"},"usage":{"output_tokens":17}}
event: message_stop
data: {"type":"message_stop"}Snel cachen
Op /v1/messages bij Claude-modellen markeert u een voorvoegsel als in de cache opgeslagen door het door te geven system als een reeks blokken waar het in de cache opgeslagen segment zich in bevindt cache_control: { type: "ephemeral" }. Bij daaropvolgende verzoeken die met hetzelfde voorvoegsel beginnen, wordt het goedkopere cache-leestarief in rekening gebracht. Modellen met supports_caching: true in /v1/models ondersteunen dit.
Modellen met snelle caching
…· live{
"model": "claude-sonnet-4.6",
"max_tokens": 1024,
"system": [
{"type": "text", "text": "You are a senior staff engineer at Airforce."},
{
"type": "text",
"text": "<repository-snapshot>...</repository-snapshot>",
"cache_control": {"type": "ephemeral"}
}
],
"messages": [
{"role": "user", "content": "Where is rate limiting enforced?"}
]
}Hoe cache-tellingen worden gerapporteerd in de respons
Cache-tokentellingen worden doorgegeven in de native vorm van elk formaat, zodat SDK's (openai, @anthropic-ai/sdk, @google/genai) ze zonder aangepaste code lezen. Velden worden weggelaten wanneer de waarde nul is, waardoor niet-gecachte respons compact blijft.
/v1/chat/completions (OpenAI-vorm)
"usage": {
"prompt_tokens": 2104,
"completion_tokens": 147,
"total_tokens": 2251,
"prompt_tokens_details": { "cached_tokens": 1980 },
"cache_creation_input_tokens": 124,
"cache_creation": {
"ephemeral_5m_input_tokens": 124,
"ephemeral_1h_input_tokens": 0
}
}/v1/messages (Anthropic-vorm)
"usage": {
"input_tokens": 2104,
"output_tokens": 147,
"cache_read_input_tokens": 1980,
"cache_creation_input_tokens": 124,
"cache_creation": {
"ephemeral_5m_input_tokens": 124,
"ephemeral_1h_input_tokens": 0
}
}/v1beta/.../generateContent (Gemini-vorm)
"usageMetadata": {
"promptTokenCount": 2104,
"candidatesTokenCount": 147,
"totalTokenCount": 2251,
"cachedContentTokenCount": 1980
}Waar caching geldt
Expliciete cache_control-markers worden gehonoreerd op /v1/messages en /v1/chat/completions voor Claude-modellen — zet ze op system- of message-contentblokken. Veel andere providers (OpenAI-familie, DeepSeek, Gemini) cachen automatisch: je stuurt geen markers en ziet gewoon cached_tokens in het antwoord zodra een lang genoeg prefix wordt hergebruikt.
Cacheduur: 5 minuten of 1 uur
Een gecachet prefix leeft standaard 5 minuten en de timer vernieuwt bij elke hit. Voeg voor een langer levend prefix ttl: "1h" toe aan de marker. Het antwoord rapporteert elke TTL apart onder cache_creation.
"cache_control": { "type": "ephemeral", "ttl": "1h" }Voorbeeld: eerst write, dan read
Stuur exact hetzelfde verzoek twee keer (het cachingvoorbeeld hierboven). De eerste call die het prefix ziet betaalt een eenmalige cache-write; identieke calls binnen de TTL betalen de veel goedkopere cache-read.
Eerste call — cache-write (usage-fragment):
"usage": {
"input_tokens": 2104,
"output_tokens": 12,
"cache_creation_input_tokens": 1980,
"cache_read_input_tokens": 0
}Tweede identieke call binnen de TTL — cache-read:
"usage": {
"input_tokens": 2104,
"output_tokens": 12,
"cache_creation_input_tokens": 0,
"cache_read_input_tokens": 1980
}Limieten & kosten
- Claude vereist een minimaal cachebaar prefix (ongeveer 1024 tokens; meer voor sommige modellen). Kortere prefixen worden simpelweg niet gecachet.
- Tot 4 cache-breakpoints per verzoek, en het gecachete prefix moet byte-identiek zijn tussen calls — zelfs een wijziging van één teken mist de cache.
- Cache-writes kosten meer dan normale input (5m ≈ 1,25×, 1h ≈ 2×); reads kosten veel minder (≈ 0,1×). Zie de cacheprijzen per model op de prijspagina.
POST /v1/responses
OpenAI Responses-API oppervlak voor stateful conversaties. Dezelfde Bearer/x-api-key auth. Cache-tellingen verschijnen als input_tokens_details.cached_tokens (read) plus de platte cache_creation_input_tokens + cache_creation.ephemeral_* (writes) voor pariteit met /v1/chat/completions.
https://api.airforce/v1/responsesFouten
Airforce retourneert standaard HTTP-statuscodes en een uniforme foutenvelop voor beide eindpunten.
| Parameter | Type | Required | Description |
|---|---|---|---|
| 400 | invalid_request | Optional | Verkeerd opgemaakte JSON, ontbrekend verplicht veld, onbekend model. |
| 401 | authentication_error | Optional | Ontbrekende of ongeldige API-sleutel. |
| 403 | permission_error | Optional | Plan- of per-sleutelmachtigingen weigeren dit verzoek. |
| 429 | rate_limit | Optional | Verzoektarief of dagelijkse tokenlimiet overschreden. |
| 503 | upstream_error | Optional | Alle upstream-sleutels voor de aangevraagde provider zijn mislukt. |
{
"error": {
"message": "Model 'gpt-99' not found.",
"type": "invalid_request",
"param": "model",
"code": "model_not_found"
}
}Ontdek modellen
Bekijk de volledige lijst met model-ID's en hun capaciteitsvlaggen (visie, tools, redenering, caching, contextlengte, ...) op /docs/api/models.
curl https://api.airforce/v1/models \
-H "Authorization: Bearer sk-air-YOUR_API_KEY"