{"repo": "carme747lob/yvbcvfy", "files": {"README_zh.md": {"90d15cc810ed0d487451f7470c9d6279d3c96ec9": {"t": 1785674071.3633206, "n": 15215, "h": "abd9ce9d56668777", "c": "![](blog/images/claude-code-router-img.png)\n\n[![](https://img.shields.io/badge/%F0%9F%87%AC%F0%9F%87%A7-English-000aff?style=flat)](README.md)\n[![Discord](https://img.shields.io/badge/Discord-%235865F2.svg?&logo=discord&logoColor=white)](https://discord.gg/rdftVMaUcS)\n[![](https://img.shields.io/github/license/musistudio/claude-code-router)](https://github.com/musistudio/claude-code-router/blob/main/LICENSE)\n\n
\n\n> 我目前正在寻找 **Agent 开发相关的工作机会**,可 base 在 **杭州**,也接受 **远程** 合作。如果你对我的项目感兴趣,或有合适的岗位/合作机会,欢迎联系我! 📧 Email: m@musiiot.top\n\n> 一款强大的工具,可将 Claude Code 请求路由到不同的模型,并自定义任何请求。\n\n> 现在你可以通过[心流平台](https://platform.iflow.cn/docs/api-mode)免费使用`GLM-4.5`、`Kimi-K2`、`Qwen3-Coder-480B-A35B`、`DeepSeek v3.1`等模型。 \n> 你可以使用`ccr ui`命令在UI中直接导入`iflow`模板,值得注意的是心流限制每位用户的并发数为1,意味着你需要将`background`路由到其他模型。 \n> 如果你想获得更好的体验,可以尝试[iFlow CLI](https://cli.iflow.cn)。 \n\n![](blog/images/claude-code.png)\n\n![](blog/images/roadmap.svg)\n\n\n## ✨ 功能\n\n- **模型路由**: 根据您的需求将请求路由到不同的模型(例如,后台任务、思考、长上下文)。\n- **多提供商支持**: 支持 OpenRouter、DeepSeek、Ollama、Gemini、Volcengine 和 SiliconFlow 等各种模型提供商。\n- **请求/响应转换**: 使用转换器为不同的提供商自定义请求和响应。\n- **动态模型切换**: 在 Claude Code 中使用 `/model` 命令动态切换模型。\n- **GitHub Actions 集成**: 在您的 GitHub 工作流程中触发 Claude Code 任务。\n- **插件系统**: 使用自定义转换器扩展功能。\n\n## 🚀 快速入门\n\n### 1. 安装\n\n首先,请确保您已安装 [Claude Code](https://docs.anthropic.com/en/docs/claude-code/quickstart):\n\n```shell\nnpm install -g @anthropic-ai/claude-code\n```\n\n然后,安装 Claude Code Router:\n\n```shell\nnpm install -g @musistudio/claude-code-router\n```\n\n### 2. 配置\n\n创建并配置您的 `~/.claude-code-router/config.json` 文件。有关更多详细信息,您可以参考 `config.example.json`。\n\n`config.json` 文件有几个关键部分:\n- **`PROXY_URL`** (可选): 您可以为 API 请求设置代理,例如:`\"PROXY_URL\": \"http://127.0.0.1:7890\"`。\n- **`LOG`** (可选): 您可以通过将其设置为 `true` 来启用日志记录。当设置为 `false` 时,将不会创建日志文件。默认值为 `true`。\n- **`LOG_LEVEL`** (可选): 设置日志级别。可用选项包括:`\"fatal\"`、`\"error\"`、`\"warn\"`、`\"info\"`、`\"debug\"`、`\"trace\"`。默认值为 `\"debug\"`。\n- **日志系统**: Claude Code Router 使用两个独立的日志系统:\n - **服务器级别日志**: HTTP 请求、API 调用和服务器事件使用 pino 记录在 `~/.claude-code-router/logs/` 目录中,文件名类似于 `ccr-*.log`\n - **应用程序级别日志**: 路由决策和业务逻辑事件记录在 `~/.claude-code-router/claude-code-router.log` 文件中\n- **`APIKEY`** (可选): 您可以设置一个密钥来进行身份验证。设置后,客户端请求必须在 `Authorization` 请求头 (例如, `Bearer your-secret-key`) 或 `x-api-key` 请求头中提供此密钥。例如:`\"APIKEY\": \"your-secret-key\"`。\n- **`HOST`** (可选): 您可以设置服务的主机地址。如果未设置 `APIKEY`,出于安全考虑,主机地址将强制设置为 `127.0.0.1`,以防止未经授权的访问。例如:`\"HOST\": \"0.0.0.0\"`。\n- **`NON_INTERACTIVE_MODE`** (可选): 当设置为 `true` 时,启用与非交互式环境(如 GitHub Actions、Docker 容器或其他 CI/CD 系统)的兼容性。这会设置适当的环境变量(`CI=true`、`FORCE_COLOR=0` 等)并配置 stdin 处理,以防止进程在自动化环境中挂起。例如:`\"NON_INTERACTIVE_MODE\": true`。\n- **`Providers`**: 用于配置不同的模型提供商。\n- **`Router`**: 用于设置路由规则。`default` 指定默认模型,如果未配置其他路由,则该模型将用于所有请求。\n- **`API_TIMEOUT_MS`**: API 请求超时时间,单位为毫秒。\n\n这是一个综合示例:\n\n```json\n{\n \"APIKEY\": \"your-secret-key\",\n \"PROXY_URL\": \"http://127.0.0.1:7890\",\n \"LOG\": true,\n \"API_TIMEOUT_MS\": 600000,\n \"NON_INTERACTIVE_MODE\": false,\n \"Providers\": [\n {\n \"name\": \"openrouter\",\n \"api_base_url\": \"https://openrouter.ai/api/v1/chat/completions\",\n \"api_key\": \"sk-xxx\",\n \"models\": [\n \"google/gemini-2.5-pro-preview\",\n \"anthropic/claude-sonnet-4\",\n \"anthropic/claude-3.5-sonnet\",\n \"anthropic/claude-3.7-sonnet:thinking\"\n ],\n \"transformer\": {\n \"use\": [\"openrouter\"]\n }\n },\n {\n \"name\": \"deepseek\",\n \"api_base_url\": \"https://api.deepseek.com/chat/completions\",\n \"api_key\": \"sk-xxx\",\n \"models\": [\"deepseek-chat\", \"deepseek-reasoner\"],\n \"transformer\": {\n \"use\": [\"deepseek\"],\n \"deepseek-chat\": {\n \"use\": [\"tooluse\"]\n }\n }\n },\n {\n \"name\": \"ollama\",\n \"api_base_url\": \"http://localhost:11434/v1/chat/completions\",\n \"api_key\": \"ollama\",\n \"models\": [\"qwen2.5-coder:latest\"]\n },\n {\n \"name\": \"gemini\",\n \"api_base_url\": \"https://generativelanguage.googleapis.com/v1beta/models/\",\n \"api_key\": \"sk-xxx\",\n \"models\": [\"gemini-2.5-flash\", \"gemini-2.5-pro\"],\n \"transformer\": {\n \"use\": [\"gemini\"]\n }\n },\n {\n \"name\": \"volcengine\",\n \"api_base_url\": \"https://ark.cn-beijing.volces.com/api/v3/chat/completions\",\n \"api_key\": \"sk-xxx\",\n \"models\": [\"deepseek-v3-250324\", \"deepseek-r1-250528\"],\n \"transformer\": {\n \"use\": [\"deepseek\"]\n }\n },\n {\n \"name\": \"modelscope\",\n \"api_base_url\": \"https://api-inference.modelscope.cn/v1/chat/completions\",\n \"api_key\": \"\",\n \"models\": [\"Qwen/Qwen3-Coder-480B-A35B-Instruct\", \"Qwen/Qwen3-235B-A22B-Thinking-2507\"],\n \"transformer\": {\n \"use\": [\n [\n \"maxtoken\",\n {\n \"max_tokens\": 65536\n }\n ],\n \"enhancetool\"\n ],\n \"Qwen/Qwen3-235B-A22B-Thinking-2507\": {\n \"use\": [\"reasoning\"]\n }\n }\n },\n {\n \"name\": \"dashscope\",\n \"api_base_url\": \"https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions\",\n \"api_key\": \"\",\n \"models\": [\"qwen3-coder-plus\"],\n \"transformer\": {\n \"use\": [\n [\n \"maxtoken\",\n {\n \"max_tokens\": 65536\n }\n ],\n \"enhancetool\"\n ]\n }\n },\n {\n \"name\": \"aihubmix\",\n \"api_base_url\": \"https://aihubmix.com/v1/chat/completions\",\n \"api_key\": \"sk-\",\n \"models\": [\n \"Z/glm-4.5\",\n \"claude-opus-4-20250514\",\n \"gemini-2.5-pro\"\n ]\n }\n ],\n \"Router\": {\n \"default\": \"deepseek,deepseek-chat\",\n \"background\": \"ollama,qwen2.5-coder:latest\",\n \"think\": \"deepseek,deepseek-reasoner\",\n \"longContext\": \"openrouter,google/gemini-2.5-pro-preview\",\n \"longContextThreshold\": 60000,\n \"webSearch\": \"gemini,gemini-2.5-flash\"\n }\n}\n```\n\n\n### 3. 使用 Router 运行 Claude Code\n\n使用 router 启动 Claude Code:\n\n```shell\nccr code\n```\n\n> **注意**: 修改配置文件后,需要重启服务使配置生效:\n> ```shell\n> ccr restart\n> ```\n\n### 4. UI 模式\n\n为了获得更直观的体验,您可以使用 UI 模式来管理您的配置:\n\n```shell\nccr ui\n```\n\n这将打开一个基于 Web 的界面,您可以在其中轻松查看和编辑您的 `config.json` 文件。\n\n![UI](/blog/images/ui.png)\n\n#### Providers\n\n`Providers` 数组是您定义要使用的不同模型提供商的地方。每个提供商对象都需要:\n\n- `name`: 提供商的唯一名称。\n- `api_base_url`: 聊天补全的完整 API 端点。\n- `api_key`: 您提供商的 API 密钥。\n- `models`: 此提供商可用的模型名称列表。\n- `transformer` (可选): 指定用于处理请求和响应的转换器。\n\n#### Transformers\n\nTransformers 允许您修改请求和响应负载,以确保与不同提供商 API 的兼容性。\n\n- **全局 Transformer**: 将转换器应用于提供商的所有模型。在此示例中,`openrouter` 转换器将应用于 `openrouter` 提供商下的所有模型。\n ```json\n {\n \"name\": \"openrouter\",\n \"api_base_url\": \"https://openrouter.ai/api/v1/chat/completions\",\n \"api_key\": \"sk-xxx\",\n \"models\": [\n \"google/gemini-2.5-pro-preview\",\n \"anthropic/claude-sonnet-4\",\n \"anthropic/claude-3.5-sonnet\"\n ],\n \"transformer\": { \"use\": [\"openrouter\"] }\n }\n ```\n- **特定于模型的 Transformer**: 将转换器应用于特定模型。在此示例中,`deepseek` 转换器应用于所有模型,而额外的 `tooluse` 转换器仅应用于 `deepseek-chat` 模型。\n ```json\n {\n \"name\": \"deepseek\",\n \"api_base_url\": \"https://api.deepseek.com/chat/completions\",\n \"api_key\": \"sk-xxx\",\n \"models\": [\"deepseek-chat\", \"deepseek-reasoner\"],\n \"transformer\": {\n \"use\": [\"deepseek\"],\n \"deepseek-chat\": { \"use\": [\"tooluse\"] }\n }\n }\n ```\n\n- **向 Transformer 传递选项**: 某些转换器(如 `maxtoken`)接受选项。要传递选项,请使用嵌套数组,其中第一个元素是转换器名称,第二个元素是选项对象。\n ```json\n {\n \"name\": \"siliconflow\",\n \"api_base_url\": \"https://api.siliconflow.cn/v1/chat/completions\",\n \"api_key\": \"sk-xxx\",\n \"models\": [\"moonshotai/Kimi-K2-Instruct\"],\n \"transformer\": {\n \"use\": [\n [\n \"maxtoken\",\n {\n \"max_tokens\": 16384\n }\n ]\n ]\n }\n }\n ```\n\n**可用的内置 Transformer:**\n\n- `Anthropic`: 如果你只使用这一个转换器,则会直接透传请求和响应(你可以用它来接入其他支持Anthropic端点的服务商)。\n- `deepseek`: 适配 DeepSeek API 的请求/响应。\n- `gemini`: 适配 Gemini API 的请求/响应。\n- `openrouter`: 适配 OpenRouter API 的请求/响应。它还可以接受一个 `provider` 路由参数,以指定 OpenRouter 应使用哪些底层提供商。有关更多详细信息,请参阅 [OpenRouter 文档](https://openrouter.ai/docs/features/provider-routing)。请参阅下面的示例:\n ```json\n \"transformer\": {\n \"use\": [\"openrouter\"],\n \"moonshotai/kimi-k2\": {\n \"use\": [\n [\n \"openrouter\",\n {\n \"provider\": {\n \"only\": [\"moonshotai/fp8\"]\n }\n }\n ]\n ]\n }\n }\n ```\n- `groq`: 适配 groq API 的请求/响应\n- `maxtoken`: 设置特定的 `max_tokens` 值。\n- `tooluse`: 优化某些模型的工具使用(通过`tool_choice`参数)。\n- `gemini-cli` (实验性): 通过 Gemini CLI [gemini-cli.js](https://gist.github.com/musistudio/1c13a65f35916a7ab690649d3df8d1cd) 对 Gemini 的非官方支持。\n- `reasoning`: 用于处理 `reasoning_content` 字段。\n- `sampling`: 用于处理采样信息字段,如 `temperature`、`top_p`、`top_k` 和 `repetition_penalty`。\n- `enhancetool`: 对 LLM 返回的工具调用参数增加一层容错处理(这会导致不再流式返回工具调用信息)。\n- `cleancache`: 清除请求中的 `cache_control` 字段。\n- `vertex-gemini`: 处理使用 vertex 鉴权的 gemini api。\n- `qwen-cli` (实验性): 通过 Qwen CLI [qwen-cli.js](https://gist.github.com/musistudio/f5a67841ced39912fd99e42200d5ca8b) 对 qwen3-coder-plus 的非官方支持。\n- `rovo-cli` (experimental): 通过 Atlassian Rovo Dev CLI [rovo-cli.js](https://gist.github.com/SaseQ/c2a20a38b11276537ec5332d1f7a5e53) 对 GPT-5 的非官方支持。\n\n**自定义 Transformer:**\n\n您还可以创建自己的转换器,并通过 `config.json` 中的 `transformers` 字段加载它们。\n\n```json\n{\n \"transformers\": [\n {\n \"path\": \"/User/xxx/.claude-code-router/plugins/gemini-cli.js\",\n \"options\": {\n \"project\": \"xxx\"\n }\n }\n ]\n}\n```\n\n#### Router\n\n`Router` 对象定义了在不同场景下使用哪个模型:\n\n- `default`: 用于常规任务的默认模型。\n- `background`: 用于后台任务的模型。这可以是一个较小的本地模型以节省成本。\n- `think`: 用于推理密集型任务(如计划模式)的模型。\n- `longContext`: 用于处理长上下文(例如,> 60K 令牌)的模型。\n- `longContextThreshold` (可选): 触发长上下文模型的令牌数阈值。如果未指定,默认为 60000。\n- `webSearch`: 用于处理网络搜索任务,需要模型本身支持。如果使用`openrouter`需要在模型后面加上`:online`后缀。\n- `image`(测试版): 用于处理图片类任务(采用CCR内置的agent支持),如果该模型不支持工具调用,需要将`config.forceUseImageAgent`属性设置为`true`。\n\n您还可以使用 `/model` 命令在 Claude Code 中动态切换模型:\n`/model provider_name,model_name`\n示例: `/model openrouter,anthropic/claude-3.5-sonnet`\n\n#### 自定义路由器\n\n对于更高级的路由逻辑,您可以在 `config.json` 中通过 `CUSTOM_ROUTER_PATH` 字段指定一个自定义路由器脚本。这允许您实现超出默认场景的复杂路由规则。\n\n在您的 `config.json` 中配置:\n\n```json\n{\n \"CUSTOM_ROUTER_PATH\": \"/User/xxx/.claude-code-router/custom-router.js\"\n}\n```\n\n自定义路由器文件必须是一个导出 `async` 函数的 JavaScript 模块。该函数接收请求对象和配置对象作为参数,并应返回提供商和模型名称的字符串(例如 `\"provider_name,model_name\"`),如果返回 `null` 则回退到默认路由。\n\n这是一个基于 `custom-router.example.js` 的 `custom-router.js` 示例:\n\n```javascript\n// /User/xxx/.claude-code-router/custom-router.js\n\n/**\n * 一个自定义路由函数,用于根据请求确定使用哪个模型。\n *\n * @param {object} req - 来自 Claude Code 的请求对象,包含请求体。\n * @param {object} config - 应用程序的配置对象。\n * @returns {Promise} - 一个解析为 \"provider,model_name\" 字符串的 Promise,如果返回 null,则使用默认路由。\n */\nmodule.exports = async function router(req, config) {\n const userMessage = req.body.messages.find(m => m.role === 'user')?.content;\n\n if (userMessage && userMessage.includes('解释这段代码')) {\n // 为代码解释任务使用更强大的模型\n return 'openrouter,anthropic/claude-3.5-sonnet';\n }\n\n // 回退到默认的路由配置\n return null;\n};\n```\n\n##### 子代理路由\n\n对于子代理内的路由,您必须在子代理提示词的**开头**包含 `provider,model` 来指定特定的提供商和模型。这样可以将特定的子代理任务定向到指定的模型。\n\n**示例:**\n\n```\nopenrouter,anthropic/claude-3.5-sonnet\n请帮我分析这段代码是否存在潜在的优化空间...\n```\n\n## Status Line (Beta)\n为了在运行时更好的查看claude-code-router的状态,claude-code-router在v1.0.40内置了一个statusline工具,你可以在UI中启用它,\n![statusline-config.png](/blog/images/statusline-config.png)\n\n效果如下:\n![statusline](/blog/images/statusline.png)\n\n## 🤖 GitHub Actions\n\n将 Claude Code Router 集成到您的 CI/CD 管道中。在设置 [Claude Code Actions](https://docs.anthropic.com/en/docs/claude-code/github-actions) 后,修改您的 `.github/workflows/claude.yaml` 以使用路由器:\n\n```yaml\nname: Claude Code\n\non:\n issue_comment:\n types: [created]\n # ... other triggers\n\njobs:\n claude:\n if: |\n (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||\n # ... other conditions\n runs-on: ubuntu-latest\n permissions:\n contents: read\n pull-requests: read\n issues: read\n id-token: write\n steps:\n - name: Checkout repository\n uses: actions/checkout@v4\n with:\n fetch-depth: 1\n\n - name: Prepare Environment\n run: |\n curl -fsSL https://bun.sh/install | bash\n mkdir -p $HOME/.claude-code-router\n cat << 'EOF' > $HOME/.claude-code-router/config.json\n {\n \"log\": true,\n \"NON_INTERACTIVE_MODE\": true,\n \"OPENAI_API_KEY\": \"${{ secrets.OPENAI_API_KEY }}\",\n \"OPENAI_BASE_URL\": \"https://api.deepseek.com\",\n \"OPENAI_MODEL\": \"deepseek-chat\"\n }\n EOF\n shell: bash\n\n - name: Start Claude Code Router\n run: |\n nohup ~/.bun/bin/bunx @musistudio/claude-code-router@1.0.8 start &\n shell: bash\n\n - name: Run Claude Code\n id: claude\n uses: anthropics/claude-code-action@beta\n env:\n ANTHROPIC_BASE_URL: http://localhost:3456\n with:\n anthropic_api_key: \"any-string-is-ok\"\n```\n\n这种设置可以实现有趣的自动化,例如在非高峰时段运行任务以降低 API 成本。\n\n## 📝 深入阅读\n\n- [项目动机和工作原理](blog/zh/项目初衷及原理.md)\n- [也许我们可以用路由器做更多事情](blog/zh/或许我们能在Router中做更多事情.md)\n\n## ❤️ 支持与赞助\n\n如果您觉得这个项目有帮助,请考虑赞助它的开发。非常感谢您的支持!\n\n[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/F1F31GN2GM)\n\n[Paypal](https://paypal.me/musistudio1999)\n\n\n \n \n \n \n
\"Alipay\"\"WeChat
\n\n### 我们的赞助商\n\n非常感谢所有赞助商的慷慨支持!\n\n- [AIHubmix](https://aihubmix.com/)\n- [BurnCloud](https://ai.burncloud.com)\n- [302.AI](https://share.302.ai/ZGVF9w)\n- @Simon Leischnig\n- [@duanshuaimin](https://github.com/duanshuaimin)\n- [@vrgitadmin](https://github.com/vrgitadmin)\n- @*o\n- [@ceilwoo](https://github.com/ceilwoo)\n- @*说\n- @*更\n- @K*g\n- @R*R\n- [@bobleer](https://github.com/bobleer)\n- @*苗\n- @*划\n- [@Clarence-pan](https://github.com/Clarence-pan)\n- [@carter003](https://github.com/carter003)\n- @S*r\n- @*晖\n- @*敏\n- @Z*z\n- @*然\n- [@cluic](https://github.com/cluic)\n- @*苗\n- [@PromptExpert](https://github.com/PromptExpert)\n- @*应\n- [@yusnake](https://github.com/yusnake)\n- @*飞\n- @董*\n- @*汀\n- @*涯\n- @*:-)\n- @**磊\n- @*琢\n- @*成\n- @Z*o\n- @\\*琨\n- [@congzhangzh](https://github.com/congzhangzh)\n- @*_\n- @Z\\*m\n- @*鑫\n- @c\\*y\n- @\\*昕\n- [@witsice](https://github.com/witsice)\n- @b\\*g\n- @\\*亿\n- @\\*辉\n- @JACK \n- @\\*光\n- @W\\*l\n- [@kesku](https://github.com/kesku)\n- [@biguncle](https://github.com/biguncle)\n- @二吉吉\n- @a\\*g\n- @\\*林\n- @\\*咸\n- @\\*明\n- @S\\*y\n- @f\\*o\n- @\\*智\n- @F\\*t\n- @r\\*c\n- [@qierkang](http://github.com/qierkang)\n- @\\*军\n- [@snrise-z](http://github.com/snrise-z)\n- @\\*王\n- [@greatheart1000](http://github.com/greatheart1000)\n- @\\*王\n- @zcutlip\n- [@Peng-YM](http://github.com/Peng-YM)\n- @\\*更\n- @\\*.\n- @F\\*t\n- @\\*政\n- @\\*铭\n- @\\*叶\n- @七\\*o\n- @\\*青\n- @\\*\\*晨\n- @\\*远\n- @\\*霄\n- @\\*\\*吉\n- @\\*\\*飞\n- @\\*\\*驰\n- @x\\*g\n- @\\*\\*东\n- @\\*落\n- @哆\\*k\n- @\\*涛\n\n(如果您的名字被屏蔽,请通过我的主页电子邮件与我联系,以便使用您的 GitHub 用户名进行更新。)\n\n\n## 交流群\n\"wechat_group\"\n"}, "2582e2fc548b79c6300c24ed1775fb1be18fd0df": {"t": 1785764474.403235, "n": 15215, "h": "abd9ce9d56668777", "c": "![](blog/images/claude-code-router-img.png)\n\n[![](https://img.shields.io/badge/%F0%9F%87%AC%F0%9F%87%A7-English-000aff?style=flat)](README.md)\n[![Discord](https://img.shields.io/badge/Discord-%235865F2.svg?&logo=discord&logoColor=white)](https://discord.gg/rdftVMaUcS)\n[![](https://img.shields.io/github/license/musistudio/claude-code-router)](https://github.com/musistudio/claude-code-router/blob/main/LICENSE)\n\n
\n\n> 我目前正在寻找 **Agent 开发相关的工作机会**,可 base 在 **杭州**,也接受 **远程** 合作。如果你对我的项目感兴趣,或有合适的岗位/合作机会,欢迎联系我! 📧 Email: m@musiiot.top\n\n> 一款强大的工具,可将 Claude Code 请求路由到不同的模型,并自定义任何请求。\n\n> 现在你可以通过[心流平台](https://platform.iflow.cn/docs/api-mode)免费使用`GLM-4.5`、`Kimi-K2`、`Qwen3-Coder-480B-A35B`、`DeepSeek v3.1`等模型。 \n> 你可以使用`ccr ui`命令在UI中直接导入`iflow`模板,值得注意的是心流限制每位用户的并发数为1,意味着你需要将`background`路由到其他模型。 \n> 如果你想获得更好的体验,可以尝试[iFlow CLI](https://cli.iflow.cn)。 \n\n![](blog/images/claude-code.png)\n\n![](blog/images/roadmap.svg)\n\n\n## ✨ 功能\n\n- **模型路由**: 根据您的需求将请求路由到不同的模型(例如,后台任务、思考、长上下文)。\n- **多提供商支持**: 支持 OpenRouter、DeepSeek、Ollama、Gemini、Volcengine 和 SiliconFlow 等各种模型提供商。\n- **请求/响应转换**: 使用转换器为不同的提供商自定义请求和响应。\n- **动态模型切换**: 在 Claude Code 中使用 `/model` 命令动态切换模型。\n- **GitHub Actions 集成**: 在您的 GitHub 工作流程中触发 Claude Code 任务。\n- **插件系统**: 使用自定义转换器扩展功能。\n\n## 🚀 快速入门\n\n### 1. 安装\n\n首先,请确保您已安装 [Claude Code](https://docs.anthropic.com/en/docs/claude-code/quickstart):\n\n```shell\nnpm install -g @anthropic-ai/claude-code\n```\n\n然后,安装 Claude Code Router:\n\n```shell\nnpm install -g @musistudio/claude-code-router\n```\n\n### 2. 配置\n\n创建并配置您的 `~/.claude-code-router/config.json` 文件。有关更多详细信息,您可以参考 `config.example.json`。\n\n`config.json` 文件有几个关键部分:\n- **`PROXY_URL`** (可选): 您可以为 API 请求设置代理,例如:`\"PROXY_URL\": \"http://127.0.0.1:7890\"`。\n- **`LOG`** (可选): 您可以通过将其设置为 `true` 来启用日志记录。当设置为 `false` 时,将不会创建日志文件。默认值为 `true`。\n- **`LOG_LEVEL`** (可选): 设置日志级别。可用选项包括:`\"fatal\"`、`\"error\"`、`\"warn\"`、`\"info\"`、`\"debug\"`、`\"trace\"`。默认值为 `\"debug\"`。\n- **日志系统**: Claude Code Router 使用两个独立的日志系统:\n - **服务器级别日志**: HTTP 请求、API 调用和服务器事件使用 pino 记录在 `~/.claude-code-router/logs/` 目录中,文件名类似于 `ccr-*.log`\n - **应用程序级别日志**: 路由决策和业务逻辑事件记录在 `~/.claude-code-router/claude-code-router.log` 文件中\n- **`APIKEY`** (可选): 您可以设置一个密钥来进行身份验证。设置后,客户端请求必须在 `Authorization` 请求头 (例如, `Bearer your-secret-key`) 或 `x-api-key` 请求头中提供此密钥。例如:`\"APIKEY\": \"your-secret-key\"`。\n- **`HOST`** (可选): 您可以设置服务的主机地址。如果未设置 `APIKEY`,出于安全考虑,主机地址将强制设置为 `127.0.0.1`,以防止未经授权的访问。例如:`\"HOST\": \"0.0.0.0\"`。\n- **`NON_INTERACTIVE_MODE`** (可选): 当设置为 `true` 时,启用与非交互式环境(如 GitHub Actions、Docker 容器或其他 CI/CD 系统)的兼容性。这会设置适当的环境变量(`CI=true`、`FORCE_COLOR=0` 等)并配置 stdin 处理,以防止进程在自动化环境中挂起。例如:`\"NON_INTERACTIVE_MODE\": true`。\n- **`Providers`**: 用于配置不同的模型提供商。\n- **`Router`**: 用于设置路由规则。`default` 指定默认模型,如果未配置其他路由,则该模型将用于所有请求。\n- **`API_TIMEOUT_MS`**: API 请求超时时间,单位为毫秒。\n\n这是一个综合示例:\n\n```json\n{\n \"APIKEY\": \"your-secret-key\",\n \"PROXY_URL\": \"http://127.0.0.1:7890\",\n \"LOG\": true,\n \"API_TIMEOUT_MS\": 600000,\n \"NON_INTERACTIVE_MODE\": false,\n \"Providers\": [\n {\n \"name\": \"openrouter\",\n \"api_base_url\": \"https://openrouter.ai/api/v1/chat/completions\",\n \"api_key\": \"sk-xxx\",\n \"models\": [\n \"google/gemini-2.5-pro-preview\",\n \"anthropic/claude-sonnet-4\",\n \"anthropic/claude-3.5-sonnet\",\n \"anthropic/claude-3.7-sonnet:thinking\"\n ],\n \"transformer\": {\n \"use\": [\"openrouter\"]\n }\n },\n {\n \"name\": \"deepseek\",\n \"api_base_url\": \"https://api.deepseek.com/chat/completions\",\n \"api_key\": \"sk-xxx\",\n \"models\": [\"deepseek-chat\", \"deepseek-reasoner\"],\n \"transformer\": {\n \"use\": [\"deepseek\"],\n \"deepseek-chat\": {\n \"use\": [\"tooluse\"]\n }\n }\n },\n {\n \"name\": \"ollama\",\n \"api_base_url\": \"http://localhost:11434/v1/chat/completions\",\n \"api_key\": \"ollama\",\n \"models\": [\"qwen2.5-coder:latest\"]\n },\n {\n \"name\": \"gemini\",\n \"api_base_url\": \"https://generativelanguage.googleapis.com/v1beta/models/\",\n \"api_key\": \"sk-xxx\",\n \"models\": [\"gemini-2.5-flash\", \"gemini-2.5-pro\"],\n \"transformer\": {\n \"use\": [\"gemini\"]\n }\n },\n {\n \"name\": \"volcengine\",\n \"api_base_url\": \"https://ark.cn-beijing.volces.com/api/v3/chat/completions\",\n \"api_key\": \"sk-xxx\",\n \"models\": [\"deepseek-v3-250324\", \"deepseek-r1-250528\"],\n \"transformer\": {\n \"use\": [\"deepseek\"]\n }\n },\n {\n \"name\": \"modelscope\",\n \"api_base_url\": \"https://api-inference.modelscope.cn/v1/chat/completions\",\n \"api_key\": \"\",\n \"models\": [\"Qwen/Qwen3-Coder-480B-A35B-Instruct\", \"Qwen/Qwen3-235B-A22B-Thinking-2507\"],\n \"transformer\": {\n \"use\": [\n [\n \"maxtoken\",\n {\n \"max_tokens\": 65536\n }\n ],\n \"enhancetool\"\n ],\n \"Qwen/Qwen3-235B-A22B-Thinking-2507\": {\n \"use\": [\"reasoning\"]\n }\n }\n },\n {\n \"name\": \"dashscope\",\n \"api_base_url\": \"https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions\",\n \"api_key\": \"\",\n \"models\": [\"qwen3-coder-plus\"],\n \"transformer\": {\n \"use\": [\n [\n \"maxtoken\",\n {\n \"max_tokens\": 65536\n }\n ],\n \"enhancetool\"\n ]\n }\n },\n {\n \"name\": \"aihubmix\",\n \"api_base_url\": \"https://aihubmix.com/v1/chat/completions\",\n \"api_key\": \"sk-\",\n \"models\": [\n \"Z/glm-4.5\",\n \"claude-opus-4-20250514\",\n \"gemini-2.5-pro\"\n ]\n }\n ],\n \"Router\": {\n \"default\": \"deepseek,deepseek-chat\",\n \"background\": \"ollama,qwen2.5-coder:latest\",\n \"think\": \"deepseek,deepseek-reasoner\",\n \"longContext\": \"openrouter,google/gemini-2.5-pro-preview\",\n \"longContextThreshold\": 60000,\n \"webSearch\": \"gemini,gemini-2.5-flash\"\n }\n}\n```\n\n\n### 3. 使用 Router 运行 Claude Code\n\n使用 router 启动 Claude Code:\n\n```shell\nccr code\n```\n\n> **注意**: 修改配置文件后,需要重启服务使配置生效:\n> ```shell\n> ccr restart\n> ```\n\n### 4. UI 模式\n\n为了获得更直观的体验,您可以使用 UI 模式来管理您的配置:\n\n```shell\nccr ui\n```\n\n这将打开一个基于 Web 的界面,您可以在其中轻松查看和编辑您的 `config.json` 文件。\n\n![UI](/blog/images/ui.png)\n\n#### Providers\n\n`Providers` 数组是您定义要使用的不同模型提供商的地方。每个提供商对象都需要:\n\n- `name`: 提供商的唯一名称。\n- `api_base_url`: 聊天补全的完整 API 端点。\n- `api_key`: 您提供商的 API 密钥。\n- `models`: 此提供商可用的模型名称列表。\n- `transformer` (可选): 指定用于处理请求和响应的转换器。\n\n#### Transformers\n\nTransformers 允许您修改请求和响应负载,以确保与不同提供商 API 的兼容性。\n\n- **全局 Transformer**: 将转换器应用于提供商的所有模型。在此示例中,`openrouter` 转换器将应用于 `openrouter` 提供商下的所有模型。\n ```json\n {\n \"name\": \"openrouter\",\n \"api_base_url\": \"https://openrouter.ai/api/v1/chat/completions\",\n \"api_key\": \"sk-xxx\",\n \"models\": [\n \"google/gemini-2.5-pro-preview\",\n \"anthropic/claude-sonnet-4\",\n \"anthropic/claude-3.5-sonnet\"\n ],\n \"transformer\": { \"use\": [\"openrouter\"] }\n }\n ```\n- **特定于模型的 Transformer**: 将转换器应用于特定模型。在此示例中,`deepseek` 转换器应用于所有模型,而额外的 `tooluse` 转换器仅应用于 `deepseek-chat` 模型。\n ```json\n {\n \"name\": \"deepseek\",\n \"api_base_url\": \"https://api.deepseek.com/chat/completions\",\n \"api_key\": \"sk-xxx\",\n \"models\": [\"deepseek-chat\", \"deepseek-reasoner\"],\n \"transformer\": {\n \"use\": [\"deepseek\"],\n \"deepseek-chat\": { \"use\": [\"tooluse\"] }\n }\n }\n ```\n\n- **向 Transformer 传递选项**: 某些转换器(如 `maxtoken`)接受选项。要传递选项,请使用嵌套数组,其中第一个元素是转换器名称,第二个元素是选项对象。\n ```json\n {\n \"name\": \"siliconflow\",\n \"api_base_url\": \"https://api.siliconflow.cn/v1/chat/completions\",\n \"api_key\": \"sk-xxx\",\n \"models\": [\"moonshotai/Kimi-K2-Instruct\"],\n \"transformer\": {\n \"use\": [\n [\n \"maxtoken\",\n {\n \"max_tokens\": 16384\n }\n ]\n ]\n }\n }\n ```\n\n**可用的内置 Transformer:**\n\n- `Anthropic`: 如果你只使用这一个转换器,则会直接透传请求和响应(你可以用它来接入其他支持Anthropic端点的服务商)。\n- `deepseek`: 适配 DeepSeek API 的请求/响应。\n- `gemini`: 适配 Gemini API 的请求/响应。\n- `openrouter`: 适配 OpenRouter API 的请求/响应。它还可以接受一个 `provider` 路由参数,以指定 OpenRouter 应使用哪些底层提供商。有关更多详细信息,请参阅 [OpenRouter 文档](https://openrouter.ai/docs/features/provider-routing)。请参阅下面的示例:\n ```json\n \"transformer\": {\n \"use\": [\"openrouter\"],\n \"moonshotai/kimi-k2\": {\n \"use\": [\n [\n \"openrouter\",\n {\n \"provider\": {\n \"only\": [\"moonshotai/fp8\"]\n }\n }\n ]\n ]\n }\n }\n ```\n- `groq`: 适配 groq API 的请求/响应\n- `maxtoken`: 设置特定的 `max_tokens` 值。\n- `tooluse`: 优化某些模型的工具使用(通过`tool_choice`参数)。\n- `gemini-cli` (实验性): 通过 Gemini CLI [gemini-cli.js](https://gist.github.com/musistudio/1c13a65f35916a7ab690649d3df8d1cd) 对 Gemini 的非官方支持。\n- `reasoning`: 用于处理 `reasoning_content` 字段。\n- `sampling`: 用于处理采样信息字段,如 `temperature`、`top_p`、`top_k` 和 `repetition_penalty`。\n- `enhancetool`: 对 LLM 返回的工具调用参数增加一层容错处理(这会导致不再流式返回工具调用信息)。\n- `cleancache`: 清除请求中的 `cache_control` 字段。\n- `vertex-gemini`: 处理使用 vertex 鉴权的 gemini api。\n- `qwen-cli` (实验性): 通过 Qwen CLI [qwen-cli.js](https://gist.github.com/musistudio/f5a67841ced39912fd99e42200d5ca8b) 对 qwen3-coder-plus 的非官方支持。\n- `rovo-cli` (experimental): 通过 Atlassian Rovo Dev CLI [rovo-cli.js](https://gist.github.com/SaseQ/c2a20a38b11276537ec5332d1f7a5e53) 对 GPT-5 的非官方支持。\n\n**自定义 Transformer:**\n\n您还可以创建自己的转换器,并通过 `config.json` 中的 `transformers` 字段加载它们。\n\n```json\n{\n \"transformers\": [\n {\n \"path\": \"/User/xxx/.claude-code-router/plugins/gemini-cli.js\",\n \"options\": {\n \"project\": \"xxx\"\n }\n }\n ]\n}\n```\n\n#### Router\n\n`Router` 对象定义了在不同场景下使用哪个模型:\n\n- `default`: 用于常规任务的默认模型。\n- `background`: 用于后台任务的模型。这可以是一个较小的本地模型以节省成本。\n- `think`: 用于推理密集型任务(如计划模式)的模型。\n- `longContext`: 用于处理长上下文(例如,> 60K 令牌)的模型。\n- `longContextThreshold` (可选): 触发长上下文模型的令牌数阈值。如果未指定,默认为 60000。\n- `webSearch`: 用于处理网络搜索任务,需要模型本身支持。如果使用`openrouter`需要在模型后面加上`:online`后缀。\n- `image`(测试版): 用于处理图片类任务(采用CCR内置的agent支持),如果该模型不支持工具调用,需要将`config.forceUseImageAgent`属性设置为`true`。\n\n您还可以使用 `/model` 命令在 Claude Code 中动态切换模型:\n`/model provider_name,model_name`\n示例: `/model openrouter,anthropic/claude-3.5-sonnet`\n\n#### 自定义路由器\n\n对于更高级的路由逻辑,您可以在 `config.json` 中通过 `CUSTOM_ROUTER_PATH` 字段指定一个自定义路由器脚本。这允许您实现超出默认场景的复杂路由规则。\n\n在您的 `config.json` 中配置:\n\n```json\n{\n \"CUSTOM_ROUTER_PATH\": \"/User/xxx/.claude-code-router/custom-router.js\"\n}\n```\n\n自定义路由器文件必须是一个导出 `async` 函数的 JavaScript 模块。该函数接收请求对象和配置对象作为参数,并应返回提供商和模型名称的字符串(例如 `\"provider_name,model_name\"`),如果返回 `null` 则回退到默认路由。\n\n这是一个基于 `custom-router.example.js` 的 `custom-router.js` 示例:\n\n```javascript\n// /User/xxx/.claude-code-router/custom-router.js\n\n/**\n * 一个自定义路由函数,用于根据请求确定使用哪个模型。\n *\n * @param {object} req - 来自 Claude Code 的请求对象,包含请求体。\n * @param {object} config - 应用程序的配置对象。\n * @returns {Promise} - 一个解析为 \"provider,model_name\" 字符串的 Promise,如果返回 null,则使用默认路由。\n */\nmodule.exports = async function router(req, config) {\n const userMessage = req.body.messages.find(m => m.role === 'user')?.content;\n\n if (userMessage && userMessage.includes('解释这段代码')) {\n // 为代码解释任务使用更强大的模型\n return 'openrouter,anthropic/claude-3.5-sonnet';\n }\n\n // 回退到默认的路由配置\n return null;\n};\n```\n\n##### 子代理路由\n\n对于子代理内的路由,您必须在子代理提示词的**开头**包含 `provider,model` 来指定特定的提供商和模型。这样可以将特定的子代理任务定向到指定的模型。\n\n**示例:**\n\n```\nopenrouter,anthropic/claude-3.5-sonnet\n请帮我分析这段代码是否存在潜在的优化空间...\n```\n\n## Status Line (Beta)\n为了在运行时更好的查看claude-code-router的状态,claude-code-router在v1.0.40内置了一个statusline工具,你可以在UI中启用它,\n![statusline-config.png](/blog/images/statusline-config.png)\n\n效果如下:\n![statusline](/blog/images/statusline.png)\n\n## 🤖 GitHub Actions\n\n将 Claude Code Router 集成到您的 CI/CD 管道中。在设置 [Claude Code Actions](https://docs.anthropic.com/en/docs/claude-code/github-actions) 后,修改您的 `.github/workflows/claude.yaml` 以使用路由器:\n\n```yaml\nname: Claude Code\n\non:\n issue_comment:\n types: [created]\n # ... other triggers\n\njobs:\n claude:\n if: |\n (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||\n # ... other conditions\n runs-on: ubuntu-latest\n permissions:\n contents: read\n pull-requests: read\n issues: read\n id-token: write\n steps:\n - name: Checkout repository\n uses: actions/checkout@v4\n with:\n fetch-depth: 1\n\n - name: Prepare Environment\n run: |\n curl -fsSL https://bun.sh/install | bash\n mkdir -p $HOME/.claude-code-router\n cat << 'EOF' > $HOME/.claude-code-router/config.json\n {\n \"log\": true,\n \"NON_INTERACTIVE_MODE\": true,\n \"OPENAI_API_KEY\": \"${{ secrets.OPENAI_API_KEY }}\",\n \"OPENAI_BASE_URL\": \"https://api.deepseek.com\",\n \"OPENAI_MODEL\": \"deepseek-chat\"\n }\n EOF\n shell: bash\n\n - name: Start Claude Code Router\n run: |\n nohup ~/.bun/bin/bunx @musistudio/claude-code-router@1.0.8 start &\n shell: bash\n\n - name: Run Claude Code\n id: claude\n uses: anthropics/claude-code-action@beta\n env:\n ANTHROPIC_BASE_URL: http://localhost:3456\n with:\n anthropic_api_key: \"any-string-is-ok\"\n```\n\n这种设置可以实现有趣的自动化,例如在非高峰时段运行任务以降低 API 成本。\n\n## 📝 深入阅读\n\n- [项目动机和工作原理](blog/zh/项目初衷及原理.md)\n- [也许我们可以用路由器做更多事情](blog/zh/或许我们能在Router中做更多事情.md)\n\n## ❤️ 支持与赞助\n\n如果您觉得这个项目有帮助,请考虑赞助它的开发。非常感谢您的支持!\n\n[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/F1F31GN2GM)\n\n[Paypal](https://paypal.me/musistudio1999)\n\n\n \n \n \n \n
\"Alipay\"\"WeChat
\n\n### 我们的赞助商\n\n非常感谢所有赞助商的慷慨支持!\n\n- [AIHubmix](https://aihubmix.com/)\n- [BurnCloud](https://ai.burncloud.com)\n- [302.AI](https://share.302.ai/ZGVF9w)\n- @Simon Leischnig\n- [@duanshuaimin](https://github.com/duanshuaimin)\n- [@vrgitadmin](https://github.com/vrgitadmin)\n- @*o\n- [@ceilwoo](https://github.com/ceilwoo)\n- @*说\n- @*更\n- @K*g\n- @R*R\n- [@bobleer](https://github.com/bobleer)\n- @*苗\n- @*划\n- [@Clarence-pan](https://github.com/Clarence-pan)\n- [@carter003](https://github.com/carter003)\n- @S*r\n- @*晖\n- @*敏\n- @Z*z\n- @*然\n- [@cluic](https://github.com/cluic)\n- @*苗\n- [@PromptExpert](https://github.com/PromptExpert)\n- @*应\n- [@yusnake](https://github.com/yusnake)\n- @*飞\n- @董*\n- @*汀\n- @*涯\n- @*:-)\n- @**磊\n- @*琢\n- @*成\n- @Z*o\n- @\\*琨\n- [@congzhangzh](https://github.com/congzhangzh)\n- @*_\n- @Z\\*m\n- @*鑫\n- @c\\*y\n- @\\*昕\n- [@witsice](https://github.com/witsice)\n- @b\\*g\n- @\\*亿\n- @\\*辉\n- @JACK \n- @\\*光\n- @W\\*l\n- [@kesku](https://github.com/kesku)\n- [@biguncle](https://github.com/biguncle)\n- @二吉吉\n- @a\\*g\n- @\\*林\n- @\\*咸\n- @\\*明\n- @S\\*y\n- @f\\*o\n- @\\*智\n- @F\\*t\n- @r\\*c\n- [@qierkang](http://github.com/qierkang)\n- @\\*军\n- [@snrise-z](http://github.com/snrise-z)\n- @\\*王\n- [@greatheart1000](http://github.com/greatheart1000)\n- @\\*王\n- @zcutlip\n- [@Peng-YM](http://github.com/Peng-YM)\n- @\\*更\n- @\\*.\n- @F\\*t\n- @\\*政\n- @\\*铭\n- @\\*叶\n- @七\\*o\n- @\\*青\n- @\\*\\*晨\n- @\\*远\n- @\\*霄\n- @\\*\\*吉\n- @\\*\\*飞\n- @\\*\\*驰\n- @x\\*g\n- @\\*\\*东\n- @\\*落\n- @哆\\*k\n- @\\*涛\n\n(如果您的名字被屏蔽,请通过我的主页电子邮件与我联系,以便使用您的 GitHub 用户名进行更新。)\n\n\n## 交流群\n\"wechat_group\"\n"}}}}