Chat completions
Endpoint chat completions kenari kompatibel dengan OpenAI, jadi bisa dipakai sebagai pengganti langsung untuk https://api.openai.com/v1. Cukup arahkan base URL ke https://kenari.id/v1 dan pakai API key kn-.... Token tetap ditagih dari saldo prabayar dalam Rupiah.
Endpoint
Section titled “Endpoint”POST /v1/chat/completions
Request
Section titled “Request”Dua field wajib: model dan messages.
Field model menerima id model dari GET /v1/models, varian :free (misalnya step-3-7-flash:free), atau nama rute yang kamu buat sendiri (misalnya opus-hemat, lihat Routing).
Field lain yang didukung:
| Field | Tipe | Keterangan |
|---|---|---|
stream | boolean | Kirim respons sebagai aliran SSE. Lihat Streaming. |
max_tokens | integer | Batas token output. |
temperature | number | Tingkat keacakan sampling. |
top_p | number | Sampling nucleus. |
stop | string atau array | Urutan teks yang menghentikan generasi. |
frequency_penalty | number | Penalti frekuensi token. |
presence_penalty | number | Penalti kemunculan token. |
tools | array | Definisi tool. Lihat Tools. |
tool_choice | string atau object | Cara model memilih tool. |
response_format | object | Format output, misalnya JSON. |
reasoning_effort | string | Untuk model penalaran. Lihat Penalaran. |
plugins | array | Plugin pra-dispatch. Saat ini hanya file-parser, untuk membaca dokumen. Lihat Baca dokumen. |
Field yang tidak ada di tabel di atas diteruskan apa adanya ke model upstream.
messages
Section titled “messages”Field messages adalah array objek {role, content}. Nilai role salah satu dari system, user, assistant, atau tool. Nilai content bisa berupa string, atau array bagian untuk input multimodal: text, image_url, dan file. Bagian file membawa PDF atau gambar dokumen dan butuh plugin file-parser, lihat Baca dokumen.
{ "model": "step-3-7-flash", "messages": [ { "role": "system", "content": "Kamu asisten yang ringkas." }, { "role": "user", "content": "Halo!" } ]}Response
Section titled “Response”Response mengikuti bentuk OpenAI chat.completion: id, object, created, model, choices[], dan usage. Tiap entri choices punya index, message{role, content}, dan finish_reason. Objek usage berisi prompt_tokens, completion_tokens, dan total_tokens. Field usage.prompt_tokens_details.cached_tokens muncul saat upstream melaporkan cache read.
{ "id": "chatcmpl-...", "object": "chat.completion", "created": 1717000000, "model": "step-3-7-flash", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "Halo! Ada yang bisa dibantu?" }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 12, "completion_tokens": 9, "total_tokens": 21 }}Contoh
Section titled “Contoh”OpenAI SDK Python, set base_url ke https://kenari.id/v1:
from openai import OpenAIclient = OpenAI(base_url="https://kenari.id/v1", api_key="kn-...")response = client.chat.completions.create(model="step-3-7-flash", messages=[{"role": "user", "content": "Halo!"}])print(response.choices[0].message.content)OpenAI SDK TypeScript, set baseURL ke https://kenari.id/v1:
import OpenAI from "openai";const client = new OpenAI({ baseURL: "https://kenari.id/v1", apiKey: "kn-..." });const res = await client.chat.completions.create({ model: "step-3-7-flash", messages: [{ role: "user", content: "Halo!" }] });console.log(res.choices[0].message.content);curl:
curl https://kenari.id/v1/chat/completions -H "Authorization: Bearer kn-..." -H "Content-Type: application/json" -d '{"model":"step-3-7-flash","messages":[{"role":"user","content":"Halo!"}]}'Streaming
Section titled “Streaming”Set "stream": true pada request untuk menerima response sebagai aliran SSE token demi token. Detail format event dan cara membaca aliran ada di Streaming.