Reasoning effort
NyEn model, der ræsonnerer, returnerer sin ræsonnementstekst ved siden af svaret, i et felt for sig. På de hostede open-weight-modeller fastsætter ét anmodningsfelt, hvor dybt modellen ræsonnerer, før den svarer.
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?"}
]
}' Svaret indeholder ræsonnementsteksten i reasoning_content, svaret i content og ræsonnement-tokens i 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}
}
} Hvilke modeller der ræsonnerer
| Model | Returnerer ræsonnementstekst | Anvender effort-feltet |
|---|---|---|
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 | — |
| Hver hostet open-weight-model | Ja | Ja |
Det er flagene capabilities.reasoning og capabilities.reasoning_effort, som GET /v1/models melder for hvert id. Et svar indeholder kun ræsonnementstekst, når modellen har frembragt noget. Modeller og priser
Indstilling af effort
Hvert endpoint har sin egen stavemåde for effort. Alle vælger et af de samme fire niveauer.
| Felt | Type | Standard | Beskrivelse | Anvendes af |
|---|---|---|---|---|
reasoning_effort | string | high | /v1/chat/completions. Hvor dybt modellen ræsonnerer, før den svarer: off, low, medium eller high. | Hostede open-weight-modeller |
reasoning | object | string | /v1/chat/completions. Samme værdi som {"effort": "low"} eller som en ren streng. Når begge felter sendes, gælder reasoning_effort. | Hostede open-weight-modeller | |
reasoning.effort | string | high | /v1/responses. Skrives som objektet {"effort": "low"}. | Hostede open-weight-modeller |
thinking | object | /v1/messages. {"type": "enabled", "budget_tokens": n} eller {"type": "disabled"}. Budgettet vælger et af niveauerne; se tabellen længere nede. | Hostede open-weight-modeller |
{
"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?"}]
} | Værdi | Accepteres også | Virkning |
|---|---|---|
off | none, minimal | Intet ræsonnement. Svaret indeholder ingen ræsonnementstekst. |
low | Kortfattet ræsonnement. | |
medium | default | Middel dybde. |
high | max | Det dybeste niveau. Det er niveauet for en anmodning, der ikke sender nogen værdi. |
- Værdier læses uden hensyn til store eller små bogstaver.
- Værdien
defaultbetydermedium. Udelader du feltet, betyder dethigh. - Shannon-modellerne (
shannon-*) fastsætter selv deres dybde i hver anmodning;GET /v1/modelsmelderreasoning_effort: falsefor dem.
Thinking-budgettet på /v1/messages
På /v1/messages vælger feltet thinking niveauet. budget_tokens vælger et af niveauerne ovenfor; det er ikke en token-grænse for sig. adaptive læses som enabled.
| Du sender | Niveau |
|---|---|
{"type": "disabled"} | off |
{"type": "enabled", "budget_tokens": n} med n op til 2,048 | low |
n fra 2,049 til 8,192 | medium |
Et større n, eller enabled uden budget_tokens | high |
Intet thinking-felt | high |
Hvor ræsonnementsteksten ankommer
Ræsonnementstekst er altid adskilt fra svaret. Hvert format har sit eget sted til den:
| Endpoint | Ikke streamet | Streamet |
|---|---|---|
/v1/chat/completions | choices[0].message.reasoning_content: en streng, eller null, når modellen ikke frembragte noget. | Chunks med choices[0].delta.reasoning_content, før chunks med delta.content. |
/v1/responses | Et output-element {"type": "reasoning", "summary": [{"type": "summary_text", "text": "…"}]} før message-elementet. Intet element, når der ikke er noget ræsonnement. | response.output_item.added med et reasoning-element, derefter response.reasoning_summary_text.delta-hændelser og én response.reasoning_summary_text.done. |
/v1/messages | En første indholdsblok {"type": "thinking", "thinking": "…"}, derefter text-blokken. Ingen thinking-blok, når der ikke er noget ræsonnement. | En indholdsblok af typen thinking: content_block_start, content_block_delta-hændelser med thinking_delta, content_block_stop. Tekstblokken følger. |
{
"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
}
} Hvor du skal kigge, per model:
| Modeller | Hvor teksten ankommer |
|---|---|
| Hostede open-weight-modeller | På alle endpoints, streamet eller ej. En anmodning med effort off eller med response_format / text.format besvares uden ræsonnementstekst. |
shannon-3, shannon-3-pro, shannon-3.1, shannon-3.1-pro | På alle endpoints, streamet eller ej, når modellen har frembragt ræsonnementstekst. |
shannon-2-lite, shannon-2-pro | /v1/chat/completions, ikke streamet: i message.reasoning_content. Streamet, i en anmodning uden tools eller response_format: streamen har kommentarlinjer : thinking, mens modellen ræsonnerer, derefter svar-chunks. /v1/messages, streamet: en thinking-blok før tekstblokken. |
shannon-1.6-pro, shannon-coder-1 | I streamede svar og i svar på anmodninger med tools, når modellen har frembragt ræsonnementstekst. |
På /v1/responses indeholder et svar, der ikke streames, reasoning-elementet for Shannon 3-familien og de hostede open-weight-modeller.
Sådan læser du en stream
I en stream kommer ræsonnementsteksten først, i deltaer for sig, og svaret følger. Udskriv eller gem de to hver for sig:
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?"}
]
}' Det første chunk fra en hostet open-weight-model, ræsonnement eller svar, indeholder også delta.role: "assistant". Streaming
Ræsonnement-tokens og afregning
På de hostede open-weight-modeller er ræsonnement-tokens output-tokens: de afregnes til modellens outputpris, og outputtællingen indeholder dem allerede. usage viser her ræsonnementets andel:
| Endpoint | Felt | Note |
|---|---|---|
/v1/chat/completions | usage.completion_tokens_details.reasoning_tokens | Allerede inkluderet i completion_tokens. |
/v1/responses | usage.output_tokens_details.reasoning_tokens | Allerede inkluderet i output_tokens. |
/v1/messages | usage.output_tokens | Ræsonnement og svar tilsammen. Dette format har ingen separat tælling. |
- På de hostede open-weight-modeller begrænser
max_tokenssvarteksten. Ræsonnement-tokens tælles ikke med i den. - Fordi ræsonnement afregnes som output, er effort-niveauet også en omkostningsindstilling:
offgiver ingen ræsonnement-tokens. - Shannon-modellerne melder
prompt_tokens,completion_tokensogtotal_tokens(input_tokensogoutput_tokenspå/v1/messages) uden en ræsonnementsandel og afregner én fast pris per token. Modeller og priser
Ræsonnement i den næste anmodning
Du behøver ikke sende ræsonnement tilbage. En thinking-blok eller et reasoning-element i den samtale, du sender, gives ikke videre til modellen, så en assistent-tur kan sendes tilbage med eller uden det. En thinking-blok har de to felter type og thinking; den har ingen signature.
Fejl
| Status | Type | Besked | Hvornår |
|---|---|---|---|
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | En hostet open-weight-model modtog en værdi uden for listen, f.eks. xhigh. Intet trækkes fra din saldo. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | reasoning_effort er ikke en streng. |
Fejl i godkendelse, saldo og server er de samme som for enhver anmodning. Fejlhåndtering