yingclaw 2.1.0 → 2.1.3
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 +62 -73
- package/bin/cli.js +76 -0
- package/lib/config.js +4 -0
- package/lib/desktop.js +3 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -10,11 +10,17 @@ Claude Code × 国产大模型,一键接入。
|
|
|
10
10
|
npm install -g yingclaw
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
安装后注册 `claw` 命令。
|
|
14
14
|
|
|
15
|
-
##
|
|
15
|
+
## 快速开始
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
```bash
|
|
18
|
+
claw
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
直接运行 `claw` 进入交互菜单,按步骤操作:安装 Claude Code → 配置 API 连接 → 接入终端或桌面应用。
|
|
22
|
+
|
|
23
|
+
也可以直接运行子命令:
|
|
18
24
|
|
|
19
25
|
**第一步:安装 Claude Code**
|
|
20
26
|
```bash
|
|
@@ -26,109 +32,92 @@ claw install-claude
|
|
|
26
32
|
```bash
|
|
27
33
|
claw config
|
|
28
34
|
```
|
|
29
|
-
选择厂商 → 输入 API Key →
|
|
35
|
+
选择厂商 → 输入 API Key → 选择模型。只保存连接信息,不修改终端环境变量,也不修改 Claude 桌面配置。
|
|
30
36
|
|
|
31
|
-
|
|
37
|
+
**第三步:接入**
|
|
32
38
|
|
|
33
39
|
接入 Claude Code 终端:
|
|
34
40
|
```bash
|
|
35
41
|
claw code
|
|
36
42
|
```
|
|
37
|
-
写入 Claude Code
|
|
43
|
+
写入 Claude Code 所需的环境变量,之后运行 `claude` 即可。
|
|
38
44
|
|
|
39
45
|
接入 Claude 桌面应用:
|
|
40
46
|
```bash
|
|
41
47
|
claw desktop
|
|
42
48
|
```
|
|
43
|
-
|
|
49
|
+
将配置写入 Claude Desktop 第三方推理本地配置。macOS 会自动重启 Claude Desktop;Windows 需手动重新打开。
|
|
44
50
|
|
|
45
|
-
|
|
46
|
-
```bash
|
|
47
|
-
claw code-reset
|
|
48
|
-
```
|
|
49
|
-
只清除 Claude Code 终端环境变量,不影响 API 连接和 Claude 桌面配置。
|
|
51
|
+
## 支持的厂商
|
|
50
52
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
53
|
+
| 厂商 | 主模型 | 快速模型 |
|
|
54
|
+
|------|--------|---------|
|
|
55
|
+
| DeepSeek | deepseek-v4-pro[1m] | deepseek-v4-flash[1m] |
|
|
56
|
+
| Kimi / Moonshot | kimi-k2.5 | kimi-k2.5 |
|
|
57
|
+
| 阿里云百炼 | qwen3-max | qwen3.5-plus |
|
|
58
|
+
| MiniMax | MiniMax-M2.7 | MiniMax-M2.7-Turbo |
|
|
59
|
+
| 智谱 GLM | glm-4.7 | glm-5-turbo |
|
|
60
|
+
| 小米 MiMo | mimo-vl-v2.5-pro | mimo-vl-v2.5-pro |
|
|
61
|
+
| 自定义接口 | 自动获取或手动输入 | — |
|
|
62
|
+
|
|
63
|
+
DeepSeek 的 `[1m]` 后缀是真实 API 模型 ID,表示 100 万 token 上下文窗口([官方说明](https://api-docs.deepseek.com/zh-cn/quick_start/agent_integrations/claude_code))。
|
|
64
|
+
|
|
65
|
+
## 命令列表
|
|
56
66
|
|
|
57
|
-
兼容旧命令:
|
|
58
67
|
```bash
|
|
59
|
-
claw
|
|
68
|
+
claw # 交互菜单(无参数时自动进入)
|
|
69
|
+
claw config # 配置 API 连接
|
|
70
|
+
claw code # 接入 Claude Code 终端
|
|
71
|
+
claw desktop # 接入 Claude 桌面应用
|
|
72
|
+
claw switch # 快速切换厂商或模型
|
|
73
|
+
claw status # 查看当前配置,验证 Key 是否有效
|
|
74
|
+
claw update # 检查并升级到最新版本
|
|
75
|
+
|
|
76
|
+
claw code-reset # 恢复 Claude Code 终端默认配置
|
|
77
|
+
claw desktop-reset # 恢复 Claude 桌面应用默认配置
|
|
78
|
+
claw reset # 清除所有 yingclaw 配置
|
|
79
|
+
|
|
80
|
+
claw install-claude # 安装 Claude Code
|
|
81
|
+
claw setup # 兼容旧命令:config + code
|
|
60
82
|
```
|
|
61
|
-
等价于 `claw config` + `claw code`,用于一键配置 API 并接入 Claude Code 终端。
|
|
62
83
|
|
|
63
|
-
|
|
84
|
+
## 平台支持
|
|
64
85
|
|
|
65
|
-
|
|
66
|
-
|
|
86
|
+
| 平台 | 终端接入 | 桌面接入 |
|
|
87
|
+
|------|---------|---------|
|
|
88
|
+
| macOS | ✅ 写入 `~/.zshrc` | ✅ 自动重启 Claude Desktop |
|
|
89
|
+
| Linux / WSL | ✅ 写入 `~/.zshrc` / `~/.bashrc` | — |
|
|
90
|
+
| Windows | ✅ 写入用户级环境变量(需重开终端) | ✅ 写入 `%APPDATA%\Claude-3p\` |
|
|
67
91
|
|
|
68
|
-
|
|
92
|
+
## 原理
|
|
69
93
|
|
|
70
|
-
|
|
94
|
+
**终端接入**(`claw code`)写入 shell 配置文件或 Windows 用户环境变量:
|
|
71
95
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
96
|
+
```
|
|
97
|
+
ANTHROPIC_BASE_URL
|
|
98
|
+
ANTHROPIC_AUTH_TOKEN / ANTHROPIC_API_KEY
|
|
99
|
+
ANTHROPIC_MODEL
|
|
100
|
+
ANTHROPIC_DEFAULT_OPUS_MODEL / SONNET_MODEL / HAIKU_MODEL
|
|
101
|
+
CLAUDE_CODE_SUBAGENT_MODEL
|
|
102
|
+
CLAUDE_CODE_EFFORT_LEVEL
|
|
75
103
|
```
|
|
76
104
|
|
|
77
|
-
|
|
105
|
+
**桌面接入**(`claw desktop`)写入 Claude Desktop 第三方推理配置:
|
|
78
106
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
| DeepSeek | V4 Flash、V4 Pro |
|
|
82
|
-
| Kimi / Moonshot | Kimi K2.5 |
|
|
83
|
-
| 阿里云百炼 | Qwen3 Max、Plus、Flash |
|
|
84
|
-
| MiniMax | M2.7、M2.7 Turbo、M2.5 |
|
|
85
|
-
| 智谱 GLM | GLM-4.7、GLM-5.1、GLM-5 Turbo、GLM-4.5 Air |
|
|
86
|
-
| 小米 MiMo | MiMo V2.5 Pro |
|
|
87
|
-
| 自定义接口 | 自动获取或手动输入 |
|
|
107
|
+
- macOS:`~/Library/Application Support/Claude-3p/configLibrary/`
|
|
108
|
+
- Windows:`%APPDATA%\Claude-3p\configLibrary\`
|
|
88
109
|
|
|
89
|
-
|
|
110
|
+
使用 `inferenceProvider=gateway`、`inferenceGatewayAuthScheme=bearer`,将 Gateway Base URL 指向对应厂商的 Anthropic 兼容接口。桌面接入要求 Base URL 使用 HTTPS。
|
|
90
111
|
|
|
91
|
-
|
|
92
|
-
claw config # 配置 API 连接,不修改终端或桌面
|
|
93
|
-
claw code # 接入 Claude Code 终端
|
|
94
|
-
claw code-reset # 恢复 Claude Code 终端默认配置
|
|
95
|
-
claw switch # 快速切换模型(只更新 API 连接)
|
|
96
|
-
claw desktop # 接入 Claude 桌面应用第三方推理
|
|
97
|
-
claw desktop-reset # 恢复 Claude 桌面应用默认配置
|
|
98
|
-
claw setup # 兼容旧命令:config + code
|
|
99
|
-
claw status # 查看当前配置,验证 Key 是否有效
|
|
100
|
-
claw reset # 清除 API 连接、终端环境变量和桌面配置
|
|
101
|
-
```
|
|
112
|
+
**自定义接口**需支持 Anthropic `/v1/messages` 格式;工具会根据 Base URL 自动尝试获取模型列表,失败则手动输入。
|
|
102
113
|
|
|
103
114
|
## 卸载
|
|
104
115
|
|
|
105
116
|
```bash
|
|
106
117
|
npm uninstall -g yingclaw
|
|
118
|
+
claw reset # 可选:清除已写入的环境变量和桌面配置
|
|
107
119
|
```
|
|
108
120
|
|
|
109
|
-
## 原理
|
|
110
|
-
|
|
111
|
-
各厂商均原生支持 Anthropic API 格式。`claw config` 只保存 API 连接;`claw code` 才会写入 Claude Code 所需的环境变量。macOS / Linux / WSL 写入 shell 配置文件,Windows 写入用户级环境变量,包括:
|
|
112
|
-
|
|
113
|
-
- `ANTHROPIC_BASE_URL`
|
|
114
|
-
- `ANTHROPIC_AUTH_TOKEN`
|
|
115
|
-
- `ANTHROPIC_API_KEY`
|
|
116
|
-
- `ANTHROPIC_MODEL`
|
|
117
|
-
- `ANTHROPIC_DEFAULT_OPUS_MODEL`
|
|
118
|
-
- `ANTHROPIC_DEFAULT_SONNET_MODEL`
|
|
119
|
-
- `ANTHROPIC_DEFAULT_HAIKU_MODEL`
|
|
120
|
-
- `CLAUDE_CODE_SUBAGENT_MODEL`
|
|
121
|
-
- `CLAUDE_CODE_EFFORT_LEVEL`
|
|
122
|
-
|
|
123
|
-
以 DeepSeek 为例,主模型默认使用 `deepseek-v4-pro[1m]`,Haiku/Subagent 快速模型使用 `deepseek-v4-flash`。如果在线模型列表获取失败,会回退到内置默认列表。
|
|
124
|
-
|
|
125
|
-
`claw desktop` 会额外写入 Claude Desktop 第三方推理配置:
|
|
126
|
-
|
|
127
|
-
- macOS:`~/Library/Application Support/Claude-3p/claude_desktop_config.json`
|
|
128
|
-
- Windows:`%APPDATA%\Claude-3p\claude_desktop_config.json`
|
|
129
|
-
|
|
130
|
-
写入的 `enterpriseConfig` 使用 `inferenceProvider=gateway`、`inferenceGatewayAuthScheme=bearer`,并按旧版方式把当前厂商模型写入 `inferenceModels`。如果本机存在新版 `configLibrary` 本地配置,`claw desktop` 会同步移除,避免 Claude 优先读取旧的错误配置。DeepSeek 的 Claude Code 终端模型仍使用 `deepseek-v4-pro[1m]`;Claude 桌面应用会写入 `deepseek-v4-pro` 和 `deepseek-v4-flash`。
|
|
131
|
-
|
|
132
121
|
## License
|
|
133
122
|
|
|
134
123
|
MIT
|
package/bin/cli.js
CHANGED
|
@@ -825,6 +825,56 @@ program
|
|
|
825
825
|
}
|
|
826
826
|
});
|
|
827
827
|
|
|
828
|
+
program
|
|
829
|
+
.command('update')
|
|
830
|
+
.description('检查并更新 yingclaw 到最新版本')
|
|
831
|
+
.action(async () => {
|
|
832
|
+
const chalk = (await import('chalk')).default;
|
|
833
|
+
const ora = (await import('ora')).default;
|
|
834
|
+
const boxen = (await import('boxen')).default;
|
|
835
|
+
|
|
836
|
+
console.log(await getBanner());
|
|
837
|
+
|
|
838
|
+
const spinner = ora('检查最新版本...').start();
|
|
839
|
+
const latest = await checkForUpdate();
|
|
840
|
+
|
|
841
|
+
if (!latest) {
|
|
842
|
+
spinner.warn(chalk.yellow('无法获取版本信息,请检查网络'));
|
|
843
|
+
return;
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
const current = pkg.version;
|
|
847
|
+
if (compareVersions(latest, current) <= 0) {
|
|
848
|
+
spinner.succeed(chalk.green(`已是最新版本 v${current}`));
|
|
849
|
+
return;
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
spinner.succeed(chalk.green(`发现新版本 v${latest}(当前 v${current})`));
|
|
853
|
+
|
|
854
|
+
const yes = await confirm({ message: `升级到 v${latest}?`, default: true });
|
|
855
|
+
if (!yes) {
|
|
856
|
+
console.log(chalk.dim('已取消'));
|
|
857
|
+
return;
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
const installCmd = buildClaudeInstallCommand('vpn');
|
|
861
|
+
const upgradeCmd = { command: installCmd.command, args: [...installCmd.args.slice(0, -1), 'yingclaw@latest'] };
|
|
862
|
+
|
|
863
|
+
console.log(chalk.dim('\n升级中...\n'));
|
|
864
|
+
const result = spawnSync(upgradeCmd.command, upgradeCmd.args, { stdio: 'inherit' });
|
|
865
|
+
|
|
866
|
+
if (result.status === 0) {
|
|
867
|
+
console.log(boxen(
|
|
868
|
+
chalk.bold(`yingclaw 已升级到 v${latest}\n\n`) +
|
|
869
|
+
chalk.dim('重新运行 ') + chalk.cyan('claw') + chalk.dim(' 使新版本生效'),
|
|
870
|
+
{ padding: { top: 0, bottom: 0, left: 2, right: 2 }, borderStyle: 'round', borderColor: 'green', margin: { top: 1, bottom: 1 } }
|
|
871
|
+
));
|
|
872
|
+
} else {
|
|
873
|
+
console.log(chalk.red('\n升级失败,请手动运行:'));
|
|
874
|
+
console.log(chalk.cyan('npm install -g yingclaw@latest'));
|
|
875
|
+
}
|
|
876
|
+
});
|
|
877
|
+
|
|
828
878
|
async function renderStatusBar(apiStatus) {
|
|
829
879
|
const chalk = (await import('chalk')).default;
|
|
830
880
|
const config = loadConfig();
|
|
@@ -855,6 +905,30 @@ async function renderStatusBar(apiStatus) {
|
|
|
855
905
|
return config ? ` ${cfgPart}` : ` ${claudeIcon} ${claudeText} ${cfgPart}`;
|
|
856
906
|
}
|
|
857
907
|
|
|
908
|
+
async function checkForUpdate() {
|
|
909
|
+
try {
|
|
910
|
+
const controller = new AbortController();
|
|
911
|
+
const timeout = setTimeout(() => controller.abort(), 5000);
|
|
912
|
+
const res = await fetch(`https://registry.npmjs.org/yingclaw/latest`, { signal: controller.signal });
|
|
913
|
+
clearTimeout(timeout);
|
|
914
|
+
if (!res.ok) return null;
|
|
915
|
+
const data = await res.json();
|
|
916
|
+
return data.version || null;
|
|
917
|
+
} catch {
|
|
918
|
+
return null;
|
|
919
|
+
}
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
function compareVersions(a, b) {
|
|
923
|
+
const pa = a.split('.').map(Number);
|
|
924
|
+
const pb = b.split('.').map(Number);
|
|
925
|
+
for (let i = 0; i < 3; i++) {
|
|
926
|
+
if ((pa[i] || 0) > (pb[i] || 0)) return 1;
|
|
927
|
+
if ((pa[i] || 0) < (pb[i] || 0)) return -1;
|
|
928
|
+
}
|
|
929
|
+
return 0;
|
|
930
|
+
}
|
|
931
|
+
|
|
858
932
|
// 缓存上次校验的 config 哈希和结果,避免每次回菜单都重检
|
|
859
933
|
let lastCheckedHash = null;
|
|
860
934
|
let lastCheckResult; // undefined / true / false / null
|
|
@@ -885,6 +959,7 @@ async function runAdvancedMenu(chalk, hasConfig) {
|
|
|
885
959
|
{ name: '↩️ 恢复 Claude Code 终端默认', value: 'code-reset' },
|
|
886
960
|
{ name: '↩️ 恢复 Claude 桌面默认', value: 'desktop-reset' },
|
|
887
961
|
{ name: '🗑 清除所有 yingclaw 配置', value: 'reset' },
|
|
962
|
+
{ name: '⬆️ 检查更新', value: 'update' },
|
|
888
963
|
{ name: chalk.dim('↩ 返回主菜单'), value: '__BACK__' },
|
|
889
964
|
],
|
|
890
965
|
});
|
|
@@ -986,6 +1061,7 @@ async function runMenu() {
|
|
|
986
1061
|
'desktop-reset': 'desktop-reset',
|
|
987
1062
|
status: 'status',
|
|
988
1063
|
reset: 'reset',
|
|
1064
|
+
update: 'update',
|
|
989
1065
|
};
|
|
990
1066
|
|
|
991
1067
|
// 执行子命令(用 spawn 隔离,避免 commander 对 program 的副作用)
|
package/lib/config.js
CHANGED
|
@@ -42,6 +42,7 @@ const PROVIDERS = {
|
|
|
42
42
|
baseUrl: 'https://dashscope.aliyuncs.com/apps/anthropic',
|
|
43
43
|
modelsUrl: 'https://dashscope.aliyuncs.com/compatible-mode/v1/models',
|
|
44
44
|
fastModel: 'qwen3.5-plus',
|
|
45
|
+
noDesktopPrefix: true,
|
|
45
46
|
models: [
|
|
46
47
|
{ name: 'Qwen3 Max(强力)', value: 'qwen3-max' },
|
|
47
48
|
{ name: 'Qwen3 Plus(均衡)', value: 'qwen3-plus' },
|
|
@@ -52,6 +53,7 @@ const PROVIDERS = {
|
|
|
52
53
|
name: 'MiniMax',
|
|
53
54
|
baseUrl: 'https://api.minimaxi.com/anthropic',
|
|
54
55
|
modelsUrl: 'https://api.minimaxi.com/v1/models',
|
|
56
|
+
noDesktopPrefix: true,
|
|
55
57
|
models: [
|
|
56
58
|
{ name: 'MiniMax M2.7(旗舰)', value: 'MiniMax-M2.7' },
|
|
57
59
|
{ name: 'MiniMax M2.7 Turbo(快速)', value: 'MiniMax-M2.7-Turbo' },
|
|
@@ -62,6 +64,7 @@ const PROVIDERS = {
|
|
|
62
64
|
name: '智谱 GLM',
|
|
63
65
|
baseUrl: 'https://open.bigmodel.cn/api/anthropic',
|
|
64
66
|
modelsUrl: 'https://open.bigmodel.cn/api/paas/v4/models',
|
|
67
|
+
noDesktopPrefix: true,
|
|
65
68
|
models: [
|
|
66
69
|
{ name: 'GLM-4.7(旗舰)', value: 'GLM-4.7' },
|
|
67
70
|
{ name: 'GLM-5.1(强力)', value: 'GLM-5.1' },
|
|
@@ -73,6 +76,7 @@ const PROVIDERS = {
|
|
|
73
76
|
name: '小米 MiMo',
|
|
74
77
|
baseUrl: 'https://api.xiaomimimo.com/anthropic',
|
|
75
78
|
modelsUrl: 'https://api.xiaomimimo.com/v1/models',
|
|
79
|
+
noDesktopPrefix: true,
|
|
76
80
|
models: [
|
|
77
81
|
{ name: 'MiMo V2.5 Pro(旗舰)', value: 'mimo-v2.5-pro' },
|
|
78
82
|
],
|
package/lib/desktop.js
CHANGED
|
@@ -3,7 +3,7 @@ const fs = require('fs');
|
|
|
3
3
|
const os = require('os');
|
|
4
4
|
const path = require('path');
|
|
5
5
|
const { spawnSync } = require('child_process');
|
|
6
|
-
const { normalizeAnthropicBaseUrl } = require('./config');
|
|
6
|
+
const { normalizeAnthropicBaseUrl, PROVIDERS } = require('./config');
|
|
7
7
|
|
|
8
8
|
const CLAUDE_DESKTOP_LABEL = 'Claude 桌面应用配置';
|
|
9
9
|
const DESKTOP_GATEWAY_KEYS = [
|
|
@@ -63,7 +63,8 @@ function collectModels(config) {
|
|
|
63
63
|
const list = Array.isArray(config.availableModels) && config.availableModels.length > 0
|
|
64
64
|
? [config.model, config.fastModel, ...config.availableModels]
|
|
65
65
|
: [config.model, config.fastModel];
|
|
66
|
-
|
|
66
|
+
const noPrefix = PROVIDERS[config.provider]?.noDesktopPrefix;
|
|
67
|
+
return [...new Set(list.filter(Boolean).map(m => noPrefix ? m : toDesktopModelId(m)))];
|
|
67
68
|
}
|
|
68
69
|
|
|
69
70
|
// 按官方 schema:所有值必须是字符串(包括布尔、数组都序列化)
|