jishushell 0.4.10 → 0.4.17

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.
Files changed (100) hide show
  1. package/INSTALL-NOTICE +10 -12
  2. package/dist/cli/app.d.ts +3 -0
  3. package/dist/cli/app.js +156 -0
  4. package/dist/cli/app.js.map +1 -0
  5. package/dist/{doctor.d.ts → cli/doctor.d.ts} +6 -1
  6. package/dist/{doctor.js → cli/doctor.js} +343 -14
  7. package/dist/cli/doctor.js.map +1 -0
  8. package/dist/cli/helpers.d.ts +4 -0
  9. package/dist/cli/helpers.js +32 -0
  10. package/dist/cli/helpers.js.map +1 -0
  11. package/dist/cli/job.d.ts +3 -0
  12. package/dist/cli/job.js +260 -0
  13. package/dist/cli/job.js.map +1 -0
  14. package/dist/cli/llm.d.ts +24 -0
  15. package/dist/cli/llm.js +593 -0
  16. package/dist/cli/llm.js.map +1 -0
  17. package/dist/cli/openclaw.d.ts +12 -0
  18. package/dist/cli/openclaw.js +156 -0
  19. package/dist/cli/openclaw.js.map +1 -0
  20. package/dist/cli/panel.d.ts +25 -0
  21. package/dist/cli/panel.js +734 -0
  22. package/dist/cli/panel.js.map +1 -0
  23. package/dist/cli.js +67 -326
  24. package/dist/cli.js.map +1 -1
  25. package/dist/config.d.ts +1 -0
  26. package/dist/config.js +11 -4
  27. package/dist/config.js.map +1 -1
  28. package/dist/control.d.ts +13 -41
  29. package/dist/control.js +12 -1355
  30. package/dist/control.js.map +1 -1
  31. package/dist/routes/apps.d.ts +3 -0
  32. package/dist/routes/apps.js +99 -0
  33. package/dist/routes/apps.js.map +1 -0
  34. package/dist/routes/instances.js +12 -6
  35. package/dist/routes/instances.js.map +1 -1
  36. package/dist/routes/llm.d.ts +15 -0
  37. package/dist/routes/llm.js +246 -0
  38. package/dist/routes/llm.js.map +1 -0
  39. package/dist/routes/setup.js +29 -2
  40. package/dist/routes/setup.js.map +1 -1
  41. package/dist/routes/system.js +31 -6
  42. package/dist/routes/system.js.map +1 -1
  43. package/dist/server.js +40 -4
  44. package/dist/server.js.map +1 -1
  45. package/dist/services/app-compiler.d.ts +15 -0
  46. package/dist/services/app-compiler.js +169 -0
  47. package/dist/services/app-compiler.js.map +1 -0
  48. package/dist/services/app-manager.d.ts +17 -0
  49. package/dist/services/app-manager.js +168 -0
  50. package/dist/services/app-manager.js.map +1 -0
  51. package/dist/services/instance-manager.d.ts +51 -3
  52. package/dist/services/instance-manager.js +233 -30
  53. package/dist/services/instance-manager.js.map +1 -1
  54. package/dist/services/job-manager.d.ts +22 -0
  55. package/dist/services/job-manager.js +102 -0
  56. package/dist/services/job-manager.js.map +1 -0
  57. package/dist/services/llm-proxy/adapters.js +5 -1
  58. package/dist/services/llm-proxy/adapters.js.map +1 -1
  59. package/dist/services/llm-proxy/index.d.ts +30 -0
  60. package/dist/services/llm-proxy/index.js +71 -1
  61. package/dist/services/llm-proxy/index.js.map +1 -1
  62. package/dist/services/llm-proxy/ssrf.js +1 -1
  63. package/dist/services/llm-proxy/ssrf.js.map +1 -1
  64. package/dist/services/nomad-manager.js +192 -29
  65. package/dist/services/nomad-manager.js.map +1 -1
  66. package/dist/services/panel-manager.d.ts +40 -0
  67. package/dist/services/panel-manager.js +346 -0
  68. package/dist/services/panel-manager.js.map +1 -0
  69. package/dist/services/process-manager.js +20 -7
  70. package/dist/services/process-manager.js.map +1 -1
  71. package/dist/services/setup-manager.js +316 -31
  72. package/dist/services/setup-manager.js.map +1 -1
  73. package/dist/services/update-manager.d.ts +47 -0
  74. package/dist/services/update-manager.js +305 -0
  75. package/dist/services/update-manager.js.map +1 -0
  76. package/dist/types.d.ts +62 -0
  77. package/install/jishu-install.sh +279 -37
  78. package/install/post-install.sh +64 -5
  79. package/package.json +6 -2
  80. package/public/assets/Dashboard-CQsp1Mr9.js +1 -0
  81. package/public/assets/InitPassword-BEC8SE4A.js +1 -0
  82. package/public/assets/InstanceDetail-B5wTgNEg.js +17 -0
  83. package/public/assets/{Login-CUoEZOWR.js → Login-D1Bt-Lyk.js} +1 -1
  84. package/public/assets/NewInstance-GQzm3K9D.js +1 -0
  85. package/public/assets/Settings-ByjGlqhP.js +1 -0
  86. package/public/assets/Setup-cMF21Y-8.js +1 -0
  87. package/public/assets/index-B6qQP4mH.css +1 -0
  88. package/public/assets/index-BuTQtuNy.js +16 -0
  89. package/public/assets/{providers-lBSOjUWy.js → providers-V-vwrExZ.js} +1 -1
  90. package/public/index.html +2 -2
  91. package/dist/doctor.js.map +0 -1
  92. package/install/jishu-install-china.sh +0 -3092
  93. package/public/assets/Dashboard-DhsrzJ4F.js +0 -1
  94. package/public/assets/InitPassword-BjubiVdd.js +0 -1
  95. package/public/assets/InstanceDetail-DMcywsof.js +0 -17
  96. package/public/assets/NewInstance-Bk0G4EiJ.js +0 -1
  97. package/public/assets/Settings-D5tHL_h5.js +0 -1
  98. package/public/assets/Setup-4t6E3Rut.js +0 -1
  99. package/public/assets/index-BJ47MWpF.css +0 -1
  100. package/public/assets/index-DbX85irc.js +0 -16
