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.
Atur level di id model
Section titled “Atur level di id model”Sebagian tools coding hanya menawarkan beberapa level, atau tidak mengirim level sama sekali untuk model yang tidak dikenalnya. Untuk tetap memilih level, tambahkan level ke id model setelah titik dua:
curl https://kenari.id/v1/chat/completions \ -H "Authorization: Bearer $KENARI_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "deepseek-v4-1-flash:free:max", "messages": [ {"role": "user", "content": "Berapa 17 * 24? Tunjukkan langkahnya."} ] }'kenari menghapus akhiran itu dan menjalankan model di level tersebut, apa pun yang diminta request. Level itu ditulis ke reasoning_effort, objek reasoning, thinking dan output_config, dan juga mengalahkan request yang mematikan penalaran. Selain itu semuanya melihat id model biasa: model di response, batasan model pada key, penagihan, dan log pemakaian. Header response x-kenari-gated-effort menunjukkan level yang dikirim kenari.
- Level harus salah satu yang tercantum di
reasoning_optionsmodel. Level yang tidak tercantum, misalnyadeepseek-v4-pro:medium, ditolak dengan 400 yang menyebutkan level yang dimiliki model.nonehanya berlaku pada model yang mencantumkannya, dan mematikan penalaran. kenari/autodan rute menerimalow,medium,high,xhighdanmax. Setiap model yang dipanggil memakai level tertinggi yang tercantum pada atau di bawah level itu. Idbyok/mengirim level ke provider kamu tanpa diubah.- Akhiran bisa digabung dengan
:freedalam urutan mana pun.deepseek-v4-1-flash:free:maxdandeepseek-v4-1-flash:max:freeadalah model yang sama. - Id dengan level tidak tercantum di
GET /v1/models. Ketik id itu di tool kamu sebagai nama model kustom. Sebagian tools mencari context window berdasarkan nama model, jadi atur secara manual jika tool kamu menyediakan pilihan itu. - Nama rute tidak boleh diakhiri level, misalnya
fast:high.
Akhiran ini adalah ekstensi kenari. OpenRouter memakai bentuk titik dua yang sama untuk varian modelnya, tetapi tidak ada variannya yang mengatur level penalaran.
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.