@aiping.cn/model_router 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/README.md +169 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +149 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/cloud.d.ts +23 -0
- package/dist/providers/cloud.d.ts.map +1 -0
- package/dist/providers/cloud.js +128 -0
- package/dist/providers/cloud.js.map +1 -0
- package/dist/providers/local.d.ts +25 -0
- package/dist/providers/local.d.ts.map +1 -0
- package/dist/providers/local.js +167 -0
- package/dist/providers/local.js.map +1 -0
- package/dist/router/router.d.ts +10 -0
- package/dist/router/router.d.ts.map +1 -0
- package/dist/router/router.js +48 -0
- package/dist/router/router.js.map +1 -0
- package/dist/router/rules.d.ts +61 -0
- package/dist/router/rules.d.ts.map +1 -0
- package/dist/router/rules.js +178 -0
- package/dist/router/rules.js.map +1 -0
- package/dist/router/scorer.d.ts +7 -0
- package/dist/router/scorer.d.ts.map +1 -0
- package/dist/router/scorer.js +34 -0
- package/dist/router/scorer.js.map +1 -0
- package/dist/setup/detector.d.ts +28 -0
- package/dist/setup/detector.d.ts.map +1 -0
- package/dist/setup/detector.js +169 -0
- package/dist/setup/detector.js.map +1 -0
- package/dist/setup/wizard.d.ts +6 -0
- package/dist/setup/wizard.d.ts.map +1 -0
- package/dist/setup/wizard.js +527 -0
- package/dist/setup/wizard.js.map +1 -0
- package/dist/types.d.ts +66 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +17 -0
- package/dist/types.js.map +1 -0
- package/openclaw.plugin.json +70 -0
- package/package.json +52 -0
|
@@ -0,0 +1,527 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.runSetupWizard = runSetupWizard;
|
|
37
|
+
const readline = __importStar(require("readline/promises"));
|
|
38
|
+
const process_1 = require("process");
|
|
39
|
+
const os = __importStar(require("os"));
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const types_js_1 = require("../types.js");
|
|
43
|
+
const detector_js_1 = require("./detector.js");
|
|
44
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
45
|
+
// Terminal colour helpers
|
|
46
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
47
|
+
const isTTY = process.stdout.isTTY ?? false;
|
|
48
|
+
const c = {
|
|
49
|
+
bold: (s) => isTTY ? `\x1b[1m${s}\x1b[0m` : s,
|
|
50
|
+
green: (s) => isTTY ? `\x1b[32m${s}\x1b[0m` : s,
|
|
51
|
+
yellow: (s) => isTTY ? `\x1b[33m${s}\x1b[0m` : s,
|
|
52
|
+
cyan: (s) => isTTY ? `\x1b[36m${s}\x1b[0m` : s,
|
|
53
|
+
red: (s) => isTTY ? `\x1b[31m${s}\x1b[0m` : s,
|
|
54
|
+
dim: (s) => isTTY ? `\x1b[2m${s}\x1b[0m` : s,
|
|
55
|
+
blue: (s) => isTTY ? `\x1b[34m${s}\x1b[0m` : s,
|
|
56
|
+
};
|
|
57
|
+
function hr() { console.log(c.dim('─'.repeat(58))); }
|
|
58
|
+
function blank() { console.log(''); }
|
|
59
|
+
function tip(t) { console.log(c.dim(` 💡 ${t}`)); }
|
|
60
|
+
function warn(t) { console.log(c.yellow(` ⚠️ ${t}`)); }
|
|
61
|
+
function ok(t) { console.log(c.green(` ✅ ${t}`)); }
|
|
62
|
+
function fail(t) { console.log(c.red(` ❌ ${t}`)); }
|
|
63
|
+
function info(t) { console.log(` ${t}`); }
|
|
64
|
+
function cmd(t) { console.log(c.cyan(` $ ${t}`)); }
|
|
65
|
+
function step(n) { blank(); hr(); console.log(c.bold(` ${n}`)); hr(); blank(); }
|
|
66
|
+
function spinner(t) { process.stdout.write(c.dim(` ⏳ ${t}...`)); }
|
|
67
|
+
function spinnerEnd() { process.stdout.write('\r' + ' '.repeat(60) + '\r'); }
|
|
68
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
69
|
+
// Write aiping:claw as default model into OpenClaw config file
|
|
70
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
71
|
+
async function trySetDefaultModel() {
|
|
72
|
+
const candidates = [
|
|
73
|
+
path.join(os.homedir(), '.openclaw', 'config.json'),
|
|
74
|
+
path.join(os.homedir(), '.config', 'openclaw', 'config.json'),
|
|
75
|
+
];
|
|
76
|
+
for (const p of candidates) {
|
|
77
|
+
try {
|
|
78
|
+
if (!fs.existsSync(p))
|
|
79
|
+
continue;
|
|
80
|
+
const cfg = JSON.parse(fs.readFileSync(p, 'utf8'));
|
|
81
|
+
cfg['defaultModel'] = 'aiping:claw';
|
|
82
|
+
fs.writeFileSync(p, JSON.stringify(cfg, null, 2), 'utf8');
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
catch { /* try next */ }
|
|
86
|
+
}
|
|
87
|
+
// Create fresh config
|
|
88
|
+
const newPath = candidates[0];
|
|
89
|
+
try {
|
|
90
|
+
fs.mkdirSync(path.dirname(newPath), { recursive: true });
|
|
91
|
+
fs.writeFileSync(newPath, JSON.stringify({ defaultModel: 'aiping:claw' }, null, 2), 'utf8');
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
99
|
+
// Print Ollama status banner
|
|
100
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
101
|
+
function printOllamaStatus(status, baseUrl) {
|
|
102
|
+
if (!status.binaryFound) {
|
|
103
|
+
fail('未检测到 Ollama 可执行文件');
|
|
104
|
+
info('');
|
|
105
|
+
info(' Ollama 是在本机运行开源大模型的工具,安装非常简单:');
|
|
106
|
+
blank();
|
|
107
|
+
info(' macOS / Linux:');
|
|
108
|
+
cmd('curl -fsSL https://ollama.com/install.sh | sh');
|
|
109
|
+
blank();
|
|
110
|
+
info(' Windows / 图形界面安装包:');
|
|
111
|
+
tip(c.cyan('https://ollama.com/download'));
|
|
112
|
+
blank();
|
|
113
|
+
info(' 安装后请重新运行此向导:');
|
|
114
|
+
cmd('openclaw run aiping:setup');
|
|
115
|
+
}
|
|
116
|
+
else if (!status.serviceRunning) {
|
|
117
|
+
warn(`Ollama 已安装,但服务未运行(地址:${baseUrl})`);
|
|
118
|
+
blank();
|
|
119
|
+
info(' 请在终端运行以下命令启动 Ollama 服务:');
|
|
120
|
+
cmd('ollama serve');
|
|
121
|
+
blank();
|
|
122
|
+
info(' 启动后按 Enter 重新检测,或继续配置(稍后修复)。');
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
ok(`Ollama 服务运行中(${baseUrl}),响应 ${status.latencyMs}ms`);
|
|
126
|
+
if (status.models.length === 0) {
|
|
127
|
+
warn('暂无已下载的模型');
|
|
128
|
+
blank();
|
|
129
|
+
info(' 请先拉取一个本地模型,推荐:');
|
|
130
|
+
cmd('ollama pull qwen2.5:4b # 约 2.3 GB,中文能力强');
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
ok(`已检测到 ${status.models.length} 个本地模型`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
138
|
+
// Print AIPing status banner
|
|
139
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
140
|
+
function printAipingStatus(status) {
|
|
141
|
+
if (!status.reachable) {
|
|
142
|
+
fail(`AIPing 服务不可达:${status.error ?? '网络错误'}`);
|
|
143
|
+
warn('请检查网络连接,或确认 https://aiping.cn 可正常访问。');
|
|
144
|
+
}
|
|
145
|
+
else if (!status.keyValid) {
|
|
146
|
+
if (status.errorCode === 429) {
|
|
147
|
+
warn(`API Key 有效,但请求被限速(429)。响应 ${status.latencyMs}ms`);
|
|
148
|
+
tip('等待几秒后自动恢复,不影响正常使用。');
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
fail(`API Key 验证失败:${status.error ?? '未知错误'}`);
|
|
152
|
+
warn('请到以下地址检查或重新生成 Key:');
|
|
153
|
+
tip(c.cyan('https://aiping.cn/user/user-center'));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
ok(`AIPing 云端(${status.model})连接正常,响应 ${status.latencyMs}ms`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
161
|
+
// Interactive model picker
|
|
162
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
163
|
+
async function pickLocalModel(rl, available, defaultModel) {
|
|
164
|
+
if (available.length === 0) {
|
|
165
|
+
blank();
|
|
166
|
+
info(' 未检测到可用的本地模型,以下是推荐选项(供下载参考):');
|
|
167
|
+
blank();
|
|
168
|
+
detector_js_1.RECOMMENDED_MODELS.forEach((m, i) => {
|
|
169
|
+
info(` ${c.bold(`[${i + 1}]`)} ${c.cyan(m.name.padEnd(18))} ${m.size.padEnd(10)} ${c.dim(m.desc)}`);
|
|
170
|
+
});
|
|
171
|
+
blank();
|
|
172
|
+
const input = await rl.question(` 手动输入模型名称 [${defaultModel}]:`);
|
|
173
|
+
return input.trim() || defaultModel;
|
|
174
|
+
}
|
|
175
|
+
blank();
|
|
176
|
+
info(' 检测到以下本地模型,请选择序号,或直接输入模型名称:');
|
|
177
|
+
blank();
|
|
178
|
+
available.forEach((m, i) => {
|
|
179
|
+
const marker = m.name === defaultModel ? c.green(' ← 当前默认') : '';
|
|
180
|
+
const size = m.size ? c.dim(` (${m.size})`) : '';
|
|
181
|
+
info(` ${c.bold(`[${i + 1}]`)} ${c.cyan(m.name)}${size}${marker}`);
|
|
182
|
+
});
|
|
183
|
+
blank();
|
|
184
|
+
const defaultIdx = available.findIndex((m) => m.name === defaultModel);
|
|
185
|
+
const hint = defaultIdx >= 0 ? `[${defaultIdx + 1}]` : `[输入模型名]`;
|
|
186
|
+
const raw = await rl.question(` 请选择本地模型 ${hint}:`);
|
|
187
|
+
const trimmed = raw.trim();
|
|
188
|
+
if (!trimmed)
|
|
189
|
+
return defaultModel;
|
|
190
|
+
// Numeric selection
|
|
191
|
+
const idx = parseInt(trimmed, 10);
|
|
192
|
+
if (!isNaN(idx) && idx >= 1 && idx <= available.length) {
|
|
193
|
+
return available[idx - 1].name;
|
|
194
|
+
}
|
|
195
|
+
// Direct name input
|
|
196
|
+
return trimmed;
|
|
197
|
+
}
|
|
198
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
199
|
+
// AIPing key input loop — retries until valid or user explicitly skips
|
|
200
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
201
|
+
async function promptAipingKey(rl, existingKey, cloudModel) {
|
|
202
|
+
let currentKey = existingKey ?? '';
|
|
203
|
+
let attempts = 0;
|
|
204
|
+
while (true) {
|
|
205
|
+
const hint = currentKey ? ' [已设置,直接回车保留;输入新 Key 替换]' : '';
|
|
206
|
+
const raw = await rl.question(`\n 请输入 AIPing API Key${hint}:`);
|
|
207
|
+
const entered = raw.trim();
|
|
208
|
+
const key = entered || currentKey;
|
|
209
|
+
if (!key) {
|
|
210
|
+
warn('未填写 API Key,云端路由将不可用。');
|
|
211
|
+
const skip = await rl.question(' 跳过云端配置,仅使用本地模型?[yes/no]:');
|
|
212
|
+
if (!['no', 'n', '不', '否'].includes(skip.trim().toLowerCase())) {
|
|
213
|
+
return { key: '', verified: false };
|
|
214
|
+
}
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
attempts++;
|
|
218
|
+
blank();
|
|
219
|
+
spinner(`正在验证 Key(第 ${attempts} 次)`);
|
|
220
|
+
const status = await (0, detector_js_1.detectAiping)(key, cloudModel);
|
|
221
|
+
spinnerEnd();
|
|
222
|
+
printAipingStatus(status);
|
|
223
|
+
if (status.keyValid || status.errorCode === 429) {
|
|
224
|
+
return { key, verified: true };
|
|
225
|
+
}
|
|
226
|
+
if (!status.reachable) {
|
|
227
|
+
// Network issue — not a key problem; let user decide
|
|
228
|
+
warn('网络检测失败,可能是网络问题。');
|
|
229
|
+
const skip = await rl.question(' 继续配置(之后修复网络)?[yes/no]:');
|
|
230
|
+
if (!['no', 'n', '不', '否'].includes(skip.trim().toLowerCase())) {
|
|
231
|
+
return { key, verified: false };
|
|
232
|
+
}
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
// Invalid key
|
|
236
|
+
blank();
|
|
237
|
+
info(' 请到以下地址获取或重新生成 API Key:');
|
|
238
|
+
tip(c.cyan('https://aiping.cn/user/user-center'));
|
|
239
|
+
const retry = await rl.question(' 重新输入 Key?[yes/no]:');
|
|
240
|
+
if (['no', 'n', '不', '否'].includes(retry.trim().toLowerCase())) {
|
|
241
|
+
return { key, verified: false };
|
|
242
|
+
}
|
|
243
|
+
currentKey = '';
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
247
|
+
// Ollama service probe loop — detects, prints status, optionally waits for fix
|
|
248
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
249
|
+
async function probeOllamaWithRepair(rl, baseUrl) {
|
|
250
|
+
let status = await (0, detector_js_1.detectOllama)(baseUrl);
|
|
251
|
+
while (!status.serviceRunning) {
|
|
252
|
+
printOllamaStatus(status, baseUrl);
|
|
253
|
+
blank();
|
|
254
|
+
if (!status.binaryFound) {
|
|
255
|
+
// Binary not found — user needs to install; can't fix here
|
|
256
|
+
const cont = await rl.question(' 安装 Ollama 后按 Enter 重新检测,或输入 "skip" 跳过本地模型配置:');
|
|
257
|
+
if (cont.trim().toLowerCase() === 'skip')
|
|
258
|
+
return status;
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
// Installed but not running
|
|
262
|
+
const cont = await rl.question(' 运行 "ollama serve" 后按 Enter 重新检测,或输入 "skip" 跳过:');
|
|
263
|
+
if (cont.trim().toLowerCase() === 'skip')
|
|
264
|
+
return status;
|
|
265
|
+
}
|
|
266
|
+
blank();
|
|
267
|
+
spinner('重新检测 Ollama');
|
|
268
|
+
status = await (0, detector_js_1.detectOllama)(baseUrl);
|
|
269
|
+
spinnerEnd();
|
|
270
|
+
}
|
|
271
|
+
return status;
|
|
272
|
+
}
|
|
273
|
+
async function verifyConnectivity(config) {
|
|
274
|
+
const [localResult, cloudResult] = await Promise.all([
|
|
275
|
+
(0, detector_js_1.detectOllama)(config.localProxyUrl),
|
|
276
|
+
config.aipingApiKey
|
|
277
|
+
? (0, detector_js_1.detectAiping)(config.aipingApiKey, config.cloudModel)
|
|
278
|
+
: Promise.resolve({ reachable: false, keyValid: false, model: config.cloudModel }),
|
|
279
|
+
]);
|
|
280
|
+
return {
|
|
281
|
+
localOk: localResult.serviceRunning && localResult.models.some((m) => m.name === config.localModel || m.name.startsWith(config.localModel.split(':')[0])),
|
|
282
|
+
cloudOk: cloudResult.keyValid || cloudResult.errorCode === 429,
|
|
283
|
+
localLatency: localResult.latencyMs,
|
|
284
|
+
cloudLatency: cloudResult.latencyMs,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
288
|
+
// Main wizard
|
|
289
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
290
|
+
async function runSetupWizard(existingConfig = {}) {
|
|
291
|
+
const rl = readline.createInterface({ input: process_1.stdin, output: process_1.stdout });
|
|
292
|
+
blank();
|
|
293
|
+
console.log(c.bold('╔══════════════════════════════════════════════════════════╗'));
|
|
294
|
+
console.log(c.bold('║ 🚀 AIPing Model Router 配置向导 v1.2 ║'));
|
|
295
|
+
console.log(c.bold('║ 智能路由:本地小模型 + 云端强模型,自动检测修复 ║'));
|
|
296
|
+
console.log(c.bold('╚══════════════════════════════════════════════════════════╝'));
|
|
297
|
+
blank();
|
|
298
|
+
info('向导将自动检测环境,并引导你修复任何问题,确保安装完即可使用。');
|
|
299
|
+
info('中途可按 Ctrl+C 退出,稍后运行 ' + c.cyan('openclaw run aiping:setup') + ' 重新配置。');
|
|
300
|
+
blank();
|
|
301
|
+
try {
|
|
302
|
+
// ── 环境预检:自动扫描 Ollama ──────────────────────────────────────────
|
|
303
|
+
step('环境预检 · 自动扫描本地 Ollama');
|
|
304
|
+
const localProxyUrl = existingConfig.localProxyUrl ?? types_js_1.DEFAULT_CONFIG.localProxyUrl;
|
|
305
|
+
spinner('正在扫描 Ollama 服务');
|
|
306
|
+
const initialOllama = await (0, detector_js_1.detectOllama)(localProxyUrl);
|
|
307
|
+
spinnerEnd();
|
|
308
|
+
if (initialOllama.serviceRunning) {
|
|
309
|
+
ok(`Ollama 服务运行中(${localProxyUrl}),响应 ${initialOllama.latencyMs}ms`);
|
|
310
|
+
if (initialOllama.models.length > 0) {
|
|
311
|
+
ok(`检测到 ${initialOllama.models.length} 个本地模型:${initialOllama.models.map((m) => m.name).join('、')}`);
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
warn('服务运行但暂无已下载模型,稍后将提示下载。');
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
printOllamaStatus(initialOllama, localProxyUrl);
|
|
319
|
+
}
|
|
320
|
+
blank();
|
|
321
|
+
// ── 第一步:AIPing API Key ──────────────────────────────────────────────
|
|
322
|
+
step('第 1 步 / 4 · 配置 AIPing 云端 API Key');
|
|
323
|
+
info('AIPing 是本插件对接的云端 AI 服务(https://aiping.cn/api/v1)。');
|
|
324
|
+
info('云端模型(Kimi-2.5)仅在复杂请求时使用,约 10% 的请求量。');
|
|
325
|
+
blank();
|
|
326
|
+
info('获取 API Key 步骤:');
|
|
327
|
+
info(' 1. 访问 ' + c.cyan('https://aiping.cn/user/user-center'));
|
|
328
|
+
info(' 2. 登录后进入「API 密钥」页面');
|
|
329
|
+
info(' 3. 点击「创建密钥」,复制以 sk- 开头的字符串');
|
|
330
|
+
blank();
|
|
331
|
+
const cloudModel = existingConfig.cloudModel ?? types_js_1.DEFAULT_CONFIG.cloudModel;
|
|
332
|
+
const { key: aipingApiKey, verified: cloudVerified } = await promptAipingKey(rl, existingConfig.aipingApiKey, cloudModel);
|
|
333
|
+
blank();
|
|
334
|
+
// ── 第二步:本地模型配置 ────────────────────────────────────────────────
|
|
335
|
+
step('第 2 步 / 4 · 配置本地模型(Ollama)');
|
|
336
|
+
info('本插件默认约 90% 请求走本地模型——零延迟、零费用。');
|
|
337
|
+
blank();
|
|
338
|
+
// Allow user to change the proxy URL
|
|
339
|
+
const localUrlInput = await rl.question(` Ollama 服务地址 [${localProxyUrl}](直接回车保持默认):`);
|
|
340
|
+
const finalLocalUrl = localUrlInput.trim() || localProxyUrl;
|
|
341
|
+
// If URL changed, re-probe
|
|
342
|
+
let ollamaStatus = initialOllama;
|
|
343
|
+
if (finalLocalUrl !== localProxyUrl) {
|
|
344
|
+
spinner('重新检测新地址');
|
|
345
|
+
ollamaStatus = await (0, detector_js_1.detectOllama)(finalLocalUrl);
|
|
346
|
+
spinnerEnd();
|
|
347
|
+
}
|
|
348
|
+
// Repair loop if service not running
|
|
349
|
+
if (!ollamaStatus.serviceRunning) {
|
|
350
|
+
blank();
|
|
351
|
+
ollamaStatus = await probeOllamaWithRepair(rl, finalLocalUrl);
|
|
352
|
+
}
|
|
353
|
+
// Model selection
|
|
354
|
+
const localModel = await pickLocalModel(rl, ollamaStatus.models, existingConfig.localModel ?? types_js_1.DEFAULT_CONFIG.localModel);
|
|
355
|
+
// If model not yet downloaded, offer pull command
|
|
356
|
+
const modelAvailable = ollamaStatus.models.some((m) => m.name === localModel || m.name.startsWith(localModel.split(':')[0]));
|
|
357
|
+
if (!modelAvailable && ollamaStatus.serviceRunning) {
|
|
358
|
+
blank();
|
|
359
|
+
warn(`模型 "${localModel}" 尚未下载到本地。`);
|
|
360
|
+
info(' 请在另一个终端运行以下命令下载(可继续后续配置):');
|
|
361
|
+
cmd(`ollama pull ${localModel}`);
|
|
362
|
+
blank();
|
|
363
|
+
const waitPull = await rl.question(' 下载完成后按 Enter 继续,或直接回车跳过等待:');
|
|
364
|
+
if (waitPull.trim() === '') {
|
|
365
|
+
// Re-check
|
|
366
|
+
blank();
|
|
367
|
+
spinner(`验证模型 ${localModel}`);
|
|
368
|
+
const refreshed = await (0, detector_js_1.detectOllama)(finalLocalUrl);
|
|
369
|
+
spinnerEnd();
|
|
370
|
+
const nowAvailable = refreshed.models.some((m) => m.name === localModel || m.name.startsWith(localModel.split(':')[0]));
|
|
371
|
+
if (nowAvailable) {
|
|
372
|
+
ok(`模型 ${localModel} 已就绪!`);
|
|
373
|
+
}
|
|
374
|
+
else {
|
|
375
|
+
warn(`模型 ${localModel} 未检测到,请确认下载完成后重启插件。`);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
else if (modelAvailable) {
|
|
380
|
+
blank();
|
|
381
|
+
ok(`模型 ${localModel} 已就绪`);
|
|
382
|
+
}
|
|
383
|
+
blank();
|
|
384
|
+
tip('如本地代理需要鉴权(如 LM Studio),填写 Key;无需则直接回车:');
|
|
385
|
+
const localProxyKeyInput = await rl.question(' 本地代理 Key(可选):');
|
|
386
|
+
const localProxyKey = localProxyKeyInput.trim() || existingConfig.localProxyKey || '';
|
|
387
|
+
blank();
|
|
388
|
+
// ── 第三步:路由策略 ────────────────────────────────────────────────────
|
|
389
|
+
step('第 3 步 / 4 · 路由策略配置');
|
|
390
|
+
info('插件对每条消息打分(满分 85 分),超过阈值才路由到云端:');
|
|
391
|
+
blank();
|
|
392
|
+
info(` ${c.cyan('Token 数量 > 4000')} → +30 分 (超长上下文)`);
|
|
393
|
+
info(` ${c.cyan('代码块 > 80 行')} → +20 分 (大型代码分析)`);
|
|
394
|
+
info(` ${c.cyan('强推理关键词')} → +15 分 ("深度分析"/"step by step")`);
|
|
395
|
+
info(` ${c.cyan('对话轮次 > 16 轮')} → +20 分 (超长多轮历史)`);
|
|
396
|
+
blank();
|
|
397
|
+
info(` 当前建议:阈值设 ${c.bold('85')} → 约 90% 请求走本地`);
|
|
398
|
+
info(' 范围参考:70(偏云端)/ 85(推荐)/ 95(几乎全本地)');
|
|
399
|
+
blank();
|
|
400
|
+
const defThreshold = existingConfig.routingThreshold ?? types_js_1.DEFAULT_CONFIG.routingThreshold;
|
|
401
|
+
const threshInput = await rl.question(` 路由阈值 [${defThreshold}]:`);
|
|
402
|
+
const routingThreshold = parseInt(threshInput.trim(), 10) || defThreshold;
|
|
403
|
+
blank();
|
|
404
|
+
tip('强烈建议开启失败自动回退:本地无响应时自动切换到云端。');
|
|
405
|
+
const fbInput = await rl.question(' 本地失败时自动切换到云端?[yes]:');
|
|
406
|
+
const fallbackToCloud = !['no', 'false', 'n', '否', '不'].includes(fbInput.trim().toLowerCase());
|
|
407
|
+
blank();
|
|
408
|
+
info(' 你也可以在消息末尾加指令强制覆盖路由决策:');
|
|
409
|
+
info(c.dim(' "帮我写个函数 @local" → 强制走本地'));
|
|
410
|
+
info(c.dim(' "系统架构评审 @cloud" → 强制走云端'));
|
|
411
|
+
blank();
|
|
412
|
+
// ── 第四步:最终验证 + 设置默认模型 ───────────────────────────────────
|
|
413
|
+
step('第 4 步 / 4 · 连通性验证 & 设为默认模型');
|
|
414
|
+
const config = {
|
|
415
|
+
aipingApiKey,
|
|
416
|
+
localProxyUrl: finalLocalUrl,
|
|
417
|
+
localProxyKey,
|
|
418
|
+
localModel,
|
|
419
|
+
cloudModel,
|
|
420
|
+
routingThreshold,
|
|
421
|
+
fallbackToCloud,
|
|
422
|
+
localTimeoutMs: existingConfig.localTimeoutMs ?? types_js_1.DEFAULT_CONFIG.localTimeoutMs,
|
|
423
|
+
debugRouting: existingConfig.debugRouting ?? types_js_1.DEFAULT_CONFIG.debugRouting,
|
|
424
|
+
};
|
|
425
|
+
// Full connectivity check
|
|
426
|
+
info('正在进行最终连通性验证...');
|
|
427
|
+
blank();
|
|
428
|
+
spinner('验证本地 Ollama');
|
|
429
|
+
const finalOllama = await (0, detector_js_1.detectOllama)(finalLocalUrl);
|
|
430
|
+
spinnerEnd();
|
|
431
|
+
if (finalOllama.serviceRunning) {
|
|
432
|
+
ok(`本地 Ollama(${localModel}):服务正常,响应 ${finalOllama.latencyMs}ms`);
|
|
433
|
+
}
|
|
434
|
+
else {
|
|
435
|
+
fail(`本地 Ollama(${localModel}):服务未就绪`);
|
|
436
|
+
if (fallbackToCloud && aipingApiKey) {
|
|
437
|
+
info(' → 已开启云端回退,本地失败时自动切换到云端。');
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
warn('本地不可用且无回退,请安装并启动 Ollama:');
|
|
441
|
+
cmd('ollama serve');
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
if (aipingApiKey) {
|
|
445
|
+
blank();
|
|
446
|
+
spinner('验证 AIPing 云端');
|
|
447
|
+
const finalCloud = await (0, detector_js_1.detectAiping)(aipingApiKey, cloudModel);
|
|
448
|
+
spinnerEnd();
|
|
449
|
+
printAipingStatus(finalCloud);
|
|
450
|
+
// Key validation failed — offer one more chance to re-enter
|
|
451
|
+
if (!finalCloud.keyValid && finalCloud.reachable && finalCloud.errorCode !== 429) {
|
|
452
|
+
blank();
|
|
453
|
+
warn('云端验证失败。是否重新输入 API Key?');
|
|
454
|
+
const rekey = await rl.question(' 输入新 Key(直接回车跳过):');
|
|
455
|
+
if (rekey.trim()) {
|
|
456
|
+
spinner('重新验证');
|
|
457
|
+
const retry = await (0, detector_js_1.detectAiping)(rekey.trim(), cloudModel);
|
|
458
|
+
spinnerEnd();
|
|
459
|
+
printAipingStatus(retry);
|
|
460
|
+
if (retry.keyValid || retry.errorCode === 429) {
|
|
461
|
+
config.aipingApiKey = rekey.trim();
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
else {
|
|
467
|
+
warn('未配置 AIPing API Key,云端路由不可用。');
|
|
468
|
+
}
|
|
469
|
+
// Abort if nothing works
|
|
470
|
+
const report = await verifyConnectivity(config);
|
|
471
|
+
if (!report.localOk && !report.cloudOk) {
|
|
472
|
+
blank();
|
|
473
|
+
hr();
|
|
474
|
+
console.log(c.red(c.bold(' ⚠️ 警告:本地和云端均未就绪')));
|
|
475
|
+
hr();
|
|
476
|
+
info('配置已保存,但当前 aiping:claw 无法处理任何请求。');
|
|
477
|
+
info('请修复后运行:' + c.cyan(' openclaw run aiping:setup'));
|
|
478
|
+
blank();
|
|
479
|
+
}
|
|
480
|
+
// Set as default model
|
|
481
|
+
blank();
|
|
482
|
+
hr();
|
|
483
|
+
const setDefaultInput = await rl.question(' 是否将 aiping:claw 设为 OpenClaw 默认模型?[yes]:');
|
|
484
|
+
const shouldSetDefault = !['no', 'false', 'n', '否', '不'].includes(setDefaultInput.trim().toLowerCase());
|
|
485
|
+
if (shouldSetDefault) {
|
|
486
|
+
const success = await trySetDefaultModel();
|
|
487
|
+
if (success) {
|
|
488
|
+
ok('aiping:claw 已设为 OpenClaw 默认模型。');
|
|
489
|
+
}
|
|
490
|
+
else {
|
|
491
|
+
warn('自动写入失败,请手动运行:');
|
|
492
|
+
cmd('openclaw config set defaultModel "aiping:claw"');
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
// ── 完成摘要 ───────────────────────────────────────────────────────────
|
|
496
|
+
blank();
|
|
497
|
+
hr();
|
|
498
|
+
console.log(c.bold(c.green(' 🎉 配置完成!')));
|
|
499
|
+
hr();
|
|
500
|
+
blank();
|
|
501
|
+
const localStatus = report.localOk
|
|
502
|
+
? c.green('✅ 正常')
|
|
503
|
+
: c.red('❌ 未就绪(请运行 ollama serve)');
|
|
504
|
+
const cloudStatus = report.cloudOk
|
|
505
|
+
? c.green('✅ 正常')
|
|
506
|
+
: (aipingApiKey ? c.red('❌ 验证失败') : c.dim('— 未配置'));
|
|
507
|
+
info(' ┌─────────────────────────────────────────────────┐');
|
|
508
|
+
info(` │ 本地模型 ${localModel.padEnd(20)} ${localStatus.padEnd(10)}`);
|
|
509
|
+
info(` │ 云端模型 ${cloudModel.padEnd(20)} ${cloudStatus.padEnd(10)}`);
|
|
510
|
+
info(` │ 路由阈值 ${String(routingThreshold).padEnd(20)} (~90% 走本地)`);
|
|
511
|
+
info(` │ 失败回退 ${fallbackToCloud ? '开启' : '关闭'}`);
|
|
512
|
+
info(' └─────────────────────────────────────────────────┘');
|
|
513
|
+
blank();
|
|
514
|
+
info(' 在 OpenClaw 中选择模型 ' + c.bold(c.cyan('"aiping:claw"')) + ' 即可开始使用。');
|
|
515
|
+
blank();
|
|
516
|
+
info(' 常用命令:');
|
|
517
|
+
info(c.dim(' openclaw run aiping:setup # 重新配置'));
|
|
518
|
+
info(c.dim(' openclaw plugins config @aiping.cn/model_router list # 查看配置'));
|
|
519
|
+
info(c.dim(' openclaw plugins config @aiping.cn/model_router set debugRouting true # 路由日志'));
|
|
520
|
+
blank();
|
|
521
|
+
return config;
|
|
522
|
+
}
|
|
523
|
+
finally {
|
|
524
|
+
rl.close();
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
//# sourceMappingURL=wizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../src/setup/wizard.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
export interface PluginConfig {
|
|
2
|
+
aipingApiKey: string;
|
|
3
|
+
localProxyUrl: string;
|
|
4
|
+
localProxyKey: string;
|
|
5
|
+
localModel: string;
|
|
6
|
+
cloudModel: string;
|
|
7
|
+
routingThreshold: number;
|
|
8
|
+
fallbackToCloud: boolean;
|
|
9
|
+
localTimeoutMs: number;
|
|
10
|
+
debugRouting: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare const DEFAULT_CONFIG: Omit<PluginConfig, 'aipingApiKey'>;
|
|
13
|
+
export interface ChatMessage {
|
|
14
|
+
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
15
|
+
content: string | null;
|
|
16
|
+
name?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface ChatRequest {
|
|
19
|
+
model: string;
|
|
20
|
+
messages: ChatMessage[];
|
|
21
|
+
stream?: boolean;
|
|
22
|
+
temperature?: number;
|
|
23
|
+
max_tokens?: number;
|
|
24
|
+
top_p?: number;
|
|
25
|
+
[key: string]: unknown;
|
|
26
|
+
}
|
|
27
|
+
export interface ChatResponse {
|
|
28
|
+
id: string;
|
|
29
|
+
object: 'chat.completion';
|
|
30
|
+
created: number;
|
|
31
|
+
model: string;
|
|
32
|
+
choices: Array<{
|
|
33
|
+
index: number;
|
|
34
|
+
message: ChatMessage;
|
|
35
|
+
finish_reason: string | null;
|
|
36
|
+
}>;
|
|
37
|
+
usage?: {
|
|
38
|
+
prompt_tokens: number;
|
|
39
|
+
completion_tokens: number;
|
|
40
|
+
total_tokens: number;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export type RoutingTarget = 'local' | 'cloud';
|
|
44
|
+
export interface RoutingDecision {
|
|
45
|
+
target: RoutingTarget;
|
|
46
|
+
score: number;
|
|
47
|
+
reasons: string[];
|
|
48
|
+
forced: boolean;
|
|
49
|
+
}
|
|
50
|
+
export interface ScoringResult {
|
|
51
|
+
totalScore: number;
|
|
52
|
+
dimensionScores: DimensionScore[];
|
|
53
|
+
forced?: RoutingTarget;
|
|
54
|
+
}
|
|
55
|
+
export interface DimensionScore {
|
|
56
|
+
name: string;
|
|
57
|
+
score: number;
|
|
58
|
+
maxScore: number;
|
|
59
|
+
reason: string;
|
|
60
|
+
}
|
|
61
|
+
export interface RuleScorer {
|
|
62
|
+
readonly name: string;
|
|
63
|
+
readonly maxScore: number;
|
|
64
|
+
score(request: ChatRequest): DimensionScore;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,eAAO,MAAM,cAAc,EAAE,IAAI,CAAC,YAAY,EAAE,cAAc,CAW7D,CAAC;AAGF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,iBAAiB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,KAAK,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,WAAW,CAAC;QACrB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;KAC9B,CAAC,CAAC;IACH,KAAK,CAAC,EAAE;QACN,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,OAAO,CAAC;AAE9C,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAGD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC;CAC7C"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Shared type definitions for @aiping.cn/model_router
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.DEFAULT_CONFIG = void 0;
|
|
5
|
+
exports.DEFAULT_CONFIG = {
|
|
6
|
+
localProxyUrl: 'http://localhost:11434',
|
|
7
|
+
localProxyKey: '',
|
|
8
|
+
localModel: 'qwen2.5:4b',
|
|
9
|
+
cloudModel: 'kimi-2.5',
|
|
10
|
+
// High threshold keeps ~90% of requests on the local model.
|
|
11
|
+
// Only genuinely heavy requests (long context + complex code + deep reasoning) reach cloud.
|
|
12
|
+
routingThreshold: 85,
|
|
13
|
+
fallbackToCloud: true,
|
|
14
|
+
localTimeoutMs: 30000,
|
|
15
|
+
debugRouting: false,
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=types.js.map
|