Efort de raționament
NouUn model care raționează returnează textul raționamentului alături de răspuns, într-un câmp separat. La modelele open-weight găzduite, un câmp al cererii stabilește cât de adânc raționează modelul înainte de a răspunde.
POST https://api.shannon-ai.com/v1/chat/completions
from openai import OpenAI
client = OpenAI(api_key="YOUR_API_KEY", base_url="https://api.shannon-ai.com/v1")
response = client.chat.completions.create(
model="Kimi-K3-3BIT-REAP",
reasoning_effort="low",
messages=[{"role": "user", "content": "Is 221 a prime number?"}],
)
message = response.choices[0].message
print("Reasoning:", getattr(message, "reasoning_content", None))
print("Answer:", message.content)
print("Reasoning tokens:", response.usage.completion_tokens_details.reasoning_tokens) import OpenAI from "openai";
const client = new OpenAI({ apiKey: "YOUR_API_KEY", baseURL: "https://api.shannon-ai.com/v1" });
const response = await client.chat.completions.create({
model: "Kimi-K3-3BIT-REAP",
reasoning_effort: "low",
messages: [{ role: "user", content: "Is 221 a prime number?" }],
});
const message = response.choices[0].message;
console.log("Reasoning:", message.reasoning_content);
console.log("Answer:", message.content);
console.log("Reasoning tokens:", response.usage.completion_tokens_details.reasoning_tokens); curl https://api.shannon-ai.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "Kimi-K3-3BIT-REAP",
"reasoning_effort": "low",
"messages": [
{"role": "user", "content": "Is 221 a prime number?"}
]
}' Răspunsul conține textul raționamentului în reasoning_content, răspunsul în content și token-urile de raționament în usage:
{
"id": "chatcmpl-2a6c8e0b4d1f4a3c9e7b5d3f1a8c6e4b",
"object": "chat.completion",
"created": 1791590400,
"model": "Kimi-K3-3BIT-REAP",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "No. 221 = 13 x 17, so it is not prime.",
"reasoning_content": "Try small primes. 221 / 13 = 17, so 221 = 13 x 17."
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 14,
"completion_tokens": 43,
"total_tokens": 57,
"prompt_tokens_details": {"cached_tokens": 0},
"completion_tokens_details": {"reasoning_tokens": 27}
}
} Care modele raționează
| Model | Returnează text de raționament | Aplică câmpul de efort |
|---|---|---|
shannon-1.6-lite | — | — |
shannon-1.6-pro, shannon-2-lite, shannon-2-pro, shannon-3, shannon-3-pro, shannon-3.1, shannon-3.1-pro, shannon-coder-1 | Da | — |
| Fiecare model open-weight găzduit | Da | Da |
Acestea sunt indicatorii capabilities.reasoning și capabilities.reasoning_effort pe care GET /v1/models îi raportează pentru fiecare id. Un răspuns conține text de raționament doar când modelul a produs unul. Modele și prețuri
Setarea efortului
Fiecare endpoint are propria scriere a efortului. Toate aleg unul dintre aceleași patru niveluri.
| Câmp | Tip | Implicit | Descriere | Aplicat de |
|---|---|---|---|---|
reasoning_effort | string | high | /v1/chat/completions. Cât de adânc raționează modelul înainte de a răspunde: off, low, medium sau high. | Modele open-weight găzduite |
reasoning | object | string | /v1/chat/completions. Aceeași valoare ca {"effort": "low"} sau ca un șir simplu. Când sunt trimise ambele câmpuri, reasoning_effort are prioritate. | Modele open-weight găzduite | |
reasoning.effort | string | high | /v1/responses. Scris ca obiectul {"effort": "low"}. | Modele open-weight găzduite |
thinking | object | /v1/messages. {"type": "enabled", "budget_tokens": n} sau {"type": "disabled"}. Bugetul alege unul dintre niveluri; vezi tabelul de mai jos. | Modele open-weight găzduite |
{
"model": "Kimi-K3-3BIT-REAP",
"reasoning_effort": "low",
"messages": [{"role": "user", "content": "Is 221 a prime number?"}]
} {
"model": "Kimi-K3-3BIT-REAP",
"reasoning": {"effort": "low"},
"input": "Is 221 a prime number?"
} {
"model": "Kimi-K3-3BIT-REAP",
"max_tokens": 1024,
"thinking": {"type": "enabled", "budget_tokens": 2048},
"messages": [{"role": "user", "content": "Is 221 a prime number?"}]
} | Valoare | Acceptat și | Efect |
|---|---|---|
off | none, minimal | Fără raționament. Răspunsul nu conține text de raționament. |
low | Raționament scurt. | |
medium | default | Adâncime medie. |
high | max | Cel mai adânc nivel. Acesta este nivelul unei cereri care nu trimite nicio valoare. |
- Valorile sunt citite fără a ține seama de majuscule sau minuscule.
- Valoarea
defaultînseamnămedium. Omiterea câmpului înseamnăhigh. - Modelele Shannon (
shannon-*) își stabilesc singure adâncimea la fiecare cerere;GET /v1/modelsraportează pentru elereasoning_effort: false.
Bugetul de gândire pe /v1/messages
Pe /v1/messages, câmpul thinking alege nivelul. budget_tokens alege unul dintre nivelurile de mai sus; nu este o limită proprie de token-uri. adaptive este citit ca enabled.
| Trimiți | Nivel |
|---|---|
{"type": "disabled"} | off |
{"type": "enabled", "budget_tokens": n} cu n până la 2,048 | low |
n de la 2,049 la 8,192 | medium |
Un n mai mare sau enabled fără budget_tokens | high |
Fără câmpul thinking | high |
Unde sosește textul raționamentului
Textul raționamentului este întotdeauna separat de răspuns. Fiecare format are locul lui pentru el:
| Endpoint | Fără streaming | Cu streaming |
|---|---|---|
/v1/chat/completions | choices[0].message.reasoning_content: un șir sau null când modelul nu a produs raționament. | Chunk-uri cu choices[0].delta.reasoning_content, înaintea chunk-urilor cu delta.content. |
/v1/responses | Un element output {"type": "reasoning", "summary": [{"type": "summary_text", "text": "…"}]} înaintea elementului message. Niciun element când nu există raționament. | response.output_item.added cu un element reasoning, apoi evenimente response.reasoning_summary_text.delta și un response.reasoning_summary_text.done. |
/v1/messages | Un prim bloc de conținut {"type": "thinking", "thinking": "…"}, apoi blocul text. Niciun bloc thinking când nu există raționament. | Un bloc de conținut thinking: content_block_start, evenimente content_block_delta cu thinking_delta, content_block_stop. Blocul de text urmează. |
{
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "No. 221 = 13 x 17, so it is not prime.",
"reasoning_content": "Try small primes. 221 / 13 = 17, so 221 = 13 x 17."
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 14,
"completion_tokens": 43,
"total_tokens": 57,
"prompt_tokens_details": {"cached_tokens": 0},
"completion_tokens_details": {"reasoning_tokens": 27}
}
} {
"output": [
{
"id": "rs_6f0a2c4e8b1d4f3a9c7e5b3d1f8a6c4e",
"type": "reasoning",
"summary": [
{
"type": "summary_text",
"text": "Try small primes. 221 / 13 = 17, so 221 = 13 x 17."
}
]
},
{
"id": "msg_1b3d5f7a9c2e4b6d8f0a2c4e6b8d0f1a",
"type": "message",
"role": "assistant",
"status": "completed",
"content": [
{
"type": "output_text",
"text": "No. 221 = 13 x 17, so it is not prime.",
"annotations": []
}
]
}
],
"usage": {
"input_tokens": 14,
"input_tokens_details": {"cached_tokens": 0},
"output_tokens": 43,
"output_tokens_details": {"reasoning_tokens": 27},
"total_tokens": 57
}
} {
"content": [
{
"type": "thinking",
"thinking": "Try small primes. 221 / 13 = 17, so 221 = 13 x 17."
},
{"type": "text", "text": "No. 221 = 13 x 17, so it is not prime."}
],
"stop_reason": "end_turn",
"usage": {
"input_tokens": 14,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 0,
"output_tokens": 43
}
} Unde te uiți, pe model:
| Modele | Unde sosește textul |
|---|---|
| Modele open-weight găzduite | Pe fiecare endpoint, cu sau fără streaming. O cerere cu efort off sau cu response_format / text.format primește răspuns fără text de raționament. |
shannon-3, shannon-3-pro, shannon-3.1, shannon-3.1-pro | Pe fiecare endpoint, cu sau fără streaming, ori de câte ori modelul a produs text de raționament. |
shannon-2-lite, shannon-2-pro | /v1/chat/completions, fără streaming: în message.reasoning_content. Cu streaming, într-o cerere fără tools sau response_format: stream-ul conține linii de comentariu : thinking cât timp modelul raționează, apoi chunk-urile răspunsului. /v1/messages, cu streaming: un bloc thinking înaintea blocului de text. |
shannon-1.6-pro, shannon-coder-1 | În răspunsurile cu streaming și în răspunsurile la cereri care conțin tools, ori de câte ori modelul a produs text de raționament. |
Pe /v1/responses, un răspuns fără streaming conține elementul reasoning pentru familia Shannon 3 și pentru modelele open-weight găzduite.
Citirea unui stream
Într-un stream, textul raționamentului vine primul, în delta-uri proprii, iar răspunsul urmează. Afișează sau stochează-le separat:
from openai import OpenAI
client = OpenAI(api_key="YOUR_API_KEY", base_url="https://api.shannon-ai.com/v1")
stream = client.chat.completions.create(
model="Kimi-K3-3BIT-REAP",
reasoning_effort="medium",
stream=True,
messages=[{"role": "user", "content": "Is 221 a prime number?"}],
)
for chunk in stream:
if not chunk.choices:
continue
delta = chunk.choices[0].delta
reasoning = getattr(delta, "reasoning_content", None)
if reasoning:
print(reasoning, end="", flush=True) # the reasoning text comes first
if delta.content:
print(delta.content, end="", flush=True) # then the answer import OpenAI from "openai";
const client = new OpenAI({ apiKey: "YOUR_API_KEY", baseURL: "https://api.shannon-ai.com/v1" });
const stream = await client.chat.completions.create({
model: "Kimi-K3-3BIT-REAP",
reasoning_effort: "medium",
stream: true,
messages: [{ role: "user", content: "Is 221 a prime number?" }],
});
for await (const chunk of stream) {
const delta = chunk.choices[0]?.delta ?? {};
if (delta.reasoning_content) process.stdout.write(delta.reasoning_content); // the reasoning text comes first
if (delta.content) process.stdout.write(delta.content); // then the answer
} curl -N https://api.shannon-ai.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "Kimi-K3-3BIT-REAP",
"reasoning_effort": "medium",
"stream": true,
"messages": [
{"role": "user", "content": "Is 221 a prime number?"}
]
}' Primul chunk al unui model open-weight găzduit, de raționament sau de răspuns, conține și delta.role: "assistant". Streaming
Token-uri de raționament și facturare
La modelele open-weight găzduite, token-urile de raționament sunt token-uri de ieșire: sunt taxate la prețul de ieșire al modelului, iar numărul de ieșire le include deja. usage arată aici partea de raționament:
| Endpoint | Câmp | Notă |
|---|---|---|
/v1/chat/completions | usage.completion_tokens_details.reasoning_tokens | Deja inclus în completion_tokens. |
/v1/responses | usage.output_tokens_details.reasoning_tokens | Deja inclus în output_tokens. |
/v1/messages | usage.output_tokens | Raționamentul și răspunsul împreună. Acest format nu are o numărătoare separată. |
- La modelele open-weight găzduite,
max_tokenslimitează textul răspunsului. Token-urile de raționament nu se numără în el. - Fiindcă raționamentul este taxat ca ieșire, nivelul de efort este și o setare de cost:
offnu produce token-uri de raționament. - Modelele Shannon raportează
prompt_tokens,completion_tokensșitotal_tokens(input_tokensșioutput_tokenspe/v1/messages) fără o parte de raționament și taxează un singur preț fix per token. Modele și prețuri
Raționamentul în cererea următoare
Nu trebuie să trimiți raționamentul înapoi. Un bloc thinking sau un element reasoning din conversația pe care o trimiți nu este transmis modelului, deci o rundă a asistentului se poate întoarce cu sau fără el. Un bloc thinking are cele două câmpuri type și thinking; nu are signature.
Erori
| Stare | Tip | Mesaj | Când |
|---|---|---|---|
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | Un model open-weight găzduit a primit o valoare din afara listei, de exemplu xhigh. Nu se scade nimic din soldul tău. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | reasoning_effort nu este un șir. |
Erorile de autentificare, de sold și de server sunt aceleași ca pentru orice cerere. Gestionare erori