Models
集成
大多数与语言模型对话的工具,用的都是两种协议格式之一。Grafilab 在同一个域名上同时提供这两种格式,所以把编辑器、聊天界面或者 SDK 指向 Grafilab 通常只需要两项设置:一个 base URL 和一个 API 密钥。
https://llm.grafilab.ai 用同一份模型目录、同一个密钥和同一个钱包,对外暴露两种请求格式:
- OpenAI chat completions——
POST /v1/chat/completions,另外还有 embeddings、图像、视频和模型列表。大多数工具说的「兼容 OpenAI」或者「自定义 OpenAI 端点」指的就是它。 - Anthropic messages——
POST /v1/messages,Claude Code 和 Anthropic SDK 用的是这个。
两种格式调用的是同样的 model id,扣的是同一份额度余额,用量也都记在发起请求时通过认证的那个密钥上。你的工具支持哪种就用哪种;除非某个工具只认其中一种,否则没有优劣之分。
我的工具需要哪个 base URL
Section titled “我的工具需要哪个 base URL”最常见的错误就是多写或漏写 /v1。规则很简单:OpenAI 风格的客户端会在一个已经以 /v1 结尾的地址后面追加路径,而 Anthropic 风格的客户端会自己补上 /v1/messages。
| Your tool speaks… | Base URL | Notes |
|---|---|---|
| OpenAI (chat completions, embeddings, images, videos, SDKs) | https://llm.grafilab.ai/v1 | Clients append /chat/completions, /models, and so on. |
| Anthropic (Messages API, Claude Code, Anthropic SDK) | https://llm.grafilab.ai | Clients append /v1/messages themselves — do not add /v1. |
本站涉及的工具:
| 工具 | 格式 | 要填入的值 |
|---|---|---|
| Cursor | OpenAI | https://llm.grafilab.ai/v1 |
| Cline | OpenAI(Anthropic 也可以) | https://llm.grafilab.ai/v1 |
| Claude Code | Anthropic | https://llm.grafilab.ai |
| Open WebUI | OpenAI | https://llm.grafilab.ai/v1 |
| OpenAI SDK(Python、TypeScript) | OpenAI | https://llm.grafilab.ai/v1 |
| Anthropic SDK | Anthropic | https://llm.grafilab.ai |
| 其他任何兼容 OpenAI 的工具 | OpenAI | https://llm.grafilab.ai/v1 |
- A Grafilab API key. In the console open API (
https://app.grafilab.ai/api) and click Generate New Key — see API Keys.
每个工具单独建一个密钥,并用工具名给它命名。用量记在通过认证的那个密钥上,所以一个工具一个密钥能把按密钥统计的用量变成按工具拆分的成本账单,而且吊销某个工具的访问权限不会影响其他工具。
OpenAI 接口从 Authorization: Bearer 读取密钥。Anthropic 接口 x-api-key 和 Authorization: Bearer 都接受,所以只支持其中一种的工具照样能用。
选择 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.
模型列表只在 OpenAI 接口上提供。即使你的工具用 Anthropic 格式与 Grafilab 通信,也要用 GET /v1/models 加 Bearer token 列出目录,再把想用的 id 粘贴到工具里。
测试两套接口
Section titled “测试两套接口”在动工具的设置之前,先在终端里确认密钥和 URL 没问题。curl 能跑通,就说明之后再出问题是工具配置的事,不是你账号的事。
curl https://llm.grafilab.ai/v1/chat/completions \ -H "Authorization: Bearer $GRAFILAB_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "grafilab/qwen3.6-flash", "messages": [{"role": "user", "content": "Say hi in five words."}] }'curl https://llm.grafilab.ai/v1/messages \ -H "x-api-key: $GRAFILAB_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "grafilab/qwen3.6-flash", "max_tokens": 64, "messages": [{"role": "user", "content": "Say hi in five words."}] }'max_tokens 在 /v1/messages 上是必填的,在 /v1/chat/completions 上是可选的。两个调用都应该返回带 content 或 choices 字段的 JSON。401 表示密钥字符串不对或者混进了多余的空白字符;404 表示 model id 和目录里的 id 对不上;429 表示你的额度余额空了,而不是发得太快。
Anthropic 接口不支持的部分
Section titled “Anthropic 接口不支持的部分”/v1/messages 实现的是 Messages 协议的一个子集。对编码 agent 和聊天客户端来说够用,但有几处和 Anthropic 官方端点的行为不一样:
- 服务端工具会被拒绝。
web_search_*、bash_*以及任何type不是custom的工具都会返回400,而不是被悄悄丢掉。未知的 content block 类型和未知的 message role 也一样。 - 有五个字段会被接受但忽略:
top_k、thinking、output_config、context_management,以及出现在任何位置的cache_control。带上它们的请求能成功,只是这些字段不起作用。 - 缓存写入从不上报。 在模型支持的地方提示词缓存照常生效,命中的输入会体现在
usage.cache_read_input_tokens里,但usage.cache_creation_input_tokens永远是0。 usage.input_tokens不包含缓存的 token,与 Anthropic 的惯例一致。- 没有模型列表接口。 请用 OpenAI 接口上的
GET /v1/models。 - 不读取
anthropic-version。 发了没坏处,不发也没问题。 - 流式响应没有结束帧。 序列到
message_stop就结束了;首帧之后出现的失败会以 HTTP200上的event: error内联返回。
user 轮支持的 content block 是 text、image 和 tool_result,assistant 轮是 text、tool_use、thinking 和 redacted_thinking。其他都返回 400。Claude Code 页面把这些逐条对应到你实际可能察觉到的现象。

