Przejdź do treści
Wysiłek rozumowania

Wysiłek rozumowania

Nowe

Model, który wnioskuje, zwraca tekst wnioskowania obok odpowiedzi, we własnym polu. W hostowanych modelach open-weight jedno pole zapytania ustala, jak głęboko model wnioskuje, zanim odpowie.

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)

Odpowiedź niesie tekst wnioskowania w reasoning_content, odpowiedź w content, a tokeny wnioskowania w usage:

200 JSON
{
  "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}
  }
}

Które modele wnioskują

Model Zwraca tekst wnioskowania Stosuje pole wysiłku
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 Tak —
Każdy hostowany model open-weight Tak Tak

To flagi capabilities.reasoning i capabilities.reasoning_effort, które GET /v1/models zgłasza dla każdego id. Odpowiedź zawiera tekst wnioskowania tylko wtedy, gdy model go wytworzył. Modele i ceny

Ustawianie wysiłku

Każdy endpoint ma własny zapis wysiłku. Wszystkie wybierają jeden z tych samych czterech poziomów.

Pole Typ Domyślnie Opis Stosowane przez
reasoning_effort string high /v1/chat/completions. Jak głęboko model wnioskuje, zanim odpowie: off, low, medium lub high. Hostowane modele open-weight
reasoning object | string /v1/chat/completions. Ta sama wartość jako {"effort": "low"} albo jako sam ciąg znaków. Gdy wysłano oba pola, liczy się reasoning_effort. Hostowane modele open-weight
reasoning.effort string high /v1/responses. Zapisywane jako obiekt {"effort": "low"}. Hostowane modele open-weight
thinking object /v1/messages. {"type": "enabled", "budget_tokens": n} lub {"type": "disabled"}. Budżet wybiera jeden z poziomów; zobacz tabelę niżej. Hostowane modele open-weight
{
  "model": "Kimi-K3-3BIT-REAP",
  "reasoning_effort": "low",
  "messages": [{"role": "user", "content": "Is 221 a prime number?"}]
}
Wartość Akceptowane też Skutek
off none, minimal Bez wnioskowania. Odpowiedź nie zawiera tekstu wnioskowania.
low Krótkie wnioskowanie.
medium default Średnia głębokość.
high max Najgłębszy poziom. Taki poziom ma zapytanie, które nie wysyła wartości.
  • Wartości są odczytywane bez względu na wielkość liter.
  • Wartość default oznacza medium. Pominięcie pola oznacza high.
  • Modele Shannon (shannon-*) same ustalają głębokość w każdym zapytaniu; GET /v1/models zgłasza dla nich reasoning_effort: false.

Budżet myślenia w /v1/messages

W /v1/messages pole thinking wybiera poziom. budget_tokens wybiera jeden z powyższych poziomów; nie jest osobnym limitem tokenów. adaptive jest odczytywane jak enabled.

Wysyłasz Poziom
{"type": "disabled"} off
{"type": "enabled", "budget_tokens": n} z n do 2,048 low
n od 2,049 do 8,192 medium
Większe n albo enabled bez budget_tokens high
Brak pola thinking high

Gdzie trafia tekst wnioskowania

Tekst wnioskowania jest zawsze oddzielony od odpowiedzi. Każdy format ma dla niego własne miejsce:

Endpoint Bez streamingu Ze streamingiem
/v1/chat/completions choices[0].message.reasoning_content: ciąg znaków albo null, gdy model nic nie wytworzył. Chunki z choices[0].delta.reasoning_content, przed chunkami z delta.content.
/v1/responses Element output {"type": "reasoning", "summary": [{"type": "summary_text", "text": "…"}]} przed elementem message. Brak elementu, gdy nie ma wnioskowania. response.output_item.added z elementem reasoning, potem zdarzenia response.reasoning_summary_text.delta i jedno response.reasoning_summary_text.done.
/v1/messages Pierwszy blok treści {"type": "thinking", "thinking": "…"}, potem blok text. Brak bloku thinking, gdy nie ma wnioskowania. Blok treści thinking: content_block_start, zdarzenia content_block_delta z thinking_delta, content_block_stop. Potem następuje blok tekstu.
{
  "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}
  }
}

Gdzie szukać, według modelu:

Modele Gdzie trafia tekst
Hostowane modele open-weight W każdym endpoincie, ze streamingiem lub bez. Zapytanie z wysiłkiem off albo z response_format / text.format dostaje odpowiedź bez tekstu wnioskowania.
shannon-3, shannon-3-pro, shannon-3.1, shannon-3.1-pro W każdym endpoincie, ze streamingiem lub bez, o ile model wytworzył tekst wnioskowania.
shannon-2-lite, shannon-2-pro /v1/chat/completions bez streamingu: w message.reasoning_content. Ze streamingiem, w zapytaniu bez tools lub response_format: stream niesie wiersze komentarza : thinking, gdy model wnioskuje, a potem chunki odpowiedzi. /v1/messages ze streamingiem: blok thinking przed blokiem tekstu.
shannon-1.6-pro, shannon-coder-1 W odpowiedziach ze streamingiem i w odpowiedziach na zapytania z tools, o ile model wytworzył tekst wnioskowania.

W /v1/responses odpowiedź bez streamingu zawiera element reasoning dla rodziny Shannon 3 i hostowanych modeli open-weight.

Czytanie streamu

W streamie tekst wnioskowania idzie pierwszy, we własnych deltach, a po nim odpowiedź. Wypisuj lub zapisuj te dwie części osobno:

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

Pierwszy chunk hostowanego modelu open-weight, z wnioskowaniem lub z odpowiedzią, niesie też delta.role: "assistant". Streaming

Tokeny wnioskowania i rozliczenia

W hostowanych modelach open-weight tokeny wnioskowania są tokenami wyjścia: są rozliczane po cenie wyjścia modelu, a liczba wyjścia już je zawiera. usage pokazuje tu udział wnioskowania:

Endpoint Pole Uwaga
/v1/chat/completions usage.completion_tokens_details.reasoning_tokens Już wliczone w completion_tokens.
/v1/responses usage.output_tokens_details.reasoning_tokens Już wliczone w output_tokens.
/v1/messages usage.output_tokens Wnioskowanie i odpowiedź razem. Ten format nie ma osobnej liczby.
  • W hostowanych modelach open-weight max_tokens ogranicza tekst odpowiedzi. Tokeny wnioskowania nie wliczają się do niego.
  • Ponieważ wnioskowanie jest rozliczane jako wyjście, poziom wysiłku jest też ustawieniem kosztu: off nie wytwarza tokenów wnioskowania.
  • Modele Shannon zgłaszają prompt_tokens, completion_tokens i total_tokens (input_tokens i output_tokens w /v1/messages) bez udziału wnioskowania i rozliczają jedną stałą cenę za token. Modele i ceny

Wnioskowanie w następnym zapytaniu

Nie musisz odsyłać wnioskowania. Blok thinking lub element reasoning w wysyłanej rozmowie nie jest przekazywany modelowi, więc turę asystenta można odesłać z nim lub bez niego. Blok thinking ma dwa pola, type i thinking; nie ma signature.

Błędy

Status Typ Komunikat Kiedy
400 invalid_request_error unknown reasoning effort '<value>'; expected off, low, medium or high Hostowany model open-weight dostał wartość spoza listy, na przykład xhigh. Nic nie jest pobierane z Twojego salda.
422 invalid_request_error Failed to deserialize the JSON body into the target type: … reasoning_effort nie jest ciągiem znaków.

Błędy uwierzytelniania, salda i serwera są takie same jak przy każdym zapytaniu. Obsługa błędów