跳转到内容

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,这样它的花费就和其他工具分开了。

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.

Terminal window
curl https://llm.grafilab.ai/v1/models \
-H "Authorization: Bearer $GRAFILAB_API_KEY" | jq -r '.data[].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

ANTHROPIC_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"

ANTHROPIC_DEFAULT_HAIKU_MODEL 决定 haiku 这个别名解析到哪个模型,也是 Claude Code 做后台工作时用的模型;ANTHROPIC_DEFAULT_SONNET_MODEL 和 ANTHROPIC_DEFAULT_OPUS_MODEL 对 sonnet 和 opus 起同样的作用,所以如果你会用 /model 切换模型,这两个也要设。ANTHROPIC_SMALL_FAST_MODEL 是 haiku 那个变量已废弃的前身,用新名字。

export 只在当前终端会话里有效。保留配置有两种办法,取决于你是想让所有 Claude Code 会话都走 Grafilab,还是只让其中一部分走。

把这些变量写进 Claude Code 配置文件的 env 块。~/.claude/settings.json 对你所有项目生效;.claude/settings.local.json 只对单个项目生效,并且已经帮你加进了 gitignore。配置文件还能作用到后台 agent,而 shell 里的 export 未必能可靠地传过去。

~/.claude/settings.json
{
"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 在下次启动时报配置错误。

如果你同时还用 Claude Code 连 Anthropic,就把 Grafilab 的配置包进一个函数里,这样原本的 claude 不受影响,而 gclaude 走 Grafilab。

~/.zshrc or ~/.bashrc
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 "$@"
}

在 PowerShell 里 finally 块很重要:$env: 赋值会在函数结束后继续存在,泄漏到你在同一个窗口里下一次运行的普通 claude。bash 那种写法只为一条命令设置变量,所以不需要清理。

如果两套都留着,记住配置文件里的 env 值会盖过同名的 shell export。

  1. 在打开 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 和密钥都没问题。

  2. 启动一个会话并发一条提示词。

    终端窗口
    claude "say hi"
  3. 运行 /status,看 Status 标签页。有两行能确认路由:

    Anthropic base URL: https://llm.grafilab.ai
    Auth token: ANTHROPIC_AUTH_TOKEN

    如果没有 base URL 那一行,说明变量没传进这个会话——从设置了 export 的那个 shell 里启动 claude,或者把它们挪进配置文件。

  4. 运行 /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_errortoken 里带了换行或者末尾空格,通常是从终端复制时带上的从控制台的 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
每个请求都返回 404base URL 以 /v1 结尾使用裸 origin https://llm.grafilab.ai
请求卡住,最后什么都没输出就断了上游调用的首个 token 有 120 秒的时间上限重试即可;没有产生输出的请求不会计费
回复到一半报错中断首帧之后失败的流仍然保持 HTTP 200,错误以 event: error 内联返回重试。已经生成的那部分输出会计费
网关返回 500基础设施故障,特意返回 500 而不是 502 或 504可以放心重试,除非响应带了 x-should-retry: false,那表示工作已经完成并且已计费