AI Gateway
Dokumentasi API
Model yang tersedia saat ini dan cara memanggil AI Gateway.
Model tersedia
Tarif dihitung dari harga provider asli, dikonversi ke IDR pakai kurs efektif harian (lihat /v1/me/usage untuk biaya aktual per request). Kalau tenant memakai kunci provider sendiri (BYOK), tidak ada biaya lewat saldo gateway.
GET /v1/models mengembalikan daftar ini sebagai JSON — publik, tidak butuh API key. Cocok dipanggil sebelum mengirim request untuk validasi model ID atau menampilkan pilihan model di UI Anda sendiri.
Model teks dipakai bersama oleh ketiga endpoint percakapan — /v1/chat/completions, /v1/messages, dan /v1/responses. Tidak ada daftar terpisah per protokol: memilih endpoint menentukan format request/response, bukan provider mana yang dipakai. Model lintas-provider umumnya bisa dipanggil dari protokol mana pun — misalnya gpt-5 lewat format Anthropic di /v1/messages.
Model embedding (text-embedding-3-small) adalah pengecualian: hanya bisa dipakai lewat /v1/embeddings, dan sebaliknya endpoint itu tidak menerima model percakapan. Keduanya menghasilkan hal yang berbeda — embedding mengembalikan vektor angka, bukan teks.
Pengecualian yang diketahui: model Qwen (qwen-*) belum bisa dipakai lewat /v1/responses — lapisan penerjemah di hulu mengirim tools kosong yang ditolak DashScope. Model Qwen tetap normal lewat /v1/chat/completions dan /v1/messages. Kalau ragu, cek dengan satu request kecil sebelum dipakai di produksi.
Contoh request
curl https://ai.awansiber.co.id/v1/models
Contoh response
{
"object": "list",
"data": [
{
"object": "model",
"id": "gpt-5",
"name": "GPT 5",
"provider": "openai",
"owned_by": "combo",
"context_limit": 1000000,
"default": false,
"created": 0,
"hostCountry": "US",
"inputPerMtokUsd": "1.25",
"outputPerMtokUsd": "10",
"effectiveFrom": "2026-08-01",
"maxTokens": null
},
...
]
}
context_limit adalah ukuran context window model, default menandai model dasar gateway, dan maxTokens adalah budget output default (null = pakai fallback endpoint). Field harga lama (hostCountry, inputPerMtokUsd, outputPerMtokUsd, effectiveFrom) tetap dikirim untuk kompatibilitas.
Daftar model saat ini
Memuat daftar model...
Autentikasi
Semua request ke /v1/chat/completions butuh API key tenant di header Authorization. Buat API key dari dashboard (/dashboard/) setelah login — key hanya ditampilkan sekali saat dibuat.
Authorization: Bearer sk-awn-xxxxxxxxxxxxxxxxxxxxxxxx
Chat completion
POST /v1/chat/completions — default merespons sebagai stream SSE (text/event-stream). Kirim "stream": false di body kalau klien Anda (mis. Postman, atau bahasa tanpa dukungan SSE mudah) butuh satu balasan JSON biasa.
Body request
| Field | Tipe | Keterangan |
|---|---|---|
model | string | Salah satu Model ID di tabel atas. |
messages | array | [{"role": "user", "content": "..."}, ...] — role: user / assistant / system. |
max_completion_tokens / max_tokens | number | Opsional. Gunakan max_completion_tokens untuk klien OpenAI terbaru; max_tokens tetap didukung. Default 512 atau default khusus model. |
stream | boolean | Opsional, default true. Set false untuk respons JSON tunggal (bukan SSE). |
tools | array | Opsional. Daftar tool/function definition gaya OpenAI, diteruskan apa adanya ke provider. Lihat dokumentasi tool calling OpenAI untuk format. |
tool_choice | string / object | Opsional. "auto", "none", atau paksa satu tool tertentu — sama seperti spesifikasi OpenAI. |
Contoh request (stream, default)
curl -N -X POST https://ai.awansiber.co.id/v1/chat/completions \
-H "Authorization: Bearer sk-awn-xxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5",
"messages": [{"role": "user", "content": "Halo, apa kabar?"}],
"max_completion_tokens": 200
}'
Contoh response (stream)
data: {"id":"chatcmpl-...","choices":[{"index":0,"delta":{"role":"assistant","content":""}}]}
data: {"id":"chatcmpl-...","choices":[{"index":0,"delta":{"content":"Halo"}}]}
data: {"id":"chatcmpl-...","choices":[{"index":0,"delta":{},"finish_reason":"stop"}],"usage":{"completion_tokens":12,"prompt_tokens":8,"total_tokens":20}}
data: [DONE]
Parse tiap baris data: ... seperti event SSE OpenAI-compatible standar, dan hentikan saat menerima data: [DONE].
Contoh request (non-stream)
curl -X POST https://ai.awansiber.co.id/v1/chat/completions \
-H "Authorization: Bearer sk-awn-xxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5",
"messages": [{"role": "user", "content": "Halo, apa kabar?"}],
"max_completion_tokens": 200,
"stream": false
}'
Contoh response (non-stream)
{
"id": "f6c1...",
"object": "chat.completion",
"model": "gpt-5",
"choices": [
{
"index": 0,
"message": { "role": "assistant", "content": "Halo! Kabar baik, ada yang bisa dibantu?" },
"finish_reason": "stop"
}
],
"usage": { "prompt_tokens": 8, "completion_tokens": 14, "total_tokens": 22 }
}
Header opsional
| Header | Keterangan |
|---|---|
x-data-class | Klasifikasi sensitivitas data request ini (mis. public, internal, confidential) — dievaluasi terhadap kebijakan routing tenant. Default ikut setting API key. |
Messages (Anthropic-native)
POST /v1/messages — bicara format Anthropic Messages API native (bukan OpenAI Chat Completions). Dipakai buat klien yang sudah terintegrasi Anthropic langsung, misal Claude Code (set ANTHROPIC_BASE_URL ke gateway ini, ANTHROPIC_API_KEY ke API key tenant Anda).
Autentikasi
Header x-api-key (bukan Authorization: Bearer), sesuai konvensi Anthropic:
x-api-key: sk-awn-xxxxxxxxxxxxxxxxxxxxxxxx
Body request
| Field | Tipe | Keterangan |
|---|---|---|
model | string | Salah satu Model ID di tabel atas. |
max_tokens | number | Wajib (beda dari /v1/chat/completions yang opsional). |
messages | array | Format Anthropic — content boleh string atau array content block (text/tool_use/tool_result). |
system | string / array | Opsional, system prompt terpisah dari messages. Ikut dipindai dan diredaksi PII sama seperti isi messages. |
tools | array | Opsional, format tool Anthropic (name/description/input_schema). |
stream | boolean | Opsional, default false (beda dari /v1/chat/completions yang default true). |
Contoh request
curl -X POST https://ai.awansiber.co.id/v1/messages \
-H "x-api-key: sk-awn-xxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-5",
"max_tokens": 200,
"messages": [{"role": "user", "content": "Halo, apa kabar?"}]
}'
Contoh response
{
"id": "msg_...",
"type": "message",
"role": "assistant",
"model": "claude-sonnet-5",
"content": [{ "type": "text", "text": "Halo! Kabar baik, ada yang bisa dibantu?" }],
"stop_reason": "end_turn",
"usage": { "input_tokens": 8, "output_tokens": 14 }
}
Catatan cakupan saat ini: pemindaian dan redaksi PII mencakup isi messages dan system — PII di system prompt diperlakukan sama, tidak lolos begitu saja. Keduanya berbagi satu penomoran placeholder ([NIK_1], [NIK_2], …) supaya nilai asli tetap bisa dipulihkan tanpa ambigu. Redaksi diterapkan ke request yang dikirim ke provider, sama seperti /v1/chat/completions; redaksi pada response yang diterima balik dari provider belum diimplementasikan di kedua endpoint.
Responses (OpenAI Responses API)
POST /v1/responses — bicara format OpenAI Responses API, alternatif yang lebih baru dari Chat Completions. Dipakai buat klien atau SDK yang sudah memakai client.responses.create(...); cukup arahkan base URL SDK ke gateway ini.
Autentikasi
Header Authorization: Bearer, sama seperti /v1/chat/completions:
Authorization: Bearer sk-awn-xxxxxxxxxxxxxxxxxxxxxxxx
Body request
| Field | Tipe | Keterangan |
|---|---|---|
model | string | Wajib. Salah satu Model ID di tabel atas. |
input | string / array | Wajib. Boleh string biasa, atau array item (mis. [{"role": "user", "content": "..."}]; content juga boleh array part input_text/input_image, plus item function_call/function_call_output). |
instructions | string | Opsional, instruksi sistem terpisah dari input. Ikut dipindai dan diredaksi PII sama seperti isi input. |
stream | boolean | Opsional, default false. Set true untuk SSE event Responses API (response.output_text.delta, ditutup response.completed lalu data: [DONE]). |
tools | array | Opsional, format tool Responses API, diteruskan apa adanya ke provider. |
tool_choice | string / object | Opsional. "auto", "none", atau paksa satu tool tertentu — sama seperti spesifikasi OpenAI. |
max_output_tokens | number | Opsional, default 512. |
Contoh request (non-stream)
curl -X POST https://ai.awansiber.co.id/v1/responses \
-H "Authorization: Bearer sk-awn-xxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5",
"input": "Halo, apa kabar?",
"max_output_tokens": 200
}'
Contoh response (non-stream)
{
"id": "resp_...",
"object": "response",
"model": "gpt-5",
"output": [
{
"type": "message",
"role": "assistant",
"content": [{ "type": "output_text", "text": "Halo! Kabar baik, ada yang bisa dibantu?" }]
}
],
"usage": { "input_tokens": 8, "output_tokens": 14 }
}
Teks balasan ada di item output bertipe message, di dalam part content bertipe output_text. Perhatikan nama field usage di sini adalah input_tokens/output_tokens, bukan prompt_tokens/completion_tokens seperti /v1/chat/completions.
Catatan cakupan saat ini: pemindaian dan redaksi PII mencakup isi input dan instructions — PII di instruksi sistem diperlakukan sama, tidak lolos begitu saja. Keduanya berbagi satu penomoran placeholder ([NIK_1], [NIK_2], …) supaya nilai asli tetap bisa dipulihkan tanpa ambigu. Redaksi diterapkan ke request yang dikirim ke provider, sama seperti dua endpoint di atas; redaksi pada response yang diterima balik dari provider belum diimplementasikan.
Embeddings
POST /v1/embeddings — ubah teks jadi vektor angka, format OpenAI Embeddings API. Dipakai buat pencarian semantik, RAG, klasifikasi, atau deduplikasi. Model yang tersedia: text-embedding-3-small.
Autentikasi
Header Authorization: Bearer, sama seperti /v1/chat/completions:
Authorization: Bearer sk-awn-xxxxxxxxxxxxxxxxxxxxxxxx
Body request
| Field | Tipe | Keterangan |
|---|---|---|
model | string | Wajib. Salah satu Model ID embedding di tabel atas, mis. text-embedding-3-small. |
input | string / array string | Wajib. Satu teks, atau array teks untuk beberapa embedding sekaligus dalam satu request. |
dimensions | number | Opsional. Perkecil panjang vektor hasil; kalau dikosongkan, dipakai dimensi bawaan model. |
encoding_format | string | Opsional. "float" (default) atau "base64", diteruskan apa adanya ke provider. |
Contoh request
curl -X POST https://ai.awansiber.co.id/v1/embeddings \
-H "Authorization: Bearer sk-awn-xxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"model": "text-embedding-3-small",
"input": "Halo dunia"
}'
Contoh response
{
"object": "list",
"model": "text-embedding-3-small",
"data": [
{
"object": "embedding",
"index": 0,
"embedding": [0.0023, -0.0114, 0.0187, ...]
}
],
"usage": { "prompt_tokens": 3, "total_tokens": 3 }
}
Tiap item di data punya embedding (array angka) dan index yang cocok dengan urutan input — kalau input berupa array tiga teks, data berisi tiga item dengan index 0, 1, dan 2.
Catatan penagihan dan streaming: embedding hanya menagih token input — tidak ada output token sama sekali, jadi tarif output untuk model embedding adalah 0 dan biaya request sepenuhnya dihitung dari prompt_tokens. Karena itu usage di sini cuma berisi prompt_tokens dan total_tokens, tanpa completion_tokens. Endpoint ini juga tidak punya mode streaming: field stream tidak berlaku, response selalu dikirim sekaligus sebagai satu JSON.
Kode error
| Status | Error | Keterangan |
|---|---|---|
| 400 | unsupported_model | Model ID tidak ada di daftar tersedia. |
| 401 | missing_api_key / invalid_api_key | Header Authorization hilang atau key tidak valid/revoked. |
| 402 | insufficient_balance | Saldo tenant tidak cukup untuk estimasi biaya maksimum request ini — topup dulu lewat dashboard. |
| 422 | pii_detected | Tenant mengaktifkan PII mode block dan request mengandung data pribadi. |
| 429 | rate_limit_exceeded | Terlalu banyak request per menit untuk API key ini — cek header Retry-After. |
| 502 | upstream_error | Provider model gagal merespons (hanya pada mode non-stream — mode stream sudah kadung mengirim event sebagian). |