@@ -0,0 +1,593 @@
1
+ /**
2
+ * jishushell llm — LLM Provider 管理
3
+ *
4
+ * 存储结构:panel.json 顶层 providers 数组
5
+ * 兼容:若只有 default_provider 则自动迁移为 providers[0]
6
+ */
7
+ import { getPanelConfig, savePanelConfig } from "../config.js";
8
+ import { encryptApiKey, decryptApiKey } from "../services/llm-proxy/encryption.js";
9
+ import { pushDefaultProviderToInstances } from "../services/llm-proxy/index.js";
10
+ // ── Provider CRUD helpers ──────────────────────────────────────────────────
11
+ function loadProviders() {
12
+ const config = getPanelConfig();
13
+ // Migrate legacy default_provider → providers[0]
14
+ if (!Array.isArray(config.providers)) {
15
+ const dp = config.default_provider;
16
+ if (dp && !dp.skipped) {
17
+ const migrated = {
18
+ id: dp.providerId || "default",
19
+ name: dp.providerId || "Default",
20
+ baseUrl: dp.baseUrl || "",
21
+ api: dp.api || "openai",
22
+ apiKey: dp.apiKey,
23
+ authHeader: dp.authHeader,
24
+ models: dp.models,
25
+ selectedModelId: dp.selectedModelId,
26
+ isDefault: true,
27
+ };
28
+ saveProviders([migrated]);
29
+ return [migrated];
30
+ }
31
+ return [];
32
+ }
33
+ return config.providers;
34
+ }
35
+ function saveProviders(providers) {
36
+ const config = getPanelConfig();
37
+ config.providers = providers;
38
+ // Keep default_provider in sync for API-layer compatibility
39
+ const def = providers.find((p) => p.isDefault) || providers[0];
40
+ if (def) {
41
+ config.default_provider = {
42
+ providerId: def.id,
43
+ baseUrl: def.baseUrl,
44
+ api: def.api,
45
+ authHeader: def.authHeader,
46
+ models: def.models,
47
+ selectedModelId: def.selectedModelId,
48
+ apiKey: def.apiKey || "",
49
+ };
50
+ }
51
+ else {
52
+ config.default_provider = { skipped: true };
53
+ }
54
+ savePanelConfig(config);
55
+ }
56
+ function findProvider(id, providers) {
57
+ return providers.find((p) => p.id === id);
58
+ }
59
+ /**
60
+ * If the default provider has a valid model selection, push its config to all
61
+ * running instances so they immediately reflect the change without restart.
62
+ */
63
+ function maybePushDefaultToInstances(providers) {
64
+ const def = providers.find((p) => p.isDefault) || providers[0];
65
+ if (!def || !def.models?.length || !def.selectedModelId)
66
+ return;
67
+ try {
68
+ pushDefaultProviderToInstances({
69
+ providerId: def.id,
70
+ baseUrl: def.baseUrl,
71
+ api: def.api,
72
+ authHeader: !!def.authHeader,
73
+ models: def.models,
74
+ selectedModelId: def.selectedModelId,
75
+ apiKey: def.apiKey ? decryptApiKey(def.apiKey) : "",
76
+ });
77
+ console.log(" → 已将模型配置同步到所有实例");
78
+ }
79
+ catch (e) {
80
+ console.warn(" ! 同步到实例失败:", e.message);
81
+ }
82
+ }
83
+ // ── Flag parser ─────────────────────────────────────────────────────────────
84
+ function flag(args, ...names) {
85
+ for (const name of names) {
86
+ const idx = args.indexOf(name);
87
+ if (idx !== -1 && args[idx + 1] && !args[idx + 1].startsWith("--")) {
88
+ return args[idx + 1];
89
+ }
90
+ }
91
+ return undefined;
92
+ }
93
+ // ── Subcommand handlers ────────────────────────────────────────────────────
94
+ function cmdList(rest) {
95
+ const json = rest.includes("--json");
96
+ const providers = loadProviders();
97
+ if (json) {
98
+ console.log(JSON.stringify(providers.map((p) => ({
99
+ id: p.id,
100
+ name: p.name,
101
+ baseUrl: p.baseUrl,
102
+ api: p.api,
103
+ authHeader: p.authHeader,
104
+ models: p.models,
105
+ selectedModelId: p.selectedModelId,
106
+ isDefault: !!p.isDefault,
107
+ hasApiKey: !!p.apiKey,
108
+ })), null, 2));
109
+ return;
110
+ }
111
+ if (providers.length === 0) {
112
+ console.log("未配置任何 LLM provider。使用 'jishushell llm add' 添加。");
113
+ return;
114
+ }
115
+ console.log(`\n${"ID".padEnd(20)} ${"API".padEnd(10)} ${"URL".padEnd(40)} ${"默认"}`);
116
+ console.log("-".repeat(80));
117
+ for (const p of providers) {
118
+ const def = p.isDefault ? "✓" : "";
119
+ const url = (p.baseUrl || "").slice(0, 38);
120
+ console.log(`${p.id.padEnd(20)} ${(p.api || "").padEnd(10)} ${url.padEnd(40)} ${def}`);
121
+ }
122
+ console.log();
123
+ }
124
+ function cmdAdd(rest) {
125
+ const id = rest[0]?.startsWith("--") ? undefined : rest[0];
126
+ if (!id) {
127
+ console.error("Usage: jishushell llm add <id> [options]");
128
+ process.exit(1);
129
+ }
130
+ const providers = loadProviders();
131
+ if (findProvider(id, providers)) {
132
+ console.error(`Provider '${id}' 已存在。使用 'jishushell llm update ${id}' 修改。`);
133
+ process.exit(1);
134
+ }
135
+ const baseUrl = flag(rest, "--url", "--base-url");
136
+ const api = flag(rest, "--api") || "openai";
137
+ const rawKey = flag(rest, "--key", "--api-key");
138
+ const selectedModelId = flag(rest, "--model");
139
+ const name = flag(rest, "--name") || id;
140
+ const authHeader = flag(rest, "--auth-header");
141
+ const setDefault = rest.includes("--default");
142
+ if (!baseUrl) {
143
+ console.error("--url <base-url> is required");
144
+ process.exit(1);
145
+ }
146
+ if (!rawKey) {
147
+ console.error("--key <api-key> is required");
148
+ process.exit(1);
149
+ }
150
+ const encKey = encryptApiKey(rawKey);
151
+ // Parse --models as JSON array string or "id:name,id:name" shorthand
152
+ const modelsRaw = flag(rest, "--models");
153
+ let models;
154
+ if (modelsRaw) {
155
+ try {
156
+ models = JSON.parse(modelsRaw);
157
+ }
158
+ catch {
159
+ // shorthand: "gpt-4o,gpt-4o-mini"
160
+ models = modelsRaw.split(",").map((m) => ({ id: m.trim(), name: m.trim() }));
161
+ }
162
+ }
163
+ if (setDefault)
164
+ providers.forEach((p) => { p.isDefault = false; });
165
+ const provider = {
166
+ id,
167
+ name,
168
+ baseUrl,
169
+ api,
170
+ apiKey: encKey,
171
+ authHeader,
172
+ models,
173
+ selectedModelId,
174
+ isDefault: setDefault || providers.length === 0, // first provider is default
175
+ };
176
+ providers.push(provider);
177
+ saveProviders(providers);
178
+ console.log(`✓ Provider '${id}' 已添加${provider.isDefault ? "(设为默认)" : ""}`);
179
+ if (provider.isDefault)
180
+ maybePushDefaultToInstances(providers);
181
+ }
182
+ function cmdUpdate(rest) {
183
+ const id = rest[0]?.startsWith("--") ? undefined : rest[0];
184
+ if (!id) {
185
+ console.error("Usage: jishushell llm update <id> [options]");
186
+ process.exit(1);
187
+ }
188
+ const providers = loadProviders();
189
+ const provider = findProvider(id, providers);
190
+ if (!provider) {
191
+ console.error(`Provider '${id}' 不存在。`);
192
+ process.exit(1);
193
+ }
194
+ const baseUrl = flag(rest, "--url", "--base-url");
195
+ const api = flag(rest, "--api");
196
+ const rawKey = flag(rest, "--key", "--api-key");
197
+ const selectedModelId = flag(rest, "--model");
198
+ const name = flag(rest, "--name");
199
+ const authHeader = flag(rest, "--auth-header");
200
+ const modelsRaw = flag(rest, "--models");
201
+ const setDefault = rest.includes("--default");
202
+ if (baseUrl)
203
+ provider.baseUrl = baseUrl;
204
+ if (api)
205
+ provider.api = api;
206
+ if (rawKey)
207
+ provider.apiKey = encryptApiKey(rawKey);
208
+ if (selectedModelId)
209
+ provider.selectedModelId = selectedModelId;
210
+ if (name)
211
+ provider.name = name;
212
+ if (authHeader)
213
+ provider.authHeader = authHeader;
214
+ if (modelsRaw) {
215
+ try {
216
+ provider.models = JSON.parse(modelsRaw);
217
+ }
218
+ catch {
219
+ provider.models = modelsRaw.split(",").map((m) => ({ id: m.trim(), name: m.trim() }));
220
+ }
221
+ }
222
+ if (setDefault) {
223
+ providers.forEach((p) => { p.isDefault = false; });
224
+ provider.isDefault = true;
225
+ }
226
+ saveProviders(providers);
227
+ console.log(`✓ Provider '${id}' 已更新`);
228
+ if (provider.isDefault)
229
+ maybePushDefaultToInstances(providers);
230
+ }
231
+ function cmdDelete(rest) {
232
+ const id = rest[0]?.startsWith("--") ? undefined : rest[0];
233
+ if (!id) {
234
+ console.error("Usage: jishushell llm delete <id>");
235
+ process.exit(1);
236
+ }
237
+ const providers = loadProviders();
238
+ const idx = providers.findIndex((p) => p.id === id);
239
+ if (idx === -1) {
240
+ console.error(`Provider '${id}' 不存在。`);
241
+ process.exit(1);
242
+ }
243
+ if (providers.length === 1) {
244
+ console.error(`✗ 无法删除最后一个 Provider,至少需要保留一个。`);
245
+ process.exit(1);
246
+ }
247
+ const wasDefault = providers[idx].isDefault;
248
+ providers.splice(idx, 1);
249
+ // Reassign default to first remaining provider
250
+ if (wasDefault && providers.length > 0) {
251
+ providers[0].isDefault = true;
252
+ console.log(` → '${providers[0].id}' 已设为新默认 provider`);
253
+ }
254
+ saveProviders(providers);
255
+ console.log(`✓ Provider '${id}' 已删除`);
256
+ if (wasDefault && providers.length > 0)
257
+ maybePushDefaultToInstances(providers);
258
+ }
259
+ async function cmdTest(rest) {
260
+ const id = rest[0]?.startsWith("--") ? undefined : rest[0];
261
+ const providers = loadProviders();
262
+ let provider;
263
+ if (id) {
264
+ provider = findProvider(id, providers);
265
+ if (!provider) {
266
+ console.error(`Provider '${id}' 不存在。`);
267
+ process.exit(1);
268
+ }
269
+ }
270
+ else {
271
+ provider = providers.find((p) => p.isDefault) || providers[0];
272
+ if (!provider) {
273
+ console.error("未配置任何 provider。");
274
+ process.exit(1);
275
+ }
276
+ }
277
+ const apiKey = provider.apiKey ? decryptApiKey(provider.apiKey) : "";
278
+ const baseUrl = provider.baseUrl.replace(/\/$/, "");
279
+ // Probe endpoint: try /v1/models first, then /models
280
+ const endpoints = ["/v1/models", "/models"];
281
+ let lastErr = "";
282
+ for (const ep of endpoints) {
283
+ const url = `${baseUrl}${ep}`;
284
+ try {
285
+ console.log(`测试 ${provider.id} → ${url} ...`);
286
+ const authHeader = provider.authHeader || "Authorization";
287
+ const resp = await fetch(url, {
288
+ headers: { [authHeader]: `Bearer ${apiKey}` },
289
+ signal: AbortSignal.timeout(10_000),
290
+ });
291
+ if (resp.ok) {
292
+ let body;
293
+ try {
294
+ body = await resp.json();
295
+ }
296
+ catch {
297
+ body = {};
298
+ }
299
+ const modelCount = Array.isArray(body?.data) ? body.data.length : "?";
300
+ console.log(`✓ 连接成功(HTTP ${resp.status},${modelCount} 个模型)`);
301
+ return;
302
+ }
303
+ else {
304
+ const text = await resp.text().catch(() => "");
305
+ lastErr = `HTTP ${resp.status}: ${text.slice(0, 200)}`;
306
+ }
307
+ }
308
+ catch (e) {
309
+ lastErr = e.message;
310
+ }
311
+ }
312
+ console.error(`✗ 连接失败: ${lastErr}`);
313
+ process.exit(1);
314
+ }
315
+ // ── Models ─────────────────────────────────────────────────────────────────
316
+ async function cmdModels(providerId, rest) {
317
+ const providers = loadProviders();
318
+ let provider;
319
+ if (providerId) {
320
+ provider = findProvider(providerId, providers);
321
+ if (!provider) {
322
+ console.error(`Provider '${providerId}' 不存在。运行 'jishushell llm list' 查看可用 provider。`);
323
+ process.exit(1);
324
+ }
325
+ }
326
+ else {
327
+ provider = providers.find((p) => p.isDefault) || providers[0];
328
+ if (!provider) {
329
+ console.error("未配置任何 provider。");
330
+ process.exit(1);
331
+ }
332
+ }
333
+ const apiKey = provider.apiKey ? decryptApiKey(provider.apiKey) : "";
334
+ const baseUrl = provider.baseUrl.replace(/\/$/, "");
335
+ const json = rest.includes("--json");
336
+ const endpoints = [`${baseUrl}/v1/models`, `${baseUrl}/models`];
337
+ let lastErr = "";
338
+ for (const url of endpoints) {
339
+ try {
340
+ const authHeader = (typeof provider.authHeader === "string" && provider.authHeader)
341
+ ? provider.authHeader
342
+ : "Authorization";
343
+ const resp = await fetch(url, {
344
+ headers: { [authHeader]: `Bearer ${apiKey}` },
345
+ signal: AbortSignal.timeout(15_000),
346
+ });
347
+ if (resp.ok) {
348
+ const body = await resp.json();
349
+ const models = Array.isArray(body?.data) ? body.data
350
+ : Array.isArray(body?.models) ? body.models
351
+ : Array.isArray(body) ? body : [];
352
+ if (json) {
353
+ console.log(JSON.stringify(models, null, 2));
354
+ return;
355
+ }
356
+ if (models.length === 0) {
357
+ console.log(`Provider '${provider.id}' 返回 0 个模型。`);
358
+ return;
359
+ }
360
+ console.log(`\nProvider: ${provider.id} (${models.length} 个模型)\n`);
361
+ console.log(`${"模型 ID".padEnd(50)} ${"创建时间"}`);
362
+ console.log("-".repeat(72));
363
+ for (const m of models) {
364
+ const id = String(m.id || m.name || "?").slice(0, 48);
365
+ const created = m.created
366
+ ? new Date(m.created * 1000).toISOString().slice(0, 10)
367
+ : m.created_at || "";
368
+ console.log(`${id.padEnd(50)} ${created}`);
369
+ }
370
+ console.log();
371
+ return;
372
+ }
373
+ else {
374
+ const text = await resp.text().catch(() => "");
375
+ lastErr = `HTTP ${resp.status}: ${text.slice(0, 200)}`;
376
+ }
377
+ }
378
+ catch (e) {
379
+ lastErr = e.message;
380
+ }
381
+ }
382
+ console.error(`✗ 获取模型失败 (${provider.id}): ${lastErr}`);
383
+ process.exit(1);
384
+ }
385
+ // ── Chat ───────────────────────────────────────────────────────────────────
386
+ async function cmdChat(providerId, rest) {
387
+ const providers = loadProviders();
388
+ let provider;
389
+ if (providerId) {
390
+ provider = findProvider(providerId, providers);
391
+ if (!provider) {
392
+ console.error(`Provider '${providerId}' 不存在。运行 'jishushell llm list' 查看可用 provider。`);
393
+ process.exit(1);
394
+ }
395
+ }
396
+ else {
397
+ provider = providers.find((p) => p.isDefault) || providers[0];
398
+ if (!provider) {
399
+ console.error("未配置任何 provider。");
400
+ process.exit(1);
401
+ }
402
+ }
403
+ // The user message is the first non-flag argument in rest
404
+ const userMsg = rest.find((a) => !a.startsWith("--"));
405
+ if (!userMsg) {
406
+ console.error('Usage: jishushell llm [<provider-id>] chat "<message>" [--model <id>] [--system <prompt>]');
407
+ process.exit(1);
408
+ }
409
+ const modelOverride = flag(rest, "--model");
410
+ const systemPrompt = flag(rest, "--system");
411
+ const json = rest.includes("--json");
412
+ const model = modelOverride || provider.selectedModelId
413
+ || (Array.isArray(provider.models) && provider.models[0]?.id)
414
+ || undefined;
415
+ if (!model) {
416
+ console.error(`Provider '${provider.id}' 没有配置默认模型。请使用 --model <id> 指定,或运行 'jishushell llm ${provider.id} models' 查看可用模型。`);
417
+ process.exit(1);
418
+ }
419
+ const apiKey = provider.apiKey ? decryptApiKey(provider.apiKey) : "";
420
+ const baseUrl = provider.baseUrl.replace(/\/$/, "");
421
+ const authHeader = (typeof provider.authHeader === "string" && provider.authHeader)
422
+ ? provider.authHeader : "Authorization";
423
+ const messages = [];
424
+ if (systemPrompt)
425
+ messages.push({ role: "system", content: systemPrompt });
426
+ messages.push({ role: "user", content: userMsg });
427
+ const body = { model, messages, stream: false };
428
+ const endpoints = [`${baseUrl}/v1/chat/completions`, `${baseUrl}/chat/completions`];
429
+ let lastErr = "";
430
+ for (const url of endpoints) {
431
+ try {
432
+ const resp = await fetch(url, {
433
+ method: "POST",
434
+ headers: {
435
+ "Content-Type": "application/json",
436
+ [authHeader]: `Bearer ${apiKey}`,
437
+ },
438
+ body: JSON.stringify(body),
439
+ signal: AbortSignal.timeout(60_000),
440
+ });
441
+ if (resp.ok) {
442
+ const data = await resp.json();
443
+ if (json) {
444
+ console.log(JSON.stringify(data, null, 2));
445
+ return;
446
+ }
447
+ const content = data?.choices?.[0]?.message?.content ?? "";
448
+ const usage = data?.usage;
449
+ process.stdout.write(content + "\n");
450
+ if (usage) {
451
+ process.stderr.write(`\n[${provider.id} / ${model} prompt=${usage.prompt_tokens} completion=${usage.completion_tokens} total=${usage.total_tokens}]\n`);
452
+ }
453
+ return;
454
+ }
455
+ else {
456
+ const text = await resp.text().catch(() => "");
457
+ lastErr = `HTTP ${resp.status}: ${text.slice(0, 300)}`;
458
+ }
459
+ }
460
+ catch (e) {
461
+ lastErr = e.message;
462
+ }
463
+ }
464
+ console.error(`✗ Chat 失败 (${provider.id}): ${lastErr}`);
465
+ process.exit(1);
466
+ }
467
+ // ── Default ────────────────────────────────────────────────────────────────
468
+ function cmdDefault(rest) {
469
+ const id = rest[0]?.startsWith("--") ? undefined : rest[0];
470
+ if (!id) {
471
+ // When called without args, show current default
472
+ const providers = loadProviders();
473
+ const current = providers.find((p) => p.isDefault) || providers[0];
474
+ if (!current) {
475
+ console.log("未配置任何 provider。");
476
+ }
477
+ else {
478
+ console.log(`当前默认 provider: ${current.id}`);
479
+ }
480
+ return;
481
+ }
482
+ const providers = loadProviders();
483
+ const provider = findProvider(id, providers);
484
+ if (!provider) {
485
+ console.error(`Provider '${id}' 不存在。运行 'jishushell llm list' 查看可用 provider。`);
486
+ process.exit(1);
487
+ }
488
+ providers.forEach((p) => { p.isDefault = false; });
489
+ provider.isDefault = true;
490
+ saveProviders(providers);
491
+ console.log(`✓ '${id}' 已设为默认 provider`);
492
+ maybePushDefaultToInstances(providers);
493
+ }
494
+ // ── Help & brief ───────────────────────────────────────────────────────────
495
+ export function brief() {
496
+ return " llm <list|add|update|delete|default|models|chat|test> LLM Provider 管理";
497
+ }
498
+ export function printHelp() {
499
+ console.log(`
500
+ Usage: jishushell llm <command> [options]
501
+ jishushell llm <provider-id> models [--json]
502
+
503
+ Commands:
504
+ list [--json] 列出已配置的 LLM provider
505
+ add <id> --url <url> --key <k> 添加 provider
506
+ update <id> [options] 修改 provider
507
+ delete <id> 删除 provider
508
+ default [<id>] 查看或设置默认 provider
509
+ <id> models [--json] 列出 provider 支持的模型(调用 API)
510
+ <id> chat "<消息>" [options] 与 provider 对话(单次)
511
+ test [<id>] 测试 provider 连通性
512
+ help 显示此帮助
513
+
514
+ Add/update options:
515
+ --url <base-url> API base URL(如 https://api.openai.com)
516
+ --api <openai|anthropic> 协议类型(默认 openai)
517
+ --key <api-key> API Key(明文,将自动加密存储)
518
+ --model <model-id> 默认选用的模型 ID
519
+ --models <json|csv> 模型列表,JSON 数组或逗号分隔的 ID
520
+ --name <name> 显示名称
521
+ --auth-header <header> 鉴权请求头名称(默认 Authorization)
522
+ --default 设为默认 provider
523
+
524
+ Examples:
525
+ jishushell llm list --json
526
+ jishushell llm add openai --url https://api.openai.com --key sk-xxx --model gpt-4o
527
+ jishushell llm update openai --key sk-new-key
528
+ jishushell llm default openai
529
+ jishushell llm openai models
530
+ jishushell llm models # 使用默认 provider
531
+ jishushell llm openai chat "你好"
532
+ jishushell llm chat "帮我写一首诗" --model gpt-4o
533
+ jishushell llm chat "你好" --system "你是个翻译助手"
534
+ jishushell llm test openai
535
+
536
+ Chat options:
537
+ --model <id> 覆盖默认模型
538
+ --system <text> 添加 system prompt
539
+ --json 输出原始 JSON 响应
540
+ `);
541
+ }
542
+ // ── Entry point ────────────────────────────────────────────────────────────
543
+ export async function run(rest) {
544
+ const cmd = rest[0];
545
+ const args = rest.slice(1);
546
+ if (cmd === "list") {
547
+ cmdList(args);
548
+ }
549
+ else if (cmd === "add") {
550
+ cmdAdd(args);
551
+ }
552
+ else if (cmd === "update") {
553
+ cmdUpdate(args);
554
+ }
555
+ else if (cmd === "delete" || cmd === "rm" || cmd === "remove") {
556
+ cmdDelete(args);
557
+ }
558
+ else if (cmd === "default") {
559
+ cmdDefault(args);
560
+ }
561
+ else if (cmd === "models") {
562
+ // jishushell llm models → use default provider
563
+ await cmdModels(undefined, args);
564
+ }
565
+ else if (cmd === "chat") {
566
+ await cmdChat(undefined, args);
567
+ }
568
+ else if (cmd === "test") {
569
+ await cmdTest(args);
570
+ }
571
+ else if (cmd === "help" || cmd === "--help" || cmd === "-h") {
572
+ printHelp();
573
+ }
574
+ else if (cmd) {
575
+ // Check if it's a provider ID followed by a sub-action
576
+ // e.g. jishushell llm openai models
577
+ const subAction = rest[1];
578
+ if (subAction === "models") {
579
+ await cmdModels(cmd, rest.slice(2));
580
+ }
581
+ else if (subAction === "chat") {
582
+ await cmdChat(cmd, rest.slice(2));
583
+ }
584
+ else {
585
+ printHelp();
586
+ process.exit(1);
587
+ }
588
+ }
589
+ else {
590
+ printHelp();
591
+ }
592
+ }
593
+ //# sourceMappingURL=llm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.js","sourceRoot":"","sources":["../../src/cli/llm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * src/cli/openclaw.ts
3
+ * OpenClaw 实例管理子命令
4
+ *
5
+ * jishushell openclaw pairing list
6
+ * jishushell openclaw pairing approve <channel> <code>
7
+ *
8
+ * 后续可在此扩展: logs、shell、config-show 等
9
+ */
10
+ export declare function run(rest: string[]): Promise<void>;
11
+ export declare function brief(): string;
12
+ export declare function printHelp(): void;