@musistudio/claude-code-router 1.0.73 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +320 -653
  2. package/README_zh.md +320 -601
  3. package/dist/main/cli.js +5242 -0
  4. package/dist/main/fusion-tool-fallback-mcp.js +5 -0
  5. package/dist/main/fusion-vision-mcp.js +10 -0
  6. package/dist/main/toolhub-mcp.js +47 -0
  7. package/dist/marketplace/plugins/claude-design-plugin.cjs +8216 -0
  8. package/dist/marketplace/plugins/cursor-proxy-plugin.cjs +7080 -0
  9. package/dist/models.json +490722 -0
  10. package/dist/renderer/assets/assets/anthropic-CJYB5ODC.png +0 -0
  11. package/dist/renderer/assets/assets/bailian-6RH6ASGG.ico +0 -0
  12. package/dist/renderer/assets/assets/claude-code-WX35JWK4.png +0 -0
  13. package/dist/renderer/assets/assets/codex-3X2KBXKY.png +0 -0
  14. package/dist/renderer/assets/assets/deepseek-ZIDCDTQF.ico +0 -0
  15. package/dist/renderer/assets/assets/gemini-7QB7T63T.svg +1 -0
  16. package/dist/renderer/assets/assets/logo-IPLFWCDN.png +0 -0
  17. package/dist/renderer/assets/assets/mascot-transition-DUBPNIIV.svg +100 -0
  18. package/dist/renderer/assets/assets/mistral-2RFSC6K3.webp +0 -0
  19. package/dist/renderer/assets/assets/moonshot-FNEXMLNW.ico +0 -0
  20. package/dist/renderer/assets/assets/openai-2EIP7LI2.png +0 -0
  21. package/dist/renderer/assets/assets/openrouter-CZIFREDB.ico +0 -0
  22. package/dist/renderer/assets/assets/runapi-UAX35AOL.jpg +0 -0
  23. package/dist/renderer/assets/assets/siliconflow-QCZUQAH2.png +0 -0
  24. package/dist/renderer/assets/assets/teamorouter-3LCEETRZ.png +0 -0
  25. package/dist/renderer/assets/assets/tray-cyan-C3U4WBE7.png +0 -0
  26. package/dist/renderer/assets/assets/tray-orange-VUJTRHBB.png +0 -0
  27. package/dist/renderer/assets/assets/tray-violet-EGMLZ2GB.png +0 -0
  28. package/dist/renderer/assets/assets/zai-global-coding-OMCES3LL.svg +219 -0
  29. package/dist/renderer/assets/assets/zai-global-general-OMCES3LL.svg +219 -0
  30. package/dist/renderer/assets/assets/zcode-Z7V7YY2Q.png +0 -0
  31. package/dist/renderer/assets/assets/zhipu-cn-coding-7BBWPUTC.png +0 -0
  32. package/dist/renderer/assets/assets/zhipu-cn-general-7BBWPUTC.png +0 -0
  33. package/dist/renderer/assets/browser.js +312 -0
  34. package/dist/renderer/assets/main.css +2 -0
  35. package/dist/renderer/assets/main.js +158 -0
  36. package/dist/renderer/assets/tray.js +8 -0
  37. package/dist/renderer/assets/web-client-bridge.js +1 -0
  38. package/dist/renderer/pages/browser/index.html +13 -0
  39. package/dist/renderer/pages/home/index.html +18 -0
  40. package/dist/renderer/pages/tray/index.html +17 -0
  41. package/package.json +36 -38
  42. package/.dockerignore +0 -2
  43. package/Dockerfile +0 -7
  44. package/custom-router.example.js +0 -3
  45. package/dist/cli.js +0 -88650
  46. package/dist/index.html +0 -439
  47. package/dist/tiktoken_bg.wasm +0 -0
  48. package/docker-compose.yml +0 -10
  49. package/tsconfig.json +0 -20
