Reasoning Effort 파라미터¶
이 문서는 Continuum Router가 다양한 LLM 백엔드에서 reasoning_effort 파라미터를 어떻게 처리하는지 설명합니다. 토큰 예산 변환 및 지원되는 effort 레벨을 포함합니다.
개요¶
reasoning_effort 파라미터는 모델이 응답을 생성하기 전에 추론에 사용하는 계산 노력의 양을 제어합니다. 각 백엔드는 이 기능을 다르게 구현합니다:
- OpenAI: O-series 및 GPT-5.2 thinking 모델에 대한 네이티브
reasoning_effort파라미터 - Anthropic: 확장 사고(extended thinking)를 지원하는 Claude 모델의
thinking.budget_tokens로 변환, 또는autoeffort에 대해{"type": "adaptive"}로 변환 - Gemini: OpenAI 호환 엔드포인트를 통한 thinking 모델에 대한 네이티브
reasoning_effort - 기타 백엔드: 패스스루 (변환 없음)
파라미터 형식¶
Continuum Router는 두 가지 입력 형식을 지원하며, 내부적으로 정규화됩니다:
평면 형식 (Chat Completions API)¶
중첩 형식 (Responses API)¶
두 형식 모두 처리 전에 평면 reasoning_effort 형식으로 자동 정규화됩니다. 둘 다 존재하는 경우 평면 형식이 우선합니다.
토큰 예산 직접 지정¶
고급 사용 사례의 경우, reasoning_effort 레벨 대신 토큰 예산을 직접 지정할 수 있습니다:
Anthropic: thinking 파라미터 직접 사용¶
{
"model": "claude-sonnet-4-20250514",
"thinking": {
"type": "enabled",
"budget_tokens": 16000
},
"messages": [...]
}
적응형 사고(Adaptive Thinking)의 경우 (모델이 사고의 시점과 정도를 결정):
Gemini: extra_body를 통한 thinking_budget 직접 지정¶
{
"model": "gemini-2.5-pro",
"extra_body": {
"google": {
"thinking_config": {
"thinking_budget": 10000,
"include_thoughts": true
}
}
},
"messages": [...]
}
우선순위
reasoning_effort와 직접 토큰 지정이 모두 있는 경우, Anthropic에서는 직접 지정(thinking 파라미터)이 우선합니다. Gemini의 경우 둘 다 공존할 수 있지만 extra_body의 thinking_budget이 세밀한 제어에 사용됩니다.
백엔드별 동작¶
OpenAI 백엔드¶
OpenAI 모델은 reasoning_effort 파라미터를 네이티브로 지원합니다. 라우터는 값을 OpenAI API에 직접 전달합니다.
지원되는 Effort 레벨¶
| Effort 레벨 | 지원 모델 | 설명 |
|---|---|---|
low |
O-series, GPT-5.2 thinking | 최소 추론, 빠른 응답 |
medium |
O-series, GPT-5.2 thinking | 균형 잡힌 추론 노력 |
high |
O-series, GPT-5.2 thinking | 깊은 추론, 느린 응답 |
xhigh |
GPT-5.2 계열만 | 최대 추론 노력 |
reasoning_effort를 지원하는 모델¶
O-series 모델 (low, medium, high 지원):
o1,o1-mini,o1-previewo3,o3-mini,o3-proo4-mini
GPT-5.2 thinking 모델 (low, medium, high, xhigh 지원):
gpt-5.2,gpt-5.2-thinking,gpt-5.2-latestgpt-5.2-pro
xhigh 자동 폴백
xhigh effort 레벨은 GPT-5.2 계열 thinking 모델만 네이티브로 지원합니다. 다른 모델이나 백엔드에 xhigh가 요청되면 Continuum Router가 자동으로 high로 다운그레이드하고 info 레벨 로그를 남깁니다. 그래서 클라이언트는 백엔드 호환성을 걱정하지 않고 항상 xhigh를 요청할 수 있습니다.
reasoning_effort를 지원하지 않는 모델¶
다음 모델들은 reasoning 파라미터를 지원하지 않습니다 (파라미터가 제거됨):
- GPT-4o, GPT-4o-mini, GPT-4-turbo, GPT-4
- GPT-5.2-chat-latest, GPT-5.2-instant (non-thinking 변형)
- GPT-5.1, GPT-5
- GPT-3.5-turbo
- 임베딩 모델, 이미지 모델
Anthropic 백엔드 (Claude)¶
Anthropic Claude 모델은 모델 세대에 따라 다른 메커니즘을 사용합니다:
- Claude Fable 5와 Mythos 5 (Mythos급; Mythos 5는 Fable 5에서 안전장치를 해제한 한정 출시 버전): 적응형 사고(
{"type": "adaptive"})와output_config.effort를 사용합니다. Opus 4.8과 같은 요청 형식으로 레거시budget_tokens는 HTTP 400으로 거부되고temperature/top_p/top_k는 자동으로 제거되며maxeffort를 지원합니다. 추가 제약으로 명시적thinking.type == "disabled"를 HTTP 400으로 거부하기 때문에 라우터가thinking파라미터를 전달하지 않고 생략합니다. - Claude 4.8+ 모델 (Opus 4.8): 적응형 사고(
{"type": "adaptive"})와output_config.effort로 사고 깊이를 제어. 레거시thinking.type: "enabled"+budget_tokens형식은 HTTP 400으로 거부됩니다.temperature,top_p,top_k는 허용하지 않으며, 라우터가 자동으로 제거합니다. Effort 기본값은high입니다. - Claude 4.6+ 적응형 모델 (Opus 4.6, Sonnet 4.6, Opus 4.7): 적응형 사고(
{"type": "adaptive"})와output_config.effort로 사고 깊이를 제어. Claude Opus 4.7은 이 API가 필수이며, 레거시budget_tokens형식을 보내면 HTTP 400 오류가 발생합니다. - 4.6 이전 모델 (Opus 4.5, Sonnet 4 등): 확장 사고에
thinking.budget_tokens사용
변환 테이블: Claude 4.6+ 모델 (적응형 사고)¶
Claude 4.6+ 적응형 모델(claude-opus-4-6-*, claude-sonnet-4-6-*, claude-opus-4-7-*, claude-opus-4-8-*, claude-fable-5-*, claude-mythos-5-*)은 budget_tokens 대신 output_config.effort를 사용합니다:
reasoning_effort |
thinking |
output_config.effort |
설명 |
|---|---|---|---|
none |
비활성화 | (생략) | Thinking 비활성화 |
minimal |
{"type": "adaptive"} |
"low" |
Anthropic API에 minimal 없으므로 low로 매핑 |
auto |
{"type": "adaptive"} |
(생략) | 모델이 기본 effort(high) 사용 |
low |
{"type": "adaptive"} |
"low" |
낮은 사고 깊이 |
medium |
{"type": "adaptive"} |
"medium" |
중간 사고 깊이 |
high |
{"type": "adaptive"} |
"high" |
높은 사고 깊이 |
xhigh (Opus 4.6, Opus 4.7, Opus 4.8, Fable 5, Mythos 5) |
{"type": "adaptive"} |
"max" |
최대 사고 깊이 |
xhigh (Sonnet 4.6) |
{"type": "adaptive"} |
"high" |
다운그레이드 (max는 Opus/Mythos급 전용) |
변환 테이블: 4.6 이전 Claude 모델 (Budget Tokens)¶
4.6 이전 모델은 thinking.budget_tokens를 사용합니다:
reasoning_effort |
Anthropic thinking |
설명 |
|---|---|---|
none |
비활성화 | Thinking 기능 비활성화 |
minimal |
{"type": "enabled", "budget_tokens": 1024} |
최소 허용 예산 |
auto |
{"type": "adaptive"} |
모델이 사고의 시점과 정도를 결정 |
low |
{"type": "enabled", "budget_tokens": 4096} |
가벼운 추론 |
medium |
{"type": "enabled", "budget_tokens": 10240} |
중간 추론 |
high |
{"type": "enabled", "budget_tokens": 32768} |
깊은 추론 |
xhigh |
{"type": "enabled", "budget_tokens": 32768} |
high 예산으로 폴백 |
변환 예시: Claude 4.6+ (적응형 사고 + Effort)¶
입력 (OpenAI 형식):
변환됨 (Anthropic 형식):
{
"model": "claude-opus-4-6-20260205",
"thinking": {
"type": "adaptive"
},
"output_config": {
"effort": "high"
},
"messages": [...]
}
Opus 4.6 또는 Opus 4.7에서 xhigh를 사용하면 output_config.effort가 "max"로 설정됩니다:
{
"model": "claude-opus-4-6-20260205",
"thinking": {"type": "adaptive"},
"output_config": {"effort": "max"},
"messages": [...]
}
변환 예시: 4.6 이전 Claude (Budget Tokens)¶
입력 (OpenAI 형식):
변환됨 (Anthropic 형식):
{
"model": "claude-sonnet-4-20250514",
"thinking": {
"type": "enabled",
"budget_tokens": 32768
},
"messages": [...]
}
적응형 사고 (Auto)¶
reasoning_effort가 "auto"로 설정되면 라우터는 output_config.effort 없이 {"type": "adaptive"}를 생성합니다. 그러면 Anthropic이 기본 effort 레벨(현재 high)을 사용하고 모델이 언제, 얼마나 추론할지를 동적으로 결정합니다.
입력 (OpenAI 형식):
변환됨 (Anthropic 형식):
output_config 직접 전달 (Pass-Through)¶
요청에 이미 명시적인 thinking 및 output_config 매개변수가 포함되어 있으면 변환 없이 직접 전달됩니다:
{
"model": "claude-opus-4-6-20260205",
"thinking": {"type": "adaptive"},
"output_config": {"effort": "medium"},
"messages": [...]
}
적응형 사고 가용성
output_config.effort를 사용한 적응형 사고는 Claude 4.6+ 적응형 모델(claude-opus-4-6-*, claude-sonnet-4-6-*, claude-opus-4-7-*, claude-opus-4-8-*)과 Mythos급 계열(claude-fable-5-*, claude-mythos-5-*)에서 사용할 수 있습니다. Claude Opus 4.7/4.8과 Mythos급 모델은 이 API가 필수이며, 라우터는 이 모델들에 대한 명시적 레거시 thinking.type == "enabled" 요청을 정규화해 업스트림 HTTP 400 오류를 방지합니다. 4.6 이전 모델은 budget_tokens를 사용합니다.
max Effort 레벨
output_config.effort의 "max" 레벨은 Opus 모델(Opus 4.6, Opus 4.7, Opus 4.8)과 Mythos급 계열(Fable 5, Mythos 5)에서 사용할 수 있습니다. Sonnet 4.6에 xhigh가 요청되면 라우터가 자동으로 "high"로 다운그레이드하고 info 레벨 로그를 남깁니다.
Claude Opus 4.7/4.8 및 Mythos급 샘플링 파라미터 지원 중단
Anthropic은 Claude Opus 4.7, Opus 4.8, Fable 5, Mythos 5에 대해 temperature, top_p, top_k를 지원하지 않습니다. 라우터는 claude-opus-4-7-*, claude-opus-4-8-*, claude-fable-5-*, claude-mythos-5-* 모델로 전달하기 전에 세 파라미터를 자동으로 제거해 HTTP 400 오류를 방지합니다.
Mythos급 비활성 thinking 거부
Claude Fable 5와 Mythos 5는 명시적 thinking: {"type": "disabled"}를 HTTP 400으로 거부합니다. 클라이언트가 claude-fable-5-* 또는 claude-mythos-5-* 모델에 비활성 thinking 설정을 보내면 라우터는 이를 전달하지 않고 thinking 파라미터를 통째로 생략합니다(공식 우회 방법). Opus와 Sonnet 계열은 명시적 비활성 thinking 설정을 그대로 받습니다.
확장 사고를 지원하는 모델¶
확장 사고는 다음에서 지원됩니다:
- Claude Fable 5 / Mythos 5 (적응형 사고 + effort;
max지원; 샘플링 파라미터 제거; 명시적 비활성 thinking 생략):claude-fable-5-*(aliasclaude-fable-5-latest),claude-mythos-5-*(aliasclaude-mythos-5-latest, 한정 출시) - Claude Opus 4.8 (적응형 사고 + effort; 샘플링 파라미터 미지원; effort 기본값
high):claude-opus-4-8-*, aliasclaude-opus-4-8-latest - Claude Opus 4.7 (적응형 사고 + effort; 샘플링 파라미터 지원 중단):
claude-opus-4-7-* - Claude 4.6 계열 (적응형 사고 + effort):
claude-opus-4-6-*,claude-sonnet-4-6-* - Claude Opus 모델 (budget tokens):
claude-opus-4-*,claude-opus-4-5-* - Claude Sonnet 4 모델 (budget tokens):
claude-sonnet-4-*,claude-sonnet-4-5-*
Temperature 제한
확장 사고가 활성화되면 Claude는 사용자 정의 temperature 설정을 지원하지 않습니다. 라우터는 thinking이 활성화되면 temperature 파라미터를 자동으로 제거합니다. Claude Opus 4.7, Opus 4.8, Fable 5, Mythos 5의 경우 thinking 활성화 여부와 관계없이 temperature, top_p, top_k가 항상 제거됩니다.
4.6 이전 Claude의 xhigh 폴백
4.6 이전 Claude 모델에 xhigh가 요청되면 라우터가 자동으로 high (32,768 budget_tokens)로 다운그레이드합니다.
비Anthropic 백엔드에서의 auto
auto effort 레벨은 Anthropic의 적응형 사고에 매핑됩니다. 적응형 사고를 지원하지 않는 OpenAI 또는 Gemini 백엔드에 auto가 요청되면 라우터가 자동으로 medium으로 다운그레이드하고 debug 레벨 로그를 남깁니다.
Gemini 백엔드¶
Gemini 모델은 OpenAI 호환 엔드포인트를 통해 reasoning_effort를 네이티브로 지원합니다. 라우터는 값을 검증하고 직접 전달합니다.
지원되는 Effort 레벨¶
| Effort 레벨 | 지원 모델 | 설명 |
|---|---|---|
none |
Flash 모델만 | Thinking 비활성화 |
minimal |
모든 thinking 모델 | 최소 추론 |
low |
모든 thinking 모델 | 가벼운 추론 |
medium |
모든 thinking 모델 | 중간 추론 |
high |
모든 thinking 모델 | 깊은 추론 |
Flash 모델 (none 지원)¶
gemini-2.0-flashgemini-2.5-flashgemini-3-flashgemini-3.1-flashgemini-3.5-flash
Pro 모델 (none 미지원)¶
gemini-2.5-progemini-3-pro
Pro 모델 제한
Pro 모델에 none effort 레벨을 요청하면 검증 오류가 발생합니다. Flash 모델만 thinking 비활성화를 지원합니다.
xhigh 자동 폴백
Gemini 모델에 xhigh가 요청되면 라우터가 자동으로 high로 다운그레이드합니다. Gemini는 xhigh를 지원하지 않기 때문입니다.
추가 기능¶
Gemini thinking 모델의 경우, 라우터는 자동으로:
- reasoning content를 노출하기 위해
include_thoughts: true설정 - 지정되지 않은 경우 기본
max_completion_tokens: 16384설정 - 모델 기능에 대해 effort 레벨 검증
Generic/HTTP 백엔드¶
Generic HTTP 백엔드 (Ollama, vLLM, LocalAI, LM Studio 등에 사용)는 변환 없이 요청을 전달합니다.
| 동작 | 설명 |
|---|---|
| 패스스루 | reasoning_effort가 백엔드에 그대로 전달됨 |
| 검증 없음 | 라우터가 effort 레벨을 검증하지 않음 |
| 변환 없음 | 토큰 예산 변환이 수행되지 않음 |
백엔드 책임
generic 백엔드의 경우, 대상 LLM 서버가 reasoning_effort 파라미터를 처리(또는 무시)할 책임이 있습니다. 서버가 지원하지 않으면 오류를 반환하거나 파라미터를 무시할 수 있습니다.
llama.cpp 백엔드¶
llama.cpp 백엔드는 패스스루 동작을 사용합니다:
| 동작 | 설명 |
|---|---|
| 패스스루 | 파라미터가 변경 없이 전달됨 |
| 서버 의존적 | 지원 여부는 llama-server 설정에 따라 다름 |
llama.cpp에서의 Thinking 모델 지원
최근 버전의 llama-server는 <think> 태그 처리를 통해 thinking 모델(예: DeepSeek-R1)을 지원합니다. 그러나 reasoning_effort나 budget_tokens에 대한 표준화된 API 파라미터는 없습니다. Thinking 동작은 일반적으로 다음으로 제어됩니다:
- thinking 태그가 있는 모델의 내장 chat 템플릿
- 서버 측 구성 (예:
--thinking-budget가능한 경우) - temperature 및 top-p 같은 샘플링 파라미터
vLLM 백엔드¶
vLLM은 OpenAI 호환 API를 제공하지만 reasoning effort 지원은 모델에 따라 다릅니다:
| 동작 | 설명 |
|---|---|
| 패스스루 | generic 백엔드를 통해 파라미터 전달 |
| 모델 의존적 | 모델 유형에 따라 지원이 다름 |
vLLM에서의 Thinking 모델 지원
vLLM은 thinking 가능 모델(예: DeepSeek-R1, QwQ)을 실행할 수 있지만 reasoning_effort 파라미터 처리는 다음에 따라 다릅니다:
- 모델이 구조화된 thinking을 지원하는지 여부
- vLLM 서버 버전 및 구성
- 모델의 chat 템플릿 구성
DeepSeek-R1 및 유사 모델의 경우, thinking은 명시적인 budget 파라미터로 제어되기보다 모델의 동작에 내재되어 있는 경우가 많습니다.
응답 필드 정규화
최신 vLLM 버전은 추론 텍스트를 choices[].delta.reasoning(스트리밍) 또는 choices[].message.reasoning(비스트리밍) 필드로 반환합니다. 라우터는 Chat Completions의 모든 릴레이 경로에서 이 필드를 reasoning_content로 정규화하므로, vLLM 버전에 관계없이 클라이언트는 항상 reasoning_content를 받습니다. 이미 reasoning_content를 사용하는 백엔드는 영향을 받지 않습니다.
요약 테이블¶
| 백엔드 | Effort 레벨 | 변환 | 비고 |
|---|---|---|---|
| OpenAI | auto*, low, medium, high, xhigh |
없음 (네이티브) | xhigh는 GPT-5.2만; *auto는 medium으로 다운그레이드 |
| Anthropic (Fable 5 / Mythos 5) | none, minimal, auto, low, medium, high, xhigh |
→ adaptive + output_config.effort |
xhigh → max; temperature/top_p/top_k 항상 제거; 명시적 비활성 thinking 생략 |
| Anthropic (Opus 4.8) | none, minimal, auto, low, medium, high, xhigh |
→ adaptive + output_config.effort |
xhigh → max; temperature/top_p/top_k 항상 제거; effort 기본값 high |
| Anthropic (Opus 4.7) | none, minimal, auto, low, medium, high, xhigh |
→ adaptive + output_config.effort |
xhigh → max; temperature/top_p/top_k 항상 제거 |
| Anthropic (4.6) | none, minimal, auto, low, medium, high, xhigh* |
→ adaptive + output_config.effort |
*xhigh → Opus 4.6은 max, Sonnet 4.6은 high; temperature 제거 |
| Anthropic (4.6 이전) | none, minimal, auto, low, medium, high |
→ budget_tokens 또는 adaptive |
auto는 적응형 사고로 매핑; temperature 제거 |
| Gemini | none, auto*, minimal, low, medium, high |
없음 (네이티브) | none은 Flash 모델만; *auto는 medium으로 다운그레이드 |
| vLLM | 모델 의존적 | 패스스루 | DeepSeek-R1, QwQ는 암시적 thinking 사용 |
| llama.cpp | 모델 의존적 | 패스스루 | chat 템플릿에서 <think> 태그 사용 |
| Generic | 모두 | 패스스루 | 백엔드가 검증 처리 |
응답 형식¶
reasoning/thinking이 활성화되면 응답에 모델의 추론 과정이 포함됩니다:
OpenAI 형식 (reasoning_content 포함)¶
{
"choices": [{
"message": {
"role": "assistant",
"content": "답은 42입니다.",
"reasoning_content": "단계별로 생각해보겠습니다..."
},
"finish_reason": "stop"
}]
}
Claude 확장 사고 (OpenAI 형식으로 변환됨)¶
라우터는 Claude의 thinking 블록을 reasoning_content 필드로 변환합니다:
{
"choices": [{
"message": {
"role": "assistant",
"content": "답은 42입니다.",
"reasoning_content": "여러 요소를 고려해야 합니다..."
},
"finish_reason": "stop"
}]
}
모범 사례¶
- 적절한 effort 레벨 사용: 높은 effort = 더 나은 추론이지만 더 느리고 비용이 많이 듬
- 모델 지원 확인: 모든 모델이 reasoning 파라미터를 지원하지 않음
- xhigh 신중히 처리: GPT-5.2 계열만
xhigh를 지원; 다른 모델에는high사용 - 비용 고려: 확장 사고는 추가 토큰 소비 (특히 Anthropic의
budget_tokens) - 백엔드 테스트: Generic 백엔드는 지원 수준이 다양할 수 있음