Models
Claude Code
只要一个服务端说 Anthropic Messages 格式,Claude Code 就把它当作网关。Grafilab 在 https://llm.grafilab.ai/v1/messages 上提供这种格式,所以把 CLI 指向 Grafilab 只需要两个环境变量再加一个 model id。
- 已安装并能正常运行 Claude Code。执行
claude --version确认。
- A Grafilab API key. In the console open API (
https://app.grafilab.ai/api) and click Generate New Key — see API Keys.
把密钥命名为 claude-code,这样它的花费就和其他工具分开了。
选择 model id
Section titled “选择 model id”The model catalog is live, so list it rather than copying ids from a page. Every entry’s id is the exact string to use in any tool or SDK.
curl https://llm.grafilab.ai/v1/models \ -H "Authorization: Bearer $GRAFILAB_API_KEY" | jq -r '.data[].id'from openai import OpenAI
client = OpenAI(api_key="sk-grafilab-...", base_url="https://llm.grafilab.ai/v1")for model in client.models.list(): print(model.id)import OpenAI from "openai";
const client = new OpenAI({ apiKey: "sk-grafilab-...", baseURL: "https://llm.grafilab.ai/v1" });for await (const model of client.models.list()) { console.log(model.id);}The same ids appear as cards in the Playground, with context size and prices.
Anthropic 接口本身没有模型列表,所以按上面的方式在 OpenAI 接口上列出目录,再把 id 粘贴到 ANTHROPIC_MODEL 里。
base URL 要设成裸的 origin。Claude Code 会自己补上 /v1/messages,所以以 /v1 结尾的 base URL 会让请求打到 /v1/v1/messages,返回 404。
export ANTHROPIC_BASE_URL="https://llm.grafilab.ai"export ANTHROPIC_AUTH_TOKEN="sk-grafilab-..."export ANTHROPIC_MODEL="grafilab/qwen3.6-flash"
claude$env:ANTHROPIC_BASE_URL = "https://llm.grafilab.ai"$env:ANTHROPIC_AUTH_TOKEN = "sk-grafilab-..."$env:ANTHROPIC_MODEL = "grafilab/qwen3.6-flash"
claudeANTHROPIC_AUTH_TOKEN 会把密钥以 Authorization: Bearer 发出,Grafilab 接受这种方式。不要同时设置 ANTHROPIC_API_KEY:它把密钥以 x-api-key 发出,Grafilab 同样接受,但两个都设置会让 Claude Code 在接管前提示你确认 API key,启动时还会警告存在两个凭据来源。选一个,优先用 ANTHROPIC_AUTH_TOKEN。
ANTHROPIC_MODEL 只管当前会话的主模型。Claude Code 还会调用一个小模型做后台工作,并会派生 subagent,这两者默认用的是 Grafilab 不提供的 Anthropic 模型名。把它们也设成 Grafilab 的 id,否则这些调用会以 404 失败:
export ANTHROPIC_DEFAULT_HAIKU_MODEL="grafilab/qwen3.6-flash"export CLAUDE_CODE_SUBAGENT_MODEL="grafilab/qwen3.6-flash"$env:ANTHROPIC_DEFAULT_HAIKU_MODEL = "grafilab/qwen3.6-flash"$env:CLAUDE_CODE_SUBAGENT_MODEL = "grafilab/qwen3.6-flash"ANTHROPIC_DEFAULT_HAIKU_MODEL 决定 haiku 这个别名解析到哪个模型,也是 Claude Code 做后台工作时用的模型;ANTHROPIC_DEFAULT_SONNET_MODEL 和 ANTHROPIC_DEFAULT_OPUS_MODEL 对 sonnet 和 opus 起同样的作用,所以如果你会用 /model 切换模型,这两个也要设。ANTHROPIC_SMALL_FAST_MODEL 是 haiku 那个变量已废弃的前身,用新名字。
让配置持久生效
Section titled “让配置持久生效”export 只在当前终端会话里有效。保留配置有两种办法,取决于你是想让所有 Claude Code 会话都走 Grafilab,还是只让其中一部分走。
配置文件:始终生效
Section titled “配置文件:始终生效”把这些变量写进 Claude Code 配置文件的 env 块。~/.claude/settings.json 对你所有项目生效;.claude/settings.local.json 只对单个项目生效,并且已经帮你加进了 gitignore。配置文件还能作用到后台 agent,而 shell 里的 export 未必能可靠地传过去。
{ "env": { "ANTHROPIC_BASE_URL": "https://llm.grafilab.ai", "ANTHROPIC_AUTH_TOKEN": "sk-grafilab-...", "ANTHROPIC_MODEL": "grafilab/qwen3.6-flash", "ANTHROPIC_DEFAULT_HAIKU_MODEL": "grafilab/qwen3.6-flash", "CLAUDE_CODE_SUBAGENT_MODEL": "grafilab/qwen3.6-flash" }}配置文件是严格的 JSON:多余的逗号或者 // 注释都会让 Claude Code 在下次启动时报配置错误。
shell 包装函数:两套并存
Section titled “shell 包装函数:两套并存”如果你同时还用 Claude Code 连 Anthropic,就把 Grafilab 的配置包进一个函数里,这样原本的 claude 不受影响,而 gclaude 走 Grafilab。
gclaude() { ANTHROPIC_BASE_URL="https://llm.grafilab.ai" \ ANTHROPIC_AUTH_TOKEN="sk-grafilab-..." \ ANTHROPIC_MODEL="grafilab/qwen3.6-flash" \ ANTHROPIC_DEFAULT_HAIKU_MODEL="grafilab/qwen3.6-flash" \ CLAUDE_CODE_SUBAGENT_MODEL="grafilab/qwen3.6-flash" \ command claude "$@"}function gclaude { $env:ANTHROPIC_BASE_URL = "https://llm.grafilab.ai" $env:ANTHROPIC_AUTH_TOKEN = "sk-grafilab-..." $env:ANTHROPIC_MODEL = "grafilab/qwen3.6-flash" $env:ANTHROPIC_DEFAULT_HAIKU_MODEL = "grafilab/qwen3.6-flash" $env:CLAUDE_CODE_SUBAGENT_MODEL = "grafilab/qwen3.6-flash" try { claude @args } finally { Remove-Item Env:ANTHROPIC_BASE_URL, Env:ANTHROPIC_AUTH_TOKEN, Env:ANTHROPIC_MODEL, Env:ANTHROPIC_DEFAULT_HAIKU_MODEL, Env:CLAUDE_CODE_SUBAGENT_MODEL -ErrorAction SilentlyContinue }}在 PowerShell 里 finally 块很重要:$env: 赋值会在函数结束后继续存在,泄漏到你在同一个窗口里下一次运行的普通 claude。bash 那种写法只为一条命令设置变量,所以不需要清理。
如果两套都留着,记住配置文件里的 env 值会盖过同名的 shell export。
-
在打开 Claude Code 之前先测端点,这样出错就能确定是网关的问题而不是 CLI 的问题。
终端窗口 curl -X POST "$ANTHROPIC_BASE_URL/v1/messages" \-H "Authorization: Bearer $ANTHROPIC_AUTH_TOKEN" \-H "content-type: application/json" \-d '{"model": "grafilab/qwen3.6-flash", "max_tokens": 16, "messages": [{"role": "user", "content": "Say hi."}]}'返回体以
{"id":"msg_开头就说明 URL 和密钥都没问题。 -
启动一个会话并发一条提示词。
终端窗口 claude "say hi" -
运行
/status,看 Status 标签页。有两行能确认路由:Anthropic base URL: https://llm.grafilab.aiAuth token: ANTHROPIC_AUTH_TOKEN如果没有 base URL 那一行,说明变量没传进这个会话——从设置了 export 的那个 shell 里启动
claude,或者把它们挪进配置文件。 -
运行
/cost。token 数和花费照常显示;缓存写入的数字一直是零,这是预期行为,下面有说明。
然后在控制台打开 API,在 claude-code 这个密钥上选择 View Usage,就能从 Grafilab 这一侧看到同样的请求。用量汇总最多可能延迟 30 分钟左右。
Grafilab 实现的是 Messages 协议的一个子集。Claude Code 用来编辑文件、执行命令和调用你的 MCP server 所需的能力都在;下面是你可能会注意到的边角情况。
| 项目 | 你会看到什么 | 该怎么做 |
|---|---|---|
| 没有 token 计数端点 | Grafilab 没有实现 /v1/messages/count_tokens,所以 Claude Code 无法让网关测算提示词长度,它显示的剩余上下文只是估计值 | 不用做什么。把上下文读数当作近似值 |
| 服务端工具被拒绝 | web_search_*、bash_* 以及任何 type 不是 custom 的工具都返回 400。Claude Code 内置的 WebSearch 工具会直接失败,而不是降级 | 在配置文件的 permissions.deny 里加上 "WebSearch",让 Claude Code 根本不提供它 |
cache_control 被忽略 | 提示词缓存的写入从不上报:cache_creation_input_tokens 永远是 0,/cost 里也看不到缓存写入。模型支持缓存时,缓存读取仍会照常上报 | 不用做什么,但别把这个零当成 bug |
thinking 被忽略 | 除非模型本身就会推理,否则扩展思考开关不起作用。对于不认识的模型名(包括 Grafilab 的别名),Claude Code 都会发 thinking;Grafilab 接受并丢弃这个字段,而不是报错 | 不用做什么 |
top_k、output_config、context_management 被忽略 | 接受后丢弃,所以推理强度和上下文编辑相关的设置是无效而不是致命的 | 不用做什么 |
不读取 anthropic-version | 发了没坏处 | 不用做什么 |
| 网关模型发现 | CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1 会让 Claude Code 在启动时读取 /v1/models,但它只保留包含 claude 或 anthropic 的 id,所以大多数 Grafilab 的 id 根本进不了 /model 选择器 | 用 ANTHROPIC_MODEL 或 claude --model 指定模型 |
429 表示钱包空了 | Grafilab 用 429 表示余额不足,而不是吞吐量超限 | 到控制台充值 |
| 直连 Anthropic 的功能 | Remote Control 和语音输入需要 claude.ai 身份,设置了网关凭据时无法使用 | 需要用到它们的会话,就把这些变量取消掉 |
| 现象 | 原因 | 解决办法 |
|---|---|---|
每个请求都返回 authentication_error | token 里带了换行或者末尾空格,通常是从终端复制时带上的 | 从控制台的 API 页面重新复制,并给值加上引号 |
| curl 测试通过了,Claude Code 却显示登录界面 | base URL 能通不等于有凭据,而且项目里的 env 块要在通过文件夹信任提示之后才生效 | 用 shell export 或者在 ~/.claude/settings.json 里设置 ANTHROPIC_AUTH_TOKEN |
not_found_error 里点名了模型 | 别名拼错了,或者后台模型、subagent 模型还是 Anthropic 的名字 | 用 GET /v1/models 重新列一遍;设置 ANTHROPIC_DEFAULT_HAIKU_MODEL 和 CLAUDE_CODE_SUBAGENT_MODEL |
每个请求都返回 404 | base URL 以 /v1 结尾 | 使用裸 origin https://llm.grafilab.ai |
| 请求卡住,最后什么都没输出就断了 | 上游调用的首个 token 有 120 秒的时间上限 | 重试即可;没有产生输出的请求不会计费 |
| 回复到一半报错中断 | 首帧之后失败的流仍然保持 HTTP 200,错误以 event: error 内联返回 | 重试。已经生成的那部分输出会计费 |
网关返回 500 | 基础设施故障,特意返回 500 而不是 502 或 504 | 可以放心重试,除非响应带了 x-should-retry: false,那表示工作已经完成并且已计费 |

