# 在 Claude Code 里用 Grok Claude Code 只认 Anthropic 协议,而 Grok 走的是 OpenAI 兼容协议, 两边对不上——所以要用 \*\*CC Switch 的「本地路由」\*\*在本机做一次协议转换。 配置一次即可,之后在 Claude Code 里就是直接用 `grok-4.6`。 下面四步照着截图填即可,标注的红框和序号就是要动的地方。 **「本地路由」是必开项,不是可选项。** API 格式选了 `OpenAI Chat Completions` 的供应商,卡片上会挂一个 \*\*「需要路由」\*\*标记;只要路由没开,这个供应商就是不可用状态—— 这是最常见的「配好了却用不了」的原因。 ## 新增供应商 打开 CC Switch,顶部先切到 **Claude 那一栏**(① 处的图标), 再点右上角的 **+**(②)新增一个供应商。 CC Switch 主界面:切到 Claude 栏,点右上角加号新增供应商 ① 顶部切到 Claude 图标那一栏 ② 右上角 + 新增供应商。配好后卡片长这样,注意名称旁边的「需要路由」标记 ## 填写供应商信息 按下图逐项填,五个红框是关键: | 字段 | 填什么 | | --------- | -------------------------------------------------- | | 供应商名称 | 自己认得就行,例如 `VibeAPI Grok` | | 官网链接 | `https://www.vibeapi.cn` | | ① API Key | 在 VibeAPI 用 **`auto` 或 `default` 令牌分组**生成的 key | | ② 请求地址 | `https://www.vibeapi.cn/v1` **结尾不要带斜杠** | | ③ API 格式 | **OpenAI Chat Completions(需开启路由)** | | 认证字段 | `ANTHROPIC_AUTH_TOKEN`(默认,不用改) | | ④ 模型映射 | Sonnet / Opus / Fable / Haiku **四行全部填 `grok-4.6`** | | ⑤ 默认兜底模型 | 同样填 `grok-4.6` | CC Switch 编辑供应商表单:API Key、请求地址、API 格式、模型映射、默认兜底模型 编辑供应商页面。①API Key ②请求地址填到 `/v1` ③API 格式选「需开启路由」那项 ④四个模型角色全填 grok-4.6 ⑤默认兜底模型也填 grok-4.6,填完点右下角保存 **为什么四行都填 `grok-4.6`。** Claude Code 会按 Sonnet / Opus / Haiku 这些角色分别发请求(后台小任务通常走 Haiku)。 映射不填满的话,这些请求会把原始 Claude 模型名透传给上游, 上游没有这个模型就直接报错。**默认兜底模型同理,别留空。** ## 打开本地路由 回到主界面,进 **设置 → 路由**,第一项就是**本地路由**,点开它。 CC Switch 设置页的路由标签页,第一项是本地路由 设置 → 路由 → 本地路由(控制路由服务开关、查看状态与端口信息) ## 打开总开关和 Claude 开关 展开后有两个开关要打开:**路由总开关**,以及「路由启用」里的 **Claude**。状态显示**运行中**就算好了。 本地路由展开后的开关:路由总开关与 Claude 路由开关均已打开 两个红箭头就是要打开的:右上「路由总开关」、下方「路由启用 · Claude」。服务地址默认 `http://127.0.0.1:15721`,改地址或端口后要重启路由服务才生效 **最后一步**:回主界面把这个供应商切成「使用中」, **重开一个 Claude Code 会话**(旧会话读的还是旧配置), `/model` 菜单里就能看到 `grok-4.6` 了。 还是不通,按顺序查三样:路由是不是「运行中」、请求地址是不是 `https://www.vibeapi.cn/v1`(无尾斜杠)、令牌分组是不是 `auto` / `default`。 # Grok 图像 `POST /v1/images/generations` · `POST /v1/images/edits` 模型 `grok-imagine-image-2.0`,按张计费;上一代 `grok-imagine-image-quality` 同端点、同价、仍在线(官方定于 2026-11-02 退役)。 图生图不换模型:把生图模型送到 `/v1/images/edits` 就是改图。最后验证:2026-09-12。 ## 基本调用 ```bash curl https://www.vibeapi.cn/v1/images/generations \ -H "Authorization: Bearer $API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "grok-imagine-image-2.0", "prompt": "a red apple on a wooden table, photo", "n": 1 }' ``` ```python from openai import OpenAI client = OpenAI(base_url="https://www.vibeapi.cn/v1", api_key="YOUR_API_KEY") result = client.images.generate( model="grok-imagine-image-2.0", prompt="a red apple on a wooden table, photo", n=1, ) item = result.data[0] print(item.url or "b64_json") # 临时链接,生成后立即下载落盘 ``` ```javascript import OpenAI from "openai"; const client = new OpenAI({ baseURL: "https://www.vibeapi.cn/v1", apiKey: "YOUR_API_KEY" }); const result = await client.images.generate({ model: "grok-imagine-image-2.0", prompt: "a red apple on a wooden table, photo", n: 1, }); const item = result.data[0]; console.log(item.url ?? "b64_json"); // 临时链接,生成后立即下载落盘 ``` 响应: ```json { "data": [{"url": "https://.../....jpeg", "mime_type": "image/jpeg"}], "usage": {"cost_in_usd_ticks": 600000000} } ``` 图片 URL 是临时地址,请在生成后立即下载落盘,不要直接交给终端用户或作为长期地址存储。 ## 请求参数 | 参数 | 支持 | 取值 / 说明 | | ----------------- | -- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `prompt` | ✅ | 必填 | | `n` | ✅ | `1`–`10`,超出返回 400;按张计费 | | `aspect_ratio` | ⚠️ | 官方取值 `1:1`、`16:9` / `9:16`、`4:3` / `3:4`、`3:2` / `2:3`、`2:1` / `1:2`、`19.5:9` / `9:19.5`、`20:9` / `9:20`、`21:9`、`5:2`、`auto`。**2.0 在本网关不生效**,固定 1248×832;上一代生效 | | `resolution` | ⚠️ | 官方 `1k`(默认)/ `2k`。**2.0 在本网关不生效** | | `quality` | ⚠️ | 官方仅 2.0 支持,`low` / `medium` / `auto`(默认;生成按 `low`、编辑按 `medium` 服务,按实际档计费)。本网关传 `medium` 或 `high` 都返回 200,尺寸不变,是否影响计费未验证 | | `response_format` | ✅ | `url`(默认)或 `b64_json` | | `seed` | ✅ | 固定随机种子 | | `size` | ⚠️ | 不报错但无效,改用 `aspect_ratio` | ## 画幅 `grok-imagine-image-2.0` 在本网关上**只出 1248 × 832 一种尺寸**:`aspect_ratio` 七种取值、`resolution: 2k`、`quality` 逐一试过, 既不报错也不生效。这与 xAI 官方文档(2.0 支持全部画幅与 2K)不一致,属本网关当前表现。 | `aspect_ratio` | `grok-imagine-image-2.0` | `grok-imagine-image-quality` | | ---------------------- | ------------------------ | ---------------------------- | | `1:1` | 1248 × 832 | 1024 × 1024 | | `16:9` | 1248 × 832 | 1280 × 720 | | `9:16` | 1248 × 832 | 864 × 1152 | | `4:3` | 1248 × 832 | 1152 × 864 | | `3:2` | 1248 × 832 | 1248 × 832 | | `2:3` / `3:4` / `21:9` | 1248 × 832 | — | 需要竖图、方图或任何非 3:2 画幅,用 `grok-imagine-image-quality`。它退役后由 2.0 以 `quality: low` 接管——如果届时 2.0 仍不认画幅,竖图就没有替代方案了。 上一代的尺寸口径也会变(`9:16` 曾返回 720 × 1280,现为 864 × 1152),**不要把尺寸写死在代码里**,以返回图片的实际宽高为准。 ## 出图耗时 同一句提示词、同样单张:`grok-imagine-image-2.0` **36–64 秒**,`grok-imagine-image-quality` 约 **5 秒**。 批量出图、或接在用户交互链路上的场景,按这个差距估算超时与并发。 ## 图生图 ```bash curl https://www.vibeapi.cn/v1/images/edits \ -H "Authorization: Bearer $API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "grok-imagine-image-2.0", "prompt": "change the apple color to bright green, keep everything else identical", "image": {"type": "image_url", "url": "https://example.com/apple.jpg"} }' ``` **只收 JSON body。** OpenAI SDK 的 `images.edit()` 走 multipart 表单上传,打到本网关会 502 (`分组 auto 下模型 grok-imagine-image-2.0 的可用渠道不存在`)。改图请自行 POST JSON,图片走 URL 或 base64 内联。 `image` 字段接受四种写法,都能正常出图、计费一致: ```json "image": {"type": "image_url", "url": "https://example.com/apple.jpg"} // 文档写法 "image": {"url": "https://example.com/apple.jpg"} // 省略 type "image": "https://example.com/apple.jpg" // 直接给字符串 "image": {"type": "image_url", "url": "data:image/jpeg;base64,...."} // base64 内联 ``` 官方还支持一次最多 5 张源图(输出画幅默认跟随第一张,可用 `aspect_ratio` 覆盖)和 Files API 的 `file_id`;本网关输出仍固定 1248 × 832。 计费与文生图同档,按张;耗时 2.0 约 36–58 秒,上一代约 5 秒。 ### 一致性 当前的改图更像「重画」而不是「编辑」:同一张红苹果原图、`keep everything else identical`,两代模型六次输出全部是按提示词重新绘制的新场景—— 苹果确实变绿了,但桌面、背景、道具、构图都换了。 对一致性有硬要求的链路(换色、局部替换、批量套版),**先用自己的图跑一遍再上线**。 把必须保留的元素直接写进提示词(背景、材质、机位、光线)比只写「保留其余部分」更有效;如果目标是「同一主体动起来」, [视频](https://docs.vibeapi.cn/zh/docs/grok-videos)接口的 `image`(锁首帧)与 `reference_images` 反而更接近「保留原图」的语义。 ## 在线调试 填入你自己的 API Key 即可直接发起请求,参数表与响应结构由接口定义生成。 模型填 `grok-imagine-image-2.0`,`aspect_ratio` 等 Grok 专有参数可在请求体里手动加。改图接口只收 JSON,通用调试器走 multipart,不适用,请直接用上文的 curl。 ## 官方文档 * [xAI · Image Generation](https://docs.x.ai/developers/model-capabilities/images/generation) · [Image Editing](https://docs.x.ai/developers/model-capabilities/images/editing) · [Multi-Image Editing](https://docs.x.ai/developers/model-capabilities/images/multi-image-editing) # 模型与入口 网关地址 `https://www.vibeapi.cn/v1`,所有请求带 `Authorization: Bearer `。 ## 列出模型 `GET /v1/models` 返回当前 Key 可调用的全部模型,模型名与下方矩阵一致。 ```bash curl "https://www.vibeapi.cn/v1/models" \ -H "Authorization: Bearer $API_KEY" ``` ```python from openai import OpenAI client = OpenAI(base_url="https://www.vibeapi.cn/v1", api_key="YOUR_API_KEY") for m in client.models.list(): print(m.id) ``` ```javascript import OpenAI from "openai"; const client = new OpenAI({ baseURL: "https://www.vibeapi.cn/v1", apiKey: "YOUR_API_KEY" }); for await (const m of client.models.list()) { console.log(m.id); } ``` ## 流式与超时 请求超时上限是 **120 秒**。非流式请求在生成完成前没有任何数据下行,单次生成一旦超过这个 时间,连接会被中断,表现为「调用超时」。 短输出的非流式请求正常可用,通常几秒即返回。会触发上限的是长输出与推理型模型—— 它们要等整段推理和生成结束才返回首字节。**由于单次生成耗时无法预先判断,生产环境 建议默认开启流式**:流式从第一个事件起就有数据下行,连接不会闲置到触发超时。 需要一次性拿到完整结果时,请在客户端聚合流式事件,而不是改回非流式。 ## 标注含义 下面每个模型最多有三行,含义是固定的: 这个模型的原生入口,功能最全、字段保真最好。没有特殊理由就用它。 可以调通,但会损失一些东西——具体差在哪写在模型下面的说明里。 你用 A 协议发,网关翻译成 B 协议后再发出。**只保证核心功能**:消息、流式、基本的 工具调用。协议特有的字段(比如 Claude 的 thinking 块、Gemini 的 imageConfig)会在 翻译中丢失。调用成功不代表功能等价。 标着 **ⓘ 以实测为准** 的模型,它们的原生协议逐个模型而异,结论是实测出来的,日期是 最后一次验证的时间。没有这个标记的(OpenAI、Anthropic、Google 三家)是确定性的, 不随时间变化。 ## 两类静默失效 **一、你的 key 分组会影响能力。** key 分 `auto`(可调用全部模型)和 `Claude 官方满血版` 两类。Claude 系模型在这两类上,提示缓存、服务端工具和 thinking 的实际可用性**是不同的**;GPT 系实测没有差异。详见 [Messages](https://docs.vibeapi.cn/zh/docs/messages) 页。 **二、网关会为部分模型过滤或改写参数**,比如 Claude 的 `thinking.budget_tokens` 会被丢掉、Grok 的内置 `web_search` 会被移除。规则写在各自的调用页 ([Messages](https://docs.vibeapi.cn/zh/docs/messages) · [Chat](https://docs.vibeapi.cn/zh/docs/chat) · [Responses](https://docs.vibeapi.cn/zh/docs/responses))。 两件事都返回 200,只看状态码发现不了。 ## 国产模型的协议兼容度 国产模型两套协议都能调通,但**对参数的遵循程度参差不齐**。 下面是逐项实测结果(`auto` key,最后验证 2026-09-09): | | glm-5.3 | kimi-k3 | qwen3.8-max | deepseek-v4-pro | MiniMax-M3 | | -------------------------- | --------------- | --------- | ----------- | --------------- | ---------- | | 基本调用(两协议) | ✅ | ✅ | ✅ | ✅ | ✅ | | **工具调用**(两协议) | ✅ | ✅ | ✅ | ✅ | ✅ | | `max_tokens` 是否执行 | ✅ 精确 | ❌ **不执行** | ✅ 精确 | ❌ **严重不执行** | ✅ 精确 | | `stop`(Chat 协议) | ❌ | ✅ | ❌ | ✅ | ❌ | | `stop_sequences`(Messages) | ❌ | ✅ | ✅ | ✅ | ❌ | | `json_object` 结构化输出 | ❌ 带 markdown 包裹 | ✅ | ✅ | ✅ | ✅ | 三条要点: **一、工具调用全部可用。** 五个模型在 Chat 和 Messages 两个协议上都能正确返回 `tool_calls` / `tool_use`。做 agent 类应用可以放心用。 **二、`max_tokens` 在两个模型上不执行,而且结束字段会误导你。** `deepseek-v4-pro` 要求 16 token,实际产出 **1465**(Chat)/ **964**(Messages); `kimi-k3` 要求 16,实际产出 81 / 75。这两个模型同时将 `finish_reason` 报为 `length`、 `stop_reason` 报为 `max_tokens`,与实际不符。 > 不要用 `max_tokens` 估算成本上限,也不要依据 `finish_reason` 判断是否截断。 > 使用这两个模型时,以 `usage` 中的实际 token 数对账。 **三、`stop` / `stop_sequences` 看模型,而且同一模型在两个协议上可能不同。** `qwen3.8-max` 在 Messages 协议上生效、在 Chat 协议上不生效。依赖停止序列的逻辑, 请先在你要用的那个协议上实测一次,不要跨协议套用结论。 `glm-5.3` 的 `json_object` 会返回带 ` ``` ` 包裹的代码块,解析前要先剥离。 ## 在线调试 填入你自己的 API Key 即可直接发起请求,参数表与响应结构由接口定义生成。 # MiniMax H3 `POST /v1/videos`,`model` 为 `MiniMax-H3`。按秒计费,见[视频生成](https://docs.vibeapi.cn/zh/docs/videos#模型与计费)。本页结论来自对本网关的真实调用,最后验证:2026-09-05。 ## 基本调用 ```bash # 1. 提交 curl https://www.vibeapi.cn/v1/videos \ -H "Authorization: Bearer $API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "MiniMax-H3", "prompt": "日出时分的海面,镜头极缓慢推进,电影级布光", "seconds": "5", "aspect_ratio": "16:9" }' # 2. 轮询(每 10~15 秒一次) curl "https://www.vibeapi.cn/v1/videos/$TASK_ID" -H "Authorization: Bearer $API_KEY" # 3. 取片 curl -L "https://www.vibeapi.cn/v1/videos/$TASK_ID/content" \ -H "Authorization: Bearer $API_KEY" -o output.mp4 ``` ```python import time, requests BASE = "https://www.vibeapi.cn/v1" H = {"Authorization": "Bearer YOUR_API_KEY"} task = requests.post(f"{BASE}/videos", headers=H, json={ "model": "MiniMax-H3",, "prompt": "日出时分的海面,镜头极缓慢推进,电影级布光",, "seconds": "5",, "aspect_ratio": "16:9", }).json() while True: s = requests.get(f"{BASE}/videos/{task['id']}", headers=H).json() if s["status"] in ("completed", "failed"): break time.sleep(12) if s["status"] == "completed": url = s.get("metadata", {}).get("url") or f"{BASE}/videos/{task['id']}/content" open("output.mp4", "wb").write(requests.get(url, headers=H).content) ``` ```javascript import fs from "fs"; const BASE = "https://www.vibeapi.cn/v1"; const H = { Authorization: "Bearer YOUR_API_KEY", "Content-Type": "application/json" }; const sleep = (ms) => new Promise((r) => setTimeout(r, ms)); const task = await (await fetch(`${BASE}/videos`, { method: "POST", headers: H, body: JSON.stringify({ model: "MiniMax-H3",, prompt: "日出时分的海面,镜头极缓慢推进,电影级布光",, seconds: "5",, aspect_ratio: "16:9", }), })).json(); let s; while (true) { s = await (await fetch(`${BASE}/videos/${task.id}`, { headers: H })).json(); if (s.status === "completed" || s.status === "failed") break; await sleep(12_000); } if (s.status === "completed") { const url = s.metadata?.url ?? `${BASE}/videos/${task.id}/content`; fs.writeFileSync("output.mp4", Buffer.from(await (await fetch(url, { headers: H })).arrayBuffer())); } ``` 按秒计费,固定 768P,整数 1–15 秒。特点是**参考素材的种类最全**:图、视频、音频三类 可以同时给,提示词里用 `` `