Selesainya obrolan
Hasilkan respons obrolan di 100+ model dari satu API. Drop-in kompatibel dengan Penyelesaian Obrolan OpenAI, Pesan Antropis, dan Respons Antropis.
Otentikasi
Setiap permintaan memerlukan token Pembawa (kunci API Airforce Anda). Antropis x-api-key header juga diterima /v1/messages untuk kompatibilitas SDK.
Authorization: Bearer sk-air-YOUR_API_KEY
# alt for /v1/messages:
x-api-key: sk-air-YOUR_API_KEYPOST /v1/chat/completions
Penyelesaian Obrolan yang kompatibel dengan OpenAI. Bekerja dengan pejabat itu openai SDK dengan mengganti base_url ke https://api.airforce/v1.
https://api.airforce/v1/chat/completionsPermintaan tubuh
| Parameter | Type | Required | Description |
|---|---|---|---|
| model | string | Required | ID Model. Gunakan GET /v1/models untuk menemukan ID yang tersedia. |
| messages | array | Required | Riwayat percakapan. Setiap entri memiliki { peran: "sistem" | "pengguna" | "asisten" | "alat", konten }. Konten adalah string atau larik blok konten (visi, lihat di bawah). |
| max_tokens | integer | Optional | Jumlah maksimum token yang akan dihasilkan. Dibatasi pada max_output_tokens model. |
| temperature | float | Optional | Suhu pengambilan sampel, 0–2. Lebih rendah lebih deterministik. Defaultnya bergantung pada penyedia upstream. |
| top_p | float | Optional | Pengambilan sampel inti. Gunakan suhu atau top_p, jangan keduanya. |
| stream | boolean | Optional | Jika benar, responsnya adalah aliran Peristiwa yang Dikirim Server. Lihat "Streaming" di bawah. |
| stream_options | object | Optional | { include_usage: boolean }. Jika include_usage benar, potongan SSE terakhir membawa blok penggunaan. |
| stop | string | array | Optional | Hingga 4 urutan perhentian. Generasi berhenti segera setelah diproduksi. |
| tools | array | Optional | Definisi fungsi yang mungkin dipanggil oleh model. Lihat "Pemanggilan alat" di bawah. |
| tool_choice | string | object | Optional | "auto" (default), "none", atau { type: "function", function: { name } } untuk memaksa panggilan tertentu. |
| response_format | object | Optional | { type: "json_object" } memaksa model untuk memancarkan JSON yang valid. Diabaikan untuk model yang tidak mendukungnya. |
| reasoning_effort | string | Optional | Kedalaman penalaran gaya OpenAI o1/o3: "rendah" | "sedang" | "tinggi". Lihat "Penalaran & pemikiran". |
| thinking | string | object | Optional | Peralihan pemikiran lintas penyedia. "aktif" | "mati" | "otomatis", atau Bentuk antropis { type: "enabled", budget_tokens: N }. Lihat "Penalaran & pemikiran". |
| thinking_budget | integer | Optional | Batas token untuk jejak penalaran model (ketika penyedia memaparkannya). |
| ignore_defaults | boolean | Optional | Lewati parameter default per model yang disimpan pengguna (dikonfigurasi di dasbor) untuk permintaan ini. |
Contoh dasar
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
}'Bentuk respons
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Optional | ID penyelesaian yang stabil, mis. "obrolancmpl-abc123". |
| object | string | Optional | "chat.completion" untuk non-streaming, "chat.completion.chunk" untuk streaming. |
| created | integer | Optional | Stempel waktu Unix (detik). |
| model | string | Optional | Gema ID model yang diminta. |
| choices | array | Optional | Array kandidat penyelesaian: [{ indeks, pesan: { peran, konten, panggilan_alat? }, alasan_selesai }]. |
| choices[].finish_reason | string | Optional | "berhenti" | "panjang" | "alat_panggilan" | "konten_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 diatur ketika model menghasilkan jejak penalaran. Bidang cache muncul ketika upstream mengembalikan info prompt-caching: prompt_tokens_details.cached_tokens melaporkan pembacaan cache (standar OpenAI), cache_creation_input_tokens menggabungkan penulisan, dan cache_creation.ephemeral_5m_input_tokens / ephemeral_1h_input_tokens memberikan pembagian per 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
}
}Penalaran & pemikiran
Model yang mendukung penalaran yang diperluas memaparkan jejak pemikiran di samping keluaran reguler. Angkatan Udara menormalisasi tiga konvensi hulu yang berbeda menjadi satu set parameter kanonik yang dapat diterapkan di mana saja.
Memeriksa supports_reasoning: true pada model di GET /v1/models untuk mengetahui ID mana yang menerima parameter ini.
Model dengan dukungan penalaran
…· liveParameter kanonik
| Parameter | Type | Required | Description |
|---|---|---|---|
| reasoning_effort | string | Optional | "rendah" | "sedang" | "tinggi". OpenAI o1/o3, model penalaran GPT-5, dan router apa pun yang memetakannya. |
| thinking | string | object | Optional | "aktif" | "mati" | "auto" untuk peralihan cepat, atau { type: "enabled", budget_tokens: N } untuk bentuk Anthropic-native. Peta untuk pemikiran Claude yang diperluas, pemikiran Gemini, dan penalaran DeepSeek. |
| thinking_budget | integer | Optional | Token maksimum yang mungkin digunakan model untuk dipikirkan sebelum mengeluarkan keluaran yang terlihat. Mencerminkan budget_tokens. |
Upaya penalaran (gaya 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"
}'Pemikiran yang diperluas (Gaya Antropis)
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}
}'Jejak penalaran itu sendiri muncul di choices[0].message.reasoning_content (Bentuk OpenAI) atau sebagai thinking blok masuk content (Bentuk antropis). Token penalaran ditagih dan dilaporkan usage.completion_tokens_details.reasoning_tokens.
Masukan visi & gambar
Model dengan supports_vision: true menerima gambar yang disematkan sebagai blok konten. URL publik atau URL data base64 berfungsi; batas ukuran bergantung pada model hulu.
Model dengan dukungan penglihatan
…· 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"}}
]
}]
}'Panggilan alat
Model dengan supports_tools: true dapat memanggil fungsi yang Anda tetapkan. Model mengembalikan a tool_calls susunan; Anda menjalankan panggilan, lalu mengirimkan hasilnya kembali dalam a tool pesan.
Model dengan dukungan panggilan alat
…· liveMeminta
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"
}'Respons dengan panggilan alat
{
"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"
}]
}Tindak lanjuti dengan hasil alat
{
"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\"}"}
]
}Mengalir
Mengatur stream: true untuk menerima penyelesaian sebagian sebagai Acara yang Dikirim Server. Setiap peristiwa adalah satu potongan JSON dengan bentuk yang sama dengan respons non-streaming, kecuali message digantikan oleh delta. Aliran berakhir dengan 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 kawat
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
API Pesan yang kompatibel dengan antropik. Bekerja dengan pejabat itu @anthropic-ai/sdk dengan mengatur baseURL ke https://api.airforce. Meneruskan ke OpenAI/Google/dll. secara transparan untuk model non-Claude.
https://api.airforce/v1/messagesPermintaan tubuh
| Parameter | Type | Required | Description |
|---|---|---|---|
| model | string | Required | ID Model (Format antropik atau alias diarahkan). |
| messages | array | Required | Setiap entri: { peran: "pengguna" | "asisten", isi: string | susunan }. |
| max_tokens | integer | Required | Dibutuhkan oleh Antropik. Batas token untuk respons. |
| system | string | array | Optional | Perintah sistem. Lewati larik { ketik: "teks", teks, kontrol_cache? } blok untuk menandai segmen awalan yang di-cache. Lihat "Meminta cache". |
| temperature | float | Optional | 0–1. |
| top_p | float | Optional | Pengambilan sampel inti. |
| top_k | integer | Optional | Batasi kumpulan pengambilan sampel hanya pada token K teratas. |
| stop_sequences | array | Optional | Hingga 4 urutan perhentian. |
| stream | boolean | Optional | Jika benar, pancarkan aliran acara SSE bergaya Antropis (lihat "Streaming"). |
| tools | array | Optional | Definisi alat antropik: { nama, deskripsi, skema_input }. Responsnya mungkin berisi blok konten tool_use. |
| tool_choice | object | Optional | { ketik: "otomatis" | "apa saja" | "alat", nama? }. |
| thinking | object | Optional | Pemikiran antropik yang diperluas: { type: "enabled", budget_tokens: N }. |
Contoh
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!"}
]
}'Bentuk respons
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Optional | ID Pesan, mis. "pesan_01ABCxyz". |
| type | string | Optional | Selalu "pesan". |
| role | string | Optional | Selalu "asisten". |
| content | array | Optional | Array blok konten: { ketik: "teks" | "alat_penggunaan" | "pemikiran", … }. |
| model | string | Optional | Gema model yang diminta. |
| stop_reason | string | Optional | "akhir_putaran" | "maks_tokens" | "berhenti_urutan" | "alat_penggunaan". |
| usage | object | Optional | { input_tokens, output_tokens, cache_read_input_tokens?, cache_creation_input_tokens?, cache_creation? }. Bidang cache muncul ketika prompt caching digunakan. cache_creation.ephemeral_5m_input_tokens dan ephemeral_1h_input_tokens memberikan pembagian penulisan per TTL. |
Acara streaming
SSE Antropik menggunakan peristiwa bernama, bukan potongan JSON satu kali. Setiap acara memiliki keduanya event: nama dan a data: muatan 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"}Penyimpanan cepat
Pada /v1/messages dengan model Claude, tandai awalan sebagai cache dengan meneruskan system sebagai larik blok tempat segmen yang di-cache dibawa cache_control: { type: "ephemeral" }. Permintaan berikutnya yang dimulai dengan awalan yang sama membebankan tarif baca cache yang lebih murah. Model dengan supports_caching: true di dalam /v1/models mendukung ini.
Model dengan cache cepat
…· 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?"}
]
}Bagaimana hitungan cache dilaporkan dalam respons
Hitungan token cache diteruskan dalam bentuk asli setiap format, sehingga SDK (openai, @anthropic-ai/sdk, @google/genai) membacanya tanpa kode kustom. Bidang dihilangkan ketika nilainya nol, menjaga respons non-cached tetap ramping.
/v1/chat/completions (bentuk 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 (bentuk 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 (bentuk Gemini)
"usageMetadata": {
"promptTokenCount": 2104,
"candidatesTokenCount": 147,
"totalTokenCount": 2251,
"cachedContentTokenCount": 1980
}Di mana caching berlaku
Marker cache_control eksplisit dihormati di /v1/messages dan /v1/chat/completions untuk model Claude — pasang pada blok konten system atau message. Banyak penyedia lain (keluarga OpenAI, DeepSeek, Gemini) melakukan caching otomatis: Anda tidak mengirim marker dan cukup melihat cached_tokens di respons begitu prefix yang cukup panjang digunakan kembali.
Durasi cache: 5 menit atau 1 jam
Prefix yang di-cache bertahan 5 menit secara default dan timer disegarkan setiap kali kena. Untuk prefix yang bertahan lebih lama, tambahkan ttl: "1h" ke marker. Respons melaporkan setiap TTL secara terpisah di bawah cache_creation.
"cache_control": { "type": "ephemeral", "ttl": "1h" }Contoh: tulis dulu, lalu baca
Kirim permintaan yang persis sama dua kali (contoh caching di atas). Panggilan pertama yang melihat prefix membayar satu kali cache write; panggilan identik dalam TTL membayar cache read yang jauh lebih murah.
Panggilan pertama — cache write (cuplikan usage):
"usage": {
"input_tokens": 2104,
"output_tokens": 12,
"cache_creation_input_tokens": 1980,
"cache_read_input_tokens": 0
}Panggilan identik kedua dalam TTL — cache read:
"usage": {
"input_tokens": 2104,
"output_tokens": 12,
"cache_creation_input_tokens": 0,
"cache_read_input_tokens": 1980
}Batas & biaya
- Claude memerlukan prefix minimum yang dapat di-cache (sekitar 1024 token; lebih besar untuk beberapa model). Prefix yang lebih pendek tidak di-cache.
- Hingga 4 cache breakpoint per permintaan, dan prefix yang di-cache harus identik byte-per-byte antar panggilan — bahkan perubahan satu karakter pun meleset dari cache.
- Cache write lebih mahal daripada input biasa (5m ≈ 1,25×, 1h ≈ 2×); read jauh lebih murah (≈ 0,1×). Lihat harga cache tiap model di halaman harga.
POST /v1/responses
Permukaan OpenAI Responses-API untuk percakapan stateful. Autentikasi Bearer/x-api-key yang sama. Hitungan cache muncul sebagai input_tokens_details.cached_tokens (baca) ditambah cache_creation_input_tokens datar + cache_creation.ephemeral_* (tulis) untuk paritas dengan /v1/chat/completions.
https://api.airforce/v1/responsesKesalahan
Airforce mengembalikan kode status HTTP standar dan amplop kesalahan seragam untuk kedua titik akhir.
| Parameter | Type | Required | Description |
|---|---|---|---|
| 400 | invalid_request | Optional | Format JSON salah, kolom wajib diisi tidak ada, model tidak dikenal. |
| 401 | authentication_error | Optional | Kunci API tidak ada atau tidak valid. |
| 403 | permission_error | Optional | Izin paket atau per kunci menolak permintaan ini. |
| 429 | rate_limit | Optional | Tingkat permintaan atau batas token harian terlampaui. |
| 503 | upstream_error | Optional | Semua kunci upstream untuk penyedia yang diminta gagal. |
{
"error": {
"message": "Model 'gpt-99' not found.",
"type": "invalid_request",
"param": "model",
"code": "model_not_found"
}
}Temukan model
Lihat daftar lengkap ID model dan tanda kemampuannya (visi, alat, penalaran, cache, panjang konteks,…) di /docs/api/models.
curl https://api.airforce/v1/models \
-H "Authorization: Bearer sk-air-YOUR_API_KEY"