Lewati ke konten
kenari.

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.

POST /v1/chat/completions

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:

FieldTipeKeterangan
streambooleanKirim respons sebagai aliran SSE. Lihat Streaming.
max_tokensintegerBatas token output.
temperaturenumberTingkat keacakan sampling.
top_pnumberSampling nucleus.
stopstring atau arrayUrutan teks yang menghentikan generasi.
frequency_penaltynumberPenalti frekuensi token.
presence_penaltynumberPenalti kemunculan token.
toolsarrayDefinisi tool. Lihat Tools.
tool_choicestring atau objectCara model memilih tool.
response_formatobjectFormat output, misalnya JSON.
reasoning_effortstringUntuk model penalaran. Lihat Penalaran.
pluginsarrayPlugin 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.

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 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
}
}

OpenAI SDK Python, set base_url ke https://kenari.id/v1:

from openai import OpenAI
client = 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:

Terminal window
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!"}]}'

Set "stream": true pada request untuk menerima response sebagai aliran SSE token demi token. Detail format event dan cara membaca aliran ada di Streaming.