AGC 模型目录初始化改为从上游拉取:不再写死 gpt-6-astra/gpt-5.6-luna 与高质量/快速别名 #506
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
现象
AGC 官方模型目录在「数据库里还没有配置」时会回落到硬编码初始目录:
quality=高质量=gpt-6-astra、fast=快速=gpt-5.6-luna,默认项quality。而这两个模型已经从上游 Router 移除,导致:新环境 / 清库 / 后台从未保存过配置的实例,客户端下拉里直接给出两个已经不存在的模型,选中后上游model_not_found,对话不可用,必须后台人工重新保存一次目录才恢复。原因
server-rs/crates/spacetime-module/src/agc_models.rs:21-28read_agc_model_catalog在agc_model_catalog缺id=0行时,直接返回module_runtime::AgcModelCatalog::default()server-rs/crates/module-runtime/src/agc_models.rs:23-44Default硬编码quality/高质量/gpt-6-astra、fast/快速/gpt-5.6-luna,default_model_id = qualityserver-rs/crates/api-server/src/llm/mod.rs:188-202/api/llm/models把目录alias当displayName下发(所以客户端只看到「高质量/快速」)server-rs/crates/api-server/src/config.rs:34、src/main.rs:210-214、src/external_api_keys.rs:1667-1679OFFICIAL_LLM_ROUTER_MODEL = "gpt-6-astra"仍被当作启动强校验常量(api-server 必须等于该模型名才允许启动),并写入llm_router_account的 route 元数据apps/ai-game-creator-shell/src-tauri/src/main.rs:1461、apps/ai-game-creator-shell/game-creator.config.json:9llm.model = "gpt-6-astra";该 json 被include_str!内嵌(main.rs:1490),首次启动原样落进用户私有配置(官方锁定构建下llm.model会被selectedModelId覆盖,但 debug/未锁定构建与落盘模板仍在写已移除的模型名)补充事实:全仓库(含
platform-llm、external_api_keys.rs的 Router 控制面调用面)没有任何“向上游查询模型列表”的实现;Router 控制面只用于/api/user*、/api/token*、/api/subscription*与额度/api/status。唯一已有的“拉模型列表”代码在 AGC 客户端自定义 Provider 分支(src-tauri/src/config.rs:4340+,GET {base}/models取data[].id)。目标
拟改动
A. 目录初始化(server-rs)
spacetime-module/src/agc_models.rs:21-28缺行时返回“未初始化”语义(procedure 报错或返回空),不再造默认目录。module-runtime::AgcModelCatalog::default()的硬编码内容(改为空/无默认),并同步删除module-runtime/src/agc_models.rs:98-108中resolve("quality") == "gpt-6-astra"一类断言。ProcessRole::Api|All)新增「确保 AGC 模型目录已初始化」,挂在既有try_restore_app_state_for_startup钩子(api-server/src/main.rs:736-773,与ensure_editor_generation_runtime_service_identity同层):save_agc_model_catalogprocedure 落库(revision0 → 1,保持乐观锁语义);/api/llm/models返回明确的“模型目录未初始化”错误(当前是 503「模型目录暂不可用」语义可复用),/api/llm/responses同样拒绝,而不是继续用写死目录放行。B. 目录内容与 id / 别名词义
id = 上游模型名、alias = 上游模型名(原名直出,不再人工写别名)、modelId = 上游模型名、enabled = true。module-runtime/src/agc_models.rs:47-78的校验:上游模型名常含.、/、:(如gpt-5.6-sol、provider/model),当前 id 只允许[A-Za-z0-9_-]且 ≤64、alias ≤40 且唯一,必须同步放宽(platform-default继续保留为保留 id)。default_model_id= 列表首项(或按可配置默认项,见待确认 3)。GET /api/llm/models契约保持{id, displayName, defaultModelId, revision},但displayName语义变为“上游原始模型名”。需同步改:api-server/src/llm/mod.rs:39-52的assert!(!payload.contains("gpt-"))断言;docs/technical/【技术方案】AGC后台模型别名与对话选择-2026-09-05.md:36,38;docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md:510-512。C. 后台「AGC 模型」页
apps/admin-web/src/pages/AdminAgcModelsPage.tsx:166-190):去掉别名列 / 只读展示原名,保留启用、默认、删除与新增;顶部摘要(:87-107)“默认模型 = 别名”文案同步调整。D. 清理写死的
gpt-6-astraapi-server/src/config.rs:34的OFFICIAL_LLM_ROUTER_MODEL不再作为“必须等于某模型名”的启动强校验(main.rs:183-244、external_api_keys.rs:1663-1680同步调整);或改为不绑定具体模型名。DEFAULT_GAME_CREATOR_LLM_MODEL(main.rs:1461)与game-creator.config.json:9的写死模型名,并同步scripts/check-config.mjs、src-tauri/src/tests/configuration.rs:711-744的断言。E. 客户端
ConversationModelSelect只渲染displayName(src/features/project-workspace/ConversationModelSelect.tsx:388,415-419),原名会直接显示出来。selectedModelId现在会是含.//的模型名,会经src-tauri/src/config.rs:3751-3757写进llm.model并作为model发给/api/llm/responses,需核对客户端与 api-server 两侧对该字符集的处理。待确认
llm_router_admin_token(控制面)和每用户 Router Key;仓库里没有模型列表端点的规格/样例,实现前需要确认上游允许的读端点、鉴权方式与返回形状。另需确认“以哪个用户分组的可见模型为准”——AGC 账号的 Router Token 分组是taonier(external_api_keys.rs的LLM_ROUTER_TOKEN_GROUP),目录必须与 AGC 账号实际能用的模型集合一致,否则仍会出现“目录里有、上游 404”。DependencyUnavailable5s 循环在本次启动内持续重试?验收
agc_model_catalog自动填充为上游模型列表,/api/llm/models的displayName即原始模型名,无「高质量/快速」。/api/llm/models明确报错且不回退任何硬编码模型名;下次启动成功后自动可用。gpt-6-astra/gpt-5.6-luna/高质量/快速作为默认模型或初始目录(测试 fixture / 历史文档除外)。所以也不是随机值了呗😁️
线上的一般是调过的,默认值一般是本地新建worktree的时候用到,懒得每次都开后台调了所以希望默认直接显示所有模型
已按 issue 描述实现并开 PR #507(分支
enhance/default-model,4 个提交,已推送)。落地结果:
read_agc_model_catalog缺行不再返回内置目录。GET {Router}/models建目录并写回(revision 自增);拉不到只记 error、不写替代目录,下次启动重试。/api/llm/models、/api/llm/responses、/api/llm/chat/completions、后台/admin/api/agc-models返回 503「模型目录未初始化」,不回退任何内置模型名。GET /api/llm/models的 DTO 形状不变,id/displayName都是上游原始模型名,存量客户端不发版即可显示原名。gpt-6-astra(模板与 Rust 默认改为platform-default占位)。验证:本地隔离 SpacetimeDB + loopback 假上游跑通四条路径(空库+可达→自动填充 revision=1 且接口返回原名;空库+不可达→启动 error + 接口 503;同库换成可达上游重启→同步成功;目录已存在时重启→不重写),另有 Rust 定向测试(module-runtime 3、api-server 30+18、AGC 客户端 45)、admin-web 页面测试与 typecheck、
check:spacetime-schema/check:server-rs-ddd/ 编码与文档索引检查全部通过。待真实环境确认(PR 已标注为残留项):
GET /v1/models,以及taonier分组的可见模型集合是否是我们要暴露的集合。OFFICIAL_LLM_ROUTER_MODEL = "gpt-6-astra"仍作为部署配置校验常量与 provisioning 元数据存在(已与目录解耦),是否移除建议单独评估。补充实测结论与一处修正(PR #507 已更新):
/v1/models用管理 token 是 401(该端点要用户 Key),管理面/api/models/会带出已下线、无路由绑定的gpt-6-astra/gpt-6-luna,所以目录来源最终定为分组定价列表GET {Router 控制面}/api/pricing?group=taonier(公开只读,不带凭据)。agc_model_catalog后启动 api-server →revision=1 model_count=6,GET /api/llm/models返回deepseek-flash / deepseek-v4-pro / glm-5.3 / glm-5.3-flash / qwen-image-3.0 / qwen3.8-flash,默认项deepseek-flash;未初始化期间接口 503,不回退内置模型。按讨论后的最终口径重做了这一版(PR #507 已强推干净历史,5 个提交):
高质量/快速 → gpt-6-astra/gpt-5.6-luna,改为 api-server 启动期从上游分组定价列表GET /api/pricing?group=taonier(公开只读)同步;拉不到就报错、不写替代目录,下次启动重试,直到目录里有数据。id/alias/modelId/defaultModelId,后台页面与 DTO、/api/llm/models形状、客户端标识校验全部保持原样。id用模型名 slug(glm-5.3→glm-5-3)、alias/modelId用上游原名,所以已发布客户端不需要发版。revision=1 model_count=6,落库{id:"glm-5-3",alias:"glm-5.3",modelId:"glm-5.3"},GET /api/llm/models返回displayName为上游原名、默认项deepseek-flash;目录已存在时重启不重写。qwen-image-3.0是否对 AGC 隐藏由 owner 后台停用;module 与 api-server 需同批发布/回滚。