Reasoning effort
NieuwEen model dat redeneert, geeft zijn redeneertekst naast het antwoord terug, in een eigen veld. Bij de gehoste open-weight modellen bepaalt één aanvraagveld hoe diep het model redeneert voordat het antwoordt.
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?"}
]
}' Het antwoord bevat de redeneertekst in reasoning_content, het antwoord in content en de redeneertokens in 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}
}
} Welke modellen redeneren
| Model | Geeft redeneertekst terug | Past het effortveld toe |
|---|---|---|
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 | Ja | — |
| Elk gehost open-weight model | Ja | Ja |
Dit zijn de vlaggen capabilities.reasoning en capabilities.reasoning_effort die GET /v1/models bij elke id meldt. Een antwoord bevat alleen redeneertekst als het model die heeft geproduceerd. Modellen en prijzen
De effort instellen
Elk endpoint heeft zijn eigen schrijfwijze voor de effort. Ze kiezen allemaal een van dezelfde vier niveaus.
| Veld | Type | Standaard | Beschrijving | Toegepast door |
|---|---|---|---|---|
reasoning_effort | string | high | /v1/chat/completions. Hoe diep het model redeneert voordat het antwoordt: off, low, medium of high. | Gehoste open-weight modellen |
reasoning | object | string | /v1/chat/completions. Dezelfde waarde als {"effort": "low"} of als kale string. Als beide velden worden verstuurd, geldt reasoning_effort. | Gehoste open-weight modellen | |
reasoning.effort | string | high | /v1/responses. Geschreven als het object {"effort": "low"}. | Gehoste open-weight modellen |
thinking | object | /v1/messages. {"type": "enabled", "budget_tokens": n} of {"type": "disabled"}. Het budget kiest een van de niveaus; zie de tabel verderop. | Gehoste open-weight modellen |
{
"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?"}]
} | Waarde | Ook geaccepteerd | Effect |
|---|---|---|
off | none, minimal | Geen redenering. Het antwoord bevat geen redeneertekst. |
low | Beknopt redeneren. | |
medium | default | Gemiddelde diepte. |
high | max | Het diepste niveau. Dit is het niveau van een aanvraag die geen waarde meestuurt. |
- Waarden worden gelezen zonder onderscheid tussen hoofdletters en kleine letters.
- De waarde
defaultbetekentmedium. Het veld weglaten betekenthigh. - De Shannon-modellen (
shannon-*) bepalen in elke aanvraag zelf hun diepte;GET /v1/modelsmeldt voor henreasoning_effort: false.
Het thinking-budget op /v1/messages
Op /v1/messages kiest het veld thinking het niveau. budget_tokens kiest een van de niveaus hierboven; het is geen eigen tokenlimiet. adaptive wordt gelezen als enabled.
| Jij verstuurt | Niveau |
|---|---|
{"type": "disabled"} | off |
{"type": "enabled", "budget_tokens": n} met n tot 2,048 | low |
n van 2,049 tot 8,192 | medium |
Een grotere n, of enabled zonder budget_tokens | high |
Geen thinking-veld | high |
Waar de redeneertekst aankomt
Redeneertekst staat altijd los van het antwoord. Elk formaat heeft er zijn eigen plek voor:
| Endpoint | Zonder streaming | Met streaming |
|---|---|---|
/v1/chat/completions | choices[0].message.reasoning_content: een string, of null als het model er geen heeft geproduceerd. | Chunks met choices[0].delta.reasoning_content, vóór de chunks met delta.content. |
/v1/responses | Een output-item {"type": "reasoning", "summary": [{"type": "summary_text", "text": "…"}]} vóór het message-item. Geen item als er geen redenering is. | response.output_item.added met een reasoning-item, daarna response.reasoning_summary_text.delta-events en één response.reasoning_summary_text.done. |
/v1/messages | Een eerste contentblok {"type": "thinking", "thinking": "…"}, daarna het text-blok. Geen thinking-blok als er geen redenering is. | Een thinking-contentblok: content_block_start, content_block_delta-events met thinking_delta, content_block_stop. Het tekstblok volgt. |
{
"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
}
} Waar je moet kijken, per model:
| Modellen | Waar de tekst aankomt |
|---|---|
| Gehoste open-weight modellen | Op elk endpoint, met of zonder streaming. Een aanvraag met effort off, of met response_format / text.format, wordt beantwoord zonder redeneertekst. |
shannon-3, shannon-3-pro, shannon-3.1, shannon-3.1-pro | Op elk endpoint, met of zonder streaming, telkens wanneer het model redeneertekst heeft geproduceerd. |
shannon-2-lite, shannon-2-pro | /v1/chat/completions, zonder streaming: in message.reasoning_content. Met streaming, in een aanvraag zonder tools of response_format: de stream bevat opmerkingsregels : thinking terwijl het model redeneert, daarna de antwoordchunks. /v1/messages, met streaming: een thinking-blok vóór het tekstblok. |
shannon-1.6-pro, shannon-coder-1 | In antwoorden met streaming en in antwoorden op aanvragen met tools, telkens wanneer het model redeneertekst heeft geproduceerd. |
Op /v1/responses bevat een antwoord zonder streaming het reasoning-item voor de Shannon 3-familie en de gehoste open-weight modellen.
Een stream lezen
In een stream komt de redeneertekst eerst, in eigen delta's, en daarna het antwoord. Druk de twee gescheiden af of sla ze gescheiden op:
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?"}
]
}' De eerste chunk van een gehost open-weight model, redenering of antwoord, bevat ook delta.role: "assistant". Streaming
Redeneertokens en facturering
Bij de gehoste open-weight modellen zijn redeneertokens outputtokens: ze worden tegen de outputprijs van het model gefactureerd, en de outputtelling bevat ze al. usage toont hier het aandeel redenering:
| Endpoint | Veld | Opmerking |
|---|---|---|
/v1/chat/completions | usage.completion_tokens_details.reasoning_tokens | Zit al in completion_tokens. |
/v1/responses | usage.output_tokens_details.reasoning_tokens | Zit al in output_tokens. |
/v1/messages | usage.output_tokens | Redenering en antwoord samen. Dit formaat heeft geen aparte telling. |
- Bij de gehoste open-weight modellen begrenst
max_tokensde antwoordtekst. Redeneertokens tellen er niet in mee. - Omdat redenering als output wordt gefactureerd, is het effortniveau ook een kosteninstelling:
offlevert geen redeneertokens op. - De Shannon-modellen melden
prompt_tokens,completion_tokensentotal_tokens(input_tokensenoutput_tokensop/v1/messages) zonder aandeel redenering, en factureren één vaste prijs per token. Modellen en prijzen
Redenering in de volgende aanvraag
Je hoeft redenering niet terug te sturen. Een thinking-blok of een reasoning-item in het gesprek dat je verstuurt, wordt niet doorgegeven aan het model, dus een assistentbeurt kan met of zonder terug. Een thinking-blok heeft de twee velden type en thinking; het heeft geen signature.
Fouten
| Status | Type | Melding | Wanneer |
|---|---|---|---|
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | Een gehost open-weight model kreeg een waarde buiten de lijst, bijvoorbeeld xhigh. Er wordt niets van je saldo afgeschreven. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | reasoning_effort is geen string. |
Fouten bij authenticatie, saldo en server zijn dezelfde als bij elke aanvraag. Foutafhandeling