如何把 Claude Code 等 Anthropic 客户端接入 SGLang 的 /v1/messages 端点?
【免费下载链接】sglangSGLang is a high-performance serving framework for large language models and multimodal models.项目地址: https://gitcode.com/GitHub_Trending/sg/sglang
如果你的客户端按 Anthropic Messages API 编写——包括 Anthropic Python SDK 和 Claude Code 这类 agentic CLI——但又想让它们对话到一个自托管的 SGLang 推理服务器,这篇文章给出完整接入路径:启动一个带/v1/messages端点的 SGLang 服务器,用 SDK 验证端点,再通过一组环境变量把 Claude Code 指向该服务器,并处理前缀缓存失效等接入后的常见问题。
SGLang 在每个服务器上自动注册 Anthropic 兼容的/v1/messages端点,无需额外开关即可启用;它复用与 OpenAI 兼容端点相同的模型、chat template 和 reasoning / tool-call parser,支持非流式、流式响应、工具调用以及count_tokens路由。端点与模型无关:任何模型都可以,本文的示例使用 GLM-5.2-FP8,因为它的推理 + 工具调用输出是 Claude Code 集成场景下文档验证过的组合。
启动 SGLang 服务器
先安装 SGLang。文档给出的两条安装路径(Python 或 Docker):
pip install --upgrade pip pip install uv uv pip install --prerelease=allow sglang或者:
docker pull lmsysorg/sglang:latest然后在终端中启动服务器并等待其完成初始化。以下是文档中单节点 GLM-5.2-FP8 的示例配置(TP8,带 EAGLE 推测解码):
sglang serve \ --model-path zai-org/GLM-5.2-FP8 \ --tp 8 \ --speculative-algorithm EAGLE \ --speculative-num-steps 5 \ --speculative-eagle-topk 1 \ --speculative-num-draft-tokens 6 \ --reasoning-parser glm45 \ --tool-call-parser glm47 \ --host 0.0.0.0 \ --port 30000这条命令中各参数的用途按文档说明如下:
--reasoning-parser/--tool-call-parser是可选的。当模型会输出 reasoning 内容(GLM-5.2、Qwen3、DeepSeek-R1 等)或需要把工具调用解析成结构化tool_use块时再加。没有 tool-call parser 时,tools字段仍会被接受,但模型的工具调用会以原始文本返回,Claude Code 无法执行它们。- 上下文长度默认取模型自身的(GLM-5.2 为 1M,即 1048576);
--context-length只能用来压低上限,不能扩展。 - SGLang 不校验请求中的
model字段,服务器启动时加载了什么模型,请求就按那个模型服务。
其他模型和硬件/量化组合的验证命令可参考 GLM-5.2 cookbook。
用 Anthropic SDK 验证端点可用
接入 Claude Code 之前,先用 Anthropic Python SDK 确认端点工作正常。注意一个容易踩的坑:与 OpenAI SDK 不同,Anthropic SDK 会自己拼接/v1/messages,所以base_url要写服务器根地址,不要带/v1后缀。
非流式请求:
from anthropic import Anthropic client = Anthropic( base_url="http://127.0.0.1:30000", api_key="EMPTY", # SGLang does not require a real key by default ) message = client.messages.create( model="zai-org/GLM-5.2-FP8", max_tokens=512, messages=[{"role": "user", "content": "List 3 countries and their capitals."}], ) # A reasoning model may emit a `thinking` block before the `text` block — # pick the text block rather than assuming content[0]. print(next(b.text for b in message.content if b.type == "text"))文档示例输出(示例结果,非固定预期):
Here are 3 countries and their capitals: 1. **France** - Paris 2. **Japan** - Tokyo 3. **Brazil** - Brasília能打印出 text 块内容,说明/v1/messages路由已通。需要流式输出时设stream=True:
with client.messages.stream( model="zai-org/GLM-5.2-FP8", max_tokens=512, messages=[{"role": "user", "content": "Say this is a test"}], ) as stream: for text in stream.text_stream: print(text, end="", flush=True)此外POST /v1/messages/count_tokens可以在不生成响应的情况下返回请求的分词长度,system prompt、tools 和多轮历史都会计入:
resp = client.messages.count_tokens( model="zai-org/GLM-5.2-FP8", messages=[{"role": "user", "content": "Hello, world"}], ) print(resp.input_tokens)配置 Claude Code 指向 SGLang 服务器
服务器已经在:30000运行的前提下,在启动 Claude Code 的 shell 中导出完整环境变量集合,然后运行claude:
export ANTHROPIC_BASE_URL="http://127.0.0.1:30000" export ANTHROPIC_AUTH_TOKEN="dummy" # required by Claude Code; any non-empty string works export API_TIMEOUT_MS="3000000" # long timeout — reasoning + 1M-context turns are slow export CLAUDE_CODE_AUTO_COMPACT_WINDOW="1000000" # let auto-compact use the full 1M window export CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 # drop autoupdater/telemetry/error-reporting noise export CLAUDE_CODE_ATTRIBUTION_HEADER=0 # required for prefix-cache reuse — see below export ANTHROPIC_DEFAULT_HAIKU_MODEL="glm-5.2[1m]" # [1m] suffix enables Claude Code's 1M-context beta export ANTHROPIC_DEFAULT_SONNET_MODEL="glm-5.2[1m]" # [1m] suffix enables Claude Code's 1M-context beta export ANTHROPIC_DEFAULT_OPUS_MODEL="glm-5.2[1m]" # [1m] suffix enables Claude Code's 1M-context beta claude每个变量的作用(均按文档说明):
ANTHROPIC_BASE_URL— 让 Claude Code 访问你的 SGLang 服务器而不是 Anthropic API。ANTHROPIC_AUTH_TOKEN— Claude Code 要求非空 token;SGLang 在未用--api-key启动时接受任意值。API_TIMEOUT_MS— 调大超时;推理模型的长输出和 1M 上下文回合经常超出默认超时。ANTHROPIC_DEFAULT_{HAIKU,SONNET,OPUS}_MODEL— Claude Code 在各档位发送的模型名。SGLang 不校验该字段,任意名字都可以。使用glm-5.2[1m]:[1m]后缀是客户端侧提示,用于启用 Claude Code 的 1M 上下文 beta;不加的话上下文会被封顶。CLAUDE_CODE_AUTO_COMPACT_WINDOW— 设为1000000,让自动压缩使用完整 1M 窗口而不是默认值,从而保住长会话。
可选的持久化方式:不想在每个 shell 里 export 时,把同一组变量写入~/.claude/settings.json的env键,对所有 Claude Code 会话生效:
{ "env": { "ANTHROPIC_BASE_URL": "http://127.0.0.1:30000", "ANTHROPIC_AUTH_TOKEN": "dummy", "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1", "CLAUDE_CODE_ATTRIBUTION_HEADER": "0", "ANTHROPIC_DEFAULT_HAIKU_MODEL": "glm-5.2[1m]", "ANTHROPIC_DEFAULT_SONNET_MODEL": "glm-5.2[1m]", "ANTHROPIC_DEFAULT_OPUS_MODEL": "glm-5.2[1m]" } }必须设置:CLAUDE_CODE_ATTRIBUTION_HEADER=0以复用前缀缓存
只要 Claude Code 经过 SGLang(或任何非 Anthropic 网关)路由,就必须设置这个变量。原因:Claude Code 会在 system prompt 开头加一段每请求变化的归因块,形如x-anthropic-billing-header: cc_version=<ver>.<per-request-hash>; cc_entrypoint=...; cch=<hash>;。这个每请求哈希是回合之间第一个不同的 token,radix 前缀缓存只能复用它之前的短前缀,导致每一轮都要把 system prompt 加整个对话历史重新 prefill。CLAUDE_CODE_ATTRIBUTION_HEADER=0会把整行归因信息从 system prompt 中移除。
注意CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC不会移除归因块——它只覆盖自动更新/遥测/错误上报,归因头是独立代码路径,必须用CLAUDE_CODE_ATTRIBUTION_HEADER=0。
判断是否生效:多轮对话时如果每一轮都整体重新 prefill、响应明显变慢,先检查这个变量是否漏设。
接入后常见问题的排查
文档针对这个接入路径列出了以下现象和对应原因:
- Connection refused /
fetch failed— 确认服务器已启动,ANTHROPIC_BASE_URL中的端口与--port一致(默认 30000)。如果ANTHROPIC_BASE_URL指向远程主机,确认它可达、且没有被拦截连接的代理挡在中间。 Model not found/ 服务器返回 404— SGLang 不校验model字段,服务启动时加载的模型,所以 404 通常意味着请求根本没有到达/v1/messages路由。确认ANTHROPIC_BASE_URL指向服务器(没有漏掉端口),且服务器已完成加载。- 工具调用不生效 / 以原始文本返回— 启动服务器时加上与模型匹配的
--tool-call-parser(如glm47、qwen3)。没有它,tools字段仍会被接受,但工具调用以文本返回而不是tool_use块,Claude Code 无法执行。 - 响应慢 / 每轮都重新 prefill 全部历史— 缺少
CLAUDE_CODE_ATTRIBUTION_HEADER=0,Claude Code 的每请求归因哈希破坏了 radix 前缀缓存复用。 - 上下文被封顶在 1M 以下— 模型名必须以
[1m]结尾 Claude Code 才会启用 1M 上下文 beta。检查ANTHROPIC_DEFAULT_*_MODEL是否带[1m]后缀,以及所加载模型的原生上下文确实是 1M(GLM-5.2 为 1048576;--context-length只能压低,不能扩展)。
请求参数与推理模型
/v1/messages接受标准 Anthropic Messages API 参数,完整列表以 Anthropic Messages API 官方参考为准。推理模型通过 OpenAI 兼容端点相同的--reasoning-parser机制支持:在请求里传模型的 reasoning kwarg(如 DeepSeek-V3 系模型用thinking,Qwen3 系模型用enable_thinking),具体 mapping 参见 OpenAI Completions 文档。完整的端点行为与 Claude Code 集成说明见 Anthropic-Compatible API 文档。
【免费下载链接】sglangSGLang is a high-performance serving framework for large language models and multimodal models.项目地址: https://gitcode.com/GitHub_Trending/sg/sglang
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考