diff --git a/README.md b/README.md index af5c9a6..d508e77 100644 --- a/README.md +++ b/README.md @@ -226,6 +226,45 @@ You can also switch models dynamically in Claude Code with the `/model` command: `/model provider_name,model_name` Example: `/model openrouter,anthropic/claude-3.5-sonnet` +#### Custom Router + +For more advanced routing logic, you can specify a custom router script via the `CUSTOM_ROUTER_PATH` in your `config.json`. This allows you to implement complex routing rules beyond the default scenarios. + +In your `config.json`: + +```json +{ + "CUSTOM_ROUTER_PATH": "$HOME/.claude-code-router/custom-router.js" +} +``` + +The custom router file must be a JavaScript module that exports an `async` function. This function receives the request object and the config object as arguments and should return the provider and model name as a string (e.g., `"provider_name,model_name"`), or `null` to fall back to the default router. + +Here is an example of a `custom-router.js` based on `custom-router.example.js`: + +```javascript +// $HOME/.claude-code-router/custom-router.js + +/** + * A custom router function to determine which model to use based on the request. + * + * @param {object} req - The request object from Claude Code, containing the request body. + * @param {object} config - The application's config object. + * @returns {Promise} - A promise that resolves to the "provider,model_name" string, or null to use the default router. + */ +module.exports = async function router(req, config) { + const userMessage = req.body.messages.find(m => m.role === 'user')?.content; + + if (userMessage && userMessage.includes('explain this code')) { + // Use a powerful model for code explanation + return 'openrouter,anthropic/claude-3.5-sonnet'; + } + + // Fallback to the default router configuration + return null; +}; +``` + ## 🤖 GitHub Actions diff --git a/README_zh.md b/README_zh.md index 72d824f..3c152e4 100644 --- a/README_zh.md +++ b/README_zh.md @@ -222,6 +222,45 @@ Transformers 允许您修改请求和响应负载,以确保与不同提供商 `/model provider_name,model_name` 示例: `/model openrouter,anthropic/claude-3.5-sonnet` +#### 自定义路由器 + +对于更高级的路由逻辑,您可以在 `config.json` 中通过 `CUSTOM_ROUTER_PATH` 字段指定一个自定义路由器脚本。这允许您实现超出默认场景的复杂路由规则。 + +在您的 `config.json` 中配置: + +```json +{ + "CUSTOM_ROUTER_PATH": "$HOME/.claude-code-router/custom-router.js" +} +``` + +自定义路由器文件必须是一个导出 `async` 函数的 JavaScript 模块。该函数接收请求对象和配置对象作为参数,并应返回提供商和模型名称的字符串(例如 `"provider_name,model_name"`),如果返回 `null` 则回退到默认路由。 + +这是一个基于 `custom-router.example.js` 的 `custom-router.js` 示例: + +```javascript +// $HOME/.claude-code-router/custom-router.js + +/** + * 一个自定义路由函数,用于根据请求确定使用哪个模型。 + * + * @param {object} req - 来自 Claude Code 的请求对象,包含请求体。 + * @param {object} config - 应用程序的配置对象。 + * @returns {Promise} - 一个解析为 "provider,model_name" 字符串的 Promise,如果返回 null,则使用默认路由。 + */ +module.exports = async function router(req, config) { + const userMessage = req.body.messages.find(m => m.role === 'user')?.content; + + if (userMessage && userMessage.includes('解释这段代码')) { + // 为代码解释任务使用更强大的模型 + return 'openrouter,anthropic/claude-3.5-sonnet'; + } + + // 回退到默认的路由配置 + return null; +}; +``` + ## 🤖 GitHub Actions