Усилие за разсъждение
НовоМодел, който разсъждава, връща текста на разсъжденията си до отговора, в отделно поле. При хостваните open-weight модели едно поле на заявката задава колко дълбоко моделът разсъждава, преди да отговори.
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?"}
]
}' Отговорът носи текста на разсъжденията в reasoning_content, отговора в content и токените на разсъжденията в 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}
}
} Кои модели разсъждават
| Модел | Връща текст на разсъжденията | Прилага полето за усилия |
|---|---|---|
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 | Да | — |
| Всеки хостван open-weight модел | Да | Да |
Това са флаговете capabilities.reasoning и capabilities.reasoning_effort, които GET /v1/models докладва за всяко id. Отговорът носи текст на разсъждения само когато моделът е създал такъв. Модели и цени
Задаване на усилията
Всеки ендпоинт има собствено изписване на усилията. Всички те избират едно от същите четири нива.
| Поле | Тип | По подразбиране | Описание | Прилага се от |
|---|---|---|---|---|
reasoning_effort | string | high | /v1/chat/completions. Колко дълбоко разсъждава моделът, преди да отговори: off, low, medium или high. | Хоствани open-weight модели |
reasoning | object | string | /v1/chat/completions. Същата стойност като {"effort": "low"} или като гол низ. Когато са изпратени и двете полета, брои се reasoning_effort. | Хоствани open-weight модели | |
reasoning.effort | string | high | /v1/responses. Записва се като обекта {"effort": "low"}. | Хоствани open-weight модели |
thinking | object | /v1/messages. {"type": "enabled", "budget_tokens": n} или {"type": "disabled"}. Бюджетът избира едно от нивата; вижте таблицата по-надолу. | Хоствани open-weight модели |
{
"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?"}]
} | Стойност | Приема се и | Ефект |
|---|---|---|
off | none, minimal | Без разсъждения. Отговорът не носи текст на разсъждения. |
low | Кратки разсъждения. | |
medium | default | Средна дълбочина. |
high | max | Най-дълбокото ниво. Това е нивото на заявка, която не изпраща стойност. |
- Стойностите се четат без значение дали са с главни, или с малки букви.
- Стойността
defaultозначаваmedium. Пропускането на полето означаваhigh. - Моделите на Shannon (
shannon-*) сами задават дълбочината си при всяка заявка;GET /v1/modelsдокладваreasoning_effort: falseза тях.
Бюджетът за thinking на /v1/messages
На /v1/messages полето thinking избира нивото. budget_tokens избира едно от нивата по-горе; не е собствено ограничение на токени. adaptive се чете като enabled.
| Изпращате | Ниво |
|---|---|
{"type": "disabled"} | off |
{"type": "enabled", "budget_tokens": n} с n до 2,048 | low |
n от 2,049 до 8,192 | medium |
По-голямо n или enabled без budget_tokens | high |
Няма поле thinking | high |
Къде пристига текстът на разсъжденията
Текстът на разсъжденията винаги е отделен от отговора. Всеки формат има собствено място за него:
| Ендпоинт | Без стрийминг | Със стрийминг |
|---|---|---|
/v1/chat/completions | choices[0].message.reasoning_content: низ или null, когато моделът не е създал такива. | Фрагменти с choices[0].delta.reasoning_content, преди фрагментите с delta.content. |
/v1/responses | Елемент на output {"type": "reasoning", "summary": [{"type": "summary_text", "text": "…"}]} преди елемента message. Няма елемент, когато няма разсъждения. | response.output_item.added с елемент reasoning, после събития response.reasoning_summary_text.delta и едно response.reasoning_summary_text.done. |
/v1/messages | Първи блок със съдържание {"type": "thinking", "thinking": "…"}, после блокът text. Няма блок thinking, когато няма разсъждения. | Блок със съдържание thinking: content_block_start, събития content_block_delta с thinking_delta, content_block_stop. Текстовият блок следва. |
{
"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
}
} Къде да гледате, по модел:
| Модели | Къде пристига текстът |
|---|---|
| Хоствани open-weight модели | На всеки ендпоинт, със или без стрийминг. Заявка с усилия off или с response_format / text.format получава отговор без текст на разсъждения. |
shannon-3, shannon-3-pro, shannon-3.1, shannon-3.1-pro | На всеки ендпоинт, със или без стрийминг, винаги когато моделът е създал текст на разсъждения. |
shannon-2-lite, shannon-2-pro | /v1/chat/completions, без стрийминг: в message.reasoning_content. Със стрийминг, в заявка без tools или response_format: стриймът носи коментарни редове : thinking, докато моделът разсъждава, после фрагментите на отговора. /v1/messages, със стрийминг: блок thinking преди текстовия блок. |
shannon-1.6-pro, shannon-coder-1 | В отговори със стрийминг и в отговори на заявки, които носят tools, винаги когато моделът е създал текст на разсъждения. |
На /v1/responses отговор без стрийминг носи елемента reasoning за семейството Shannon 3 и хостваните open-weight модели.
Четене на стрийм
При стрийм текстът на разсъжденията идва първи, в собствени делти, а отговорът следва. Отпечатвайте или съхранявайте двете поотделно:
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?"}
]
}' Първият фрагмент на хостван open-weight модел, разсъждение или отговор, носи и delta.role: "assistant". Стрийминг
Токени на разсъжденията и фактуриране
При хостваните open-weight модели токените на разсъжденията са изходни токени: таксуват се по изходната цена на модела, а изходният брой вече ги включва. usage показва дела на разсъжденията тук:
| Ендпоинт | Поле | Бележка |
|---|---|---|
/v1/chat/completions | usage.completion_tokens_details.reasoning_tokens | Вече е включено в completion_tokens. |
/v1/responses | usage.output_tokens_details.reasoning_tokens | Вече е включено в output_tokens. |
/v1/messages | usage.output_tokens | Разсъждения и отговор заедно. Този формат няма отделно броене. |
- При хостваните open-weight модели
max_tokensограничава текста на отговора. Токените на разсъжденията не се броят към него. - Тъй като разсъжденията се таксуват като изход, нивото на усилията е и настройка на цената:
offне създава токени за разсъждения. - Моделите на Shannon докладват
prompt_tokens,completion_tokensиtotal_tokens(input_tokensиoutput_tokensна/v1/messages) без дял за разсъждения и таксуват една единна цена на токен. Модели и цени
Разсъжденията в следващата заявка
Не е нужно да изпращате разсъжденията обратно. Блок thinking или елемент reasoning в разговора, който изпращате, не се предава на модела, така че ход на асистента може да се върне със или без него. Блокът thinking има двете полета type и thinking; няма signature.
Грешки
| Статус | Тип | Съобщение | Кога |
|---|---|---|---|
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | Хостван open-weight модел е получил стойност извън списъка, например xhigh. Нищо не се взема от баланса Ви. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | reasoning_effort не е низ. |
Грешките при удостоверяване, баланс и сървър са същите като за всяка заявка. Обработка на грешки