调整思考强度
按协议设置思考档位,并读取实际思考 token 用量。
同一个“低”档,在 Chat、Messages 和 Google 中使用不同字段。先选模型支持的协议与档位,再查看响应中的思考用量;档位是提示,实际消耗以 usage 为准。
选择协议与档位
打开控制台 → 模型目录,点进模型详情的「协议与思考档位」。期望:看到该模型支持的调用方式和思考选项;没有“关闭”时,不要发送关闭思考的设置。
用 GET /model/v1/models 的 supported_apis 确认协议;Chat 目录 GET /openai/v1/models?api=chat 的 reasoning.supported_efforts 和 reasoning.mandatory 可用于程序检查。2026-10-13 的 Chat 目录将 glm-5.3、glm-5.3-flash 和 kimi-k3 标为 mandatory=true,即不能关闭思考;调用前仍需重查目录。不要假设每个模型都有全部档位。下列用量字段是本页所选模型实测返回的字段,不保证所有模型都提供明细。
| 调用方式 | 设置思考的入口 | 本页读取的用量 |
|---|---|---|
| Chat Completions | reasoning_effort;也接受 reasoning 对象 | usage.completion_tokens_details.reasoning_tokens |
| Anthropic Messages | thinking 控制模式,output_config.effort 选择档位 | usage.output_tokens_details.thinking_tokens |
| Google generateContent | generationConfig.thinkingConfig 中的 thinkingBudget 或 thinkingLevel | usageMetadata.thoughtsTokenCount |
Chat 的档位范围从 none 到 max,实际可选项以模型为准;none 表示关闭,不是“低”。Messages 的 enabled、adaptive、disabled 分别表达预算思考、自适应思考和关闭,不能把 thinking.effort 当作档位字段。Google 的预算和档位随模型而异,不要同时发送两种控制。
1. 准备终端
准备 Python 3.10+ 和 uv。将 Praxis 云 API Key 放入环境变量 PRAXIS_API_KEY,不要写入代码或日志。
test -n "$PRAXIS_API_KEY"期望:退出码为 0。退出码 1 表示变量未设置,先设置再继续。示例默认使用 https://api.deepraxis.ai。切换环境时,将 PRAXIS_API_BASE 设为相应 API 域名,不带末尾斜杠或 API 路径。
2. Chat:设为低并读取用量
deepseek-flash 支持 Chat 和 low。
保存为 reasoning-chat.py,运行 uv run -q --no-project --with openai --with anthropic --with google-genai python reasoning-chat.py。
import os
from openai import OpenAI
client = OpenAI(api_key=os.environ['PRAXIS_API_KEY'],
base_url=os.environ.get('PRAXIS_API_BASE', 'https://api.deepraxis.ai') + '/openai/v1')
response = client.chat.completions.create(
model='deepseek-flash', reasoning_effort='low', max_tokens=2048,
messages=[{'role': 'user', 'content': 'What is 17 times 23? Answer briefly.'}])
assert response.choices[0].finish_reason == 'stop'
assert '391' in (response.choices[0].message.content or '')
details = response.usage.completion_tokens_details
assert details is not None and details.reasoning_tokens is not None, 'Reasoning usage was not reported'
print('X-Request-Id:', response._request_id)
print('answer:', response.choices[0].message.content)
print('reasoning_tokens:', details.reasoning_tokens)期望:回答包含 391,终态为 stop,打印实际 reasoning_tokens,退出码 0。数字会随调用变化。
3. Messages:设为低并读取用量
这里选用 claude-opus-5,因为本次验证中它会返回思考 token 明细。deepseek-flash 的 Messages 响应未返回该明细;缺失不等于 0,也不能用 output_tokens 代替。
保存为 reasoning-messages.py,运行 uv run -q --no-project --with openai --with anthropic --with google-genai python reasoning-messages.py。
import os
from anthropic import Anthropic
client = Anthropic(api_key=os.environ['PRAXIS_API_KEY'],
base_url=os.environ.get('PRAXIS_API_BASE', 'https://api.deepraxis.ai') + '/anthropic')
raw = client.messages.with_raw_response.create(
model='claude-opus-5', max_tokens=2048,
thinking={'type': 'adaptive'}, output_config={'effort': 'low'},
messages=[{'role': 'user', 'content': 'What is 17 times 23? Answer briefly.'}])
response = raw.parse()
answer = ''.join(block.text for block in response.content if block.type == 'text')
assert response.stop_reason == 'end_turn' and '391' in answer
usage = response.usage.model_dump()
details = usage.get('output_tokens_details') or {}
assert details.get('thinking_tokens') is not None, 'Thinking usage was not reported'
print('X-Request-Id:', raw.headers.get('x-request-id'))
print('answer:', answer)
print('thinking_tokens:', details['thinking_tokens'])期望:回答包含 391,终态为 end_turn,打印实际 thinking_tokens,退出码 0。
4. Google:按模型选预算或档位
以下依次调用两个模型:gemini-2.5-flash 使用预算,gemini-3.1-flash-lite-preview 使用低档。使用 HTTP 是为了直接展示 Google 的字段名。
保存为 reasoning-google.py,运行 uv run -q --no-project --with openai --with anthropic --with google-genai python reasoning-google.py。
import json
import os
import httpx
base = os.environ.get('PRAXIS_API_BASE', 'https://api.deepraxis.ai')
with httpx.Client(timeout=120) as client:
for model, thinking in [
('gemini-2.5-flash', {'thinkingBudget': 1024}),
('gemini-3.1-flash-lite-preview', {'thinkingLevel': 'low'}),
]:
response = client.post(base + '/google/v1beta/models/' + model + ':generateContent',
headers={'Authorization': 'Bearer ' + os.environ['PRAXIS_API_KEY']},
json={'contents': [{'role': 'user', 'parts': [{'text': 'What is 17 times 23? Answer briefly.'}]}],
'generationConfig': {'maxOutputTokens': 2048, 'thinkingConfig': thinking}})
print('X-Request-Id:', response.headers.get('x-request-id'))
response.raise_for_status()
data = response.json()
candidate = data['candidates'][0]
answer = ''.join(part.get('text', '') for part in candidate['content']['parts'])
assert candidate['finishReason'] == 'STOP' and '391' in answer
assert 'thoughtsTokenCount' in data['usageMetadata'], 'Thinking usage was not reported'
print(model, answer, json.dumps(data['usageMetadata']))期望:两次回答都包含 391,终态为 STOP,各自打印 thoughtsTokenCount,退出码 0。
如何比较结果
保持模型和问题一致,多次采样,比较实际思考 token、完整回答、耗时与质量。预算不是跨模型统一的硬上限;“低”不保证每次都比“高”少用 token,也不保证更快。不要根据一条响应推断单调关系。用量字段缺失时,保留“未报告”,不要填 0。
实测失败与处理
glm-5.3 设置 reasoning_effort="none" 返回 HTTP 400,错误码 thinking_disable_unsupported:
glm-5.3 cannot disable thinking; omit the thinking setting or choose a level.
省略关闭设置或选择模型支持的档位,再请求。不要靠换成另一个协议的“关闭”字段绕过限制。