Penalaran
Sebagian model berpikir sebelum menjawab. Mereka menghasilkan jejak penalaran lebih dulu, baru teks jawaban akhir. kenari menyediakan parameter untuk mengatur penalaran yang sama di setiap format chat, mengembalikan jejaknya bersama jawaban, dan menagih proses berpikirnya sebagai token Output. Berpikir lebih banyak biasanya menghasilkan jawaban yang lebih baik untuk masalah sulit. Itu juga bisa membuat balasan lebih lambat dan token lebih banyak, yang menambah biaya di mana pun token Output ditagih.
Cari model yang mendukung penalaran
Section titled “Cari model yang mendukung penalaran”GET /v1/models menjelaskan penalaran untuk setiap model. Endpoint ini publik, jadi kamu bisa memfilternya tanpa key:
curl -s https://kenari.id/v1/models | jq -r '.data[] | select(.reasoning == true) | .id'| Field | Arti |
|---|---|
reasoning | true jika model bisa berpikir. |
reasoning_options | Level effort yang diterima model, misalnya ["low", "medium", "high"]. Tidak ada jika model tidak punya level effort. |
reasoning_toggle | true jika penalaran bisa dinyalakan atau dimatikan per request. |
Levelnya adalah none, minimal, low, medium, high, xhigh, dan max. none mematikan penalaran, dan minimal diperlakukan sebagai low. Jika kamu meminta level yang tidak tercantum di model, kenari memakai level tertinggi yang tercantum di bawah atau sama dengan permintaanmu. Kalau model tidak mencantumkan level di bawah atau sama dengan yang kamu minta, level yang kamu minta dikirim apa adanya. Pada model yang tidak mendukung penalaran, field penalaran diabaikan.
Minta penalaran
Section titled “Minta penalaran”Setiap format punya field sendiri. kenari memetakan semuanya ke kontrol penalaran asli dari provider model.
| Format | Cara meminta |
|---|---|
| Chat completions | reasoning_effort, atau objek reasoning di bawah |
| Messages | thinking: {"type": "enabled", "budget_tokens": N}, atau output_config: {"effort": "high"} |
| Responses | reasoning: {"effort": "high"} |
Dengan Chat completions:
curl https://kenari.id/v1/chat/completions \ -H "Authorization: Bearer $KENARI_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "step-3-7-flash:free", "reasoning_effort": "medium", "messages": [ {"role": "user", "content": "Berapa 17 * 24? Tunjukkan langkahnya."} ] }'Dengan Messages. Arahkan Anthropic SDK ke https://kenari.id, tanpa /v1:
import os
import anthropic
client = anthropic.Anthropic( base_url="https://kenari.id", api_key=os.environ["KENARI_API_KEY"],)
message = client.messages.create( model="step-3-7-flash:free", max_tokens=4096, thinking={"type": "enabled", "budget_tokens": 2048}, messages=[{"role": "user", "content": "Berapa 17 * 24? Tunjukkan langkahnya."}],)
for block in message.content: if block.type == "thinking": print("Penalaran:", block.thinking) elif block.type == "text": print("Jawaban:", block.text)thinking: {"type": "disabled"} mematikan penalaran di Messages hanya untuk model yang dilayani lewat API gaya Anthropic. Untuk model lain, pengaturan effort dihapus dan default model berlaku. Untuk menonaktifkan penalaran pada model yang mendukungnya (reasoning_toggle bernilai true), pakai reasoning: {"enabled": false} di Chat completions. Budget harus minimal 1.024 dan di bawah max_tokens. Pada max_tokens 1.024 atau kurang, model yang dilayani lewat API gaya Anthropic tidak berpikir sama sekali.
Objek reasoning
Section titled “Objek reasoning”Chat completions juga menerima objek reasoning gaya OpenRouter, yang bisa kamu kirim ke semua model chat:
| Field | Tipe | Deskripsi |
|---|---|---|
effort | string | Salah satu level di atas. |
enabled | boolean | false mematikan penalaran. true tanpa effort atau max_tokens menyalakannya pada level medium. |
max_tokens | integer | Budget token untuk proses berpikir. Model yang menerima level, bukan budget, bisa mengabaikannya, jadi utamakan effort. |
exclude | boolean | true menyembunyikan jejak dari response. Proses berpikirnya tetap berjalan dan ditagih. |
Jika sebuah request memuat reasoning dan reasoning_effort sekaligus, objek reasoning yang dipakai.
curl https://kenari.id/v1/chat/completions \ -H "Authorization: Bearer $KENARI_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "step-3-7-flash:free", "reasoning": {"enabled": false}, "messages": [ {"role": "user", "content": "Jawab dengan satu kata: apa ibu kota Indonesia?"} ] }'kenari mengubah enabled: false menjadi parameter yang dibutuhkan provider, jadi kodemu tidak perlu berubah per model. Model tanpa reasoning_toggle bernilai true mungkin tetap berpikir.
Baca jejak penalaran
Section titled “Baca jejak penalaran”Lokasi jejak bergantung pada formatnya.
Di Chat completions, jejak ada di choices[].message.reasoning. Teks yang sama juga ada di reasoning_content, untuk tools yang membaca nama itu.
{ "choices": [ { "message": { "role": "assistant", "reasoning": "17 * 24 = 17 * 20 + 17 * 4 = 340 + 68 ...", "reasoning_content": "17 * 24 = 17 * 20 + 17 * 4 = 340 + 68 ...", "content": "17 * 24 = 408." }, "finish_reason": "stop" } ]}Di Messages, jejak berupa blok thinking sebelum blok teks:
{ "content": [ {"type": "thinking", "thinking": "17 * 24 = 17 * 20 + 17 * 4 ..."}, {"type": "text", "text": "17 * 24 = 408."} ]}Di Responses, jejak berupa item reasoning di awal output, dengan teks di summary[].text. Dalam stream, jejak datang sebelum jawaban. Lihat Streaming untuk event di setiap format.
kenari tidak memperpendek atau menyaring jejak. Isinya adalah teks yang dihasilkan model. Sebagian model tidak mengembalikan jejak, meskipun mereka berpikir.
Penagihan
Section titled “Penagihan”Token penalaran ditagih sebagai token Output, dengan tarif yang sama dengan token jawaban. Level effort yang lebih tinggi atau budget yang lebih besar bisa berarti lebih banyak token, dan biaya lebih tinggi di model yang menagihnya. Model :free tidak dikenai biaya. exclude: true tidak mengubah tagihan, karena proses berpikirnya tetap terjadi. Untuk berhemat, turunkan effort atau matikan penalaran. Lihat Cara penagihan.
max_tokens kecil dan jawaban kosong
Section titled “max_tokens kecil dan jawaban kosong”Proses berpikir memakai sebagian max_tokens. Jika max_tokens kecil, proses berpikir bisa menghabiskan seluruhnya sebelum jawaban dimulai, dan response tidak berisi teks jawaban. kenari menandai response sebagai terpotong, bukan sebagai berhenti normal:
| Format | Sinyal |
|---|---|
| Chat completions | finish_reason bernilai "length" |
| Messages | stop_reason bernilai "max_tokens" |
| Responses | status bernilai "incomplete" dengan incomplete_details: {"reason": "max_output_tokens"} |
Token berpikirnya tetap ditagih. Beri model reasoning max_tokens yang cukup untuk proses berpikir dan jawaban sekaligus, atau turunkan effort-nya.