package/README_zh.md CHANGED
@@ -1,609 +1,328 @@
1
- ![](blog/images/claude-code-router-img.png)
2
-
3
- [![](https://img.shields.io/badge/%F0%9F%87%AC%F0%9F%87%A7-English-000aff?style=flat)](README.md)
4
- [![Discord](https://img.shields.io/badge/Discord-%235865F2.svg?&logo=discord&logoColor=white)](https://discord.gg/rdftVMaUcS)
5
- [![](https://img.shields.io/github/license/musistudio/claude-code-router)](https://github.com/musistudio/claude-code-router/blob/main/LICENSE)
6
-
7
- <hr>
8
-
9
- ![](blog/images/sponsors/glm-zh.jpg)
10
- > GLM CODING PLAN 是专为AI编码打造的订阅套餐,每月最低仅需20元,即可在十余款主流AI编码工具如Claude Code、中畅享智谱旗舰模型GLM-4.6,为开发者提供顶尖的编码体验。
11
- > 智谱AI为本软件提供了特别优惠,使用以下链接购买可以享受九折优惠:https://www.bigmodel.cn/claude-code?ic=RRVJPB5SII
12
-
13
- > 一款强大的工具,可将 Claude Code 请求路由到不同的模型,并自定义任何请求。
14
-
15
- > [GLM-4.6支持思考及思维链回传](blog/zh/GLM-4.6支持思考及思维链回传.md)
16
-
17
- ![](blog/images/claude-code.png)
18
-
19
-
20
- ## 功能
21
-
22
- - **模型路由**: 根据您的需求将请求路由到不同的模型(例如,后台任务、思考、长上下文)。
23
- - **多提供商支持**: 支持 OpenRouter、DeepSeek、Ollama、Gemini、Volcengine 和 SiliconFlow 等各种模型提供商。
24
- - **请求/响应转换**: 使用转换器为不同的提供商自定义请求和响应。
25
- - **动态模型切换**: 在 Claude Code 中使用 `/model` 命令动态切换模型。
26
- - **GitHub Actions 集成**: 在您的 GitHub 工作流程中触发 Claude Code 任务。
27
- - **插件系统**: 使用自定义转换器扩展功能。
28
-
29
- ## 🚀 快速入门
30
-
31
- ### 1. 安装
32
-
33
- 首先,请确保您已安装 [Claude Code](https://docs.anthropic.com/en/docs/claude-code/quickstart):
34
-
35
- ```shell
36
- npm install -g @anthropic-ai/claude-code
37
- ```
38
-
39
- 然后,安装 Claude Code Router:
40
-
41
- ```shell
42
- npm install -g @musistudio/claude-code-router
43
- ```
44
-
45
- ### 2. 配置
46
-
47
- 创建并配置您的 `~/.claude-code-router/config.json` 文件。有关更多详细信息,您可以参考 `config.example.json`。
48
-
49
- `config.json` 文件有几个关键部分:
50
- - **`PROXY_URL`** (可选): 您可以为 API 请求设置代理,例如:`"PROXY_URL": "http://127.0.0.1:7890"`。
51
- - **`LOG`** (可选): 您可以通过将其设置为 `true` 来启用日志记录。当设置为 `false` 时,将不会创建日志文件。默认值为 `true`。
52
- - **`LOG_LEVEL`** (可选): 设置日志级别。可用选项包括:`"fatal"`、`"error"`、`"warn"`、`"info"`、`"debug"`、`"trace"`。默认值为 `"debug"`。
53
- - **日志系统**: Claude Code Router 使用两个独立的日志系统:
54
- - **服务器级别日志**: HTTP 请求、API 调用和服务器事件使用 pino 记录在 `~/.claude-code-router/logs/` 目录中,文件名类似于 `ccr-*.log`
55
- - **应用程序级别日志**: 路由决策和业务逻辑事件记录在 `~/.claude-code-router/claude-code-router.log` 文件中
56
- - **`APIKEY`** (可选): 您可以设置一个密钥来进行身份验证。设置后,客户端请求必须在 `Authorization` 请求头 (例如, `Bearer your-secret-key`) 或 `x-api-key` 请求头中提供此密钥。例如:`"APIKEY": "your-secret-key"`。
57
- - **`HOST`** (可选): 您可以设置服务的主机地址。如果未设置 `APIKEY`,出于安全考虑,主机地址将强制设置为 `127.0.0.1`,以防止未经授权的访问。例如:`"HOST": "0.0.0.0"`。
58
- - **`NON_INTERACTIVE_MODE`** (可选): 当设置为 `true` 时,启用与非交互式环境(如 GitHub Actions、Docker 容器或其他 CI/CD 系统)的兼容性。这会设置适当的环境变量(`CI=true`、`FORCE_COLOR=0` 等)并配置 stdin 处理,以防止进程在自动化环境中挂起。例如:`"NON_INTERACTIVE_MODE": true`。
59
- - **`Providers`**: 用于配置不同的模型提供商。
60
- - **`Router`**: 用于设置路由规则。`default` 指定默认模型,如果未配置其他路由,则该模型将用于所有请求。
61
- - **`API_TIMEOUT_MS`**: API 请求超时时间,单位为毫秒。
62
-
63
- 这是一个综合示例:
64
-
65
- ```json
66
- {
67
- "APIKEY": "your-secret-key",
68
- "PROXY_URL": "http://127.0.0.1:7890",
69
- "LOG": true,
70
- "API_TIMEOUT_MS": 600000,
71
- "NON_INTERACTIVE_MODE": false,
72
- "Providers": [
73
- {
74
- "name": "openrouter",
75
- "api_base_url": "https://openrouter.ai/api/v1/chat/completions",
76
- "api_key": "sk-xxx",
77
- "models": [
78
- "google/gemini-2.5-pro-preview",
79
- "anthropic/claude-sonnet-4",
80
- "anthropic/claude-3.5-sonnet",
81
- "anthropic/claude-3.7-sonnet:thinking"
82
- ],
83
- "transformer": {
84
- "use": ["openrouter"]
85
- }
86
- },
87
- {
88
- "name": "deepseek",
89
- "api_base_url": "https://api.deepseek.com/chat/completions",
90
- "api_key": "sk-xxx",
91
- "models": ["deepseek-chat", "deepseek-reasoner"],
92
- "transformer": {
93
- "use": ["deepseek"],
94
- "deepseek-chat": {
95
- "use": ["tooluse"]
96
- }
97
- }
98
- },
99
- {
100
- "name": "ollama",
101
- "api_base_url": "http://localhost:11434/v1/chat/completions",
102
- "api_key": "ollama",
103
- "models": ["qwen2.5-coder:latest"]
104
- },
105
- {
106
- "name": "gemini",
107
- "api_base_url": "https://generativelanguage.googleapis.com/v1beta/models/",
108
- "api_key": "sk-xxx",
109
- "models": ["gemini-2.5-flash", "gemini-2.5-pro"],
110
- "transformer": {
111
- "use": ["gemini"]
112
- }
113
- },
114
- {
115
- "name": "volcengine",
116
- "api_base_url": "https://ark.cn-beijing.volces.com/api/v3/chat/completions",
117
- "api_key": "sk-xxx",
118
- "models": ["deepseek-v3-250324", "deepseek-r1-250528"],
119
- "transformer": {
120
- "use": ["deepseek"]
121
- }
122
- },
123
- {
124
- "name": "modelscope",
125
- "api_base_url": "https://api-inference.modelscope.cn/v1/chat/completions",
126
- "api_key": "",
127
- "models": ["Qwen/Qwen3-Coder-480B-A35B-Instruct", "Qwen/Qwen3-235B-A22B-Thinking-2507"],
128
- "transformer": {
129
- "use": [
130
- [
131
- "maxtoken",
132
- {
133
- "max_tokens": 65536
134
- }
135
- ],
136
- "enhancetool"
137
- ],
138
- "Qwen/Qwen3-235B-A22B-Thinking-2507": {
139
- "use": ["reasoning"]
140
- }
141
- }
142
- },
143
- {
144
- "name": "dashscope",
145
- "api_base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions",
146
- "api_key": "",
147
- "models": ["qwen3-coder-plus"],
148
- "transformer": {
149
- "use": [
150
- [
151
- "maxtoken",
152
- {
153
- "max_tokens": 65536
154
- }
155
- ],
156
- "enhancetool"
157
- ]
158
- }
159
- },
160
- {
161
- "name": "aihubmix",
162
- "api_base_url": "https://aihubmix.com/v1/chat/completions",
163
- "api_key": "sk-",
164
- "models": [
165
- "Z/glm-4.5",
166
- "claude-opus-4-20250514",
167
- "gemini-2.5-pro"
168
- ]
169
- }
170
- ],
171
- "Router": {
172
- "default": "deepseek,deepseek-chat",
173
- "background": "ollama,qwen2.5-coder:latest",
174
- "think": "deepseek,deepseek-reasoner",
175
- "longContext": "openrouter,google/gemini-2.5-pro-preview",
176
- "longContextThreshold": 60000,
177
- "webSearch": "gemini,gemini-2.5-flash"
178
- }
179
- }
180
- ```
181
-
182
-
183
- ### 3. 使用 Router 运行 Claude Code
184
-
185
- 使用 router 启动 Claude Code:
186
-
187
- ```shell
188
- ccr code
189
- ```
190
-
191
- > **注意**: 修改配置文件后,需要重启服务使配置生效:
192
- > ```shell
193
- > ccr restart
194
- > ```
195
-
196
- ### 4. UI 模式
197
-
198
- 为了获得更直观的体验,您可以使用 UI 模式来管理您的配置:
199
-
200
- ```shell
201
- ccr ui
202
- ```
203
-
204
- 这将打开一个基于 Web 的界面,您可以在其中轻松查看和编辑您的 `config.json` 文件。
205
-
206
- ![UI](/blog/images/ui.png)
207
-
208
- ### 5. Activate 命令(环境变量设置)
209
-
210
- `activate` 命令允许您在 shell 中全局设置环境变量,使您能够直接使用 `claude` 命令或将 Claude Code Router 与使用 Agent SDK 构建的应用程序集成。
211
-
212
- 要激活环境变量,请运行:
213
-
214
- ```shell
215
- eval "$(ccr activate)"
216
- ```
217
-
218
- 此命令会以 shell 友好的格式输出必要的环境变量,这些变量将在当前的 shell 会话中设置。激活后,您可以:
219
-
220
- - **直接使用 `claude` 命令**:无需使用 `ccr code` 即可运行 `claude` 命令。`claude` 命令将自动通过 Claude Code Router 路由请求。
221
- - **与 Agent SDK 应用程序集成**:使用 Anthropic Agent SDK 构建的应用程序将自动使用配置的路由器和模型。
222
-
223
- `activate` 命令设置以下环境变量:
224
-
225
- - `ANTHROPIC_AUTH_TOKEN`: 来自配置的 API 密钥
226
- - `ANTHROPIC_BASE_URL`: 本地路由器端点(默认:`http://127.0.0.1:3456`)
227
- - `NO_PROXY`: 设置为 `127.0.0.1` 以防止代理干扰
228
- - `DISABLE_TELEMETRY`: 禁用遥测
229
- - `DISABLE_COST_WARNINGS`: 禁用成本警告
230
- - `API_TIMEOUT_MS`: 来自配置的 API 超时时间
231
-
232
- > **注意**:在使用激活的环境变量之前,请确保 Claude Code Router 服务正在运行(`ccr start`)。环境变量仅在当前 shell 会话中有效。要使其持久化,您可以将 `eval "$(ccr activate)"` 添加到您的 shell 配置文件(例如 `~/.zshrc` 或 `~/.bashrc`)中。
233
-
234
- #### Providers
235
-
236
- `Providers` 数组是您定义要使用的不同模型提供商的地方。每个提供商对象都需要:
237
-
238
- - `name`: 提供商的唯一名称。
239
- - `api_base_url`: 聊天补全的完整 API 端点。
240
- - `api_key`: 您提供商的 API 密钥。
241
- - `models`: 此提供商可用的模型名称列表。
242
- - `transformer` (可选): 指定用于处理请求和响应的转换器。
243
-
244
- #### Transformers
245
-
246
- Transformers 允许您修改请求和响应负载,以确保与不同提供商 API 的兼容性。
247
-
248
- - **全局 Transformer**: 将转换器应用于提供商的所有模型。在此示例中,`openrouter` 转换器将应用于 `openrouter` 提供商下的所有模型。
249
- ```json
250
- {
251
- "name": "openrouter",
252
- "api_base_url": "https://openrouter.ai/api/v1/chat/completions",
253
- "api_key": "sk-xxx",
254
- "models": [
255
- "google/gemini-2.5-pro-preview",
256
- "anthropic/claude-sonnet-4",
257
- "anthropic/claude-3.5-sonnet"
258
- ],
259
- "transformer": { "use": ["openrouter"] }
260
- }
261
- ```
262
- - **特定于模型的 Transformer**: 将转换器应用于特定模型。在此示例中,`deepseek` 转换器应用于所有模型,而额外的 `tooluse` 转换器仅应用于 `deepseek-chat` 模型。
263
- ```json
264
- {
265
- "name": "deepseek",
266
- "api_base_url": "https://api.deepseek.com/chat/completions",
267
- "api_key": "sk-xxx",
268
- "models": ["deepseek-chat", "deepseek-reasoner"],
269
- "transformer": {
270
- "use": ["deepseek"],
271
- "deepseek-chat": { "use": ["tooluse"] }
272
- }
273
- }
274
- ```
275
-
276
- - **向 Transformer 传递选项**: 某些转换器(如 `maxtoken`)接受选项。要传递选项,请使用嵌套数组,其中第一个元素是转换器名称,第二个元素是选项对象。
277
- ```json
278
- {
279
- "name": "siliconflow",
280
- "api_base_url": "https://api.siliconflow.cn/v1/chat/completions",
281
- "api_key": "sk-xxx",
282
- "models": ["moonshotai/Kimi-K2-Instruct"],
283
- "transformer": {
284
- "use": [
285
- [
286
- "maxtoken",
287
- {
288
- "max_tokens": 16384
289
- }
290
- ]
291
- ]
292
- }
293
- }
294
- ```
295
-
296
- **可用的内置 Transformer:**
297
-
298
- - `Anthropic`: 如果你只使用这一个转换器,则会直接透传请求和响应(你可以用它来接入其他支持Anthropic端点的服务商)。
299
- - `deepseek`: 适配 DeepSeek API 的请求/响应。
300
- - `gemini`: 适配 Gemini API 的请求/响应。
301
- - `openrouter`: 适配 OpenRouter API 的请求/响应。它还可以接受一个 `provider` 路由参数,以指定 OpenRouter 应使用哪些底层提供商。有关更多详细信息,请参阅 [OpenRouter 文档](https://openrouter.ai/docs/features/provider-routing)。请参阅下面的示例:
302
- ```json
303
- "transformer": {
304
- "use": ["openrouter"],
305
- "moonshotai/kimi-k2": {
306
- "use": [
307
- [
308
- "openrouter",
309
- {
310
- "provider": {
311
- "only": ["moonshotai/fp8"]
312
- }
313
- }
314
- ]
315
- ]
316
- }
317
- }
318
- ```
319
- - `groq`: 适配 groq API 的请求/响应
320
- - `maxtoken`: 设置特定的 `max_tokens` 值。
321
- - `tooluse`: 优化某些模型的工具使用(通过`tool_choice`参数)。
322
- - `gemini-cli` (实验性): 通过 Gemini CLI [gemini-cli.js](https://gist.github.com/musistudio/1c13a65f35916a7ab690649d3df8d1cd) 对 Gemini 的非官方支持。
323
- - `reasoning`: 用于处理 `reasoning_content` 字段。
324
- - `sampling`: 用于处理采样信息字段,如 `temperature`、`top_p`、`top_k` 和 `repetition_penalty`。
325
- - `enhancetool`: 对 LLM 返回的工具调用参数增加一层容错处理(这会导致不再流式返回工具调用信息)。
326
- - `cleancache`: 清除请求中的 `cache_control` 字段。
327
- - `vertex-gemini`: 处理使用 vertex 鉴权的 gemini api。
328
- - `qwen-cli` (实验性): 通过 Qwen CLI [qwen-cli.js](https://gist.github.com/musistudio/f5a67841ced39912fd99e42200d5ca8b) 对 qwen3-coder-plus 的非官方支持。
329
- - `rovo-cli` (experimental): 通过 Atlassian Rovo Dev CLI [rovo-cli.js](https://gist.github.com/SaseQ/c2a20a38b11276537ec5332d1f7a5e53) 对 GPT-5 的非官方支持。
330
-
331
- **自定义 Transformer:**
332
-
333
- 您还可以创建自己的转换器,并通过 `config.json` 中的 `transformers` 字段加载它们。
334
-
335
- ```json
336
- {
337
- "transformers": [
338
- {
339
- "path": "/User/xxx/.claude-code-router/plugins/gemini-cli.js",
340
- "options": {
341
- "project": "xxx"
342
- }
343
- }
344
- ]
345
- }
346
- ```
347
-
348
- #### Router
349
-
350
- `Router` 对象定义了在不同场景下使用哪个模型:
351
-
352
- - `default`: 用于常规任务的默认模型。
353
- - `background`: 用于后台任务的模型。这可以是一个较小的本地模型以节省成本。
354
- - `think`: 用于推理密集型任务(如计划模式)的模型。
355
- - `longContext`: 用于处理长上下文(例如,> 60K 令牌)的模型。
356
- - `longContextThreshold` (可选): 触发长上下文模型的令牌数阈值。如果未指定,默认为 60000。
357
- - `webSearch`: 用于处理网络搜索任务,需要模型本身支持。如果使用`openrouter`需要在模型后面加上`:online`后缀。
358
- - `image`(测试版): 用于处理图片类任务(采用CCR内置的agent支持),如果该模型不支持工具调用,需要将`config.forceUseImageAgent`属性设置为`true`。
359
-
360
- 您还可以使用 `/model` 命令在 Claude Code 中动态切换模型:
361
- `/model provider_name,model_name`
362
- 示例: `/model openrouter,anthropic/claude-3.5-sonnet`
363
-
364
- #### 自定义路由器
365
-
366
- 对于更高级的路由逻辑,您可以在 `config.json` 中通过 `CUSTOM_ROUTER_PATH` 字段指定一个自定义路由器脚本。这允许您实现超出默认场景的复杂路由规则。
367
-
368
- 在您的 `config.json` 中配置:
369
-
370
- ```json
371
- {
372
- "CUSTOM_ROUTER_PATH": "/User/xxx/.claude-code-router/custom-router.js"
373
- }
374
- ```
375
-
376
- 自定义路由器文件必须是一个导出 `async` 函数的 JavaScript 模块。该函数接收请求对象和配置对象作为参数,并应返回提供商和模型名称的字符串(例如 `"provider_name,model_name"`),如果返回 `null` 则回退到默认路由。
377
-
378
- 这是一个基于 `custom-router.example.js` 的 `custom-router.js` 示例:
379
-
380
- ```javascript
381
- // /User/xxx/.claude-code-router/custom-router.js
382
-
383
- /**
384
- * 一个自定义路由函数,用于根据请求确定使用哪个模型。
385
- *
386
- * @param {object} req - 来自 Claude Code 的请求对象,包含请求体。
387
- * @param {object} config - 应用程序的配置对象。
388
- * @returns {Promise<string|null>} - 一个解析为 "provider,model_name" 字符串的 Promise,如果返回 null,则使用默认路由。
389
- */
390
- module.exports = async function router(req, config) {
391
- const userMessage = req.body.messages.find(m => m.role === 'user')?.content;
392
-
393
- if (userMessage && userMessage.includes('解释这段代码')) {
394
- // 为代码解释任务使用更强大的模型
395
- return 'openrouter,anthropic/claude-3.5-sonnet';
396
- }
397
-
398
- // 回退到默认的路由配置
399
- return null;
400
- };
401
- ```
402
-
403
- ##### 子代理路由
404
-
405
- 对于子代理内的路由,您必须在子代理提示词的**开头**包含 `<CCR-SUBAGENT-MODEL>provider,model</CCR-SUBAGENT-MODEL>` 来指定特定的提供商和模型。这样可以将特定的子代理任务定向到指定的模型。
406
-
407
- **示例:**
408
-
409
- ```
410
- <CCR-SUBAGENT-MODEL>openrouter,anthropic/claude-3.5-sonnet</CCR-SUBAGENT-MODEL>
411
- 请帮我分析这段代码是否存在潜在的优化空间...
412
- ```
413
-
414
- ## Status Line (Beta)
415
- 为了在运行时更好的查看claude-code-router的状态,claude-code-router在v1.0.40内置了一个statusline工具,你可以在UI中启用它,
416
- ![statusline-config.png](/blog/images/statusline-config.png)
417
-
418
- 效果如下:
419
- ![statusline](/blog/images/statusline.png)
420
-
421
- ## 🤖 GitHub Actions
422
-
423
- 将 Claude Code Router 集成到您的 CI/CD 管道中。在设置 [Claude Code Actions](https://docs.anthropic.com/en/docs/claude-code/github-actions) 后,修改您的 `.github/workflows/claude.yaml` 以使用路由器:
424
-
425
- ```yaml
426
- name: Claude Code
427
-
428
- on:
429
- issue_comment:
430
- types: [created]
431
- # ... other triggers
432
-
433
- jobs:
434
- claude:
435
- if: |
436
- (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
437
- # ... other conditions
438
- runs-on: ubuntu-latest
439
- permissions:
440
- contents: read
441
- pull-requests: read
442
- issues: read
443
- id-token: write
444
- steps:
445
- - name: Checkout repository
446
- uses: actions/checkout@v4
447
- with:
448
- fetch-depth: 1
449
-
450
- - name: Prepare Environment
451
- run: |
452
- curl -fsSL https://bun.sh/install | bash
453
- mkdir -p $HOME/.claude-code-router
454
- cat << 'EOF' > $HOME/.claude-code-router/config.json
455
- {
456
- "log": true,
457
- "NON_INTERACTIVE_MODE": true,
458
- "OPENAI_API_KEY": "${{ secrets.OPENAI_API_KEY }}",
459
- "OPENAI_BASE_URL": "https://api.deepseek.com",
460
- "OPENAI_MODEL": "deepseek-chat"
461
- }
462
- EOF
463
- shell: bash
464
-
465
- - name: Start Claude Code Router
466
- run: |
467
- nohup ~/.bun/bin/bunx @musistudio/claude-code-router@1.0.8 start &
468
- shell: bash
469
-
470
- - name: Run Claude Code
471
- id: claude
472
- uses: anthropics/claude-code-action@beta
473
- env:
474
- ANTHROPIC_BASE_URL: http://localhost:3456
475
- with:
476
- anthropic_api_key: "any-string-is-ok"
477
- ```
478
-
479
- 这种设置可以实现有趣的自动化,例如在非高峰时段运行任务以降低 API 成本。
480
-
481
- ## 📝 深入阅读
482
-
483
- - [项目动机和工作原理](blog/zh/项目初衷及原理.md)
484
- - [也许我们可以用路由器做更多事情](blog/zh/或许我们能在Router中做更多事情.md)
485
-
486
- ## ❤️ 支持与赞助
487
-
488
- 如果您觉得这个项目有帮助,请考虑赞助它的开发。非常感谢您的支持!
489
-
490
- [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/F1F31GN2GM)
491
-
492
- [Paypal](https://paypal.me/musistudio1999)
1
+ <h1 align="center">Claude Code Router Desktop</h1>
2
+
3
+ <p align="center">
4
+ <a href="README.md"><img alt="English README" src="https://img.shields.io/badge/%F0%9F%87%AC%F0%9F%87%A7-English-000aff?style=flat" /></a>
5
+ <a href="https://discord.gg/rdftVMaUcS"><img alt="Discord" src="https://img.shields.io/badge/Discord-%235865F2.svg?&logo=discord&logoColor=white" /></a>
6
+ <a href="https://x.com/musistudio2026"><img alt="X" src="https://img.shields.io/badge/X-@musistudio2026-000000?logo=x&logoColor=white" /></a>
7
+ <a href="https://github.com/musistudio/claude-code-router/blob/main/LICENSE"><img alt="License" src="https://img.shields.io/github/license/musistudio/claude-code-router" /></a>
8
+ <a href="https://ccrdesk.top/"><img alt="文档" src="https://img.shields.io/badge/%E6%96%87%E6%A1%A3-ccrdesk.top-0ea5e9?style=flat" /></a>
9
+ </p>
10
+
11
+ <p align="center">
12
+ <img src="blog/images/claude-code-router.png" width="720" alt="Claude Code Router Desktop 项目截图" />
13
+ </p>
14
+
15
+ Claude Code Router Desktop 是一个本地网关和桌面控制台,用来把 Claude Code、Codex、ZCode 以及兼容客户端的 Agent 请求路由到你真正想使用的模型服务。
16
+
17
+ ## 为什么使用 CCR
18
+
19
+ - 用一个本地入口连接多个 Agent 工具,不需要在每个客户端里重复配置 Provider。
20
+ - 在不改变工作流的情况下混用不同 Provider。CCR 支持 OpenAI 兼容 API、Anthropic Messages、Gemini Generate Content、OpenRouter、DeepSeek、SiliconFlow、Moonshot、Kimi Code、Mistral、Z.AI、百炼以及自定义 Provider。
21
+ - 通过 fallback 路由、API Key 轮换、用量统计和请求日志来控制成本和可靠性。
22
+
23
+ ## 功能和特性
24
+
25
+ - **概览仪表盘**:查看系统状态、用量组件、账号余额、模型分布和分享卡片。
26
+ - **Provider 管理**:添加预设或自定义端点,探测协议支持,检测模型连通性,管理凭据,并在可用时查看账号余额。
27
+ - **路由规则**:配置条件路由、模型前缀规则、失败降级和请求改写。
28
+ - **Agent配置**:为 Claude Code、Codex 和 ZCode 配置启动入口、模型、作用范围和多开 App 配置。
29
+ - **网关兼容层**:通过本地 CCR 模型网关转换支持的客户端请求。
30
+ - **代理模式**:通过本地代理捕获支持的 API 流量,可选系统代理和网络捕获。
31
+ - **Fusion 组合模型**:把基础模型与视觉、联网搜索或 MCP 工具组合成新的可选模型。
32
+
33
+ ## 文档
34
+
35
+ 完整文档见 [ccrdesk.top](https://ccrdesk.top/)。
36
+
37
+ ## 下载和安装
38
+
39
+ 1. 打开 [GitHub Releases 页面](https://github.com/musistudio/claude-code-router/releases)。
40
+ 2. 按系统下载对应安装包:
41
+ - macOS Apple 芯片:`Claude-Code-Router_<version>-mac-Apple-Silicon-arm64.dmg` 或 `.zip`
42
+ - macOS Intel 芯片:`Claude-Code-Router_<version>-mac-Intel-x64.dmg` 或 `.zip`
43
+ - Windows:`Claude Code Router_<version>.exe`
44
+ - Linux:`Claude Code Router_<version>.AppImage`
45
+ 3. 安装并启动 **Claude Code Router**。
46
+ 4. 首次启动后,CCR 会创建本地配置数据库:
47
+ - macOS/Linux:`~/.claude-code-router/config.sqlite`
48
+ - Windows:`%APPDATA%\Claude Code Router\config.sqlite`
49
+
50
+ CCR 的运行配置存储在 SQLite 中。旧版 `config.json` 只会在没有 SQLite 配置时作为迁移来源读取一次。
51
+
52
+ **服务** 页面启动后,CCR 默认监听 `http://localhost:8080`。**服务** 页面负责配置网关 `Host`、`Port`、代理模式、系统代理、网络捕获和 CA 证书状态。
53
+
54
+ ## 快速开始
55
+
56
+ CCR 可以完全通过桌面 UI 完成配置。首次使用建议按下面顺序操作。
57
+
58
+ ### 1. 添加 Provider
59
+
60
+ 打开 **供应商**,点击 **添加供应商**,选择内置预设或 **其他 / 自定义 API 端点**。按表单填写 Provider 名称、基础 URL、协议、API Key 和模型列表。可用时先运行协议探测和模型连通性检查,然后保存 Provider。
61
+
62
+ ### 2. 设置路由
63
+
64
+ 打开 **路由**,添加条件规则,配置请求改写和失败降级。
65
+
66
+ 如果需要更细粒度控制,使用 **添加路由规则** 添加模型前缀、请求条件或规则级失败降级目标。
67
+
68
+ ### 3. 启动网关
69
+
70
+ 打开 **服务**,点击 **启动**。页面显示运行中后,CCR 会在本机监听 `http://localhost:8080`。如果希望每次打开桌面应用时自动启动网关,可以启用自动启动。
71
+
72
+ ### 4. 连接 Agent 工具
73
+
74
+ 打开 **Agent配置**,选择要使用的客户端。配置 Claude Code、Codex 或 ZCode,选择目标模型和作用范围,然后应用配置。对于 App 入口,可以使用 **打开 Agent** 操作通过 CCR 打开目标应用。
75
+
76
+ ### 5. 日常查看和调整
77
+
78
+ 到 **设置 → 日志与观测** 打开请求日志和 Agent 观测。使用 **日志** 确认 `request model`、`resolved provider`、`resolved model`、状态码、tokens、耗时和错误;使用托盘窗口快速查看 Token 和账号状态。
79
+
80
+ ## 致谢
81
+
82
+ 对 Codex 的支持来自于 [musistudio/codexl](https://github.com/musistudio/codexl) 这个项目。
83
+
84
+ ## 支持与赞助
85
+
86
+ <div align="center">
87
+
88
+ <p>如果你觉得这个项目有帮助,欢迎赞助项目开发。非常感谢你的支持。</p>
493
89
 
494
90
  <table>
495
91
  <tr>
496
- <td><img src="/blog/images/alipay.jpg" width="200" alt="Alipay" /></td>
497
- <td><img src="/blog/images/wechat.jpg" width="200" alt="WeChat Pay" /></td>
92
+ <td align="center" width="220">
93
+ <a href="https://ko-fi.com/F1F31GN2GM">
94
+ <img src="https://ko-fi.com/img/githubbutton_sm.svg" alt="通过 Ko-fi 赞助" />
95
+ </a>
96
+ <br />
97
+ <sub>通过 Ko-fi 单次赞助</sub>
98
+ </td>
99
+ <td align="center" width="220">
100
+ <a href="https://paypal.me/musistudio1999">
101
+ <img src="https://img.shields.io/badge/PayPal-Sponsor-003087?logo=paypal&logoColor=white" alt="通过 PayPal 赞助" />
102
+ </a>
103
+ <br />
104
+ <sub>国际赞助通道</sub>
105
+ </td>
498
106
  </tr>
499
107
  </table>
500
108
 
109
+ <table>
110
+ <tr>
111
+ <td align="center" width="220">
112
+ <strong>支付宝</strong>
113
+ <br />
114
+ <img src="/blog/images/alipay.jpg" width="160" alt="支付宝收款码" />
115
+ </td>
116
+ <td align="center" width="220">
117
+ <strong>微信支付</strong>
118
+ <br />
119
+ <img src="/blog/images/wechat.jpg" width="160" alt="微信支付收款码" />
120
+ </td>
121
+ </tr>
122
+ </table>
123
+
124
+ </div>
125
+
501
126
  ### 我们的赞助商
502
127
 
503
- 非常感谢所有赞助商的慷慨支持!
504
-
505
- - [AIHubmix](https://aihubmix.com/)
506
- - [BurnCloud](https://ai.burncloud.com)
507
- - [302.AI](https://share.302.ai/ZGVF9w)
508
- - [Z智谱](https://www.bigmodel.cn/claude-code?ic=FPF9IVAGFJ)
509
- - @Simon Leischnig
510
- - [@duanshuaimin](https://github.com/duanshuaimin)
511
- - [@vrgitadmin](https://github.com/vrgitadmin)
512
- - @*o
513
- - [@ceilwoo](https://github.com/ceilwoo)
514
- - @*说
515
- - @*更
516
- - @K*g
517
- - @R*R
518
- - [@bobleer](https://github.com/bobleer)
519
- - @*苗
520
- - @*划
521
- - [@Clarence-pan](https://github.com/Clarence-pan)
522
- - [@carter003](https://github.com/carter003)
523
- - @S*r
524
- - @*晖
525
- - @*敏
526
- - @Z*z
527
- - @*然
528
- - [@cluic](https://github.com/cluic)
529
- - @*苗
530
- - [@PromptExpert](https://github.com/PromptExpert)
531
- - @*应
532
- - [@yusnake](https://github.com/yusnake)
533
- - @*飞
534
- - @董*
535
- - @*汀
536
- - @*涯
537
- - @*:-)
538
- - @**磊
539
- - @*琢
540
- - @*成
541
- - @Z*o
542
- - @\*琨
543
- - [@congzhangzh](https://github.com/congzhangzh)
544
- - @*_
545
- - @Z\*m
546
- - @*鑫
547
- - @c\*y
548
- - @\*昕
549
- - [@witsice](https://github.com/witsice)
550
- - @b\*g
551
- - @\*亿
552
- - @\*辉
553
- - @JACK
554
- - @\*光
555
- - @W\*l
556
- - [@kesku](https://github.com/kesku)
557
- - [@biguncle](https://github.com/biguncle)
558
- - @二吉吉
559
- - @a\*g
560
- - @\*林
561
- - @\*咸
562
- - @\*明
563
- - @S\*y
564
- - @f\*o
565
- - @\*智
566
- - @F\*t
567
- - @r\*c
568
- - [@qierkang](http://github.com/qierkang)
569
- - @\*军
570
- - [@snrise-z](http://github.com/snrise-z)
571
- - @\*王
572
- - [@greatheart1000](http://github.com/greatheart1000)
573
- - @\*王
574
- - @zcutlip
575
- - [@Peng-YM](http://github.com/Peng-YM)
576
- - @\*更
577
- - @\*.
578
- - @F\*t
579
- - @\*政
580
- - @\*铭
581
- - @\*叶
582
- - @七\*o
583
- - @\*青
584
- - @\*\*晨
585
- - @\*远
586
- - @\*霄
587
- - @\*\*吉
588
- - @\*\*飞
589
- - @\*\*驰
590
- - @x\*g
591
- - @\*\*东
592
- - @\*落
593
- - @哆\*k
594
- - @\*涛
595
- - [@苗大](https://github.com/WitMiao)
596
- - @\*呢
597
- - @\d*u
598
- - @crizcraig
599
- - s\*s
600
- - \*火
601
- - \*勤
602
- - \*\*锟
603
- - \*涛
604
-
605
- (如果您的名字被屏蔽,请通过我的主页电子邮件与我联系,以便使用您的 GitHub 用户名进行更新。)
606
-
607
-
608
- ## 交流群
609
- <img src="/blog/images/wechat_group.jpg" width="200" alt="wechat_group" />
128
+ <div align="center">
129
+
130
+ <p>非常感谢所有赞助商的慷慨支持。</p>
131
+
132
+ <table width="100%">
133
+ <tr>
134
+ <td align="center" width="330">
135
+ <a href="https://www.bigmodel.cn/claude-code?ic=FPF9IVAGFJ">
136
+ <img src="/docs/public/provider-icons/zhipu-cn-general.png" width="42" height="42" alt="智谱图标" />
137
+ <br />
138
+ <strong>Z智谱</strong>
139
+ </a>
140
+ </td>
141
+ <td align="center" width="330">
142
+ <a href="https://aihubmix.com/">
143
+ <img src="https://www.google.com/s2/favicons?domain=aihubmix.com&amp;sz=128" width="42" height="42" alt="AIHubmix 图标" />
144
+ <br />
145
+ <strong>AIHubmix</strong>
146
+ </a>
147
+ </td>
148
+ <td align="center" width="330">
149
+ <a href="https://ai.burncloud.com">
150
+ <img src="https://www.burncloud.com/favicon.png" width="42" height="42" alt="BurnCloud 图标" />
151
+ <br />
152
+ <strong>BurnCloud</strong>
153
+ </a>
154
+ </td>
155
+ <td align="center" width="330">
156
+ <a href="https://share.302.ai/ZGVF9w">
157
+ <img src="https://www.google.com/s2/favicons?domain=302.ai&amp;sz=128" width="42" height="42" alt="302.AI 图标" />
158
+ <br />
159
+ <strong>302.AI</strong>
160
+ </a>
161
+ </td>
162
+ </tr>
163
+ <tr>
164
+ <td align="center" width="330">
165
+ <a href="https://runapi.co/register?aff=IX1t">
166
+ <img src="/docs/public/provider-icons/runapi.jpg" width="42" height="42" alt="RunAPI 图标" />
167
+ <br />
168
+ <strong>RunAPI</strong>
169
+ </a>
170
+ </td>
171
+ <td align="center" width="330">
172
+ <a href="https://teamorouter.com/">
173
+ <img src="/docs/public/provider-icons/teamorouter.png" width="42" height="42" alt="TeamoRouter 图标" />
174
+ <br />
175
+ <strong>TeamoRouter</strong>
176
+ </a>
177
+ </td>
178
+ </tr>
179
+ </table>
180
+
181
+ <h4>社区赞助者</h4>
182
+
183
+ <table width="100%">
184
+ <tr>
185
+ <td align="center" width="220">@Simon Leischnig</td>
186
+ <td align="center" width="220"><a href="https://github.com/duanshuaimin">@duanshuaimin</a></td>
187
+ <td align="center" width="220"><a href="https://github.com/vrgitadmin">@vrgitadmin</a></td>
188
+ <td align="center" width="220">@*o</td>
189
+ <td align="center" width="220"><a href="https://github.com/ceilwoo">@ceilwoo</a></td>
190
+ <td align="center" width="220">@*说</td>
191
+ </tr>
192
+ <tr>
193
+ <td align="center" width="220">@*更</td>
194
+ <td align="center" width="220">@K*g</td>
195
+ <td align="center" width="220">@R*R</td>
196
+ <td align="center" width="220"><a href="https://github.com/bobleer">@bobleer</a></td>
197
+ <td align="center" width="220">@*苗</td>
198
+ <td align="center" width="220">@*划</td>
199
+ </tr>
200
+ <tr>
201
+ <td align="center" width="220"><a href="https://github.com/Clarence-pan">@Clarence-pan</a></td>
202
+ <td align="center" width="220"><a href="https://github.com/carter003">@carter003</a></td>
203
+ <td align="center" width="220">@S*r</td>
204
+ <td align="center" width="220">@*晖</td>
205
+ <td align="center" width="220">@*敏</td>
206
+ <td align="center" width="220">@Z*z</td>
207
+ </tr>
208
+ <tr>
209
+ <td align="center" width="220">@*然</td>
210
+ <td align="center" width="220"><a href="https://github.com/cluic">@cluic</a></td>
211
+ <td align="center" width="220">@*苗</td>
212
+ <td align="center" width="220"><a href="https://github.com/PromptExpert">@PromptExpert</a></td>
213
+ <td align="center" width="220">@*应</td>
214
+ <td align="center" width="220"><a href="https://github.com/yusnake">@yusnake</a></td>
215
+ </tr>
216
+ <tr>
217
+ <td align="center" width="220">@*飞</td>
218
+ <td align="center" width="220">@董*</td>
219
+ <td align="center" width="220">@*汀</td>
220
+ <td align="center" width="220">@*涯</td>
221
+ <td align="center" width="220">@*:-)</td>
222
+ <td align="center" width="220">@**磊</td>
223
+ </tr>
224
+ <tr>
225
+ <td align="center" width="220">@*琢</td>
226
+ <td align="center" width="220">@*成</td>
227
+ <td align="center" width="220">@Z*o</td>
228
+ <td align="center" width="220">@*琨</td>
229
+ <td align="center" width="220"><a href="https://github.com/congzhangzh">@congzhangzh</a></td>
230
+ <td align="center" width="220">@*_</td>
231
+ </tr>
232
+ <tr>
233
+ <td align="center" width="220">@Z*m</td>
234
+ <td align="center" width="220">@*鑫</td>
235
+ <td align="center" width="220">@c*y</td>
236
+ <td align="center" width="220">@*昕</td>
237
+ <td align="center" width="220"><a href="https://github.com/witsice">@witsice</a></td>
238
+ <td align="center" width="220">@b*g</td>
239
+ </tr>
240
+ <tr>
241
+ <td align="center" width="220">@*亿</td>
242
+ <td align="center" width="220">@*辉</td>
243
+ <td align="center" width="220">@JACK</td>
244
+ <td align="center" width="220">@*光</td>
245
+ <td align="center" width="220">@W*l</td>
246
+ <td align="center" width="220"><a href="https://github.com/kesku">@kesku</a></td>
247
+ </tr>
248
+ <tr>
249
+ <td align="center" width="220"><a href="https://github.com/biguncle">@biguncle</a></td>
250
+ <td align="center" width="220">@二吉吉</td>
251
+ <td align="center" width="220">@a*g</td>
252
+ <td align="center" width="220">@*林</td>
253
+ <td align="center" width="220">@*咸</td>
254
+ <td align="center" width="220">@*明</td>
255
+ </tr>
256
+ <tr>
257
+ <td align="center" width="220">@S*y</td>
258
+ <td align="center" width="220">@f*o</td>
259
+ <td align="center" width="220">@*智</td>
260
+ <td align="center" width="220">@F*t</td>
261
+ <td align="center" width="220">@r*c</td>
262
+ <td align="center" width="220"><a href="https://github.com/qierkang">@qierkang</a></td>
263
+ </tr>
264
+ <tr>
265
+ <td align="center" width="220">@*军</td>
266
+ <td align="center" width="220"><a href="https://github.com/snrise-z">@snrise-z</a></td>
267
+ <td align="center" width="220">@*王</td>
268
+ <td align="center" width="220"><a href="https://github.com/greatheart1000">@greatheart1000</a></td>
269
+ <td align="center" width="220">@*王</td>
270
+ <td align="center" width="220">@zcutlip</td>
271
+ </tr>
272
+ <tr>
273
+ <td align="center" width="220"><a href="https://github.com/Peng-YM">@Peng-YM</a></td>
274
+ <td align="center" width="220">@*更</td>
275
+ <td align="center" width="220">@*.</td>
276
+ <td align="center" width="220">@F*t</td>
277
+ <td align="center" width="220">@*政</td>
278
+ <td align="center" width="220">@*铭</td>
279
+ </tr>
280
+ <tr>
281
+ <td align="center" width="220">@*叶</td>
282
+ <td align="center" width="220">@七*o</td>
283
+ <td align="center" width="220">@*青</td>
284
+ <td align="center" width="220">@**晨</td>
285
+ <td align="center" width="220">@*远</td>
286
+ <td align="center" width="220">@*霄</td>
287
+ </tr>
288
+ <tr>
289
+ <td align="center" width="220">@**吉</td>
290
+ <td align="center" width="220">@**飞</td>
291
+ <td align="center" width="220">@**驰</td>
292
+ <td align="center" width="220">@x*g</td>
293
+ <td align="center" width="220">@**东</td>
294
+ <td align="center" width="220">@*落</td>
295
+ </tr>
296
+ <tr>
297
+ <td align="center" width="220">@哆*k</td>
298
+ <td align="center" width="220">@*涛</td>
299
+ <td align="center" width="220"><a href="https://github.com/WitMiao">@苗大</a></td>
300
+ <td align="center" width="220">@*呢</td>
301
+ <td align="center" width="220">@d*u</td>
302
+ <td align="center" width="220">@crizcraig</td>
303
+ </tr>
304
+ <tr>
305
+ <td align="center" width="220">s*s</td>
306
+ <td align="center" width="220">*火</td>
307
+ <td align="center" width="220">*勤</td>
308
+ <td align="center" width="220">**锟</td>
309
+ <td align="center" width="220">*涛</td>
310
+ <td align="center" width="220">**明</td>
311
+ </tr>
312
+ <tr>
313
+ <td align="center" width="220">*知</td>
314
+ <td align="center" width="220">*语</td>
315
+ <td align="center" width="220">*瓜</td>
316
+ <td align="center" width="220"></td>
317
+ <td align="center" width="220"></td>
318
+ <td align="center" width="220"></td>
319
+ </tr>
320
+ </table>
321
+
322
+ <sub>如果你的名字被打码,请通过我的主页邮箱联系我更新为 GitHub 用户名。</sub>
323
+
324
+ </div>
325
+
326
+ ## 许可证
327
+
328
+ 本项目基于 [MIT License](LICENSE) 发布。