调整思考强度

按协议设置思考档位,并读取实际思考 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 Completionsreasoning_effort;也接受 reasoning 对象usage.completion_tokens_details.reasoning_tokens
Anthropic Messagesthinking 控制模式,output_config.effort 选择档位usage.output_tokens_details.thinking_tokens
Google generateContentgenerationConfig.thinkingConfig 中的 thinkingBudget 或 thinkingLevelusageMetadata.thoughtsTokenCount

Chat 的档位范围从 none 到 max,实际可选项以模型为准;none 表示关闭,不是“低”。Messages 的 enabled、adaptive、disabled 分别表达预算思考、自适应思考和关闭,不能把 thinking.effort 当作档位字段。Google 的预算和档位随模型而异,不要同时发送两种控制。

完整字段定义见 Chat、Messages、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.

省略关闭设置或选择模型支持的档位,再请求。不要靠换成另一个协议的“关闭”字段绕过限制。

API 参考 → · Cookbook →

导出

本页内容