Esforço de raciocínio
NovoUm modelo que raciocina retorna o seu texto de raciocínio ao lado da resposta, em um campo próprio. Nos modelos open-weight hospedados, um campo da requisição define quão profundamente o modelo raciocina antes de responder.
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?"}
]
}' A resposta traz o texto de raciocínio em reasoning_content, a resposta em content e os tokens de raciocínio em 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}
}
} Quais modelos raciocinam
| Modelo | Retorna texto de raciocínio | Aplica o campo de esforço |
|---|---|---|
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 | Sim | — |
| Todos os modelos open-weight hospedados | Sim | Sim |
São as flags capabilities.reasoning e capabilities.reasoning_effort que GET /v1/models informa para cada id. Uma resposta traz texto de raciocínio apenas quando o modelo produziu algum. Modelos e preços
Definindo o esforço
Cada endpoint tem a sua própria grafia para o esforço. Todas selecionam um dos mesmos quatro níveis.
| Campo | Tipo | Padrão | Descrição | Aplicado por |
|---|---|---|---|---|
reasoning_effort | string | high | /v1/chat/completions. Quão profundamente o modelo raciocina antes de responder: off, low, medium ou high. | Modelos open-weight hospedados |
reasoning | object | string | /v1/chat/completions. O mesmo valor como {"effort": "low"} ou como uma string simples. Quando os dois campos são enviados, vale reasoning_effort. | Modelos open-weight hospedados | |
reasoning.effort | string | high | /v1/responses. Escrito como o objeto {"effort": "low"}. | Modelos open-weight hospedados |
thinking | object | /v1/messages. {"type": "enabled", "budget_tokens": n} ou {"type": "disabled"}. O orçamento seleciona um dos níveis; veja a tabela mais abaixo. | Modelos open-weight hospedados |
{
"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?"}]
} | Valor | Também aceito | Efeito |
|---|---|---|
off | none, minimal | Sem raciocínio. A resposta não traz texto de raciocínio. |
low | Raciocínio breve. | |
medium | default | Profundidade média. |
high | max | O nível mais profundo. É o nível de uma requisição que não envia valor. |
- Os valores são lidos sem diferenciar maiúsculas de minúsculas.
- O valor
defaultsignificamedium. Omitir o campo significahigh. - Os modelos Shannon (
shannon-*) definem a própria profundidade em cada requisição;GET /v1/modelsinformareasoning_effort: falsepara eles.
O orçamento de raciocínio em /v1/messages
Em /v1/messages, o campo thinking seleciona o nível. budget_tokens escolhe um dos níveis acima; não é um limite de tokens próprio. adaptive é lido como enabled.
| Você envia | Nível |
|---|---|
{"type": "disabled"} | off |
{"type": "enabled", "budget_tokens": n} com n até 2,048 | low |
n de 2,049 a 8,192 | medium |
Um n maior, ou enabled sem budget_tokens | high |
Sem campo thinking | high |
Onde o texto de raciocínio chega
O texto de raciocínio é sempre separado da resposta. Cada formato tem o seu próprio lugar para ele:
| Endpoint | Sem stream | Com stream |
|---|---|---|
/v1/chat/completions | choices[0].message.reasoning_content: uma string, ou null quando o modelo não produziu nenhum. | Chunks com choices[0].delta.reasoning_content, antes dos chunks com delta.content. |
/v1/responses | Um item de output {"type": "reasoning", "summary": [{"type": "summary_text", "text": "…"}]} antes do item message. Sem item quando não há raciocínio. | response.output_item.added com um item reasoning, depois eventos response.reasoning_summary_text.delta e um response.reasoning_summary_text.done. |
/v1/messages | Um primeiro bloco de conteúdo {"type": "thinking", "thinking": "…"}, depois o bloco text. Sem bloco thinking quando não há raciocínio. | Um bloco de conteúdo thinking: content_block_start, eventos content_block_delta com thinking_delta, content_block_stop. O bloco de texto vem em seguida. |
{
"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
}
} Onde procurar, por modelo:
| Modelos | Onde o texto chega |
|---|---|
| Modelos open-weight hospedados | Em todos os endpoints, com ou sem stream. Uma requisição com esforço off, ou com response_format / text.format, é respondida sem texto de raciocínio. |
shannon-3, shannon-3-pro, shannon-3.1, shannon-3.1-pro | Em todos os endpoints, com ou sem stream, sempre que o modelo produziu texto de raciocínio. |
shannon-2-lite, shannon-2-pro | /v1/chat/completions, sem stream: em message.reasoning_content. Com stream, em uma requisição sem tools nem response_format: o stream traz linhas de comentário : thinking enquanto o modelo raciocina, depois os chunks da resposta. /v1/messages, com stream: um bloco thinking antes do bloco de texto. |
shannon-1.6-pro, shannon-coder-1 | Em respostas com stream e em respostas a requisições que trazem tools, sempre que o modelo produziu texto de raciocínio. |
Em /v1/responses, uma resposta sem stream traz o item reasoning para a família Shannon 3 e para os modelos open-weight hospedados.
Lendo um stream
Em um stream, o texto de raciocínio vem primeiro, em deltas próprios, e a resposta vem depois. Exiba ou armazene os dois separadamente:
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?"}
]
}' O primeiro chunk de um modelo open-weight hospedado, de raciocínio ou de resposta, também traz delta.role: "assistant". Streaming
Tokens de raciocínio e faturamento
Nos modelos open-weight hospedados, os tokens de raciocínio são tokens de saída: são faturados ao preço de saída do modelo, e a contagem de saída já os inclui. usage mostra aqui a parcela de raciocínio:
| Endpoint | Campo | Observação |
|---|---|---|
/v1/chat/completions | usage.completion_tokens_details.reasoning_tokens | Já incluído em completion_tokens. |
/v1/responses | usage.output_tokens_details.reasoning_tokens | Já incluído em output_tokens. |
/v1/messages | usage.output_tokens | Raciocínio e resposta juntos. Este formato não tem contagem separada. |
- Nos modelos open-weight hospedados,
max_tokenslimita o texto da resposta. Os tokens de raciocínio não contam para esse limite. - Como o raciocínio é faturado como saída, o nível de esforço também é uma configuração de custo:
offnão produz tokens de raciocínio. - Os modelos Shannon informam
prompt_tokens,completion_tokensetotal_tokens(input_tokenseoutput_tokensem/v1/messages) sem parcela de raciocínio, e cobram um preço único por token. Modelos e preços
O raciocínio na próxima requisição
Você não precisa enviar o raciocínio de volta. Um bloco thinking ou um item reasoning na conversa que você envia não é repassado ao modelo, então um turno do assistente pode voltar com ou sem ele. Um bloco thinking tem os dois campos type e thinking; não tem signature.
Erros
| Status | Tipo | Mensagem | Quando |
|---|---|---|---|
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | Um modelo open-weight hospedado recebeu um valor fora da lista, por exemplo xhigh. Nada é descontado do seu saldo. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | reasoning_effort não é uma string. |
Os erros de autenticação, de saldo e do servidor são os mesmos de qualquer requisição. Tratamento de erros