实战记录:把 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/messages
  • ANTHROPIC_AUTH_TOKEN:你的 key
  • ANTHROPIC_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 可以在网关的多个模型间随时切换,遇到复杂任务换一个更重的模型即可。

两点提醒收尾:

  1. 安全底线:写教程、截图、分享时,密钥和内网地址必须脱敏。
  2. 先测后配:工具调用、流式、中文三项摸底,比配置本身更重要。

以上为个人实操记录,环境是 Windows + New API 网关 + Claude Code v2.1.81,不同网关实现可能略有差异,但探测思路通用。

更多推荐