Dokumentasi API
API ini kompatibel dengan OpenAI Chat Completions dan Anthropic Messages. Pilih SDK sesuai format API yang kamu gunakan. API key tersedia di halaman API Key.
https://tukenku.com/v1
https://tukenku.com
Quickstart
Tempel API key sekali, lalu pilih cara pakai: OpenCode (satu perintah), SDK OpenAI, atau SDK Anthropic. Semua snippet di bawah otomatis memakai key yang kamu tempel.
OpenCode (satu perintah)
Memasang opencode, mengambil daftar model dari /v1/models, dan menulis opencode.json otomatis. Pilih OS lalu jalankan perintahnya.
BASE_URL="https://tukenku.com/v1" API_KEY="sk-xxx" bash <(curl -fsSL https://tukenku.com/linux.sh)
BASE_URL="https://tukenku.com/v1" API_KEY="sk-xxx" bash <(curl -fsSL https://tukenku.com/macos.sh)
$env:BASE_URL="https://tukenku.com/v1"; $env:API_KEY="sk-xxx"; irm https://tukenku.com/windows.ps1 | iex
set "BASE_URL=https://tukenku.com/v1" & set "API_KEY=sk-xxx" & set "DOCS_URL=https://tukenku.com" & curl -fsSL "https://tukenku.com/windows-cmd.bat" -o "%TEMP%\setup.bat" & "%TEMP%\setup.bat" & del "%TEMP%\setup.bat"
- Memeriksa apakah
opencodesudah terpasang; jika belum, memasangnya lewat installer resmi (ataunpm). - Mengambil daftar model yang tersedia dari
/v1/models. - Menulis konfigurasi ke
opencode.json. - Menetapkan API key kamu sebagai provider default.
SDK OpenAI
Endpoint ini kompatibel OpenAI Chat Completions. Pasang SDK, arahkan base_url ke https://tukenku.com/v1, lalu pakai model dari /v1/models.
# pip install openai
from openai import OpenAI
client = OpenAI(
api_key="sk-xxx",
base_url="https://tukenku.com/v1",
)
resp = client.chat.completions.create(
model="nama-model", # ambil dari /v1/models
messages=[{"role": "user", "content": "Halo!"}],
)
print(resp.choices[0].message.content)// npm install openai
import OpenAI from "openai";
const client = new OpenAI({
apiKey: "sk-xxx",
baseURL: "https://tukenku.com/v1",
});
const resp = await client.chat.completions.create({
model: "nama-model",
messages: [{ role: "user", content: "Halo!" }],
});
console.log(resp.choices[0].message.content);SDK Anthropic
Endpoint /v1/messages kompatibel Anthropic Messages. max_tokens wajib dan di-clamp ke batas model (lihat Batas max_tokens).
# pip install anthropic
from anthropic import Anthropic
client = Anthropic(
api_key="sk-xxx",
base_url="https://tukenku.com",
)
msg = client.messages.create(
model="nama-model",
max_tokens=1024, # wajib untuk Anthropic
messages=[{"role": "user", "content": "Halo!"}],
)
print(msg.content[0].text)// npm install @anthropic-ai/sdk
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
apiKey: "sk-xxx",
baseURL: "https://tukenku.com",
});
const msg = await client.messages.create({
model: "nama-model",
max_tokens: 1024,
messages: [{ role: "user", content: "Halo!" }],
});
console.log(msg.content[0].text);curl https://tukenku.com/v1/messages \
-H "x-api-key: sk-xxx" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model":"nama-model","max_tokens":1024,"messages":[{"role":"user","content":"Halo!"}]}'1. Autentikasi
Setiap permintaan wajib menyertakan API key di header Authorization sebagai Bearer token. Jaga kerahasiaan key ini — siapa pun yang memilikinya bisa memakai saldo atau kuotamu.
Authorization: Bearer sk-xxxxxxxxxxxxxxxxxxxx2. Base URL & endpoint
| Method | Endpoint | Fungsi |
|---|---|---|
| POST | https://tukenku.com/v1/chat/completions | OpenAI Chat Completions |
| POST | https://tukenku.com/v1/messages | Anthropic Messages untuk Claude SDK & OpenCode |
| GET | https://tukenku.com/v1/models | Daftar model yang boleh dipakai key ini |
| POST | https://tukenku.com/v1/videos/generations | Membuat task video |
| GET | https://tukenku.com/v1/videos/generations/{task_id} | Memeriksa status dan hasil video asynchronous |
| GET | https://tukenku.com/v1/videos/seedance/tasks | Daftar task Seedance |
| DELETE | https://tukenku.com/v1/videos/seedance/tasks/{task_id} | Hapus task Seedance |
| POST | https://tukenku.com/v1/videos/kling/multi-elements/preparations | Preparation multi-elements Kling (synchronous) |
3. Daftar model
Ambil model yang tersedia untuk key kamu:
curl https://tukenku.com/v1/models \
-H "Authorization: Bearer $API_KEY"4. Video
Video dibuat secara asynchronous: kamu mengirim satu request untuk membuat task, lalu menunggu (polling) sampai video selesai. Alur dasarnya sama untuk semua model:
- Cek model dulu. Panggil
GET /v1/modelsdan pilih model bertipe video yang tersedia untuk key kamu. Lihat jugaresolutions&capabilitiesmodel itu. - Buat task.
POSTkehttps://tukenku.com/v1/videos/generations. Server membalasidtask. - Polling hasil.
GET https://tukenku.com/v1/videos/generations/{id}tiap 10–15 detik sampai status selesai, lalu unduh URL video (URL bersifat sementara).
Model yang didukung: Grok, Kling, Seedance, Hailuo, Jimeng, Vidu, HappyHorse, dan Wan. Body diteruskan apa adanya (tanpa ganti nama field); model memilih model dan operation memilih jenis proses. Contoh curl lengkap tersedia untuk setiap provider di bawah — cukup ganti $API_KEY dan nama model.
prices memuat kombinasi operation, resolution, mode, audio, billing_unit, dan unit_price. Field kosong hanya cocok bila field itu tidak dikirim. Kombinasi tanpa aturan dibalas video_pricing_missing; server tidak menebak resolusi, durasi, token, atau harga lain.| Field | Contoh | Keterangan |
|---|---|---|
resolutions | 480p, 720p, 1080p | Resolusi yang aktif untuk model. |
prices | 480p: 1000 | Harga hanya ditampilkan untuk resolusi aktif. |
capabilities.audio | silent atau with_audio | Mode audio yang tersedia. |
capabilities.reference_* | true / false | Dukungan video, audio, dan gambar referensi. |
capabilities.motion_control | true / false | Dukungan pengendalian gerakan. |
Contoh response lengkap dapat dilihat pada bagian /v1/models di atas.
Grok: text, image, dan reference-to-video
curl -X POST https://tukenku.com/v1/videos/generations \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"MODEL_GROK_DARI_V1_MODELS","prompt":"A cinematic ocean sunrise","duration":8,"aspect_ratio":"16:9","resolution":"720p"}'Tambahkan image untuk image-to-video, atau reference_images berisi 1–7 URL untuk reference-to-video. Durasi Grok adalah 1–15 detik, tetapi reference-to-video maksimal 10 detik; resolusi yang valid 480p atau 720p.
{
"model":"MODEL_GROK_DARI_V1_MODELS",
"prompt":"Keep the subject consistent with ",
"reference_images":["https://example.com/subject.jpg"],
"duration":8, "aspect_ratio":"16:9", "resolution":"720p"
} Seedance: text, image, video, dan audio reference
Seedance memakai content[]. Letakkan role di level item content, bukan di dalam objek URL. Role yang didukung adalah first_frame, last_frame, reference_image, reference_video, dan reference_audio, sesuai kemampuan model.
curl -X POST https://tukenku.com/v1/videos/generations \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model":"MODEL_SEEDANCE_DARI_V1_MODELS",
"content":[
{"type":"text","text":"Follow the reference motion"},
{"type":"video_url","video_url":{"url":"https://example.com/reference.mp4"},"role":"reference_video"}
],
"resolution":"720p", "ratio":"16:9", "duration":5,
"generate_audio":true, "return_last_frame":false
}'Parameter create yang diteruskan mencakup callback_url, return_last_frame, service_tier, execution_expires_after, generate_audio, draft, tools, safety_identifier, priority, resolution, ratio, duration, frames, seed, camera_fixed, dan watermark. Dukungan dan batasnya bergantung model Seedance yang dipilih.
Seedance: daftar dan hapus task
Kirim alias model melalui query model. List menerima page_num, page_size, filter.status, filter.task_ids (boleh berulang), filter.model, dan filter.service_tier. DELETE dapat mengembalikan body JSON kosong.
curl "https://tukenku.com/v1/videos/seedance/tasks?model=MODEL_SEEDANCE&page_num=1&page_size=20&filter.status=succeeded&filter.task_ids=TASK_A" \
-H "Authorization: Bearer $API_KEY"
curl -X DELETE "https://tukenku.com/v1/videos/seedance/tasks/TASK_A?model=MODEL_SEEDANCE" \
-H "Authorization: Bearer $API_KEY"Kling: motion control
Motion control memakai image_url sebagai frame awal dan video_url sebagai gerakan referensi. Hanya kirim jika capabilities.motion_control bernilai true pada model tersebut.
curl -X POST https://tukenku.com/v1/videos/generations \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model":"MODEL_KLING_DARI_V1_MODELS",
"operation":"motion-control",
"image_url":"https://example.com/subject.jpg",
"video_url":"https://example.com/motion.mp4"
}'Kling multi-elements preparation
Preparation bersifat synchronous dan tidak membuat task billable. POST ke /v1/videos/kling/multi-elements/preparations dengan operation salah satu init-selection, add-selection, delete-selection, clear-selection, atau preview-selection, plus field resmi operation tersebut.
curl -X POST https://tukenku.com/v1/videos/kling/multi-elements/preparations \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"MODEL_KLING_DARI_V1_MODELS","operation":"init-selection","image_url":"https://example.com/source.jpg"}'Wan face detection (synchronous)
Kirim operation: "face-detect" melalui endpoint create. Respons final dikembalikan langsung dengan output.check_pass, output.humanoid, dan usage provider; tidak ada ID task dan tidak perlu polling. Biaya memakai aturan billing_unit: "image" yang exact-match.
Validasi kemampuan model
Client wajib membaca resolutions dan capabilities dari GET /v1/models terlebih dahulu. Jangan mengasumsikan semua model punya kemampuan yang sama. Jika request meminta fitur yang tidak didukung model, endpoint membalas 400 dengan salah satu error code berikut sebelum request diteruskan ke provider:
| Error code | Dipicu ketika |
|---|---|
unsupported_resolution | Resolusi yang diminta tidak ada di resolutions model. |
unsupported_audio | Model bertipe silent, tetapi request meminta audio (generate_audio, sound, atau audio:true). |
unsupported_reference_video | Request mengirim video referensi (reference_video, video_list, videos, atau role reference_video) tetapi capabilities.reference_video bernilai false. |
unsupported_reference_audio | Request mengirim audio referensi (reference_audio atau role reference_audio) tetapi capabilities.reference_audio bernilai false. |
unsupported_reference_image | Request mengirim gambar referensi (reference_images, subject_reference, subjects, image_list, atau role reference_image) tetapi capabilities.reference_image bernilai false. |
unsupported_motion_control | Request memakai motion control (operation motion-control/motion-transfer, motion_control, atau camera_control) tetapi capabilities.motion_control bernilai false. |
Contoh error saat meminta resolusi yang tidak aktif untuk model:
{
"error":{
"message":"Resolusi 4K tidak didukung model ini. Pilihan: 480P, 720P, 1080P.",
"type":"unsupported_resolution"
}
}Format body per provider
| Provider | Field utama | Status / hasil |
|---|---|---|
| Grok | prompt, image, reference_images, video, duration, aspect_ratio, resolution | pending/done/failed/expired; URL di video.url |
| Kling | prompt, image, image_tail, mode, duration, sound, camera_control, dan field endpoint Kling lainnya | submitted/processing/succeed/failed; URL di data.task_result.videos[].url |
| Seedance | content[], callback_url, return_last_frame, service_tier, execution_expires_after, generate_audio, draft, tools, safety_identifier, priority, resolution, ratio, duration, frames, seed, camera_fixed, watermark | queued/running/succeeded/failed/cancelled/expired; URL di content.video_url |
| Hailuo | prompt, first_frame_image, last_frame_image, subject_reference, duration, resolution | Preparing/Queueing/Processing/Success/Fail; endpoint mengambil download_url memakai file_id |
| Jimeng | prompt, image_urls atau binary_data_base64, seed, frames, aspect_ratio | in_queue/generating/done/not_found/expired; URL di data.video_url |
| Vidu | prompt, images, duration, resolution, audio, seed, dan opsi endpoint terkait | created/queueing/processing/success/failed; URL di creations[].url |
| HappyHorse / Wan | input dan parameters sesuai protokol model; jangan menaruh resolution, duration, atau ratio di top-level | PENDING/RUNNING/SUCCEEDED/FAILED/CANCELED/UNKNOWN; URL di output.video_url |
Memilih endpoint dengan operation
operation digunakan untuk memilih jenis proses dan tidak diteruskan ke layanan tujuan. Jika dapat disimpulkan dari body, field ini boleh dihilangkan.
| Provider | Nilai yang didukung |
|---|---|
| Grok | generate, edit, extend |
| Kling | text2video, image2video, omni-video, multi-image2video, motion-control, multi-elements, video-extend, identify-face, advanced-lip-sync, avatar, image-recognize, effects |
| Vidu | text2video, img2video, reference2video, start-end2video, multiframe, template, template-story |
| HappyHorse / Wan | text2video, image2video, reference2video, video-editing, first-last-frame, motion-transfer, digital-human, vace, face-detect |
Contoh HappyHorse / Wan
curl -X POST https://tukenku.com/v1/videos/generations \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model":"MODEL_WAN_ATAU_HAPPYHORSE_DARI_V1_MODELS",
"input":{"prompt":"A cinematic ocean sunrise"},
"parameters":{"resolution":"1080P","ratio":"16:9","duration":5,"watermark":false}
}'Respons pembuatan bersifat asynchronous. Simpan id publik dari response, bukan ID internal provider.
{
"request_id":"1a4ea198-...",
"id":"eyJwIjoxMCwi..."
}Periksa status dan ambil hasil
Header Authorization tetap wajib saat polling. Cookie sesi dashboard tidak dapat menggantikan API key. Poll sekitar setiap 10–15 detik; jangan membuat task baru hanya karena task lama masih diproses.
TASK_ID="eyJwIjoxMCwi..."
curl https://tukenku.com/v1/videos/generations/$TASK_ID \
-H "Authorization: Bearer $API_KEY"Bentuk status dan lokasi URL hasil tetap mengikuti provider upstream pada tabel di atas. URL hasil bersifat sementara, jadi unduh atau pindahkan segera setelah task selesai.
5. Chat completions
Contoh permintaan paling sederhana:
curl https://tukenku.com/v1/chat/completions \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "nama-model",
"messages": [
{ "role": "user", "content": "Halo, siapa kamu?" }
]
}'Contoh respons:
{
"id": "chatcmpl-...",
"object": "chat.completion",
"choices": [
{
"index": 0,
"message": { "role": "assistant", "content": "Halo! Saya asisten AI." },
"finish_reason": "stop"
}
],
"usage": { "prompt_tokens": 12, "completion_tokens": 8, "total_tokens": 20 }
}5. Streaming
Tambahkan "stream": true untuk menerima respons Server-Sent Events (SSE). Chunk diteruskan langsung dari model begitu tersedia (bukan menunggu jawaban penuh), lalu stream ditutup dengan data: [DONE]. Streaming juga menghindari timeout untuk jawaban panjang, jadi dianjurkan untuk output besar.
curl -N https://tukenku.com/v1/chat/completions \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "nama-model",
"stream": true,
"messages": [{ "role": "user", "content": "Ceritakan sebuah lelucon" }]
}'6. Pakai SDK OpenAI & Anthropic
Untuk OpenAI, arahkan base_url ke endpoint ini.
from openai import OpenAI
client = OpenAI(
api_key="sk-xxxx", # API key dari dashboard
base_url="https://tukenku.com/v1",
)
resp = client.chat.completions.create(
model="nama-model",
messages=[{"role": "user", "content": "Halo!"}],
max_tokens=1024,
)
print(resp.choices[0].message.content)Anthropic mewajibkan max_tokens pada setiap request ke /v1/messages. Nilai akan di-clamp ke batas model (lihat Batas max_tokens per model); untuk jawaban panjang, set mendekati batas model, jangan biarkan kecil supaya tidak terpotong.
curl https://tukenku.com/v1/messages \
-H "x-api-key: $API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model":"nama-model","max_tokens":1024,"messages":[{"role":"user","content":"Halo!"}]}'import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
apiKey: "sk-xxxx",
baseURL: "https://tukenku.com/v1",
});
const message = await client.messages.create({
model: "nama-model",
max_tokens: 1024,
messages: [{ role: "user", content: "Halo!" }],
});
console.log(message.content[0].text);Untuk OpenCode, gunakan provider Anthropic-compatible dengan baseURL https://tukenku.com/v1 dan API key dari dashboard. Konten teks dan streaming SSE didukung; tool serta gambar belum didukung.
import OpenAI from "openai";
const client = new OpenAI({
apiKey: "sk-xxxx",
baseURL: "https://tukenku.com/v1",
});
const resp = await client.chat.completions.create({
model: "nama-model",
messages: [{ role: "user", content: "Halo!" }],
});
console.log(resp.choices[0].message.content);7. Konfigurasi client
Semua client di bawah cukup diarahkan ke base URL ini dengan API key dari dashboard. Prinsipnya sama: base URL https://tukenku.com/v1, key sebagai Bearer token, lalu pilih model persis dari /v1/models.
Header Authorization: Bearer <token> wajib diisi: berarti client belum mengirim API key. Isi field API key / token, dan pastikan base URL berakhiran /v1 (bukan tanpa /v1).OpenCode
Buat file opencode.json (di root project atau ~/.config/opencode/). OpenCode kompatibel OpenAI, jadi pakai provider @ai-sdk/openai-compatible. Ganti sk-xxxx dan daftar models dengan ID dari /v1/models.
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"monyet": {
"npm": "@ai-sdk/openai-compatible",
"name": "Monyet AI",
"options": {
"baseURL": "https://tukenku.com/v1",
"apiKey": "sk-xxxx"
},
"models": {
"nama-model": { "name": "Nama Model" }
}
}
}
}Atau lewat Anthropic-compatible (endpoint /v1/messages) dengan provider @ai-sdk/anthropic dan baseURL yang sama.
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"monyet": {
"npm": "@ai-sdk/anthropic",
"name": "Monyet AI",
"options": {
"baseURL": "https://tukenku.com/v1",
"apiKey": "sk-xxxx"
},
"models": { "nama-model": { "name": "Nama Model" } }
}
}
}OpenCode CLI (langkah lengkap, sudah dites)
Pasang CLI dulu (jangan pakai curl). Butuh Node.js 18+.
# 1. Pasang OpenCode CLI
npm install -g opencode-ai
# 2. Cek versi (pastikan terpasang)
opencode --versionBuat opencode.json di root project (atau ~/.config/opencode/opencode.json). Ambil model id dari /v1/models.
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"monyet": {
"npm": "@ai-sdk/openai-compatible",
"name": "Monyet AI",
"options": {
"baseURL": "https://tukenku.com/v1",
"apiKey": "sk-xxxx"
},
"models": {
"myt/claude-fable-5": { "name": "Fable 5" }
}
}
}
}Jalankan sekali untuk tes (mode non-interaktif run):
opencode run -m monyet/myt/claude-fable-5 "Halo, jawab singkat siapa kamu?"reasoning tidak diaktifkan di sisi server — jawaban tertahan di kanal reasoning sehingga content jadi "". Sekarang server selalu mengaktifkan reasoning.enabled di jalur API (stream & non-stream), jadi content terisi normal. Cukup update ke versi terbaru; tidak ada perubahan konfigurasi di sisimu.Kilo Code CLI
Kilo Code kompatibel OpenAI. Pasang lewat npm, lalu arahkan ke base URL ini.
# 1. Pasang Kilo Code CLI
npm install -g @kilocode/cli
# 2. Set base URL + key (OpenAI-compatible)
export OPENAI_BASE_URL="https://tukenku.com/v1"
export OPENAI_API_KEY="sk-xxxx"
# 3. Jalankan
kilo --model "myt/claude-fable-5" "Halo, jawab singkat siapa kamu?"Kalau Kilo Code kamu memakai file config, isi provider OpenAI-compatible dengan baseURL https://tukenku.com/v1, API key dari dashboard, dan model persis dari /v1/models.
OpenRouter / client OpenAI-compatible lain
Client apa pun yang meniru gaya OpenRouter (base URL + Bearer key) tinggal diisi seperti ini:
OPENAI_BASE_URL="https://tukenku.com/v1"
OPENAI_API_KEY="sk-xxxx"Cline / Roo Code (VS Code)
Pilih provider OpenAI Compatible, lalu isi:
| Field | Isi |
|---|---|
| Base URL | https://tukenku.com/v1 |
| API Key | sk-xxxx (dari dashboard) |
| Model ID | ID dari /v1/models |
Environment variable (SDK OpenAI/Anthropic)
SDK resmi membaca base URL & key dari environment variable:
# OpenAI SDK
export OPENAI_API_KEY="sk-xxxx"
export OPENAI_BASE_URL="https://tukenku.com/v1"
# Anthropic SDK
export ANTHROPIC_API_KEY="sk-xxxx"
export ANTHROPIC_BASE_URL="https://tukenku.com/v1"8. Parameter yang didukung
| Parameter | Tipe | Keterangan |
|---|---|---|
| model | string | Wajib. Gunakan ID persis dari endpoint /v1/models. |
| messages | array | Wajib. Daftar pesan berisi role & content string. |
| stream | boolean | Opsional. true untuk respons SSE satu chunk. |
| temperature | number | Opsional. Angka antara 0–2. |
| max_tokens | integer | Wajib untuk Anthropic /v1/messages, opsional untuk Chat Completions. Plafon token output; server meng-clamp ke terkecil dari batas model, nilai ini, dan saldo. Lihat Batas max_tokens per model. |
9. Batas max_tokens per model
Batas maksimum token output berbeda tiap model, jadi max_tokens tidak lagi dipukul rata satu angka. Server meng-clamp nilai akhir ke yang terkecil dari tiga hal: batas model, max_tokens yang kamu kirim, dan sisa saldo/kuota kamu. Kalau kamu tidak mengirim max_tokens, server memakai batas model sebagai plafon.
max_tokens melebihi batas modelnya (mis. Claude 3.5 = 8192). Sebaliknya, meminta angka terlalu kecil membuat jawaban terpotong di tengah dengan finish_reason: "length". Untuk jawaban panjang (koding proyek besar via OpenCode/CLI), naikkan max_tokens sampai mendekati batas model dan pastikan saldo cukup.| Model | Batas output |
|---|---|
| claude-3-* | 4.096 |
| claude-3-5-* / claude-3.5-* | 8.192 |
| claude-opus-4 / 4-1 | 32.000 |
| claude-sonnet-4* / claude-haiku-4* / claude-opus-4-5* / claude-*-5* | 64.000 |
| gpt-5* / gemini-3* / gemini-2.5* / grok-4* / deepseek* / glm-* / minimax* / kimi* / qwen3* | 65.536 |
| gpt-4.1* | 32.768 |
| Model claude lain yang belum ada di daftar | 8.192 (fallback aman) |
| Model non-claude lain | 32.768 (max_output global) |
Kalau jawaban berhenti dengan finish_reason: "length": naikkan max_tokens, cek sisa saldo, dan pastikan client (mis. OpenCode) tidak mengunci max_tokens ke angka kecil. Angka di tabel mengikuti konfigurasi server dan bisa berubah sewaktu-waktu; sumber kebenarannya tetap batas resmi tiap model.
10. Kode error
| Status | Arti | Solusi |
|---|---|---|
| 400 | JSON atau parameter tidak valid | Periksa messages, max_tokens, dan temperature. |
| 400 | unsupported_resolution | Resolusi video tidak tersedia untuk model tersebut. Baca resolutions dari /v1/models. |
| 400 | unsupported_audio | Model silent tidak dapat menghasilkan audio. Baca capabilities.audio dari /v1/models. |
| 400 | unsupported_reference_video | Model tidak menerima video referensi. Baca capabilities.reference_video. |
| 400 | unsupported_reference_audio | Model tidak menerima audio referensi. Baca capabilities.reference_audio. |
| 400 | unsupported_reference_image | Model tidak menerima gambar referensi. Baca capabilities.reference_image. |
| 400 | unsupported_motion_control | Model tidak mendukung motion control. Baca capabilities.motion_control. |
| 401 | API key tidak valid / tidak ada | Periksa header Authorization. |
| 402 | Saldo atau kuota tidak cukup | Top up saldo atau aktifkan paket lalu coba lagi. |
| 404 | Model tidak diizinkan untuk key ini | Pilih ID model dari /v1/models. |
| 429 | Terlalu banyak permintaan | Beri jeda lalu coba lagi. |
| 502 | Provider AI menolak atau gagal memproses request | Periksa parameter, lalu coba lagi atau pilih model lain. |
Saldo habis? Top up melalui menu Top Up Saldo. Pengguna paket dapat memeriksa sisa kuota di dashboard.