Zakończenia czatu
Generuj odpowiedzi na czacie dla ponad 100 modeli za pomocą jednego interfejsu API. Drop-in kompatybilny z uzupełnianiem czatu OpenAI, wiadomościami antropicznymi i odpowiedziami antropicznymi.
Uwierzytelnianie
Każde żądanie wymaga tokena okaziciela (twój klucz API Airforce). Antropiczny x-api-key nagłówek jest również akceptowany /v1/messages dla kompatybilności SDK.
Authorization: Bearer sk-air-YOUR_API_KEY
# alt for /v1/messages:
x-api-key: sk-air-YOUR_API_KEYPOST /v1/chat/completions
Ukończenie czatu zgodne z OpenAI. Współpracuje z urzędnikiem openai SDK przez zastąpienie base_url Do https://api.airforce/v1.
https://api.airforce/v1/chat/completionsTreść żądania
| Parameter | Type | Required | Description |
|---|---|---|---|
| model | string | Required | Identyfikator modelu. Użyj GET /v1/models, aby odkryć dostępne identyfikatory. |
| messages | array | Required | Historia rozmów. Każdy wpis ma {rolę: "system" | "użytkownik" | "asystent" | "narzędzie", treść }. Treść to ciąg znaków lub tablica bloków treści (wizja, patrz poniżej). |
| max_tokens | integer | Optional | Maksymalna liczba tokenów do wygenerowania. Ograniczone do max_output_tokens modelu. |
| temperature | float | Optional | Temperatura pobierania próbek, 0–2. Niższy jest bardziej deterministyczny. Wartość domyślna zależy od dostawcy nadrzędnego. |
| top_p | float | Optional | Próbkowanie jądra. Użyj temperatury lub top_p, a nie obu. |
| stream | boolean | Optional | Jeśli ma wartość true, odpowiedzią jest strumień zdarzeń wysłanych przez serwer. Zobacz „Streaming” poniżej. |
| stream_options | object | Optional | {include_usage: wartość logiczna }. Gdy include_usage ma wartość true, końcowy fragment SSE zawiera blok użycia. |
| stop | string | array | Optional | Do 4 sekwencji zatrzymania. Generowanie zatrzymuje się, gdy tylko zostanie wyprodukowane. |
| tools | array | Optional | Definicje funkcji, które model może wywołać. Patrz „Wywoływanie narzędzi” poniżej. |
| tool_choice | string | object | Optional | „auto” (domyślnie), „brak” lub { wpisz: „funkcja”, funkcja: { nazwa } }, aby wymusić określone połączenie. |
| response_format | object | Optional | { type: "json_object" } wymusza na modelu emitowanie prawidłowego formatu JSON. Ignorowany w przypadku modeli, które go nie obsługują. |
| reasoning_effort | string | Optional | Głębokość rozumowania w stylu OpenAI o1/o3: „niska” | „średni” | "wysoki". Zobacz „Rozumowanie i myślenie”. |
| thinking | string | object | Optional | Zmiana sposobu myślenia między dostawcami. "na" | „wyłączone” | „auto” lub Anthropic-shape { type: „enabled”, Budget_tokens: N }. Zobacz „Rozumowanie i myślenie”. |
| thinking_budget | integer | Optional | Limit tokenów dla śladu rozumowania modelu (gdy dostawca go udostępnia). |
| ignore_defaults | boolean | Optional | Pomiń zapisane przez użytkownika domyślne parametry poszczególnych modeli (skonfigurowane w panelu kontrolnym) dla tego żądania. |
Podstawowy przykład
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
}'Kształt odpowiedzi
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Optional | Stabilny identyfikator ukończenia, np. „chatcmpl-abc123”. |
| object | string | Optional | „chat.completion” w przypadku transmisji niestrumieniowej, „chat.completion.chunk” w przypadku transmisji strumieniowej. |
| created | integer | Optional | Znacznik czasu Uniksa (sekundy). |
| model | string | Optional | Echo żądanego identyfikatora modelu. |
| choices | array | Optional | Tablica kandydatów do ukończenia: [{ indeks, wiadomość: { rola, treść, wywołania narzędzi? }, koniec_powód }]. |
| choices[].finish_reason | string | Optional | „przestań” | „długość” | „wywołania_narzędzi” | „filtr_treści”. |
| 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 jest ustawiane gdy model wygenerował ślad rozumowania. Pola cache pojawiają się gdy upstream zwrócił informacje o prompt-caching: prompt_tokens_details.cached_tokens raportuje odczyty cache (standard OpenAI), cache_creation_input_tokens agreguje zapisy, a cache_creation.ephemeral_5m_input_tokens / ephemeral_1h_input_tokens dają podział na TTL. |
{
"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
}
}Rozumowanie i myślenie
Modele obsługujące rozszerzone rozumowanie ujawniają ślad myślenia obok zwykłych wyników. Airforce normalizuje trzy różne konwencje wyższego szczebla w jeden zestaw parametrów kanonicznych, które działają wszędzie.
Sprawdzać supports_reasoning: true na modelu w GET /v1/models aby wiedzieć, które identyfikatory akceptują te parametry.
Modele ze wsparciem rozumowania
…· liveParametry kanoniczne
| Parameter | Type | Required | Description |
|---|---|---|---|
| reasoning_effort | string | Optional | „niski” | „średni” | "wysoki". Modele wnioskowania OpenAI o1/o3, GPT-5 i dowolny router, który na nie mapuje. |
| thinking | string | object | Optional | "na" | „wyłączone” | „auto” w celu szybkiego przełączania lub { type: „enabled”, budżet_tokens: N } w przypadku kształtu natywnego antropicznego. Mapy do rozszerzonego myślenia Claude'a, myślenia Bliźniąt i rozumowania DeepSeek. |
| thinking_budget | integer | Optional | Maksymalna liczba żetonów, które model może wydać na rozumowanie przed wyemitowaniem widocznego wyniku. Odzwierciedla budżet_tokens. |
Wysiłek rozumowania (w stylu OpenAI)
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"
}'Myślenie rozszerzone (w stylu antropicznym)
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}
}'Sam ślad rozumowania pojawia się w choices[0].message.reasoning_content (kształt OpenAI) lub jako thinking blokuje w content (Kształt antropiczny). Tokeny wnioskowania są rozliczane i raportowane usage.completion_tokens_details.reasoning_tokens.
Wprowadzanie wizji i obrazu
Modele z supports_vision: true akceptować obrazy osadzone jako bloki treści. Działa publiczny adres URL lub adres URL danych base64; limity rozmiaru zależą od modelu wyższego szczebla.
Modele ze wsparciem wzroku
…· 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"}}
]
}]
}'Wywołanie narzędzia
Modele z supports_tools: true może wywoływać zdefiniowane przez Ciebie funkcje. Model zwraca a tool_calls szyk; uruchamiasz połączenie, a następnie wysyłasz wynik z powrotem w formacie a tool wiadomość.
Modele z obsługą wywoływania narzędzi
…· liveWniosek
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"
}'Odpowiedź z wywołaniem narzędzia
{
"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"
}]
}Kontynuacja z wynikami narzędzia
{
"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\"}"}
]
}Transmisja strumieniowa
Ustawić stream: true aby otrzymać częściowe uzupełnienia jako zdarzenia wysłane przez serwer. Każde zdarzenie to jeden fragment JSON o tym samym kształcie, co odpowiedź niestrumieniowa, z wyjątkiem message zostaje zastąpiony przez delta. Strumień kończy się 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}
}'Format drutu
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
Interfejs API wiadomości zgodny z Anthropic. Współpracuje z urzędnikiem @anthropic-ai/sdk poprzez ustawienie baseURL Do https://api.airforce. Przekazuje do OpenAI/Google/etc. przejrzyste dla modeli innych niż Claude.
https://api.airforce/v1/messagesTreść żądania
| Parameter | Type | Required | Description |
|---|---|---|---|
| model | string | Required | Identyfikator modelu (alias w formacie antropicznym lub routingu). |
| messages | array | Required | Każdy wpis: { rola: "użytkownik" | "asystent", treść: string | tablica }. |
| max_tokens | integer | Required | Wymagane przez firmę Anthropic. Limit tokenu dla odpowiedzi. |
| system | string | array | Optional | Monit systemowy. Przekaż tablicę { type: "text", text, cache_control? } bloki, aby oznaczyć buforowane segmenty prefiksów. Zobacz „Szybkie buforowanie”. |
| temperature | float | Optional | 0–1. |
| top_p | float | Optional | Próbkowanie jądra. |
| top_k | integer | Optional | Ogranicz pulę próbkowania do tokenów z najwyższej półki. |
| stop_sequences | array | Optional | Do 4 sekwencji zatrzymania. |
| stream | boolean | Optional | Jeśli ma wartość true, emituje strumień zdarzeń SSE w stylu antropicznym (patrz „Streaming”). |
| tools | array | Optional | Definicje narzędzi antropicznych: { nazwa, opis, schemat_wejściowy }. Odpowiedź może zawierać bloki treści Tool_use. |
| tool_choice | object | Optional | {wpisz: „auto” | „dowolny” | "narzędzie", nazwa? }. |
| thinking | object | Optional | Rozszerzone myślenie antropiczne: { type: "enabled", budżet_tokens: N }. |
Przykład
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!"}
]
}'Kształt odpowiedzi
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Optional | Identyfikator wiadomości, np. „msg_01ABCxyz”. |
| type | string | Optional | Zawsze „wiadomość”. |
| role | string | Optional | Zawsze „asystent”. |
| content | array | Optional | Tablica bloków treści: { type: "text" | „użycie_narzędzia” | „myślenie”… }. |
| model | string | Optional | Echo żądanego modelu. |
| stop_reason | string | Optional | „koniec_zakrętu” | „max_tokens” | „sekwencja_zatrzymania” | „użycie_narzędzia”. |
| usage | object | Optional | { input_tokens, output_tokens, cache_read_input_tokens?, cache_creation_input_tokens?, cache_creation? }. Pola cache pojawiają się gdy użyto prompt cachingu. cache_creation.ephemeral_5m_input_tokens i ephemeral_1h_input_tokens dają podział zapisów na TTL. |
Wydarzenia strumieniowe
Anthropic SSE używa nazwanych zdarzeń zamiast jednorazowych fragmentów JSON. Każde wydarzenie ma zarówno event: imię i a data: Ładunek JSON.
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"}Natychmiastowe buforowanie
NA /v1/messages w przypadku modeli Claude zaznacz przedrostek jako zapisany w pamięci podręcznej poprzez przekazanie system jako tablica bloków, w których znajduje się buforowany segment cache_control: { type: "ephemeral" }. Kolejne żądania rozpoczynające się od tego samego prefiksu naliczają niższą stawkę za odczyt pamięci podręcznej. Modele z supports_caching: true W /v1/models wspierać to.
Modele z szybkim buforowaniem
…· 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?"}
]
}Jak liczniki cache są raportowane w odpowiedzi
Liczniki tokenów cache są przekazywane w natywnej formie każdego formatu, więc SDK (openai, @anthropic-ai/sdk, @google/genai) odczytują je bez niestandardowego kodu. Pola są pomijane gdy wartość wynosi zero, utrzymując odpowiedzi niecachowane szczupłymi.
/v1/chat/completions (kształt OpenAI)
"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 (kształt Anthropic)
"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 (kształt Gemini)
"usageMetadata": {
"promptTokenCount": 2104,
"candidatesTokenCount": 147,
"totalTokenCount": 2251,
"cachedContentTokenCount": 1980
}Gdzie działa cache
Jawne markery cache_control są honorowane na /v1/messages i /v1/chat/completions dla modeli Claude — umieść je na blokach treści system lub message. Wielu innych dostawców (rodzina OpenAI, DeepSeek, Gemini) cache’uje automatycznie: nie wysyłasz markerów i po prostu widzisz cached_tokens w odpowiedzi, gdy wystarczająco długi prefiks zostanie ponownie użyty.
Czas życia cache: 5 minut lub 1 godzina
Buforowany prefiks żyje domyślnie 5 minut, a licznik odświeża się przy każdym trafieniu. Aby prefiks żył dłużej, dodaj ttl: "1h" do markera. Odpowiedź raportuje każdy TTL osobno w cache_creation.
"cache_control": { "type": "ephemeral", "ttl": "1h" }Przykład: najpierw zapis, potem odczyt
Wyślij dokładnie to samo żądanie dwa razy (przykład cache powyżej). Pierwsze wywołanie widzące prefiks płaci jednorazowy zapis do cache; identyczne wywołania w obrębie TTL płacą znacznie tańszy odczyt z cache.
Pierwsze wywołanie — zapis do cache (fragment usage):
"usage": {
"input_tokens": 2104,
"output_tokens": 12,
"cache_creation_input_tokens": 1980,
"cache_read_input_tokens": 0
}Drugie identyczne wywołanie w obrębie TTL — odczyt z cache:
"usage": {
"input_tokens": 2104,
"output_tokens": 12,
"cache_creation_input_tokens": 0,
"cache_read_input_tokens": 1980
}Limity i koszt
- Claude wymaga minimalnego buforowalnego prefiksu (około 1024 tokenów; więcej w niektórych modelach). Krótsze prefiksy po prostu nie są buforowane.
- Do 4 punktów cache na żądanie, a buforowany prefiks musi być identyczny co do bajta między wywołaniami — nawet zmiana jednego znaku chybia cache.
- Zapisy do cache kosztują więcej niż zwykłe wejście (5m ≈ 1,25×, 1h ≈ 2×); odczyty kosztują znacznie mniej (≈ 0,1×). Ceny cache dla każdego modelu znajdziesz na stronie cennika.
POST /v1/responses
Powierzchnia OpenAI Responses-API dla konwersacji stanowych. Ta sama autoryzacja Bearer/x-api-key. Liczniki cache pojawiają się jako input_tokens_details.cached_tokens (odczyt) plus płaskie cache_creation_input_tokens + cache_creation.ephemeral_* (zapisy) dla parzystości z /v1/chat/completions.
https://api.airforce/v1/responsesBłędy
Airforce zwraca standardowe kody stanu HTTP i jednolitą kopertę błędów dla obu punktów końcowych.
| Parameter | Type | Required | Description |
|---|---|---|---|
| 400 | invalid_request | Optional | Źle sformułowany JSON, brak wymaganego pola, nieznany model. |
| 401 | authentication_error | Optional | Brakujący lub nieprawidłowy klucz API. |
| 403 | permission_error | Optional | Uprawnienia planu lub klucza odrzucają to żądanie. |
| 429 | rate_limit | Optional | Przekroczono częstotliwość żądań lub dzienny limit tokenów. |
| 503 | upstream_error | Optional | Wszystkie klucze nadrzędne dla żądanego dostawcy nie powiodły się. |
{
"error": {
"message": "Model 'gpt-99' not found.",
"type": "invalid_request",
"param": "model",
"code": "model_not_found"
}
}Odkryj modele
Zobacz pełną listę identyfikatorów modeli i ich flag możliwości (wizja, narzędzia, rozumowanie, buforowanie, długość kontekstu,…) na stronie /docs/api/models.
curl https://api.airforce/v1/models \
-H "Authorization: Bearer sk-air-YOUR_API_KEY"