这个 500 不是网络故障
如果 Claude Code 接到本地 Qwen3.8/vLLM 后,第一轮请求返回 HTTP 500 internal_error,随后客户端持续重试,先检查 effort 值。Qwen3.8-27B 的模板只接受 xhigh、medium 和 low;Claude Code 在某些环境中默认发送 high,模板会直接抛错。
Qwen3.8 在 2026-08-19 发布。这个兼容问题是模型模板和客户端默认参数之间的组合问题,不是把 URL 改成另一个网关就能解决。
用 curl 复现输入边界
先在 vLLM 的 Anthropic 兼容入口测试,不要让 Claude Code 的自动重试掩盖原始错误。
curl -s http://127.0.0.1:8000/v1/messages \
-H 'content-type: application/json' \
-d '{"model":"qwen3.8-27b","max_tokens":64,"messages":[{"role":"user","content":"hi"}],"output_config":{"effort":"high"}}'如果响应为 500,并包含 Unexpected reasoning effort high,再分别把 high 改成 medium 和 xhigh。至少有一个值返回 200,才能确认问题就在模板校验。
Claude Code 的保守修复
在启动 Claude Code 的同一个 shell 中固定为 medium:
export CLAUDE_CODE_EFFORT_LEVEL=medium
claude --model qwen3.8-27b -p "返回 OK" < /dev/nullWindows PowerShell 可以这样设置:
$env:CLAUDE_CODE_EFFORT_LEVEL = "medium"
claude --model qwen3.8-27b -p "返回 OK"成功标准是请求返回 200、首轮输出 OK,并且日志中没有连续的 500 重试。enable_thinking=false 虽然可以绕过校验,但它关闭了思考模式,不应当当作等价修复。
为什么不要直接映射到 xhigh
Issue #217 的后续记录提到,另一个测试栈在 xhigh 下出现空答案风险。因此在没有完成自己的回归测试前,优先使用 medium,再单独比较 xhigh 的工具调用、输出完整度和延迟。
同时固定下面几项,避免把多个变量混在一起:
- Qwen3.8 权重和量化版本
- vLLM 版本与
--tool-call-parser qwen3_coder --reasoning-parser qwen3- Claude Code 的模型名和 effort
max_tokens与上下文长度
长任务要验证什么
短请求通过后,再运行一个会读取文件、修改文件并执行测试的最小任务。观察:
- 第二轮请求是否仍返回 200。
- 工具调用参数是否完整 JSON。
- Claude Code 是否因 500 进入重试循环。
- 上下文接近上限时,错误是否仍然是 effort 校验,而不是新的模板或工具协议错误。
如果只有 Qwen3.8 报错、Qwen3.6 同配置正常,说明兼容边界在模型模板,而不是通用 Anthropic 入口。此时应保留版本、请求体和响应日志,等待上游模板或 vLLM 修复。