@andyzheung/ccmr 1.2.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/dist/server.js ADDED
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+ /**
3
+ * Express server for Claude Code Model Router
4
+ */
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.createServer = createServer;
10
+ exports.startServer = startServer;
11
+ const express_1 = __importDefault(require("express"));
12
+ const router_js_1 = require("./router.js");
13
+ function createServer(configManager) {
14
+ const app = (0, express_1.default)();
15
+ const router = new router_js_1.ModelRouter(configManager);
16
+ const config = configManager.getConfig();
17
+ // Middleware
18
+ app.use(express_1.default.json({ limit: '50mb' }));
19
+ // Logging middleware
20
+ if (config.gateway.enable_logging) {
21
+ app.use((req, _res, next) => {
22
+ if (req.path !== '/health') {
23
+ console.log(`[${new Date().toISOString()}] ${req.method} ${req.path}`);
24
+ }
25
+ next();
26
+ });
27
+ }
28
+ // Health check
29
+ app.get('/health', (_req, res) => {
30
+ const models = {};
31
+ for (const [name] of Object.entries(config.models)) {
32
+ models[name] = configManager.getApiKey(name) ? 'available' : 'no_api_key';
33
+ }
34
+ res.json({
35
+ status: 'healthy',
36
+ version: '1.0.0',
37
+ default_model: config.default_model,
38
+ models,
39
+ });
40
+ });
41
+ // List models
42
+ app.get('/v1/models', (_req, res) => {
43
+ const data = Object.entries(config.models).map(([id, model]) => ({
44
+ id,
45
+ object: 'model',
46
+ display_name: model.display_name,
47
+ provider: model.provider,
48
+ model_id: model.model_id,
49
+ available: !!configManager.getApiKey(id),
50
+ }));
51
+ res.json({ object: 'list', data });
52
+ });
53
+ // Messages endpoint
54
+ app.post('/v1/messages', async (req, res) => {
55
+ try {
56
+ const body = req.body;
57
+ // Use default model if not specified
58
+ if (!body.model) {
59
+ body.model = config.default_model;
60
+ }
61
+ // Get original headers for forwarding
62
+ const originalHeaders = {};
63
+ if (req.headers['anthropic-beta']) {
64
+ originalHeaders['anthropic-beta'] = req.headers['anthropic-beta'];
65
+ }
66
+ if (req.headers['anthropic-version']) {
67
+ originalHeaders['anthropic-version'] = req.headers['anthropic-version'];
68
+ }
69
+ // Get model display name for headers
70
+ const modelConfig = configManager.getModel(body.model);
71
+ const modelDisplayName = modelConfig?.display_name || body.model;
72
+ // Check if streaming
73
+ if (body.stream) {
74
+ // Set SSE headers
75
+ res.setHeader('Content-Type', 'text/event-stream');
76
+ res.setHeader('Cache-Control', 'no-cache');
77
+ res.setHeader('Connection', 'keep-alive');
78
+ res.setHeader('X-Accel-Buffering', 'no');
79
+ res.setHeader('X-Model-Router', modelDisplayName);
80
+ res.flushHeaders();
81
+ // Stream the response
82
+ for await (const chunk of router.forwardStream(body, originalHeaders)) {
83
+ res.write(chunk);
84
+ // Flush immediately for real-time streaming
85
+ if (typeof res.flush === 'function') {
86
+ res.flush();
87
+ }
88
+ }
89
+ res.end();
90
+ }
91
+ else {
92
+ // Non-streaming response
93
+ const response = await router.forwardRequest(body, originalHeaders);
94
+ if (config.gateway.enable_logging) {
95
+ res.setHeader('X-Model-Router', modelDisplayName);
96
+ }
97
+ res.json(response);
98
+ }
99
+ }
100
+ catch (error) {
101
+ // Check if headers already sent (streaming started)
102
+ if (res.headersSent) {
103
+ // For streaming, send error as SSE event and end
104
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
105
+ const errorEvent = {
106
+ type: 'error',
107
+ error: { type: 'stream_error', message: errorMessage },
108
+ };
109
+ res.write(`event: error\ndata: ${JSON.stringify(errorEvent)}\n\n`);
110
+ res.end();
111
+ return;
112
+ }
113
+ if (error instanceof router_js_1.RouterError) {
114
+ res.status(error.statusCode).json(error.toErrorResponse());
115
+ }
116
+ else {
117
+ console.error('Unexpected error:', error);
118
+ res.status(500).json({
119
+ type: 'error',
120
+ error: {
121
+ type: 'internal_error',
122
+ message: error instanceof Error ? error.message : 'Unknown error',
123
+ },
124
+ });
125
+ }
126
+ }
127
+ });
128
+ // Token counting (not implemented)
129
+ app.post('/v1/messages/count_tokens', (_req, res) => {
130
+ res.status(501).json({
131
+ type: 'error',
132
+ error: {
133
+ type: 'not_implemented',
134
+ message: 'Token counting is not yet implemented',
135
+ },
136
+ });
137
+ });
138
+ // 404 handler
139
+ app.use((_req, res) => {
140
+ res.status(404).json({
141
+ type: 'error',
142
+ error: {
143
+ type: 'not_found',
144
+ message: 'Endpoint not found',
145
+ },
146
+ });
147
+ });
148
+ // Error handler
149
+ app.use((err, _req, res, _next) => {
150
+ console.error('Server error:', err);
151
+ res.status(500).json({
152
+ type: 'error',
153
+ error: {
154
+ type: 'internal_error',
155
+ message: err.message,
156
+ },
157
+ });
158
+ });
159
+ return app;
160
+ }
161
+ function startServer(configManager) {
162
+ const app = createServer(configManager);
163
+ const config = configManager.getConfig();
164
+ const { host, port } = config.gateway;
165
+ app.listen(port, host, () => {
166
+ console.log('');
167
+ console.log('============================================================');
168
+ console.log(' Claude Code Model Router');
169
+ console.log('============================================================');
170
+ console.log('');
171
+ console.log(`Gateway running at: http://${host === '0.0.0.0' ? 'localhost' : host}:${port}`);
172
+ console.log(`Default model: ${config.default_model}`);
173
+ console.log('');
174
+ console.log('Available models:');
175
+ for (const [name, model] of Object.entries(config.models)) {
176
+ const hasKey = !!configManager.getApiKey(name);
177
+ const status = hasKey ? '\x1b[32m[Ready]\x1b[0m' : '\x1b[33m[No API Key]\x1b[0m';
178
+ console.log(` - ${name}: ${model.display_name} ${status}`);
179
+ }
180
+ console.log('');
181
+ console.log('Press Ctrl+C to stop the gateway.');
182
+ console.log('============================================================');
183
+ console.log('');
184
+ });
185
+ }
186
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Type definitions for Claude Code Model Router
3
+ */
4
+ export interface ModelConfig {
5
+ display_name: string;
6
+ provider: string;
7
+ model_id: string;
8
+ base_url: string;
9
+ api_key_env: string;
10
+ auth_header?: string;
11
+ supports_streaming?: boolean;
12
+ supports_tools?: boolean;
13
+ max_tokens?: number;
14
+ context_window?: number;
15
+ }
16
+ export interface GatewayConfig {
17
+ host: string;
18
+ port: number;
19
+ timeout: number;
20
+ enable_logging: boolean;
21
+ log_level: string;
22
+ }
23
+ export interface RouterConfig {
24
+ default_model: string;
25
+ models: Record<string, ModelConfig>;
26
+ aliases: Record<string, string>;
27
+ gateway: GatewayConfig;
28
+ }
29
+ export interface Message {
30
+ role: 'user' | 'assistant';
31
+ content: string | ContentBlock[];
32
+ }
33
+ export interface ContentBlock {
34
+ type: string;
35
+ text?: string;
36
+ [key: string]: unknown;
37
+ }
38
+ export interface MessagesRequest {
39
+ model: string;
40
+ messages: Message[];
41
+ max_tokens?: number;
42
+ system?: string | ContentBlock[];
43
+ temperature?: number;
44
+ top_p?: number;
45
+ top_k?: number;
46
+ stop_sequences?: string[];
47
+ stream?: boolean;
48
+ tools?: Tool[];
49
+ tool_choice?: Record<string, unknown>;
50
+ metadata?: Record<string, unknown>;
51
+ [key: string]: unknown;
52
+ }
53
+ export interface Tool {
54
+ name: string;
55
+ description: string;
56
+ input_schema: Record<string, unknown>;
57
+ }
58
+ export interface Usage {
59
+ input_tokens: number;
60
+ output_tokens: number;
61
+ cache_creation_input_tokens?: number;
62
+ cache_read_input_tokens?: number;
63
+ }
64
+ export interface MessagesResponse {
65
+ id: string;
66
+ type: 'message';
67
+ role: 'assistant';
68
+ content: ContentBlock[];
69
+ model: string;
70
+ stop_reason: string | null;
71
+ stop_sequence: string | null;
72
+ usage: Usage;
73
+ }
74
+ export interface ErrorResponse {
75
+ type: 'error';
76
+ error: {
77
+ type: string;
78
+ message: string;
79
+ };
80
+ }
81
+ export interface RouteInfo {
82
+ name: string;
83
+ config: ModelConfig;
84
+ apiKey: string;
85
+ }
86
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ /**
3
+ * Type definitions for Claude Code Model Router
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
package/package.json ADDED
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "@andyzheung/ccmr",
3
+ "version": "1.2.0",
4
+ "description": "A lightweight API gateway for routing Claude Code requests to multiple AI models (Forked with GLM-5 and MiniMax M2.5 support)",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "ccmr-plus": "dist/cli.js",
9
+ "claude-code-model-router": "dist/cli.js"
10
+ },
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "start": "node dist/cli.js start",
14
+ "dev": "ts-node src/cli.ts start",
15
+ "clean": "rimraf dist",
16
+ "prepublishOnly": "npm run build"
17
+ },
18
+ "keywords": [
19
+ "claude",
20
+ "claude-code",
21
+ "ai",
22
+ "llm",
23
+ "gateway",
24
+ "router",
25
+ "deepseek",
26
+ "glm",
27
+ "glm-5",
28
+ "minimax",
29
+ "minimax-m2.5",
30
+ "qwen",
31
+ "kimi",
32
+ "anthropic"
33
+ ],
34
+ "author": "andyzheung",
35
+ "license": "MIT",
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "https://github.com/andyzheung/Claude-Code-Model-Router.git"
39
+ },
40
+ "bugs": {
41
+ "url": "https://github.com/andyzheung/Claude-Code-Model-Router/issues"
42
+ },
43
+ "homepage": "https://github.com/andyzheung/Claude-Code-Model-Router#readme",
44
+ "engines": {
45
+ "node": ">=18.0.0"
46
+ },
47
+ "files": [
48
+ "dist",
49
+ "config"
50
+ ],
51
+ "dependencies": {
52
+ "chalk": "^5.3.0",
53
+ "commander": "^12.1.0",
54
+ "dotenv": "^16.4.5",
55
+ "express": "^4.21.0",
56
+ "js-yaml": "^4.1.0",
57
+ "node-fetch": "^3.3.2"
58
+ },
59
+ "devDependencies": {
60
+ "@types/express": "^4.17.21",
61
+ "@types/js-yaml": "^4.0.9",
62
+ "@types/node": "^20.14.0",
63
+ "rimraf": "^5.0.7",
64
+ "ts-node": "^10.9.2",
65
+ "typescript": "^5.4.5"
66
+ }
67
+ }