llm-api-gateway-cli 1.0.2 → 1.0.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/lib/config.js +18 -5
- package/lib/hub.js +7 -3
- package/package.json +1 -1
package/lib/config.js
CHANGED
|
@@ -8,8 +8,9 @@
|
|
|
8
8
|
* 所有 CLI 都走 resolveConfig,保证问「密钥从哪来」只有一种答案。
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import {
|
|
11
|
+
import { DEFAULT_BASE_URL, strArg } from './common.js';
|
|
12
12
|
import { resolveSecretKey } from './secrets.js';
|
|
13
|
+
import { resolveSettings, settingsFilePath } from './settings.js';
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
16
|
* 缺密钥时的统一提示(各 CLI 文案一致,避免用户按提示改了还是不通)。
|
|
@@ -44,12 +45,21 @@ export function numArg(v) {
|
|
|
44
45
|
* @returns {{key:string, baseUrl:string, model:string, workDir:string,
|
|
45
46
|
* temperature:number|undefined, maxTokens:number|undefined, system:string|undefined}}
|
|
46
47
|
*/
|
|
47
|
-
export function resolveConfig(args = {}, { defaultModel = '', defaultMaxTokens, env = process.env } = {}) {
|
|
48
|
+
export function resolveConfig(args = {}, { defaultModel = '', defaultMaxTokens, env = process.env, file = settingsFilePath(env) } = {}) {
|
|
48
49
|
const maxTokens = numArg(args['max-tokens']) ?? defaultMaxTokens;
|
|
49
50
|
// 密钥走 lib/secrets.js:`--key` > 环境变量 / `.env` > credentials.json。
|
|
50
51
|
// 命令行必须认那个文件,否则「在界面里配一次就能用」对 CLI 入口是句空话
|
|
51
52
|
// (界面与 config set key 写的都是它)。来源字段一并带出来,横幅才能说清「谁给的」。
|
|
52
53
|
const secret = resolveSecretKey({ args, env });
|
|
54
|
+
// 网关地址与模型走 lib/settings.js 的**四层**优先级:--flag > 环境变量/.env > config.json > 内置默认。
|
|
55
|
+
//
|
|
56
|
+
// 这一段曾经用的是 lib/common.js 的 resolveBaseUrl —— 它只认 flag 与环境变量,**不读 config.json**。
|
|
57
|
+
// 后果是 `gateway-agent setup` 与 `config set baseUrl` 写进配置文件的地址,命令行根本不认:
|
|
58
|
+
// 网页/设置面板显示 192.168.x.x,命令行却仍旧连内置默认的 127.0.0.1:9000(模型同理)。
|
|
59
|
+
// 网页侧一直走 resolveSettings,所以「页面是对的、命令行是错的」——两条链必须合成一条。
|
|
60
|
+
const settings = resolveSettings({ file, env, args });
|
|
61
|
+
// 模型:配置文件里**真写了**才用它,否则保留各入口自己的 defaultModel(cli-anthropic 等默认值不同)
|
|
62
|
+
const modelFromFile = settings.sources.model === 'default' ? '' : strArg(settings.values.model);
|
|
53
63
|
return {
|
|
54
64
|
key: secret.key,
|
|
55
65
|
keySource: secret.source,
|
|
@@ -57,9 +67,12 @@ export function resolveConfig(args = {}, { defaultModel = '', defaultMaxTokens,
|
|
|
57
67
|
// 整个来源对象一并带出:横幅要 `secretSourceText(cfg.secret)` 才能说清
|
|
58
68
|
// 「环境变量 GATEWAY_KEY(来自 .env:…)」这类细节
|
|
59
69
|
secret,
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
70
|
+
// 与 resolveBaseUrl / Web 侧同一口径:去掉尾部斜杠
|
|
71
|
+
baseUrl: String(settings.values.baseUrl || DEFAULT_BASE_URL).replace(/\/+$/, ''),
|
|
72
|
+
// 顺序:--model > GATEWAY_MODEL > config.json > 该入口的默认模型
|
|
73
|
+
model: strArg(args.model) || strArg(env.GATEWAY_MODEL) || modelFromFile || defaultModel,
|
|
74
|
+
// 整份解析结果:调用方要 `settingSourceText(settings, 'baseUrl')` 这类「谁给的」信息
|
|
75
|
+
settings,
|
|
63
76
|
workDir: strArg(args.cwd) || strArg(args['work-dir']) || '',
|
|
64
77
|
temperature: numArg(args.temperature),
|
|
65
78
|
maxTokens: Number.isFinite(maxTokens) && maxTokens > 0 ? maxTokens : undefined,
|
package/lib/hub.js
CHANGED
|
@@ -22,7 +22,6 @@ import {
|
|
|
22
22
|
parseArgs,
|
|
23
23
|
strArg,
|
|
24
24
|
resolveKey,
|
|
25
|
-
resolveBaseUrl,
|
|
26
25
|
resolvePort,
|
|
27
26
|
sendJson,
|
|
28
27
|
readBody,
|
|
@@ -1345,8 +1344,13 @@ export function runHub(argv, { entry = 'web' } = {}) {
|
|
|
1345
1344
|
const settingsFile = settingsFilePath();
|
|
1346
1345
|
const settings = resolveSettings({ file: settingsFile, env: process.env, args });
|
|
1347
1346
|
for (const w of settings.warnings) console.warn(`[警告] ${w}`);
|
|
1348
|
-
|
|
1349
|
-
|
|
1347
|
+
// 网关地址与模型:事实来源是 lib/settings.js 的四层优先级(flag > 环境变量/.env > config.json > 内置默认)。
|
|
1348
|
+
// 这里曾经用 resolveBaseUrl(只认 flag/env),于是**横幅把 config.json 里的地址显示成内置默认**,
|
|
1349
|
+
// 而 applySettings 之后的运行态用的却是配置文件里的值 —— 横幅与事实打架,用户以为配置没生效。
|
|
1350
|
+
// 现在两边同源:横幅打印的就是运行态那个值。
|
|
1351
|
+
const baseUrl = String(settings.values.baseUrl || DEFAULT_BASE_URL).replace(/\/+$/, '');
|
|
1352
|
+
const modelFromFile = settings.sources.model === 'default' ? '' : strArg(settings.values.model);
|
|
1353
|
+
const model = strArg(args.model) || strArg(process.env.GATEWAY_MODEL) || modelFromFile || DEFAULT_MODEL;
|
|
1350
1354
|
// 老的两个服务各用各的环境变量名,这里都认
|
|
1351
1355
|
const port =
|
|
1352
1356
|
resolvePort(args, process.env, 'WEB_PORT', null) ??
|