Api.Airforce
API REFERENCE

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_KEY

POST /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.

POSThttps://api.airforce/v1/chat/completions

Treść żądania

ParameterTypeRequiredDescription
modelstringRequiredIdentyfikator modelu. Użyj GET /v1/models, aby odkryć dostępne identyfikatory.
messagesarrayRequiredHistoria 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_tokensintegerOptionalMaksymalna liczba tokenów do wygenerowania. Ograniczone do max_output_tokens modelu.
temperaturefloatOptionalTemperatura pobierania próbek, 0–2. Niższy jest bardziej deterministyczny. Wartość domyślna zależy od dostawcy nadrzędnego.
top_pfloatOptionalPróbkowanie jądra. Użyj temperatury lub top_p, a nie obu.
streambooleanOptionalJeśli ma wartość true, odpowiedzią jest strumień zdarzeń wysłanych przez serwer. Zobacz „Streaming” poniżej.
stream_optionsobjectOptional{include_usage: wartość logiczna }. Gdy include_usage ma wartość true, końcowy fragment SSE zawiera blok użycia.
stopstring | arrayOptionalDo 4 sekwencji zatrzymania. Generowanie zatrzymuje się, gdy tylko zostanie wyprodukowane.
toolsarrayOptionalDefinicje funkcji, które model może wywołać. Patrz „Wywoływanie narzędzi” poniżej.
tool_choicestring | objectOptional„auto” (domyślnie), „brak” lub { wpisz: „funkcja”, funkcja: { nazwa } }, aby wymusić określone połączenie.
response_formatobjectOptional{ type: "json_object" } wymusza na modelu emitowanie prawidłowego formatu JSON. Ignorowany w przypadku modeli, które go nie obsługują.
reasoning_effortstringOptionalGłębokość rozumowania w stylu OpenAI o1/o3: „niska” | „średni” | "wysoki". Zobacz „Rozumowanie i myślenie”.
thinkingstring | objectOptionalZmiana sposobu myślenia między dostawcami. "na" | „wyłączone” | „auto” lub Anthropic-shape { type: „enabled”, Budget_tokens: N }. Zobacz „Rozumowanie i myślenie”.
thinking_budgetintegerOptionalLimit tokenów dla śladu rozumowania modelu (gdy dostawca go udostępnia).
ignore_defaultsbooleanOptionalPomiń 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

ParameterTypeRequiredDescription
idstringOptionalStabilny identyfikator ukończenia, np. „chatcmpl-abc123”.
objectstringOptional„chat.completion” w przypadku transmisji niestrumieniowej, „chat.completion.chunk” w przypadku transmisji strumieniowej.
createdintegerOptionalZnacznik czasu Uniksa (sekundy).
modelstringOptionalEcho żądanego identyfikatora modelu.
choicesarrayOptionalTablica kandydatów do ukończenia: [{ indeks, wiadomość: { rola, treść, wywołania narzędzi? }, koniec_powód }].
choices[].finish_reasonstringOptional„przestań” | „długość” | „wywołania_narzędzi” | „filtr_treści”.
usageobjectOptional{ 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

· live

Parametry kanoniczne

ParameterTypeRequiredDescription
reasoning_effortstringOptional„niski” | „średni” | "wysoki". Modele wnioskowania OpenAI o1/o3, GPT-5 i dowolny router, który na nie mapuje.
thinkingstring | objectOptional"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_budgetintegerOptionalMaksymalna 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

· live
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": [
        {"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

· live

Wniosek

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.

POSThttps://api.airforce/v1/messages

Treść żądania

ParameterTypeRequiredDescription
modelstringRequiredIdentyfikator modelu (alias w formacie antropicznym lub routingu).
messagesarrayRequiredKażdy wpis: { rola: "użytkownik" | "asystent", treść: string | tablica }.
max_tokensintegerRequiredWymagane przez firmę Anthropic. Limit tokenu dla odpowiedzi.
systemstring | arrayOptionalMonit systemowy. Przekaż tablicę { type: "text", text, cache_control? } bloki, aby oznaczyć buforowane segmenty prefiksów. Zobacz „Szybkie buforowanie”.
temperaturefloatOptional0–1.
top_pfloatOptionalPróbkowanie jądra.
top_kintegerOptionalOgranicz pulę próbkowania do tokenów z najwyższej półki.
stop_sequencesarrayOptionalDo 4 sekwencji zatrzymania.
streambooleanOptionalJeśli ma wartość true, emituje strumień zdarzeń SSE w stylu antropicznym (patrz „Streaming”).
toolsarrayOptionalDefinicje narzędzi antropicznych: { nazwa, opis, schemat_wejściowy }. Odpowiedź może zawierać bloki treści Tool_use.
tool_choiceobjectOptional{wpisz: „auto” | „dowolny” | "narzędzie", nazwa? }.
thinkingobjectOptionalRozszerzone 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

ParameterTypeRequiredDescription
idstringOptionalIdentyfikator wiadomości, np. „msg_01ABCxyz”.
typestringOptionalZawsze „wiadomość”.
rolestringOptionalZawsze „asystent”.
contentarrayOptionalTablica bloków treści: { type: "text" | „użycie_narzędzia” | „myślenie”… }.
modelstringOptionalEcho żądanego modelu.
stop_reasonstringOptional„koniec_zakrętu” | „max_tokens” | „sekwencja_zatrzymania” | „użycie_narzędzia”.
usageobjectOptional{ 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.

POSThttps://api.airforce/v1/responses

Błędy

Airforce zwraca standardowe kody stanu HTTP i jednolitą kopertę błędów dla obu punktów końcowych.

ParameterTypeRequiredDescription
400invalid_requestOptionalŹle sformułowany JSON, brak wymaganego pola, nieznany model.
401authentication_errorOptionalBrakujący lub nieprawidłowy klucz API.
403permission_errorOptionalUprawnienia planu lub klucza odrzucają to żądanie.
429rate_limitOptionalPrzekroczono częstotliwość żądań lub dzienny limit tokenów.
503upstream_errorOptionalWszystkie 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"