claude-code-model-router 1.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.
package/README.md ADDED
@@ -0,0 +1,215 @@
1
+ # Claude Code Model Router
2
+
3
+ 一个轻量级 API 网关,让你在使用 Claude Code 时可以切换到第三方 AI 模型。
4
+
5
+ 支持 Windows、macOS、Linux 跨平台使用。
6
+
7
+ ## 快速开始
8
+
9
+ ### 方式一:使用 npx(推荐)
10
+
11
+ ```bash
12
+ # 1. 初始化配置文件
13
+ npx claude-code-model-router init
14
+
15
+ # 2. 编辑 .env 文件,填入 API Keys
16
+
17
+ # 3. 启动网关
18
+ npx claude-code-model-router start
19
+
20
+ # 4. 新开终端,启动 Claude Code
21
+ # 第三方模型(网关模式):
22
+ npx claude-code-model-router claude
23
+
24
+ # 官方订阅(默认模式):
25
+ claude
26
+ ```
27
+
28
+ ### 方式二:全局安装
29
+
30
+ ```bash
31
+ npm install -g claude-code-model-router
32
+
33
+ # 然后使用 ccmr 命令
34
+ ccmr init
35
+ ccmr start
36
+
37
+ # 启动 Claude Code
38
+ ccmr claude # 第三方模型(网关模式)
39
+ claude # 官方订阅(默认模式)
40
+ ```
41
+
42
+ ## 命令说明
43
+
44
+ ```bash
45
+ # 初始化配置文件
46
+ npx claude-code-model-router init
47
+
48
+ # 启动网关
49
+ npx claude-code-model-router start
50
+ npx claude-code-model-router start --port 9000 # 指定端口
51
+
52
+ # 查看可用模型
53
+ npx claude-code-model-router models
54
+
55
+ # 启动 Claude Code(网关模式,使用第三方模型)
56
+ npx claude-code-model-router claude
57
+ npx claude-code-model-router claude --port 9000 # 自定义端口
58
+
59
+ # 启动 Claude Code(官方订阅)
60
+ claude
61
+ ```
62
+
63
+ ## 支持的模型
64
+
65
+ | 别名 | 模型 | 提供商 |
66
+ |------|------|--------|
67
+ | `deepseek` | DeepSeek V3.2 | DeepSeek |
68
+ | `kimi` | Kimi K2 Thinking | Moonshot |
69
+ | `minimax` | MiniMax M2 | MiniMax |
70
+ | `qwen` | Qwen3 Max | 阿里云 |
71
+ | `glm` | GLM 4.6 | 智谱 AI |
72
+
73
+ ## 配置
74
+
75
+ ### 环境变量 (.env)
76
+
77
+ ```bash
78
+ DEEPSEEK_API_KEY=sk-xxx # https://platform.deepseek.com/
79
+ KIMI_API_KEY=sk-xxx # https://www.kimi.com/
80
+ MINIMAX_API_KEY=xxx # https://platform.minimax.io/
81
+ QWEN_API_KEY=sk-xxx # https://dashscope.console.aliyun.com/
82
+ GLM_API_KEY=xxx # https://open.bigmodel.cn/
83
+ ```
84
+
85
+ ### 配置文件 (models.yaml)
86
+
87
+ 可以自定义模型配置、添加别名等。运行 `init` 命令会生成模板。
88
+
89
+ ## 使用场景
90
+
91
+ ### 双模式使用(配置完全隔离)
92
+
93
+ 本工具通过独立的配置目录实现完全隔离,让你可以同时使用官方订阅和第三方模型:
94
+
95
+ ```
96
+ ┌─────────────────────────────────────────────────────────────────┐
97
+ │ 模式1: 官方订阅(默认) │
98
+ │ 命令: claude │
99
+ │ 配置: ~/.claude/settings.json │
100
+ │ 用途: 使用 Claude 官方模型(订阅额度) │
101
+ └─────────────────────────────────────────────────────────────────┘
102
+
103
+ ┌─────────────────────────────────────────────────────────────────┐
104
+ │ 模式2: 第三方模型(网关) │
105
+ │ 命令: npx claude-code-model-router claude │
106
+ │ 配置: ~/.claude-gateway/settings.json │
107
+ │ 用途: 使用第三方 AI 模型(DeepSeek, GLM, Qwen 等) │
108
+ └─────────────────────────────────────────────────────────────────┘
109
+ ```
110
+
111
+ #### 为什么配置是隔离的?
112
+
113
+ - **官方模式**使用 `~/.claude/` 配置目录(Claude Code 默认)
114
+ - **网关模式**使用 `~/.claude-gateway/` 配置目录(独立隔离)
115
+ - 两个配置目录完全独立,互不干扰
116
+ - 在网关模式切换模型不会影响官方模式
117
+
118
+ #### 使用步骤
119
+
120
+ **第一步:启动网关**
121
+ ```bash
122
+ npx claude-code-model-router start
123
+ ```
124
+
125
+ **第二步:选择使用模式**
126
+
127
+ **使用官方订阅(终端 A):**
128
+ ```bash
129
+ claude
130
+ ```
131
+ - 使用官方 Claude 模型(Sonnet, Opus, Haiku)
132
+ - 消耗订阅额度
133
+ - 配置存储在 `~/.claude/`
134
+
135
+ **使用第三方模型(终端 B):**
136
+ ```bash
137
+ npx claude-code-model-router claude
138
+ ```
139
+ - 使用第三方 AI 模型(DeepSeek, GLM, Qwen 等)
140
+ - 按 API 使用量付费
141
+ - 配置存储在 `~/.claude-gateway/`
142
+
143
+ #### 跨平台支持
144
+
145
+ 所有命令在 Windows、macOS、Linux 上完全相同,无需修改。
146
+
147
+ ### 在 Claude Code 中切换模型
148
+
149
+ #### 官方模式(直接 `claude` 启动)
150
+
151
+ ```
152
+ /model sonnet # Claude Sonnet 4.5
153
+ /model opus # Claude Opus 4.5
154
+ /model haiku # Claude Haiku 3.5
155
+ ```
156
+
157
+ #### 网关模式(`npx ... claude` 启动)
158
+
159
+ ```
160
+ /model deepseek # 切换到 DeepSeek V3.2
161
+ /model qwen # 切换到 Qwen3 Max
162
+ /model glm # 切换到 GLM 4.6
163
+ /model kimi # 切换到 Kimi K2 Thinking
164
+ /model minimax # 切换到 MiniMax M2
165
+ ```
166
+
167
+ **重要:** 两个模式的配置完全独立,在网关模式切换模型不会影响官方模式!
168
+
169
+ ## API 端点
170
+
171
+ | 端点 | 方法 | 说明 |
172
+ |------|------|------|
173
+ | `/v1/messages` | POST | Anthropic Messages API |
174
+ | `/v1/models` | GET | 列出可用模型 |
175
+ | `/health` | GET | 健康检查 |
176
+
177
+ ## 开发
178
+
179
+ ```bash
180
+ # 克隆项目
181
+ git clone <repo>
182
+ cd claude-code-model-router
183
+
184
+ # 安装依赖
185
+ npm install
186
+
187
+ # 开发模式
188
+ npm run dev
189
+
190
+ # 构建
191
+ npm run build
192
+
193
+ # 本地测试
194
+ npm link
195
+ ccmr start
196
+ ```
197
+
198
+ ## 故障排除
199
+
200
+ ### 端口被占用
201
+
202
+ ```bash
203
+ # 使用其他端口
204
+ npx claude-code-model-router start --port 9000
205
+ ```
206
+
207
+ ### API Key 错误
208
+
209
+ 1. 检查 .env 文件中的 Key 是否正确
210
+ 2. 确认账户有余额
211
+ 3. 运行 `npx claude-code-model-router models` 查看状态
212
+
213
+ ## License
214
+
215
+ MIT
package/dist/cli.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI for Claude Code Model Router
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;GAEG"}
package/dist/cli.js ADDED
@@ -0,0 +1,183 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * CLI for Claude Code Model Router
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ const commander_1 = require("commander");
11
+ const node_fs_1 = __importDefault(require("node:fs"));
12
+ const node_path_1 = __importDefault(require("node:path"));
13
+ const config_js_1 = require("./config.js");
14
+ const server_js_1 = require("./server.js");
15
+ const VERSION = '1.0.0';
16
+ commander_1.program
17
+ .name('ccmr')
18
+ .description('Claude Code Model Router - A lightweight API gateway for multi-model switching')
19
+ .version(VERSION);
20
+ // Start command
21
+ commander_1.program
22
+ .command('start')
23
+ .description('Start the model router gateway')
24
+ .option('-p, --port <port>', 'Port to listen on', '8080')
25
+ .option('-c, --config <path>', 'Path to config file')
26
+ .option('--host <host>', 'Host to bind to', '0.0.0.0')
27
+ .action((options) => {
28
+ // Set port from option
29
+ if (options.port) {
30
+ process.env.GATEWAY_PORT = options.port;
31
+ }
32
+ try {
33
+ const configManager = new config_js_1.ConfigManager(options.config);
34
+ // Override port if specified
35
+ if (options.port) {
36
+ configManager.getConfig().gateway.port = parseInt(options.port, 10);
37
+ }
38
+ if (options.host) {
39
+ configManager.getConfig().gateway.host = options.host;
40
+ }
41
+ (0, server_js_1.startServer)(configManager);
42
+ }
43
+ catch (error) {
44
+ console.error('Failed to start server:', error);
45
+ process.exit(1);
46
+ }
47
+ });
48
+ // Init command
49
+ commander_1.program
50
+ .command('init')
51
+ .description('Initialize configuration files in current directory')
52
+ .option('-f, --force', 'Overwrite existing files')
53
+ .action((options) => {
54
+ const configPath = node_path_1.default.join(process.cwd(), 'models.yaml');
55
+ const envPath = node_path_1.default.join(process.cwd(), '.env');
56
+ console.log('');
57
+ console.log('Initializing Claude Code Model Router...');
58
+ console.log('');
59
+ // Create config file
60
+ if (node_fs_1.default.existsSync(configPath) && !options.force) {
61
+ console.log(`[SKIP] ${configPath} already exists (use --force to overwrite)`);
62
+ }
63
+ else {
64
+ node_fs_1.default.writeFileSync(configPath, (0, config_js_1.generateConfigFile)());
65
+ console.log(`[CREATE] ${configPath}`);
66
+ }
67
+ // Create .env file
68
+ if (node_fs_1.default.existsSync(envPath) && !options.force) {
69
+ console.log(`[SKIP] ${envPath} already exists (use --force to overwrite)`);
70
+ }
71
+ else {
72
+ node_fs_1.default.writeFileSync(envPath, (0, config_js_1.generateEnvFile)());
73
+ console.log(`[CREATE] ${envPath}`);
74
+ }
75
+ console.log('');
76
+ console.log('Next steps:');
77
+ console.log(' 1. Edit .env and add your API keys');
78
+ console.log(' 2. Run: npx claude-code-model-router start');
79
+ console.log(' 3. In a new terminal, start Claude Code:');
80
+ console.log('');
81
+ console.log(' # For third-party models (gateway mode):');
82
+ console.log(' npx claude-code-model-router claude');
83
+ console.log('');
84
+ console.log(' # For official subscription (default mode):');
85
+ console.log(' claude');
86
+ console.log('');
87
+ });
88
+ // Models command
89
+ commander_1.program
90
+ .command('models')
91
+ .description('List available models')
92
+ .option('-c, --config <path>', 'Path to config file')
93
+ .action((options) => {
94
+ try {
95
+ const configManager = new config_js_1.ConfigManager(options.config);
96
+ const models = configManager.listModels();
97
+ console.log('');
98
+ console.log('Available models:');
99
+ console.log('');
100
+ for (const [name, info] of Object.entries(models)) {
101
+ const status = info.available
102
+ ? '\x1b[32m[Ready]\x1b[0m'
103
+ : '\x1b[33m[No API Key]\x1b[0m';
104
+ console.log(` ${name.padEnd(12)} ${info.displayName.padEnd(20)} ${status}`);
105
+ }
106
+ console.log('');
107
+ console.log('Aliases:');
108
+ const config = configManager.getConfig();
109
+ for (const [alias, target] of Object.entries(config.aliases)) {
110
+ console.log(` ${alias} -> ${target}`);
111
+ }
112
+ console.log('');
113
+ }
114
+ catch (error) {
115
+ console.error('Error:', error);
116
+ process.exit(1);
117
+ }
118
+ });
119
+ // Claude command - launches Claude Code connected to the gateway
120
+ commander_1.program
121
+ .command('claude')
122
+ .description('Launch Claude Code connected to the gateway (for third-party models)')
123
+ .option('-p, --port <port>', 'Gateway port', '8080')
124
+ .action(async (options) => {
125
+ const { spawn } = await import('node:child_process');
126
+ const os = await import('node:os');
127
+ const homeDir = os.homedir();
128
+ // Set up environment for gateway
129
+ const env = {
130
+ ...process.env,
131
+ CLAUDE_CONFIG_DIR: node_path_1.default.join(homeDir, '.claude-gateway'),
132
+ ANTHROPIC_BASE_URL: `http://localhost:${options.port}`,
133
+ };
134
+ console.log('');
135
+ console.log('========================================');
136
+ console.log('Starting Claude Code (Third-party Models)');
137
+ console.log('Configuration: ' + env.CLAUDE_CONFIG_DIR);
138
+ console.log('Gateway: ' + env.ANTHROPIC_BASE_URL);
139
+ console.log('========================================');
140
+ console.log('');
141
+ console.log('NOTE: Make sure the gateway is running first!');
142
+ console.log('Run: npx claude-code-model-router start');
143
+ console.log('');
144
+ console.log('TIP: For official Claude subscription, just use: claude');
145
+ console.log('');
146
+ const child = spawn('claude', [], {
147
+ stdio: 'inherit',
148
+ env,
149
+ shell: true,
150
+ });
151
+ child.on('error', (error) => {
152
+ console.error('Failed to start Claude Code:', error.message);
153
+ console.error('');
154
+ console.error('Make sure Claude Code is installed:');
155
+ console.error(' npm install -g @anthropic-ai/claude-code');
156
+ process.exit(1);
157
+ });
158
+ child.on('exit', (code) => {
159
+ process.exit(code ?? 0);
160
+ });
161
+ });
162
+ // Parse arguments
163
+ commander_1.program.parse();
164
+ // Show help if no command provided
165
+ if (!process.argv.slice(2).length) {
166
+ console.log('');
167
+ console.log('Claude Code Model Router v' + VERSION);
168
+ console.log('');
169
+ console.log('Quick Start:');
170
+ console.log(' 1. npx claude-code-model-router init # Create config files');
171
+ console.log(' 2. Edit .env with your API keys');
172
+ console.log(' 3. npx claude-code-model-router start # Start gateway');
173
+ console.log('');
174
+ console.log('Commands:');
175
+ console.log(' init Create configuration files');
176
+ console.log(' start Start the gateway server');
177
+ console.log(' models List available models');
178
+ console.log(' claude Launch Claude Code with gateway');
179
+ console.log('');
180
+ console.log('Use --help for more information.');
181
+ console.log('');
182
+ }
183
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Configuration management for Claude Code Model Router
3
+ */
4
+ import type { RouterConfig, ModelConfig } from './types.js';
5
+ export declare class ConfigManager {
6
+ private config;
7
+ private apiKeys;
8
+ constructor(configPath?: string);
9
+ private loadConfig;
10
+ private mergeConfig;
11
+ private loadApiKeys;
12
+ getConfig(): RouterConfig;
13
+ getModel(name: string): ModelConfig | undefined;
14
+ resolveModelName(name: string): string;
15
+ getApiKey(modelName: string): string | undefined;
16
+ listModels(): Record<string, {
17
+ displayName: string;
18
+ provider: string;
19
+ available: boolean;
20
+ }>;
21
+ }
22
+ export declare function generateConfigFile(): string;
23
+ export declare function generateEnvFile(): string;
24
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAiB,MAAM,YAAY,CAAC;AA8F3E,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,OAAO,CAAkC;gBAErC,UAAU,CAAC,EAAE,MAAM;IAK/B,OAAO,CAAC,UAAU;IAyBlB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,WAAW;IASnB,SAAS,IAAI,YAAY;IAIzB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAe/C,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAUtC,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAKhD,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;CAa5F;AAGD,wBAAgB,kBAAkB,IAAI,MAAM,CA4D3C;AAED,wBAAgB,eAAe,IAAI,MAAM,CAmBxC"}