实战记录:把 Claude Code 接入公司自建大模型网关(免转换层直连)
实战记录:把 Claude Code 接入公司自建大模型网关(免转换层直连)
公司发了一把内部大模型 API 的 key,又不想浪费 Claude Code 这个趁手的工具?本文记录一次完整的接入实战:从协议探测、模型能力摸底到最终跑通,全程踩坑全程干货。Windows 环境,Claude Code v2.1.81。
一、背景与思路
Claude Code 是 Anthropic 官方的命令行编程智能体,但它只认 Anthropic 协议(/v1/messages 那套)。而大多数公司自建的大模型网关是 OpenAI 兼容协议(/v1/chat/completions)。
所以接入前先回答一个问题:你的网关支不支持 Anthropic 协议?
现在主流的开源网关(New API、one-api 的分支等)大多同时提供两套端点。如果你的网关恰好支持 Anthropic 协议——恭喜,Claude Code 可以直连,一行转换代码都不用写。不支持的话,就得在本地垫一层 LiteLLM 之类的转换代理,本文不展开。
我的环境:
- Windows 11,Claude Code 通过 winget 安装(
winget install Anthropic.ClaudeCode) - 公司网关:New API 架构,同时暴露 OpenAI 和 Anthropic 端点
- 网关里挂了 DeepSeek、GPT、GLM 等多家模型
二、第一步:探测网关能力(别急着配 Claude Code)
很多人拿到 key 直接就去配环境变量,配完发现不好使再来回折腾。正确顺序是先用脚本把网关摸清楚。
2.1 看模型列表
curl -H "Authorization: Bearer sk-your-api-key" \
"https://your-company-gateway.example.com/v1/models"
注意:有些网关按"分组"管权限,列表里能看到的模型,你的 key 未必有权限调用。我一开始的 key 只能调 6 个模型,后来管理员把我切到 VIP 分组,才解锁到 12 个。
2.2 测 Anthropic 端点是否可用
import urllib.request, json
KEY = "sk-your-api-key"
BASE = "https://your-company-gateway.example.com"
body = {
"model": "你的模型名",
"max_tokens": 100,
"messages": [{"role": "user", "content": "回复两个字:收到"}],
}
req = urllib.request.Request(
BASE + "/v1/messages",
data=json.dumps(body, ensure_ascii=False).encode("utf-8"),
headers={
"Content-Type": "application/json",
"x-api-key": KEY,
"anthropic-version": "2023-06-01",
},
)
obj = json.loads(urllib.request.urlopen(req, timeout=60).read().decode("utf-8"))
print(obj)
2.3 三个必测项(一个都不能省)
Claude Code 和普通聊天不一样,它对模型有三个硬要求:
① 工具调用(tool use)——Claude Code 读文件、写文件、跑命令全靠它。请求里带上 tools 字段,看返回的 stop_reason 是不是 tool_use:
body["tools"] = [{
"name": "get_weather",
"description": "Get weather of a city",
"input_schema": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"],
},
}]
body["messages"] = [{"role": "user", "content": "北京天气怎么样"}]
# 返回内容里出现 type=tool_use 的 block 才算过关
② 流式输出——Claude Code 的回复是打字机效果,走的是 SSE 流式。把 stream 设为 True,确认能收到 content_block_delta 事件。
③ 中文质量——逐字节检查回复里有没有 U+FFFD(替换字符),有就说明网关某处编码转换出了问题。
我摸底时的实测结果(供参考):
| 模型 | 工具调用 | 流式 | 中文 | 结论 |
|---|---|---|---|---|
| gpt-5.5 | ✅ | ✅ | ✅ | 主力首选 |
| deepseek-v4-pro | ✅ | ✅ | ✅ | 备选 |
| deepseek-v4-pro-max | ✅ | ✅ | ⚠️ 非流式返回空 | 慎用,只做流式场景 |
| glm 系列 | - | - | - | 列表可见但我的分组无通道 |
三、配置 Claude Code
环境变量四个就够:
set ANTHROPIC_BASE_URL=https://your-company-gateway.example.com
set ANTHROPIC_AUTH_TOKEN=sk-your-api-key
set ANTHROPIC_MODEL=gpt-5.5
set ANTHROPIC_SMALL_FAST_MODEL=gpt-5.5
claude
各变量的分工:
ANTHROPIC_BASE_URL:网关地址,Claude Code 会自动在后面拼/v1/messagesANTHROPIC_AUTH_TOKEN:你的 keyANTHROPIC_MODEL:主力模型ANTHROPIC_SMALL_FAST_MODEL:后台杂务模型(生成会话标题这类小事)。别图省事放不稳定的模型,否则标题、摘要可能静默失败
想偷懒的话,把这几行存成 .bat 双击运行,等价于手动敲。
验证是否真的切过去了
进 Claude Code 后输 /status,核对三行:
Auth token应显示ANTHROPIC_AUTH_TOKEN(而不是你的个人订阅账号)Anthropic base URL应是网关地址Model应是你设置的模型名
再输 /model,能看到网关里的模型列表,支持随时切换。
四、踩坑记录(血泪部分)
坑 1:测试脚本自己乱码,误判模型能力
这是我踩得最狠的一个坑。最初用 bash 里的 curl 发中文测试,模型对工具调用"毫无反应"、中文回复全是乱码,我一度得出结论"网关不支持工具调用,Claude Code 没法用"。
后来换成 Python 显式 UTF-8 编码重发,所有模型全部正常——之前的"故障"全是我自己的测试脚本在 Windows 终端下把中文请求体转码转坏了。
教训:测 LLM 网关一律用 Python 脚本,请求体 ensure_ascii=False + UTF-8 编码,别信终端里 curl 出来的结果。
坑 2:环境变量只在启动时读取
set 完变量发现没生效?因为 Claude Code 进程是之前启动的。环境变量只在启动那一刻读一次,改完必须退出重进。自查命令:
set ANTHROPIC_
能列出四个变量再启动 claude。
坑 3:别把配置写进全局文件
Claude Code 支持把配置写进 settings.json 持久化,但要注意作用域:写项目级配置只影响当前目录,写用户级全局配置则所有目录的会话都会走公司网关。如果你同时还有个人订阅账号在用,全局写入会把私人会话也一并送进公司网关——既浪费也可能违反公司数据安全规定。我的做法是公司通道只靠环境变量(关掉窗口即失效),和个人账号天然隔离。
坑 4:分组权限是隐形的
/v1/models 列表里出现的模型 ≠ 你的 key 能用的模型。调用时报 model_not_found: No available channel for model xxx under group xxx 就是权限问题,找网关管理员开分组,自己折腾没用。
五、使用感受
接通之后,Claude Code 的全部能力(读写文件、执行命令、多步任务)在公司模型上都能正常跑,而且用量走公司额度,不再消耗个人订阅的窗口配额。会话里 /model 可以在网关的多个模型间随时切换,遇到复杂任务换一个更重的模型即可。
两点提醒收尾:
- 安全底线:写教程、截图、分享时,密钥和内网地址必须脱敏。
- 先测后配:工具调用、流式、中文三项摸底,比配置本身更重要。
以上为个人实操记录,环境是 Windows + New API 网关 + Claude Code v2.1.81,不同网关实现可能略有差异,但探测思路通用。
更多推荐
所有评论(0)