feat(models): 「模型设置」接官方厂家目录 + 按官方页结构重做界面(档案 87 补做)

用户实测反馈:新增条目看不懂、厂家选择太少且国内一家都没有。根因是**第一版只做了手填表单**,没接官方 pi-ai 自带目录(实测 38 家,国内 11 家:蚂蚁 / 通义千问 / 小米 / 月之暗面 / 智谱 / MiniMax)。
- 新文件 src/web/model-catalog.ts:只读官方 data/*.json(10 分钟缓存,不导入 pi-ai 运行时);中文名走显示用静态表,选取范围以目录为准
- 新增 GET /api/me/model-providers(38 家 + cn 分组 + modelCount + 模型名;排除 deepseek —— 平台已有内置入口)
- POST /api/me/keys 新增 provider 参数:**目录厂家只需 API 密钥**(端点/协议/模型全由官方目录兜底 —— 官方 config.d.ts 明示 route 命中即继承默认)
- refForEntry 判据由「baseUrl 为空」改为「**没有 route**」:否则目录厂家的 key 会被写进 DEEPSEEK_API_KEY
- SettingsEntry 的 baseURL/api/models 改为可选:目录厂家只写 apiKeyEnv(写得越少越不容易漂)
- 前端按官方页结构重写:提供方行(厂家/说明/状态/操作)+ 新增**先选厂家**(中国大陆 / 国际分组 / 自定义)+ 保留并强化 admin 的「平台共享模型」区块
- 真环境验收:目录端点 38 家 / 国内 11 家;加 moonshotai-cn 只给 key → settings.yaml 仅 apiKeyEnv;删后整块消失
This commit is contained in:
admin committed 2026-09-14 00:15:17 +08:00
1 parent 918f1d3a51
commit 022b1f770c
7 files changed
+489 -121

No files matched your search

+18 -10
View File
@@ -183,16 +183,24 @@ export async function buildServer(config: ServerConfig): Promise<FastifyInstance
}
seen.add(ref)
creds.push({ ref, value })
// 只有"自定义厂家"才写 settings.yaml:内置 DeepSeek 由官方 `dsh-llm-deepseek` 自己管
// (它的 route 是 `deepseek-official`,不是 `llm-pi-ai` 下的键)。
if (row.baseUrl !== null && row.baseUrl !== '' && row.route !== null && row.route !== '') {
providers.push({
route: row.route,
apiKeyEnv: ref,
baseURL: row.baseUrl,
api: normalizeProtocol(row.api),
models: parseModels(row.models),
})
// 有 route 才写 settings.yaml。两种情形:
// · **目录厂家**(route 命中官方 pi-ai catalog,baseUrl 为空)⇒ 只写 `apiKeyEnv`,
// endpoint / 协议 / 模型目录全由官方目录提供(档案 87 补做)。
// · **自定义厂家**(baseUrl 非空)⇒ endpoint + 协议 + 模型清单必须齐全。
// 内置 DeepSeek 没有 route ⇒ 只写 `refs.DEEPSEEK_API_KEY`,不进 settings.yaml。
const route = row.route ?? ''
if (route !== '') {
if (row.baseUrl === null || row.baseUrl === '') {
providers.push({ route, apiKeyEnv: ref })
} else {
providers.push({
route,
apiKeyEnv: ref,
baseURL: row.baseUrl,
api: normalizeProtocol(row.api),
models: parseModels(row.models),
})
}
}
}
const credFile = join(owner.home_dir, '.credentials.yaml')