ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Qwen3.5-27B + vllm + claude-code 本地化部署:TaoToken 统一 Key 接入配置实战

Qwen3.5-27B + vllm + claude-code 本地化部署:TaoToken 统一 Key 接入配置实战 1. 本地跑 Qwen3.5-27B 之后claude-code 为什么还需要 TaoTokenQwen3.5-27B 是通义千问系列里比较适合本地部署的一档模型27B 参数量在 A800 80G 这类卡上能跑出可用的推理速度同时保留不错的代码理解和工具调用能力。vllm 从 0.16 版本开始原生支持 Anthropic 的/v1/messages协议这意味着 claude-code 这类客户端可以直接把请求打到本地 vllm 上不需要再额外挂一层 LiteLLM 做协议转换。听起来链路已经通了但实际用起来会遇到几个绕不开的问题。第一个问题是 Key 管理。claude-code 默认走 Anthropic 官方通道环境变量里要填ANTHROPIC_API_KEY。本地 vllm 其实不校验 Key随便填个dummy也能跑但一旦你同时还要调用云端模型做对比、或者团队里多人共用一台推理机这个dummy就没法做权限区分和用量统计了。第二个问题是通道稳定性。本地 vllm 服务重启、显存被其他进程抢占、容器 OOM 退出这些情况在长时间编码会话里并不罕见claude-code 侧只会看到一个连接失败排查起来要来回切终端。TaoToken 在这里的角色是统一 Key 和 API 通道。你可以把它理解成一个请求入口claude-code 侧只认一个 Base URL 和一个 Key这个 Key 背后既可以指向本地 vllm 的 OpenAI 兼容接口也可以指向其他模型服务。对 claude-code 来说它不关心后面是本地还是远端只关心/v1/messages能不能稳定返回。这样做的直接好处是本地模型和云端模型可以共用一套客户端配置切换时只改 TaoToken 侧的路由不用动 claude-code 的 settings.json。这篇内容适合已经在本地用 vllm 拉起过模型、想让 claude-code 稳定接入的开发者。如果你还没跑通 vllm 本身建议先把推理服务跑起来再回来看接入部分。下面按“vllm 启动 → TaoToken 配置 → claude-code 接入 → 验证请求 → 排障”的顺序走一遍每一步都给可复制的命令和配置。2. TaoToken 前置Key、通道与本地模型的关系在动手改 claude-code 配置之前先把 TaoToken 侧的准备做完。这一步的核心是拿到一个能用的 Key并确认它背后指向的通道能访问到你的本地 vllm 服务。TaoToken 的 API 入口是https://taotoken.net/api注意这个地址不带任何查询参数直接作为 Base URL 使用。Key 的创建在控制台完成路径是 API Keys 页面。创建时建议按用途命名比如local-qwen35-claude这样后面在用量面板里能一眼看出是本地模型通道。拿到 Key 之后需要确认通道指向。TaoToken 支持把请求转发到自定义的 OpenAI 兼容端点你的本地 vllm 暴露的就是标准 OpenAI 接口/v1/chat/completions和/v1/messages都有。在通道配置里填上本地 vllm 的地址比如http://127.0.0.1:8210注意这里要用容器映射出来的宿主机端口不是容器内部的 8000。如果你和我一样把 vllm 跑在 Docker 里ports: 8210:8000这行就是关键宿主机访问 8210容器内部还是 8000。注意TaoToken 侧配置的本地地址必须是宿主机能访问到的地址。如果 TaoToken 服务和 vllm 不在同一台机器上127.0.0.1会指向 TaoToken 自己需要换成 vllm 所在机器的内网 IP。配置完成后建议先用 curl 直接打 TaoToken 的接口确认通道通了再动 claude-code。这一步能省掉后面很多“到底是客户端问题还是通道问题”的纠结。curl -X POST https://taotoken.net/api/v1/messages \ -H x-api-key: 你的TaoTokenKey \ -H anthropic-version: 2023-06-01 \ -H content-type: application/json \ -d { model: qwen3.5-27b, max_tokens: 128, messages: [ {role: user, content: 用一句话说明你是什么模型} ] }如果返回里能看到content字段且有正常文本说明 TaoToken 到本地 vllm 的通道已经通了。如果返回 404 或 502先检查 vllm 容器是否还在跑、端口映射是否正确。这一步过了后面 claude-code 的配置就是水到渠成。3. 可复制配置vllm 启动参数与 claude-code settings.json3.1 vllm 侧启动参数vllm 的启动方式我用的是 docker-compose这样重启和改参数都方便。模型文件提前 clone 到宿主机挂载进容器。下面是完整的 compose 文件关键参数都加了注释。services: vllm-qwen3.5-agent: image: vllm/vllm-openai:nightly container_name: vllm-qwen volumes: - /bigdata/huggingface:/root/.cache/huggingface environment: - CUDA_VISIBLE_DEVICES0 - VLLM_USE_V10 ports: - 8210:8000 ipc: host deploy: resources: reservations: devices: - driver: nvidia device_ids: [0] capabilities: [gpu] command: --model /root/.cache/huggingface/Qwen3.5-27B --host 0.0.0.0 --port 8000 --trust-remote-code --gpu_memory_utilization 0.8 --max-model-len 200000 --enforce-eager --enable-auto-tool-choice --tool-call-parser qwen3_coder --served-model-name qwen3.5-27b healthcheck: test: [CMD-SHELL, curl -f http://localhost:8000/health || exit 1] interval: 30s timeout: 10s retries: 5几个参数值得单独说。--enable-auto-tool-choice和--tool-call-parser qwen3_coder是让模型支持工具调用的关键claude-code 依赖这个能力来执行 Bash、读写文件。--served-model-name qwen3.5-27b决定了 API 里model字段填什么后面 claude-code 的环境变量要和它对齐。--max-model-len 200000给的是上下文长度上限实际能跑多长取决于显存A800 80G 下单卡跑 27B 模型上下文拉到 20 万 token 时显存会比较紧如果 OOM 可以降到 131072 试试。启动命令docker compose up -d docker compose logs -f --tail 20 vllm-qwen看到Application startup complete和/v1/messages路由注册成功就说明 vllm 侧准备好了。3.2 claude-code 侧 settings.json 骨架claude-code 的配置分两部分环境变量和 settings.json。环境变量控制 Base URL 和 Keysettings.json 控制模型映射和行为。先看环境变量加到~/.bashrc或~/.zshrcexport ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEY你的TaoTokenKey export ANTHROPIC_AUTH_TOKEN你的TaoTokenKey export ANTHROPIC_DEFAULT_OPUS_MODELqwen3.5-27b export ANTHROPIC_DEFAULT_SONNET_MODELqwen3.5-27b export ANTHROPIC_DEFAULT_HAIKU_MODELqwen3.5-27b export CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC1这里ANTHROPIC_BASE_URL指向 TaoToken 的 API 入口不是本地 vllm 的 8210。这是整个链路的关键claude-code 只和 TaoToken 对话TaoToken 再把请求转给本地 vllm。ANTHROPIC_API_KEY和ANTHROPIC_AUTH_TOKEN都填 TaoToken 的 Key有些版本的 claude-code 读前者有些读后者两个都填省事。三个模型映射都指向qwen3.5-27b因为本地只有一个模型Opus/Sonnet/Haiku 的区分在这里没有意义。settings.json 放在~/.claude/settings.json骨架如下{ model: qwen3.5-27b, env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: 你的TaoTokenKey }, permissions: { allow: [ Bash(nvidia-smi:*), Bash(docker compose logs:*), Read, Write ] } }permissions.allow里我放开了nvidia-smi和docker compose logs这样在 claude-code 里直接问显存占用、看容器日志时不用每次确认。生产环境建议按需收紧本地开发可以放宽一些。改完环境变量记得source ~/.bashrc然后新开一个终端跑claude确保读到的是新配置。4. 验证请求从 claude-code 发起一次完整对话配置改完最直接的验证方式就是在 claude-code 里发一条需要调用工具的指令。我用的测试指令是“帮我查看显存占用了多少”这条指令会触发 Bash 工具调用能同时验证模型推理、工具调用解析、结果回传三个环节。启动 claude-codecd ~/your-project claude进入交互界面后输入帮我查看显存占用了多少正常的话claude-code 会显示它准备执行nvidia-smi然后返回类似下面的结果● Bash(nvidia-smi --query-gpumemory.total,memory.used,memory.free --formatcsv) ⎿ memory.total [MiB], memory.used [MiB], memory.free [MiB] 81920 MiB, 66922 MiB, 14230 MiB 81920 MiB, 34989 MiB, 46164 MiB接着模型会把结果整理成表格给出每张卡的占用率和剩余显存。这个过程里请求路径是 claude-code → TaoToken → 本地 vllm → 返回工具调用的解析由 vllm 的qwen3_coderparser 完成。如果这一步能跑通说明整条链路已经通了。你可以再试一条需要读写文件的指令比如“在当前目录创建一个 test.md写入今天的日期”验证 Write 工具是否正常。两条都过基本可以确认 claude-code 和本地 Qwen3.5-27B 的协作没问题。提示第一次调用可能会慢一些因为 vllm 要做 prefix cache 的预热。后续同样前缀的请求会快很多。如果超过 60 秒没响应先去看 vllm 容器日志确认请求有没有到达。5. 本篇常见错排查5.1 claude-code 报连接失败或 401最常见的原因是环境变量没生效。ANTHROPIC_BASE_URL如果还是默认的 Anthropic 官方地址请求会打到官方去而你的 Key 是 TaoToken 的自然 401。检查方法是在终端里echo $ANTHROPIC_BASE_URL确认输出是https://taotoken.net/api。如果是空的或者不对说明source没执行或者写错了文件。另一个可能是 Key 填错。TaoToken 的 Key 在控制台 API Keys 页面可以重新复制注意不要带多余空格。ANTHROPIC_API_KEY和ANTHROPIC_AUTH_TOKEN两个都填上避免版本差异导致读不到。5.2 vllm 返回 404 model not found这个报错说明请求到了 vllm但model字段和--served-model-name对不上。claude-code 侧三个模型映射都填的qwen3.5-27bvllm 启动参数里--served-model-name qwen3.5-27b两边要完全一致大小写和连字符都不能差。如果你改过 served-model-name记得同步改环境变量。还有一种情况是 TaoToken 通道里配置的模型名和实际转发的不一致。检查通道配置里的模型映射确保qwen3.5-27b被正确路由到本地 vllm 端点。5.3 工具调用不生效模型只返回文本claude-code 依赖模型返回结构化的 tool_call如果 vllm 没开--enable-auto-tool-choice或者 parser 选错模型会把工具调用当成普通文本输出claude-code 收到后不知道要执行命令。确认启动参数里有这两行--enable-auto-tool-choice --tool-call-parser qwen3_coderQwen3.5 系列用qwen3_coderparser如果你用的是其他模型parser 名字要对应改。改完参数需要重启 vllm 容器docker compose restart vllm-qwen。5.4 显存 OOM 导致容器退出27B 模型在 80G 卡上跑--gpu_memory_utilization 0.8意味着 vllm 会占用约 64G 显存留给 KV cache 的空间取决于上下文长度。如果--max-model-len设得太大KV cache 会撑爆显存。排查方法是看容器日志里有没有CUDA out of memory有的话把--max-model-len降到 131072 或 65536或者把--gpu_memory_utilization提到 0.9前提是卡上没跑其他任务。另外注意nvidia-smi里如果 GPU 0 已经被其他进程占用了一部分显存vllm 能用的就少了。启动前先确认目标卡的空闲显存足够。5.5 TaoToken 通道超时如果 claude-code 侧一直转圈最后超时但 vllm 日志里能看到请求进来可能是 TaoToken 到 vllm 的网络延迟或者 vllm 推理太慢。先确认 vllm 是不是在--enforce-eager模式下跑这个模式关掉了 CUDA graph推理会慢一些但启动快、显存省。如果追求速度可以去掉--enforce-eager但要注意显存占用会上升。还有一种可能是max_tokens设得太大模型生成时间过长。claude-code 默认的 max_tokens 可能比较高可以在 settings.json 里加maxTokens: 4096限制一下。6. 接入之后Key 分流与长期使用建议链路跑通之后日常使用还有几个可以优化的点。如果你同时用本地模型和云端模型建议在 TaoToken 里建两个 Key一个指向本地 vllm 通道一个指向云端通道。claude-code 侧通过切换环境变量来换 Key这样用量统计能分开看本地模型的调用不会和云端混在一起。长期编码场景下如果你发现本地 27B 模型在复杂重构任务上力不从心可以考虑用 Coding Plan 把部分请求分流到更强的模型上。TaoToken 的通道配置支持按模型名路由claude-code 侧不用改任何东西只需要在 TaoToken 里调整路由规则。这样本地模型处理日常补全和简单工具调用复杂任务走云端成本和体验能兼顾。模型对话页面可以用来快速验证某个 prompt 在本地模型上的表现不用每次都开 claude-code。接入文档里有完整的 API 参数说明遇到协议层面的问题可以先查文档。API Keys 页面管理所有 Key建议定期轮换尤其是多人共用的环境。最后说一个实际踩过的坑vllm 容器重启后如果 TaoToken 侧配置的是127.0.0.1:8210而 TaoToken 服务和 vllm 不在同一台机器重启后 IP 可能变化导致通道失效。解决办法是用固定的内网 IP 或者主机名别用localhost。这个细节在单机测试时不会暴露一旦跨机部署就会冒出来。
返回列表