@musistudio/claude-code-router 2.0.0 → 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.
- package/README.md +321 -694
- package/README_zh.md +320 -666
- package/dist/main/cli.js +5242 -0
- package/dist/main/fusion-tool-fallback-mcp.js +5 -0
- package/dist/main/fusion-vision-mcp.js +10 -0
- package/dist/main/toolhub-mcp.js +47 -0
- package/dist/marketplace/plugins/claude-design-plugin.cjs +8216 -0
- package/dist/marketplace/plugins/cursor-proxy-plugin.cjs +7080 -0
- package/dist/models.json +490722 -0
- package/dist/renderer/assets/assets/anthropic-CJYB5ODC.png +0 -0
- package/dist/renderer/assets/assets/bailian-6RH6ASGG.ico +0 -0
- package/dist/renderer/assets/assets/claude-code-WX35JWK4.png +0 -0
- package/dist/renderer/assets/assets/codex-3X2KBXKY.png +0 -0
- package/dist/renderer/assets/assets/deepseek-ZIDCDTQF.ico +0 -0
- package/dist/renderer/assets/assets/gemini-7QB7T63T.svg +1 -0
- package/dist/renderer/assets/assets/logo-IPLFWCDN.png +0 -0
- package/dist/renderer/assets/assets/mascot-transition-DUBPNIIV.svg +100 -0
- package/dist/renderer/assets/assets/mistral-2RFSC6K3.webp +0 -0
- package/dist/renderer/assets/assets/moonshot-FNEXMLNW.ico +0 -0
- package/dist/renderer/assets/assets/openai-2EIP7LI2.png +0 -0
- package/dist/renderer/assets/assets/openrouter-CZIFREDB.ico +0 -0
- package/dist/renderer/assets/assets/runapi-UAX35AOL.jpg +0 -0
- package/dist/renderer/assets/assets/siliconflow-QCZUQAH2.png +0 -0
- package/dist/renderer/assets/assets/teamorouter-3LCEETRZ.png +0 -0
- package/dist/renderer/assets/assets/tray-cyan-C3U4WBE7.png +0 -0
- package/dist/renderer/assets/assets/tray-orange-VUJTRHBB.png +0 -0
- package/dist/renderer/assets/assets/tray-violet-EGMLZ2GB.png +0 -0
- package/dist/renderer/assets/assets/zai-global-coding-OMCES3LL.svg +219 -0
- package/dist/renderer/assets/assets/zai-global-general-OMCES3LL.svg +219 -0
- package/dist/renderer/assets/assets/zcode-Z7V7YY2Q.png +0 -0
- package/dist/renderer/assets/assets/zhipu-cn-coding-7BBWPUTC.png +0 -0
- package/dist/renderer/assets/assets/zhipu-cn-general-7BBWPUTC.png +0 -0
- package/dist/renderer/assets/browser.js +312 -0
- package/dist/renderer/assets/main.css +2 -0
- package/dist/renderer/assets/main.js +158 -0
- package/dist/renderer/assets/tray.js +8 -0
- package/dist/renderer/assets/web-client-bridge.js +1 -0
- package/dist/renderer/pages/browser/index.html +13 -0
- package/dist/renderer/pages/home/index.html +18 -0
- package/dist/renderer/pages/tray/index.html +17 -0
- package/package.json +37 -38
- package/dist/cli.js +0 -1179
- package/dist/index.html +0 -225
- package/dist/tiktoken_bg.wasm +0 -0
- package/pnpm-workspace.yaml +0 -3
- package/tsconfig.base.json +0 -17
- package/tsconfig.json +0 -20
package/README.md
CHANGED
|
@@ -1,702 +1,329 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
<
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
>
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
- **
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
"PROXY_URL": "http://127.0.0.1:7890",
|
|
91
|
-
"LOG": true,
|
|
92
|
-
"API_TIMEOUT_MS": 600000,
|
|
93
|
-
"NON_INTERACTIVE_MODE": false,
|
|
94
|
-
"Providers": [
|
|
95
|
-
{
|
|
96
|
-
"name": "openrouter",
|
|
97
|
-
"api_base_url": "https://openrouter.ai/api/v1/chat/completions",
|
|
98
|
-
"api_key": "sk-xxx",
|
|
99
|
-
"models": [
|
|
100
|
-
"google/gemini-2.5-pro-preview",
|
|
101
|
-
"anthropic/claude-sonnet-4",
|
|
102
|
-
"anthropic/claude-3.5-sonnet",
|
|
103
|
-
"anthropic/claude-3.7-sonnet:thinking"
|
|
104
|
-
],
|
|
105
|
-
"transformer": {
|
|
106
|
-
"use": ["openrouter"]
|
|
107
|
-
}
|
|
108
|
-
},
|
|
109
|
-
{
|
|
110
|
-
"name": "deepseek",
|
|
111
|
-
"api_base_url": "https://api.deepseek.com/chat/completions",
|
|
112
|
-
"api_key": "sk-xxx",
|
|
113
|
-
"models": ["deepseek-chat", "deepseek-reasoner"],
|
|
114
|
-
"transformer": {
|
|
115
|
-
"use": ["deepseek"],
|
|
116
|
-
"deepseek-chat": {
|
|
117
|
-
"use": ["tooluse"]
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
},
|
|
121
|
-
{
|
|
122
|
-
"name": "ollama",
|
|
123
|
-
"api_base_url": "http://localhost:11434/v1/chat/completions",
|
|
124
|
-
"api_key": "ollama",
|
|
125
|
-
"models": ["qwen2.5-coder:latest"]
|
|
126
|
-
},
|
|
127
|
-
{
|
|
128
|
-
"name": "gemini",
|
|
129
|
-
"api_base_url": "https://generativelanguage.googleapis.com/v1beta/models/",
|
|
130
|
-
"api_key": "sk-xxx",
|
|
131
|
-
"models": ["gemini-2.5-flash", "gemini-2.5-pro"],
|
|
132
|
-
"transformer": {
|
|
133
|
-
"use": ["gemini"]
|
|
134
|
-
}
|
|
135
|
-
},
|
|
136
|
-
{
|
|
137
|
-
"name": "volcengine",
|
|
138
|
-
"api_base_url": "https://ark.cn-beijing.volces.com/api/v3/chat/completions",
|
|
139
|
-
"api_key": "sk-xxx",
|
|
140
|
-
"models": ["deepseek-v3-250324", "deepseek-r1-250528"],
|
|
141
|
-
"transformer": {
|
|
142
|
-
"use": ["deepseek"]
|
|
143
|
-
}
|
|
144
|
-
},
|
|
145
|
-
{
|
|
146
|
-
"name": "modelscope",
|
|
147
|
-
"api_base_url": "https://api-inference.modelscope.cn/v1/chat/completions",
|
|
148
|
-
"api_key": "",
|
|
149
|
-
"models": ["Qwen/Qwen3-Coder-480B-A35B-Instruct", "Qwen/Qwen3-235B-A22B-Thinking-2507"],
|
|
150
|
-
"transformer": {
|
|
151
|
-
"use": [
|
|
152
|
-
[
|
|
153
|
-
"maxtoken",
|
|
154
|
-
{
|
|
155
|
-
"max_tokens": 65536
|
|
156
|
-
}
|
|
157
|
-
],
|
|
158
|
-
"enhancetool"
|
|
159
|
-
],
|
|
160
|
-
"Qwen/Qwen3-235B-A22B-Thinking-2507": {
|
|
161
|
-
"use": ["reasoning"]
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
},
|
|
165
|
-
{
|
|
166
|
-
"name": "dashscope",
|
|
167
|
-
"api_base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions",
|
|
168
|
-
"api_key": "",
|
|
169
|
-
"models": ["qwen3-coder-plus"],
|
|
170
|
-
"transformer": {
|
|
171
|
-
"use": [
|
|
172
|
-
[
|
|
173
|
-
"maxtoken",
|
|
174
|
-
{
|
|
175
|
-
"max_tokens": 65536
|
|
176
|
-
}
|
|
177
|
-
],
|
|
178
|
-
"enhancetool"
|
|
179
|
-
]
|
|
180
|
-
}
|
|
181
|
-
},
|
|
182
|
-
{
|
|
183
|
-
"name": "aihubmix",
|
|
184
|
-
"api_base_url": "https://aihubmix.com/v1/chat/completions",
|
|
185
|
-
"api_key": "sk-",
|
|
186
|
-
"models": [
|
|
187
|
-
"Z/glm-4.5",
|
|
188
|
-
"claude-opus-4-20250514",
|
|
189
|
-
"gemini-2.5-pro"
|
|
190
|
-
]
|
|
191
|
-
}
|
|
192
|
-
],
|
|
193
|
-
"Router": {
|
|
194
|
-
"default": "deepseek,deepseek-chat",
|
|
195
|
-
"background": "ollama,qwen2.5-coder:latest",
|
|
196
|
-
"think": "deepseek,deepseek-reasoner",
|
|
197
|
-
"longContext": "openrouter,google/gemini-2.5-pro-preview",
|
|
198
|
-
"longContextThreshold": 60000,
|
|
199
|
-
"webSearch": "gemini,gemini-2.5-flash"
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
### 3. Running Claude Code with the Router
|
|
205
|
-
|
|
206
|
-
Start Claude Code using the router:
|
|
207
|
-
|
|
208
|
-
```shell
|
|
209
|
-
ccr code
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
> **Note**: After modifying the configuration file, you need to restart the service for the changes to take effect:
|
|
213
|
-
>
|
|
214
|
-
> ```shell
|
|
215
|
-
> ccr restart
|
|
216
|
-
> ```
|
|
217
|
-
|
|
218
|
-
### 4. UI Mode
|
|
219
|
-
|
|
220
|
-
For a more intuitive experience, you can use the UI mode to manage your configuration:
|
|
221
|
-
|
|
222
|
-
```shell
|
|
223
|
-
ccr ui
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
This will open a web-based interface where you can easily view and edit your `config.json` file.
|
|
227
|
-
|
|
228
|
-

|
|
229
|
-
|
|
230
|
-
### 5. CLI Model Management
|
|
231
|
-
|
|
232
|
-
For users who prefer terminal-based workflows, you can use the interactive CLI model selector:
|
|
233
|
-
|
|
234
|
-
```shell
|
|
235
|
-
ccr model
|
|
236
|
-
```
|
|
237
|
-

|
|
238
|
-
|
|
239
|
-
This command provides an interactive interface to:
|
|
240
|
-
|
|
241
|
-
- View current configuration:
|
|
242
|
-
- See all configured models (default, background, think, longContext, webSearch, image)
|
|
243
|
-
- Switch models: Quickly change which model is used for each router type
|
|
244
|
-
- Add new models: Add models to existing providers
|
|
245
|
-
- Create new providers: Set up complete provider configurations including:
|
|
246
|
-
- Provider name and API endpoint
|
|
247
|
-
- API key
|
|
248
|
-
- Available models
|
|
249
|
-
- Transformer configuration with support for:
|
|
250
|
-
- Multiple transformers (openrouter, deepseek, gemini, etc.)
|
|
251
|
-
- Transformer options (e.g., maxtoken with custom limits)
|
|
252
|
-
- Provider-specific routing (e.g., OpenRouter provider preferences)
|
|
253
|
-
|
|
254
|
-
The CLI tool validates all inputs and provides helpful prompts to guide you through the configuration process, making it easy to manage complex setups without editing JSON files manually.
|
|
255
|
-
|
|
256
|
-
### 6. Presets Management
|
|
257
|
-
|
|
258
|
-
Presets allow you to save, share, and reuse configurations easily. You can export your current configuration as a preset and install presets from files or URLs.
|
|
259
|
-
|
|
260
|
-
```shell
|
|
261
|
-
# Export current configuration as a preset
|
|
262
|
-
ccr preset export my-preset
|
|
263
|
-
|
|
264
|
-
# Export with metadata
|
|
265
|
-
ccr preset export my-preset --description "My OpenAI config" --author "Your Name" --tags "openai,production"
|
|
266
|
-
|
|
267
|
-
# Install a preset from local directory
|
|
268
|
-
ccr preset install /path/to/preset
|
|
269
|
-
|
|
270
|
-
# List all installed presets
|
|
271
|
-
ccr preset list
|
|
272
|
-
|
|
273
|
-
# Show preset information
|
|
274
|
-
ccr preset info my-preset
|
|
275
|
-
|
|
276
|
-
# Delete a preset
|
|
277
|
-
ccr preset delete my-preset
|
|
278
|
-
```
|
|
279
|
-
|
|
280
|
-
**Preset Features:**
|
|
281
|
-
- **Export**: Save your current configuration as a preset directory (with manifest.json)
|
|
282
|
-
- **Install**: Install presets from local directories
|
|
283
|
-
- **Sensitive Data Handling**: API keys and other sensitive data are automatically sanitized during export (marked as `{{field}}` placeholders)
|
|
284
|
-
- **Dynamic Configuration**: Presets can include input schemas for collecting required information during installation
|
|
285
|
-
- **Version Control**: Each preset includes version metadata for tracking updates
|
|
286
|
-
|
|
287
|
-
**Preset File Structure:**
|
|
288
|
-
```
|
|
289
|
-
~/.claude-code-router/presets/
|
|
290
|
-
├── my-preset/
|
|
291
|
-
│ └── manifest.json # Contains configuration and metadata
|
|
292
|
-
```
|
|
293
|
-
|
|
294
|
-
### 7. Activate Command (Environment Variables Setup)
|
|
295
|
-
|
|
296
|
-
The `activate` command allows you to set up environment variables globally in your shell, enabling you to use the `claude` command directly or integrate Claude Code Router with applications built using the Agent SDK.
|
|
297
|
-
|
|
298
|
-
To activate the environment variables, run:
|
|
299
|
-
|
|
300
|
-
```shell
|
|
301
|
-
eval "$(ccr activate)"
|
|
302
|
-
```
|
|
303
|
-
|
|
304
|
-
This command outputs the necessary environment variables in shell-friendly format, which are then set in your current shell session. After activation, you can:
|
|
305
|
-
|
|
306
|
-
- **Use `claude` command directly**: Run `claude` commands without needing to use `ccr code`. The `claude` command will automatically route requests through Claude Code Router.
|
|
307
|
-
- **Integrate with Agent SDK applications**: Applications built with the Anthropic Agent SDK will automatically use the configured router and models.
|
|
308
|
-
|
|
309
|
-
The `activate` command sets the following environment variables:
|
|
310
|
-
|
|
311
|
-
- `ANTHROPIC_AUTH_TOKEN`: API key from your configuration
|
|
312
|
-
- `ANTHROPIC_BASE_URL`: The local router endpoint (default: `http://127.0.0.1:3456`)
|
|
313
|
-
- `NO_PROXY`: Set to `127.0.0.1` to prevent proxy interference
|
|
314
|
-
- `DISABLE_TELEMETRY`: Disables telemetry
|
|
315
|
-
- `DISABLE_COST_WARNINGS`: Disables cost warnings
|
|
316
|
-
- `API_TIMEOUT_MS`: API timeout from your configuration
|
|
317
|
-
|
|
318
|
-
> **Note**: Make sure the Claude Code Router service is running (`ccr start`) before using the activated environment variables. The environment variables are only valid for the current shell session. To make them persistent, you can add `eval "$(ccr activate)"` to your shell configuration file (e.g., `~/.zshrc` or `~/.bashrc`).
|
|
319
|
-
|
|
320
|
-
#### Providers
|
|
321
|
-
|
|
322
|
-
The `Providers` array is where you define the different model providers you want to use. Each provider object requires:
|
|
323
|
-
|
|
324
|
-
- `name`: A unique name for the provider.
|
|
325
|
-
- `api_base_url`: The full API endpoint for chat completions.
|
|
326
|
-
- `api_key`: Your API key for the provider.
|
|
327
|
-
- `models`: A list of model names available from this provider.
|
|
328
|
-
- `transformer` (optional): Specifies transformers to process requests and responses.
|
|
329
|
-
|
|
330
|
-
#### Transformers
|
|
331
|
-
|
|
332
|
-
Transformers allow you to modify the request and response payloads to ensure compatibility with different provider APIs.
|
|
333
|
-
|
|
334
|
-
- **Global Transformer**: Apply a transformer to all models from a provider. In this example, the `openrouter` transformer is applied to all models under the `openrouter` provider.
|
|
335
|
-
```json
|
|
336
|
-
{
|
|
337
|
-
"name": "openrouter",
|
|
338
|
-
"api_base_url": "https://openrouter.ai/api/v1/chat/completions",
|
|
339
|
-
"api_key": "sk-xxx",
|
|
340
|
-
"models": [
|
|
341
|
-
"google/gemini-2.5-pro-preview",
|
|
342
|
-
"anthropic/claude-sonnet-4",
|
|
343
|
-
"anthropic/claude-3.5-sonnet"
|
|
344
|
-
],
|
|
345
|
-
"transformer": { "use": ["openrouter"] }
|
|
346
|
-
}
|
|
347
|
-
```
|
|
348
|
-
- **Model-Specific Transformer**: Apply a transformer to a specific model. In this example, the `deepseek` transformer is applied to all models, and an additional `tooluse` transformer is applied only to the `deepseek-chat` model.
|
|
349
|
-
|
|
350
|
-
```json
|
|
351
|
-
{
|
|
352
|
-
"name": "deepseek",
|
|
353
|
-
"api_base_url": "https://api.deepseek.com/chat/completions",
|
|
354
|
-
"api_key": "sk-xxx",
|
|
355
|
-
"models": ["deepseek-chat", "deepseek-reasoner"],
|
|
356
|
-
"transformer": {
|
|
357
|
-
"use": ["deepseek"],
|
|
358
|
-
"deepseek-chat": { "use": ["tooluse"] }
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
```
|
|
362
|
-
|
|
363
|
-
- **Passing Options to a Transformer**: Some transformers, like `maxtoken`, accept options. To pass options, use a nested array where the first element is the transformer name and the second is an options object.
|
|
364
|
-
```json
|
|
365
|
-
{
|
|
366
|
-
"name": "siliconflow",
|
|
367
|
-
"api_base_url": "https://api.siliconflow.cn/v1/chat/completions",
|
|
368
|
-
"api_key": "sk-xxx",
|
|
369
|
-
"models": ["moonshotai/Kimi-K2-Instruct"],
|
|
370
|
-
"transformer": {
|
|
371
|
-
"use": [
|
|
372
|
-
[
|
|
373
|
-
"maxtoken",
|
|
374
|
-
{
|
|
375
|
-
"max_tokens": 16384
|
|
376
|
-
}
|
|
377
|
-
]
|
|
378
|
-
]
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
```
|
|
382
|
-
|
|
383
|
-
**Available Built-in Transformers:**
|
|
384
|
-
|
|
385
|
-
- `Anthropic`:If you use only the `Anthropic` transformer, it will preserve the original request and response parameters(you can use it to connect directly to an Anthropic endpoint).
|
|
386
|
-
- `deepseek`: Adapts requests/responses for DeepSeek API.
|
|
387
|
-
- `gemini`: Adapts requests/responses for Gemini API.
|
|
388
|
-
- `openrouter`: Adapts requests/responses for OpenRouter API. It can also accept a `provider` routing parameter to specify which underlying providers OpenRouter should use. For more details, refer to the [OpenRouter documentation](https://openrouter.ai/docs/features/provider-routing). See an example below:
|
|
389
|
-
```json
|
|
390
|
-
"transformer": {
|
|
391
|
-
"use": ["openrouter"],
|
|
392
|
-
"moonshotai/kimi-k2": {
|
|
393
|
-
"use": [
|
|
394
|
-
[
|
|
395
|
-
"openrouter",
|
|
396
|
-
{
|
|
397
|
-
"provider": {
|
|
398
|
-
"only": ["moonshotai/fp8"]
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
]
|
|
402
|
-
]
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
```
|
|
406
|
-
- `groq`: Adapts requests/responses for groq API.
|
|
407
|
-
- `maxtoken`: Sets a specific `max_tokens` value.
|
|
408
|
-
- `tooluse`: Optimizes tool usage for certain models via `tool_choice`.
|
|
409
|
-
- `gemini-cli` (experimental): Unofficial support for Gemini via Gemini CLI [gemini-cli.js](https://gist.github.com/musistudio/1c13a65f35916a7ab690649d3df8d1cd).
|
|
410
|
-
- `reasoning`: Used to process the `reasoning_content` field.
|
|
411
|
-
- `sampling`: Used to process sampling information fields such as `temperature`, `top_p`, `top_k`, and `repetition_penalty`.
|
|
412
|
-
- `enhancetool`: Adds a layer of error tolerance to the tool call parameters returned by the LLM (this will cause the tool call information to no longer be streamed).
|
|
413
|
-
- `cleancache`: Clears the `cache_control` field from requests.
|
|
414
|
-
- `vertex-gemini`: Handles the Gemini API using Vertex authentication.
|
|
415
|
-
- `chutes-glm` Unofficial support for GLM 4.5 model via Chutes [chutes-glm-transformer.js](https://gist.github.com/vitobotta/2be3f33722e05e8d4f9d2b0138b8c863).
|
|
416
|
-
- `qwen-cli` (experimental): Unofficial support for qwen3-coder-plus model via Qwen CLI [qwen-cli.js](https://gist.github.com/musistudio/f5a67841ced39912fd99e42200d5ca8b).
|
|
417
|
-
- `rovo-cli` (experimental): Unofficial support for gpt-5 via Atlassian Rovo Dev CLI [rovo-cli.js](https://gist.github.com/SaseQ/c2a20a38b11276537ec5332d1f7a5e53).
|
|
418
|
-
|
|
419
|
-
**Custom Transformers:**
|
|
420
|
-
|
|
421
|
-
You can also create your own transformers and load them via the `transformers` field in `config.json`.
|
|
422
|
-
|
|
423
|
-
```json
|
|
424
|
-
{
|
|
425
|
-
"transformers": [
|
|
426
|
-
{
|
|
427
|
-
"path": "/User/xxx/.claude-code-router/plugins/gemini-cli.js",
|
|
428
|
-
"options": {
|
|
429
|
-
"project": "xxx"
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
]
|
|
433
|
-
}
|
|
434
|
-
```
|
|
435
|
-
|
|
436
|
-
#### Router
|
|
437
|
-
|
|
438
|
-
The `Router` object defines which model to use for different scenarios:
|
|
439
|
-
|
|
440
|
-
- `default`: The default model for general tasks.
|
|
441
|
-
- `background`: A model for background tasks. This can be a smaller, local model to save costs.
|
|
442
|
-
- `think`: A model for reasoning-heavy tasks, like Plan Mode.
|
|
443
|
-
- `longContext`: A model for handling long contexts (e.g., > 60K tokens).
|
|
444
|
-
- `longContextThreshold` (optional): The token count threshold for triggering the long context model. Defaults to 60000 if not specified.
|
|
445
|
-
- `webSearch`: Used for handling web search tasks and this requires the model itself to support the feature. If you're using openrouter, you need to add the `:online` suffix after the model name.
|
|
446
|
-
- `image` (beta): Used for handling image-related tasks (supported by CCR’s built-in agent). If the model does not support tool calling, you need to set the `config.forceUseImageAgent` property to `true`.
|
|
447
|
-
|
|
448
|
-
- You can also switch models dynamically in Claude Code with the `/model` command:
|
|
449
|
-
`/model provider_name,model_name`
|
|
450
|
-
Example: `/model openrouter,anthropic/claude-3.5-sonnet`
|
|
451
|
-
|
|
452
|
-
#### Custom Router
|
|
453
|
-
|
|
454
|
-
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.
|
|
455
|
-
|
|
456
|
-
In your `config.json`:
|
|
457
|
-
|
|
458
|
-
```json
|
|
459
|
-
{
|
|
460
|
-
"CUSTOM_ROUTER_PATH": "/User/xxx/.claude-code-router/custom-router.js"
|
|
461
|
-
}
|
|
462
|
-
```
|
|
463
|
-
|
|
464
|
-
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.
|
|
465
|
-
|
|
466
|
-
Here is an example of a `custom-router.js` based on `custom-router.example.js`:
|
|
467
|
-
|
|
468
|
-
```javascript
|
|
469
|
-
// /User/xxx/.claude-code-router/custom-router.js
|
|
470
|
-
|
|
471
|
-
/**
|
|
472
|
-
* A custom router function to determine which model to use based on the request.
|
|
473
|
-
*
|
|
474
|
-
* @param {object} req - The request object from Claude Code, containing the request body.
|
|
475
|
-
* @param {object} config - The application's config object.
|
|
476
|
-
* @returns {Promise<string|null>} - A promise that resolves to the "provider,model_name" string, or null to use the default router.
|
|
477
|
-
*/
|
|
478
|
-
module.exports = async function router(req, config) {
|
|
479
|
-
const userMessage = req.body.messages.find((m) => m.role === "user")?.content;
|
|
480
|
-
|
|
481
|
-
if (userMessage && userMessage.includes("explain this code")) {
|
|
482
|
-
// Use a powerful model for code explanation
|
|
483
|
-
return "openrouter,anthropic/claude-3.5-sonnet";
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
// Fallback to the default router configuration
|
|
487
|
-
return null;
|
|
488
|
-
};
|
|
489
|
-
```
|
|
490
|
-
|
|
491
|
-
##### Subagent Routing
|
|
492
|
-
|
|
493
|
-
For routing within subagents, you must specify a particular provider and model by including `<CCR-SUBAGENT-MODEL>provider,model</CCR-SUBAGENT-MODEL>` at the **beginning** of the subagent's prompt. This allows you to direct specific subagent tasks to designated models.
|
|
494
|
-
|
|
495
|
-
**Example:**
|
|
496
|
-
|
|
497
|
-
```
|
|
498
|
-
<CCR-SUBAGENT-MODEL>openrouter,anthropic/claude-3.5-sonnet</CCR-SUBAGENT-MODEL>
|
|
499
|
-
Please help me analyze this code snippet for potential optimizations...
|
|
500
|
-
```
|
|
501
|
-
|
|
502
|
-
## Status Line (Beta)
|
|
503
|
-
To better monitor the status of claude-code-router at runtime, version v1.0.40 includes a built-in statusline tool, which you can enable in the UI.
|
|
504
|
-

|
|
505
|
-
|
|
506
|
-
The effect is as follows:
|
|
507
|
-

|
|
508
|
-
|
|
509
|
-
## 🤖 GitHub Actions
|
|
510
|
-
|
|
511
|
-
Integrate Claude Code Router into your CI/CD pipeline. After setting up [Claude Code Actions](https://docs.anthropic.com/en/docs/claude-code/github-actions), modify your `.github/workflows/claude.yaml` to use the router:
|
|
512
|
-
|
|
513
|
-
```yaml
|
|
514
|
-
name: Claude Code
|
|
515
|
-
|
|
516
|
-
on:
|
|
517
|
-
issue_comment:
|
|
518
|
-
types: [created]
|
|
519
|
-
# ... other triggers
|
|
520
|
-
|
|
521
|
-
jobs:
|
|
522
|
-
claude:
|
|
523
|
-
if: |
|
|
524
|
-
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
|
|
525
|
-
# ... other conditions
|
|
526
|
-
runs-on: ubuntu-latest
|
|
527
|
-
permissions:
|
|
528
|
-
contents: read
|
|
529
|
-
pull-requests: read
|
|
530
|
-
issues: read
|
|
531
|
-
id-token: write
|
|
532
|
-
steps:
|
|
533
|
-
- name: Checkout repository
|
|
534
|
-
uses: actions/checkout@v4
|
|
535
|
-
with:
|
|
536
|
-
fetch-depth: 1
|
|
537
|
-
|
|
538
|
-
- name: Prepare Environment
|
|
539
|
-
run: |
|
|
540
|
-
curl -fsSL https://bun.sh/install | bash
|
|
541
|
-
mkdir -p $HOME/.claude-code-router
|
|
542
|
-
cat << 'EOF' > $HOME/.claude-code-router/config.json
|
|
543
|
-
{
|
|
544
|
-
"log": true,
|
|
545
|
-
"NON_INTERACTIVE_MODE": true,
|
|
546
|
-
"OPENAI_API_KEY": "${{ secrets.OPENAI_API_KEY }}",
|
|
547
|
-
"OPENAI_BASE_URL": "https://api.deepseek.com",
|
|
548
|
-
"OPENAI_MODEL": "deepseek-chat"
|
|
549
|
-
}
|
|
550
|
-
EOF
|
|
551
|
-
shell: bash
|
|
552
|
-
|
|
553
|
-
- name: Start Claude Code Router
|
|
554
|
-
run: |
|
|
555
|
-
nohup ~/.bun/bin/bunx @musistudio/claude-code-router@1.0.8 start &
|
|
556
|
-
shell: bash
|
|
557
|
-
|
|
558
|
-
- name: Run Claude Code
|
|
559
|
-
id: claude
|
|
560
|
-
uses: anthropics/claude-code-action@beta
|
|
561
|
-
env:
|
|
562
|
-
ANTHROPIC_BASE_URL: http://localhost:3456
|
|
563
|
-
with:
|
|
564
|
-
anthropic_api_key: "any-string-is-ok"
|
|
565
|
-
```
|
|
566
|
-
|
|
567
|
-
> **Note**: When running in GitHub Actions or other automation environments, make sure to set `"NON_INTERACTIVE_MODE": true` in your configuration to prevent the process from hanging due to stdin handling issues.
|
|
568
|
-
|
|
569
|
-
This setup allows for interesting automations, like running tasks during off-peak hours to reduce API costs.
|
|
570
|
-
|
|
571
|
-
## 📝 Further Reading
|
|
572
|
-
|
|
573
|
-
- [Project Motivation and How It Works](blog/en/project-motivation-and-how-it-works.md)
|
|
574
|
-
- [Maybe We Can Do More with the Router](blog/en/maybe-we-can-do-more-with-the-route.md)
|
|
575
|
-
- [GLM-4.6 Supports Reasoning and Interleaved Thinking](blog/en/glm-4.6-supports-reasoning.md)
|
|
576
|
-
|
|
577
|
-
## ❤️ Support & Sponsoring
|
|
578
|
-
|
|
579
|
-
If you find this project helpful, please consider sponsoring its development. Your support is greatly appreciated!
|
|
580
|
-
|
|
581
|
-
[](https://ko-fi.com/F1F31GN2GM)
|
|
582
|
-
|
|
583
|
-
[Paypal](https://paypal.me/musistudio1999)
|
|
1
|
+
<h1 align="center">Claude Code Router Desktop</h1>
|
|
2
|
+
|
|
3
|
+
<p align="center">
|
|
4
|
+
<a href="README_zh.md"><img alt="Chinese README" src="https://img.shields.io/badge/%F0%9F%87%A8%F0%9F%87%B3-%E4%B8%AD%E6%96%87%E7%89%88-ff0000?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="Documentation" src="https://img.shields.io/badge/Docs-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 screenshot" />
|
|
13
|
+
</p>
|
|
14
|
+
|
|
15
|
+
Claude Code Router Desktop is a local gateway and desktop control panel for routing agent requests from Claude Code, Codex, ZCode, and compatible clients to the model provider you actually want to use.
|
|
16
|
+
|
|
17
|
+
## Why Use CCR
|
|
18
|
+
|
|
19
|
+
- Use one local endpoint for multiple agent tools instead of configuring every client separately.
|
|
20
|
+
- Route requests with default routing, conditional rules, fallback targets, and request rewrites instead of editing client configuration by hand.
|
|
21
|
+
- Mix providers without changing your workflow. CCR supports OpenAI-compatible APIs, Anthropic Messages, Gemini Generate Content, OpenRouter, DeepSeek, SiliconFlow, Moonshot, Kimi Code, Mistral, Z.AI, Bailian, and custom providers.
|
|
22
|
+
- Control cost and reliability with fallback routing, API key rotation, usage statistics, and request logs.
|
|
23
|
+
|
|
24
|
+
## Features
|
|
25
|
+
|
|
26
|
+
- **Overview dashboard**: inspect system status, usage widgets, account balances, model distribution, and share cards.
|
|
27
|
+
- **Provider management**: add provider presets or custom endpoints, probe protocol support, test model connectivity, manage credentials, and monitor supported account balances where available.
|
|
28
|
+
- **Routing rules**: configure default routing, conditional and model-prefix rules, fallback handling, and request rewrites.
|
|
29
|
+
- **Agent Config**: configure Claude Code, Codex, and ZCode launch entries, models, scopes, and multi-instance app profiles.
|
|
30
|
+
- **Gateway compatibility**: translate supported client requests through the local CCR model gateway.
|
|
31
|
+
- **Proxy mode**: capture supported API traffic through a local proxy with optional system proxy integration and network capture.
|
|
32
|
+
- **Fusion models**: combine a base model with vision, web search, or MCP tools into a reusable selectable model.
|
|
33
|
+
|
|
34
|
+
## Documentation
|
|
35
|
+
|
|
36
|
+
Read the full documentation at [ccrdesk.top](https://ccrdesk.top/).
|
|
37
|
+
|
|
38
|
+
## Download And Install
|
|
39
|
+
|
|
40
|
+
1. Open the [GitHub Releases page](https://github.com/musistudio/claude-code-router/releases).
|
|
41
|
+
2. Download the package for your platform:
|
|
42
|
+
- macOS Apple Silicon: `Claude-Code-Router_<version>-mac-Apple-Silicon-arm64.dmg` or `.zip`
|
|
43
|
+
- macOS Intel: `Claude-Code-Router_<version>-mac-Intel-x64.dmg` or `.zip`
|
|
44
|
+
- Windows: `Claude Code Router_<version>.exe`
|
|
45
|
+
- Linux: `Claude Code Router_<version>.AppImage`
|
|
46
|
+
3. Install and launch **Claude Code Router**.
|
|
47
|
+
4. On first launch, CCR creates its local configuration database:
|
|
48
|
+
- macOS/Linux: `~/.claude-code-router/config.sqlite`
|
|
49
|
+
- Windows: `%APPDATA%\Claude Code Router\config.sqlite`
|
|
50
|
+
|
|
51
|
+
CCR stores runtime configuration in SQLite. A legacy `config.json` is read only once for migration when no SQLite config exists.
|
|
52
|
+
|
|
53
|
+
After the service is started from the **Server** page, CCR listens on `http://localhost:8080` by default. The **Server** page controls the gateway `Host`, `Port`, proxy mode, system proxy, network capture, and CA certificate status.
|
|
54
|
+
|
|
55
|
+
## Quick Start
|
|
56
|
+
|
|
57
|
+
CCR can be configured entirely from the desktop UI. Use this setup order for a clean first run.
|
|
58
|
+
|
|
59
|
+
### 1. Add a provider
|
|
60
|
+
|
|
61
|
+
Open **Providers**, click **Add Provider**, then choose a built-in preset or **Other / custom API endpoint**. Fill in the provider name, base URL, protocol, API key, and model list. Run protocol probing and model connectivity checks when available, then save the provider.
|
|
62
|
+
|
|
63
|
+
### 2. Configure routing
|
|
64
|
+
|
|
65
|
+
Open **Routing** to add conditional rules, configure request rewrites, and set fallback behavior.
|
|
66
|
+
|
|
67
|
+
Use **Add Routing Rule** for request conditions, model-prefix routing, or rule-level fallback targets.
|
|
68
|
+
|
|
69
|
+
### 3. Start the gateway
|
|
70
|
+
|
|
71
|
+
Open **Server** and click **Start**. After the page shows Running, CCR listens on `http://localhost:8080`. Enable **Auto start** if you want CCR to start the local gateway whenever the desktop app opens.
|
|
72
|
+
|
|
73
|
+
### 4. Connect your agent tool
|
|
74
|
+
|
|
75
|
+
Open **Agent Config** and choose the client you want to use. Configure Claude Code, Codex, or ZCode, select the target model and effect scope, then apply the config. For app entries, use the **Open Agent** action to open the target app through CCR.
|
|
76
|
+
|
|
77
|
+
### 5. Monitor and adjust
|
|
78
|
+
|
|
79
|
+
Use **Settings → Logs & Observability** to enable request logs and agent observability. Use **Logs** to confirm `request model`, `resolved provider`, `resolved model`, status, tokens, latency, and errors; use the tray window for quick token and account status.
|
|
80
|
+
|
|
81
|
+
## Acknowledgements
|
|
82
|
+
|
|
83
|
+
Codex support is powered by [musistudio/codexl](https://github.com/musistudio/codexl).
|
|
84
|
+
|
|
85
|
+
## Support & Sponsoring
|
|
86
|
+
|
|
87
|
+
<div align="center">
|
|
88
|
+
|
|
89
|
+
<p>If you find this project helpful, please consider sponsoring its development. Your support is greatly appreciated.</p>
|
|
584
90
|
|
|
585
91
|
<table>
|
|
586
92
|
<tr>
|
|
587
|
-
<td
|
|
588
|
-
|
|
93
|
+
<td align="center" width="220">
|
|
94
|
+
<a href="https://ko-fi.com/F1F31GN2GM">
|
|
95
|
+
<img src="https://ko-fi.com/img/githubbutton_sm.svg" alt="Support on Ko-fi" />
|
|
96
|
+
</a>
|
|
97
|
+
<br />
|
|
98
|
+
<sub>One-time support via Ko-fi</sub>
|
|
99
|
+
</td>
|
|
100
|
+
<td align="center" width="220">
|
|
101
|
+
<a href="https://paypal.me/musistudio1999">
|
|
102
|
+
<img src="https://img.shields.io/badge/PayPal-Sponsor-003087?logo=paypal&logoColor=white" alt="Sponsor with PayPal" />
|
|
103
|
+
</a>
|
|
104
|
+
<br />
|
|
105
|
+
<sub>International sponsorship</sub>
|
|
106
|
+
</td>
|
|
589
107
|
</tr>
|
|
590
108
|
</table>
|
|
591
109
|
|
|
110
|
+
<table>
|
|
111
|
+
<tr>
|
|
112
|
+
<td align="center" width="220">
|
|
113
|
+
<strong>Alipay</strong>
|
|
114
|
+
<br />
|
|
115
|
+
<img src="/blog/images/alipay.jpg" width="160" alt="Alipay QR code" />
|
|
116
|
+
</td>
|
|
117
|
+
<td align="center" width="220">
|
|
118
|
+
<strong>WeChat Pay</strong>
|
|
119
|
+
<br />
|
|
120
|
+
<img src="/blog/images/wechat.jpg" width="160" alt="WeChat Pay QR code" />
|
|
121
|
+
</td>
|
|
122
|
+
</tr>
|
|
123
|
+
</table>
|
|
124
|
+
|
|
125
|
+
</div>
|
|
126
|
+
|
|
592
127
|
### Our Sponsors
|
|
593
128
|
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
-
|
|
602
|
-
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
129
|
+
<div align="center">
|
|
130
|
+
|
|
131
|
+
<p>A huge thank you to all our sponsors for their generous support.</p>
|
|
132
|
+
|
|
133
|
+
<table width="100%">
|
|
134
|
+
<tr>
|
|
135
|
+
<td align="center" width="330">
|
|
136
|
+
<a href="https://www.bigmodel.cn/claude-code?ic=FPF9IVAGFJ">
|
|
137
|
+
<img src="/docs/public/provider-icons/zhipu-cn-general.png" width="42" height="42" alt="Zhipu icon" />
|
|
138
|
+
<br />
|
|
139
|
+
<strong>Z智谱</strong>
|
|
140
|
+
</a>
|
|
141
|
+
</td>
|
|
142
|
+
<td align="center" width="330">
|
|
143
|
+
<a href="https://aihubmix.com/">
|
|
144
|
+
<img src="https://www.google.com/s2/favicons?domain=aihubmix.com&sz=128" width="42" height="42" alt="AIHubmix icon" />
|
|
145
|
+
<br />
|
|
146
|
+
<strong>AIHubmix</strong>
|
|
147
|
+
</a>
|
|
148
|
+
</td>
|
|
149
|
+
<td align="center" width="330">
|
|
150
|
+
<a href="https://ai.burncloud.com">
|
|
151
|
+
<img src="https://www.burncloud.com/favicon.png" width="42" height="42" alt="BurnCloud icon" />
|
|
152
|
+
<br />
|
|
153
|
+
<strong>BurnCloud</strong>
|
|
154
|
+
</a>
|
|
155
|
+
</td>
|
|
156
|
+
<td align="center" width="330">
|
|
157
|
+
<a href="https://share.302.ai/ZGVF9w">
|
|
158
|
+
<img src="https://www.google.com/s2/favicons?domain=302.ai&sz=128" width="42" height="42" alt="302.AI icon" />
|
|
159
|
+
<br />
|
|
160
|
+
<strong>302.AI</strong>
|
|
161
|
+
</a>
|
|
162
|
+
</td>
|
|
163
|
+
</tr>
|
|
164
|
+
<tr>
|
|
165
|
+
<td align="center" width="330">
|
|
166
|
+
<a href="https://runapi.co/register?aff=IX1t">
|
|
167
|
+
<img src="/docs/public/provider-icons/runapi.jpg" width="42" height="42" alt="RunAPI icon" />
|
|
168
|
+
<br />
|
|
169
|
+
<strong>RunAPI</strong>
|
|
170
|
+
</a>
|
|
171
|
+
</td>
|
|
172
|
+
<td align="center" width="330">
|
|
173
|
+
<a href="https://teamorouter.com/">
|
|
174
|
+
<img src="/docs/public/provider-icons/teamorouter.png" width="42" height="42" alt="TeamoRouter icon" />
|
|
175
|
+
<br />
|
|
176
|
+
<strong>TeamoRouter</strong>
|
|
177
|
+
</a>
|
|
178
|
+
</td>
|
|
179
|
+
</tr>
|
|
180
|
+
</table>
|
|
181
|
+
|
|
182
|
+
<h4>Community Sponsors</h4>
|
|
183
|
+
|
|
184
|
+
<table width="100%">
|
|
185
|
+
<tr>
|
|
186
|
+
<td align="center" width="220">@Simon Leischnig</td>
|
|
187
|
+
<td align="center" width="220"><a href="https://github.com/duanshuaimin">@duanshuaimin</a></td>
|
|
188
|
+
<td align="center" width="220"><a href="https://github.com/vrgitadmin">@vrgitadmin</a></td>
|
|
189
|
+
<td align="center" width="220">@*o</td>
|
|
190
|
+
<td align="center" width="220"><a href="https://github.com/ceilwoo">@ceilwoo</a></td>
|
|
191
|
+
<td align="center" width="220">@*说</td>
|
|
192
|
+
</tr>
|
|
193
|
+
<tr>
|
|
194
|
+
<td align="center" width="220">@*更</td>
|
|
195
|
+
<td align="center" width="220">@K*g</td>
|
|
196
|
+
<td align="center" width="220">@R*R</td>
|
|
197
|
+
<td align="center" width="220"><a href="https://github.com/bobleer">@bobleer</a></td>
|
|
198
|
+
<td align="center" width="220">@*苗</td>
|
|
199
|
+
<td align="center" width="220">@*划</td>
|
|
200
|
+
</tr>
|
|
201
|
+
<tr>
|
|
202
|
+
<td align="center" width="220"><a href="https://github.com/Clarence-pan">@Clarence-pan</a></td>
|
|
203
|
+
<td align="center" width="220"><a href="https://github.com/carter003">@carter003</a></td>
|
|
204
|
+
<td align="center" width="220">@S*r</td>
|
|
205
|
+
<td align="center" width="220">@*晖</td>
|
|
206
|
+
<td align="center" width="220">@*敏</td>
|
|
207
|
+
<td align="center" width="220">@Z*z</td>
|
|
208
|
+
</tr>
|
|
209
|
+
<tr>
|
|
210
|
+
<td align="center" width="220">@*然</td>
|
|
211
|
+
<td align="center" width="220"><a href="https://github.com/cluic">@cluic</a></td>
|
|
212
|
+
<td align="center" width="220">@*苗</td>
|
|
213
|
+
<td align="center" width="220"><a href="https://github.com/PromptExpert">@PromptExpert</a></td>
|
|
214
|
+
<td align="center" width="220">@*应</td>
|
|
215
|
+
<td align="center" width="220"><a href="https://github.com/yusnake">@yusnake</a></td>
|
|
216
|
+
</tr>
|
|
217
|
+
<tr>
|
|
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
|
+
<td align="center" width="220">@**磊</td>
|
|
224
|
+
</tr>
|
|
225
|
+
<tr>
|
|
226
|
+
<td align="center" width="220">@*琢</td>
|
|
227
|
+
<td align="center" width="220">@*成</td>
|
|
228
|
+
<td align="center" width="220">@Z*o</td>
|
|
229
|
+
<td align="center" width="220">@*琨</td>
|
|
230
|
+
<td align="center" width="220"><a href="https://github.com/congzhangzh">@congzhangzh</a></td>
|
|
231
|
+
<td align="center" width="220">@*_</td>
|
|
232
|
+
</tr>
|
|
233
|
+
<tr>
|
|
234
|
+
<td align="center" width="220">@Z*m</td>
|
|
235
|
+
<td align="center" width="220">@*鑫</td>
|
|
236
|
+
<td align="center" width="220">@c*y</td>
|
|
237
|
+
<td align="center" width="220">@*昕</td>
|
|
238
|
+
<td align="center" width="220"><a href="https://github.com/witsice">@witsice</a></td>
|
|
239
|
+
<td align="center" width="220">@b*g</td>
|
|
240
|
+
</tr>
|
|
241
|
+
<tr>
|
|
242
|
+
<td align="center" width="220">@*亿</td>
|
|
243
|
+
<td align="center" width="220">@*辉</td>
|
|
244
|
+
<td align="center" width="220">@JACK</td>
|
|
245
|
+
<td align="center" width="220">@*光</td>
|
|
246
|
+
<td align="center" width="220">@W*l</td>
|
|
247
|
+
<td align="center" width="220"><a href="https://github.com/kesku">@kesku</a></td>
|
|
248
|
+
</tr>
|
|
249
|
+
<tr>
|
|
250
|
+
<td align="center" width="220"><a href="https://github.com/biguncle">@biguncle</a></td>
|
|
251
|
+
<td align="center" width="220">@二吉吉</td>
|
|
252
|
+
<td align="center" width="220">@a*g</td>
|
|
253
|
+
<td align="center" width="220">@*林</td>
|
|
254
|
+
<td align="center" width="220">@*咸</td>
|
|
255
|
+
<td align="center" width="220">@*明</td>
|
|
256
|
+
</tr>
|
|
257
|
+
<tr>
|
|
258
|
+
<td align="center" width="220">@S*y</td>
|
|
259
|
+
<td align="center" width="220">@f*o</td>
|
|
260
|
+
<td align="center" width="220">@*智</td>
|
|
261
|
+
<td align="center" width="220">@F*t</td>
|
|
262
|
+
<td align="center" width="220">@r*c</td>
|
|
263
|
+
<td align="center" width="220"><a href="https://github.com/qierkang">@qierkang</a></td>
|
|
264
|
+
</tr>
|
|
265
|
+
<tr>
|
|
266
|
+
<td align="center" width="220">@*军</td>
|
|
267
|
+
<td align="center" width="220"><a href="https://github.com/snrise-z">@snrise-z</a></td>
|
|
268
|
+
<td align="center" width="220">@*王</td>
|
|
269
|
+
<td align="center" width="220"><a href="https://github.com/greatheart1000">@greatheart1000</a></td>
|
|
270
|
+
<td align="center" width="220">@*王</td>
|
|
271
|
+
<td align="center" width="220">@zcutlip</td>
|
|
272
|
+
</tr>
|
|
273
|
+
<tr>
|
|
274
|
+
<td align="center" width="220"><a href="https://github.com/Peng-YM">@Peng-YM</a></td>
|
|
275
|
+
<td align="center" width="220">@*更</td>
|
|
276
|
+
<td align="center" width="220">@*.</td>
|
|
277
|
+
<td align="center" width="220">@F*t</td>
|
|
278
|
+
<td align="center" width="220">@*政</td>
|
|
279
|
+
<td align="center" width="220">@*铭</td>
|
|
280
|
+
</tr>
|
|
281
|
+
<tr>
|
|
282
|
+
<td align="center" width="220">@*叶</td>
|
|
283
|
+
<td align="center" width="220">@七*o</td>
|
|
284
|
+
<td align="center" width="220">@*青</td>
|
|
285
|
+
<td align="center" width="220">@**晨</td>
|
|
286
|
+
<td align="center" width="220">@*远</td>
|
|
287
|
+
<td align="center" width="220">@*霄</td>
|
|
288
|
+
</tr>
|
|
289
|
+
<tr>
|
|
290
|
+
<td align="center" width="220">@**吉</td>
|
|
291
|
+
<td align="center" width="220">@**飞</td>
|
|
292
|
+
<td align="center" width="220">@**驰</td>
|
|
293
|
+
<td align="center" width="220">@x*g</td>
|
|
294
|
+
<td align="center" width="220">@**东</td>
|
|
295
|
+
<td align="center" width="220">@*落</td>
|
|
296
|
+
</tr>
|
|
297
|
+
<tr>
|
|
298
|
+
<td align="center" width="220">@哆*k</td>
|
|
299
|
+
<td align="center" width="220">@*涛</td>
|
|
300
|
+
<td align="center" width="220"><a href="https://github.com/WitMiao">@苗大</a></td>
|
|
301
|
+
<td align="center" width="220">@*呢</td>
|
|
302
|
+
<td align="center" width="220">@d*u</td>
|
|
303
|
+
<td align="center" width="220">@crizcraig</td>
|
|
304
|
+
</tr>
|
|
305
|
+
<tr>
|
|
306
|
+
<td align="center" width="220">s*s</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
|
+
<td align="center" width="220">**明</td>
|
|
312
|
+
</tr>
|
|
313
|
+
<tr>
|
|
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
|
+
<td align="center" width="220"></td>
|
|
320
|
+
</tr>
|
|
321
|
+
</table>
|
|
322
|
+
|
|
323
|
+
<sub>If your name is masked, please contact me via my homepage email to update it with your GitHub username.</sub>
|
|
324
|
+
|
|
325
|
+
</div>
|
|
326
|
+
|
|
327
|
+
## License
|
|
328
|
+
|
|
329
|
+
This project is licensed under the [MIT License](LICENSE).
|