본문으로 건너뛰기
추론 effort

추론 effort

새로운

추론하는 모델은 답변 옆의 별도 필드에 추론 텍스트를 반환합니다. 호스팅 오픈 웨이트 모델에서는 요청 필드 하나로 모델이 답변 전에 얼마나 깊이 추론할지 정합니다.

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)

응답은 추론 텍스트를 reasoning_content에, 답변을 content에, 추론 토큰을 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}
  }
}

추론하는 모델

모델 추론 텍스트 반환 여부 강도 필드 적용 여부
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 예 —
모든 호스팅 오픈 웨이트 모델 예 예

GET /v1/models가 id마다 보고하는 플래그 capabilities.reasoning과 capabilities.reasoning_effort입니다. 모델이 추론을 생성했을 때만 응답에 추론 텍스트가 포함됩니다. 모델 및 가격

강도 설정

엔드포인트마다 강도의 표기가 다릅니다. 모두 같은 네 가지 수준 중 하나를 선택합니다.

필드 유형 기본값 설명 적용 대상
reasoning_effort string high /v1/chat/completions. 모델이 답변 전에 얼마나 깊이 추론하는지: off, low, medium, high. 호스팅 오픈 웨이트 모델
reasoning object | string /v1/chat/completions. {"effort": "low"}와 같은 값이거나 단순 문자열입니다. 두 필드를 모두 보내면 reasoning_effort가 적용됩니다. 호스팅 오픈 웨이트 모델
reasoning.effort string high /v1/responses. 객체 {"effort": "low"}로 작성합니다. 호스팅 오픈 웨이트 모델
thinking object /v1/messages. {"type": "enabled", "budget_tokens": n} 또는 {"type": "disabled"}. 예산이 수준 중 하나를 선택합니다. 아래 표를 참고하세요. 호스팅 오픈 웨이트 모델
{
  "model": "Kimi-K3-3BIT-REAP",
  "reasoning_effort": "low",
  "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를 보고합니다.

/v1/messages의 사고 예산 설정

/v1/messages에서는 thinking 필드가 수준을 선택합니다. budget_tokens는 위 수준 중 하나를 고르는 값이며 자체적인 토큰 한도가 아닙니다. adaptive는 enabled와 같게 처리됩니다.

보내는 값 수준
{"type": "disabled"} off
n이 2,048 이하인 {"type": "enabled", "budget_tokens": n} low
n이 2,049에서 8,192 medium
더 큰 n, 또는 budget_tokens 없는 enabled high
thinking 필드 없음 high

추론 텍스트가 도착하는 위치

추론 텍스트는 항상 답변과 분리되어 있습니다. 형식마다 고유한 위치가 있습니다.

엔드포인트 스트리밍 아님 스트리밍
/v1/chat/completions choices[0].message.reasoning_content: 문자열이며, 모델이 추론을 생성하지 않았으면 null입니다. choices[0].delta.reasoning_content가 있는 청크가 delta.content가 있는 청크보다 먼저 옵니다.
/v1/responses message 항목 앞에 output 항목 {"type": "reasoning", "summary": [{"type": "summary_text", "text": "…"}]}이 옵니다. 추론이 없으면 이 항목도 없습니다. reasoning 항목이 있는 response.output_item.added, 그다음 response.reasoning_summary_text.delta 이벤트들과 response.reasoning_summary_text.done 하나입니다.
/v1/messages 첫 콘텐츠 블록 {"type": "thinking", "thinking": "…"}, 그다음 text 블록입니다. 추론이 없으면 thinking 블록도 없습니다. thinking 콘텐츠 블록: content_block_start, thinking_delta가 있는 content_block_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}
  }
}

모델별로 확인할 위치:

모델 텍스트가 도착하는 위치
호스팅 오픈 웨이트 모델 모든 엔드포인트에서 스트리밍 여부와 관계없이 제공됩니다. 강도가 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에서 스트리밍이 아닌 응답은 Shannon 3 계열과 호스팅 오픈 웨이트 모델에 대해 reasoning 항목을 포함합니다.

스트림 읽기

스트림에서는 추론 텍스트가 별도의 델타로 먼저 오고, 답변이 뒤따릅니다. 둘을 따로 출력하거나 저장하세요.

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

호스팅 오픈 웨이트 모델의 첫 청크는 추론이든 답변이든 delta.role: "assistant"도 담고 있습니다. 스트리밍

추론 토큰과 청구

호스팅 오픈 웨이트 모델에서 추론 토큰은 출력 토큰입니다. 모델의 출력 가격으로 청구되며 출력 수에 이미 포함되어 있습니다. 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 추론과 답변을 합산한 값입니다. 이 형식에는 별도의 수치가 없습니다.
  • 호스팅 오픈 웨이트 모델에서 max_tokens는 답변 텍스트를 제한합니다. 추론 토큰은 여기에 포함되지 않습니다.
  • 추론은 출력으로 청구되므로 강도 수준은 비용 설정이기도 합니다. off는 추론 토큰을 생성하지 않습니다.
  • Shannon 모델은 추론 몫 없이 prompt_tokens, completion_tokens, total_tokens(/v1/messages에서는 input_tokens와 output_tokens)를 보고하며, 토큰당 단일 가격으로 청구합니다. 모델 및 가격

다음 요청에서의 추론

추론을 다시 보낼 필요는 없습니다. 보내는 대화 안의 thinking 블록이나 reasoning 항목은 모델에 전달되지 않으므로, assistant 턴은 포함하든 하지 않든 되돌려 보낼 수 있습니다. thinking 블록에는 type과 thinking 두 필드가 있으며 signature는 없습니다.

오류

상태 유형 메시지 시점
400 invalid_request_error unknown reasoning effort '<value>'; expected off, low, medium or high 호스팅 오픈 웨이트 모델이 목록에 없는 값(예: xhigh)을 받았습니다. 잔액에서는 아무것도 차감되지 않습니다.
422 invalid_request_error Failed to deserialize the JSON body into the target type: … reasoning_effort가 문자열이 아닙니다.

인증, 잔액, 서버 오류는 다른 모든 요청과 같습니다. 오류 처리