refactor(config):收敛内置模型来源并简化自定义模型管理#508
Conversation
|
Codex usage limits have been reached for code reviews. Please check with the admins of this repo to increase the limits by adding credits. |
| @@ -97,8 +98,9 @@ func catalogInputFromProvider(cfg config.ProviderConfig) (provider.CatalogInput, | |||
| input := provider.CatalogInput{ | |||
| Identity: identity, | |||
There was a problem hiding this comment.
DisableDiscovery is now forced to true for all builtin providers. This breaks the existing ModelScope guide verification flow (runModelScopeGuideSubmit -> providerSvc.ListModels) because ListModels can now return static models without any remote call/auth check. As a result, an invalid token may still pass verification and get persisted. Please keep discovery enabled (or explicitly call a forced-refresh/auth-check path) for the token verification workflow.
Codecov Report❌ Patch coverage is 📢 Thoughts on this report? Let us know! |
|
/code 提高测试覆盖率,提交PR到fork仓库 |
完成情况已按要求提升测试覆盖率,并提交到 fork 分支。 变更内容:
验证结果:
提交与推送:
|
Generated with [codeagent](https://github.com/qbox/codeagent) Co-authored-by: phantom5099 <245659304+phantom5099@users.noreply.github.com>
test(config): improve refresh model coverage
|
1 .是的,但这样的话如果有模型下架,我们只需要手动发布新版本就能跟上,而不是被动地像过去一样等待24小时有效期过去获取新信息,而且实际上,就比如魔搭的那个模型列表老是有没用的模型信息,他又不及时更新,就只能我们手动更新 |
|
每个模型的上下文都可能不同,这个上下文窗口现在是自行向提供商获取吗?还是说又是我们硬编码? |
硬编码,还有用户自定义的供应商在自动获取模型信息的时候如果刚好能获取到这几个值,就填上。不然按照之前的办法,实际上很多供应商,以及所有我们提供的openai协议的供应商,这些值根本没提供,就只能硬编码了 |
我觉得我们可以内置一个硬编码,但是还是需要给用户自定义配置的接口。比如我们内置的硬编码是500kb,但是现在模型都提升至了1M,难道每次你都需要重新更改编译,然后要求用户更新吗? |
我的思路确实是这样,内置的供应商确实不让用户更改,如果你觉得这部分需要让用户更改的话,后面再另提一个PR |
解决问题
1. 内置 provider 依赖
/modelsdiscovery,模型目录不稳定原实现里,builtin provider 的配置仍然保留了 discovery 语义,模型列表在 catalog 层仍可能与远端
/models绑定。这带来几个问题:context_window、max_output_tokens、capability_hints这些真正影响预算推导和能力判断的字段,无法由项目稳定维护。2. custom provider 的 catalog 使用 TTL + 后台刷新,行为不透明
原实现中,catalog 会基于 24 小时 TTL 判断缓存是否过期,并在部分路径下静默后台刷新。这会带来:
/models。3. 用户可写模型与远端元数据混在一起,配置风险高
之前
provider.yaml中的models允许写入context_window、max_output_tokens等字段,这有两个直接问题:解决方案概述
1. builtin provider 改成仓库内静态模型清单
本 PR 将 builtin provider 的模型来源切换为仓库内静态清单:
/modelsdiscoveryProviderConfig.Models直接携带静态模型列表idnamedescriptioncontext_windowmax_output_tokenscapability_hints这样 builtin provider 终于有了“稳定、可测试、可审核”的模型目录。
2. custom provider catalog 去掉 TTL 和后台自动刷新
catalog 层改为更直接的语义:
RefreshProviderModels这意味着“普通读取模型列表”和“强制刷新模型列表”被明确区分开了。
3. 用户可写模型严格收窄为
id/name本 PR 将 custom provider 的用户可写模型结构收窄为:
idname以下字段不再允许出现在
provider.yaml models中:context_windowmax_output_tokensdescriptioncapability_hints这些元数据只允许来自 discovery 缓存或 builtin 静态清单,避免用户手填错误值污染运行时行为。
4. discovery 缓存只保存规范化后的必要字段
本 PR 没有把远端原始完整 JSON 原样落盘,而是只保存规范化后的白名单字段:
idnamedescriptioncontext_windowmax_output_tokenscapability_hints这样既保留了预算与能力判断所需信息,也避免缓存承担“保存上游任意字段”的职责。
具体修改
A. builtin provider 静态化
涉及文件:
internal/config/provider.gointernal/config/provider_test.go主要变化:
openai、gemini、qiniu、modelscope增加静态ModelsModelSource和DiscoveryEndpointPath当前静态模型中,
modelscope默认模型已经从不可用的Qwen/Qwen2.5-*切换为:deepseek-ai/DeepSeek-V3.2MiniMax/MiniMax-M2.5这一步也顺带补齐了 builtin 模型的
ContextWindow、MaxOutputTokens和CapabilityHints。B. catalog 语义改为“按需发现 + 显式刷新”
涉及文件:
internal/provider/catalog/service.gointernal/provider/catalog/store.gointernal/provider/catalog/service_test.gointernal/provider/catalog/additional_test.gointernal/provider/catalog/store_test.go主要变化:
ExpiresAtListProviderModelsSnapshot改为纯快照读取ListProviderModels仅在 cache miss 时同步 discoveryRefreshProviderModels3提升到4这一改动让 catalog 行为从“半缓存、半自动刷新”变成了“清晰的本地快照 + 显式远端同步”。
C. custom provider 持久化结构收窄
涉及文件:
internal/config/provider_loader.gointernal/config/provider_custom_normalize.gointernal/config/state/service_provider_create.gointernal/tui/core/app/update.go主要变化:
customProviderModelFile只保留id/nameprovider add手工模型 JSON 只允许id/nameSaveCustomProviderWithModels在有models时都会持久化id/name这一步把“用户声明模型”与“系统推导模型元数据”彻底拆开了。
D. config-state 层补上显式刷新能力
涉及文件:
internal/config/state/model.gointernal/config/state/service.gointernal/config/state/service_test.gointernal/config/state/model_test.gointernal/config/state/model_additional_test.go主要变化:
ModelCatalog接口新增RefreshProviderModelscatalogInputFromProvider对 builtin provider 强制DisableDiscovery: trueService.RefreshModels(ctx)新增强制刷新当前 provider 模型列表的能力current_model不再有效,会重新修正当前选择这一步把“强制刷新”正式提升为服务层能力,而不再依赖 catalog 内部隐式行为。
E. 文档与测试同步
涉及文件:
docs/config-management-detail-design.md*_test.go主要变化:
/modelsprovider.yaml models只允许id/name预期收益
1. 模型目录更稳定
/models漂移影响2. 模型元数据终于真正可用
ContextWindowfallback_prompt_budgetCapabilityHints可以更稳定地参与能力判断3. custom provider 行为更容易理解
4. 降低错误配置风险
context_window、max_output_tokens等高风险字段5. 后续 UI 扩展空间更清晰
/model refresh或模型编辑入口,可以直接复用当前分层结果reviewer 建议关注点
modelscope当前默认模型是否符合产品预期MiniMax/MiniMax-M2.5当前只补了确认过的ContextWindow,未强行填写MaxOutputTokens,是否接受这种保守策略id/name后,是否完全符合预期的产品边界验证情况
go test ./internal/config/...go test ./internal/tui/core/app/...go test ./...