Lewati ke konten
kenari.

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.

GET /v1/models menjelaskan penalaran untuk setiap model. Endpoint ini publik, jadi kamu bisa memfilternya tanpa key:

Terminal window
curl -s https://kenari.id/v1/models | jq -r '.data[] | select(.reasoning == true) | .id'
FieldArti
reasoningtrue jika model bisa berpikir.
reasoning_optionsLevel effort yang diterima model, misalnya ["low", "medium", "high"]. Tidak ada jika model tidak punya level effort.
reasoning_toggletrue 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.

Setiap format punya field sendiri. kenari memetakan semuanya ke kontrol penalaran asli dari provider model.

FormatCara meminta
Chat completionsreasoning_effort, atau objek reasoning di bawah
Messagesthinking: {"type": "enabled", "budget_tokens": N}, atau output_config: {"effort": "high"}
Responsesreasoning: {"effort": "high"}

Dengan Chat completions:

Terminal window
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.

Chat completions juga menerima objek reasoning gaya OpenRouter, yang bisa kamu kirim ke semua model chat:

FieldTipeDeskripsi
effortstringSalah satu level di atas.
enabledbooleanfalse mematikan penalaran. true tanpa effort atau max_tokens menyalakannya pada level medium.
max_tokensintegerBudget token untuk proses berpikir. Model yang menerima level, bukan budget, bisa mengabaikannya, jadi utamakan effort.
excludebooleantrue menyembunyikan jejak dari response. Proses berpikirnya tetap berjalan dan ditagih.

Jika sebuah request memuat reasoning dan reasoning_effort sekaligus, objek reasoning yang dipakai.

Terminal window
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.

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.

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.

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:

FormatSinyal
Chat completionsfinish_reason bernilai "length"
Messagesstop_reason bernilai "max_tokens"
Responsesstatus 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.