feat(config,cyrene): .env → 面板配置的启动期 materialize(主人裁决:面板是一等来源,.env 退回入口/播种)
- 主人原话:「.env 只是基础入口,生产环境下应该在每次启动进程时从 .env 把变量(包括后续更新过的)
写入面板专用配置文件,而不是仅依赖 .env 这个脆弱的文件。」⇒ 根治「每加一种能力就再加一个 env 键」
- 规则(主会话裁定,已写入 02 回执):
· **组集合**:面板配置非空 ⇒ 完全由面板决定(env 不新增/不复活被删组/不重排);缺失/空/[]/null ⇒ 由 .env 播种(=今天 env-only 行为)
· **键级**:面板缺 provider/baseUrl/apiKey/model 某键 ⇒ 用 .env 补;**面板已有该键(含显式 ""/null/false)⇒ 面板优先,绝不覆盖**
· 判定用原始 JSON 的**键存在性**(故显式空值也算声明);`len(Filled)==0` ⇒ 一个字节都不动(幂等)
· 面板不可读/解析失败/补齐后不合法 ⇒ **不覆盖原文件**(保人工可救),只 WARN;写盘失败不阻断启动
· 带 omitempty/omitzero 的 fallback/multimodal/reasoning.kind **不在补齐表内**(面板清空与未声明字节相同,
补回会撤销面板操作);它们仍以面板为准、文件缺失/无效时由 .env 兜底
- 落点:`internal/config/runtimeconfig/materialize.go`(导出 Materialize + 诊断 Result/Fill)+ 组合根
`cmd/cyrene/models_materialize.go`,在 `NewRuntimeLLM` **之前**跑一次(**不在热重载路径上**,否则面板刚清空的键会被立刻补回)
- 复核:build/vet 绿 + 全树 `go test ./... -count=1` 全绿 + linux/darwin 交叉编译绿;6 条真断言
(面板值胜出且字节不变 / 缺键补齐并落盘 / 被删组不复活 / 五态播种 / 幂等逐字节相同 /
multimodal 回归两路径);**4 条变异反证**(一律 env 覆盖、只首启播种、组集合由 env 决定、无可补也重写)均已逐字节还原;
另加端到端:`.env`→启动补齐→真 NewRuntimeLLM→真面板写路径改成 panel-model→再启动 ⇒ 仍是面板值
- 契约面:REST/WS/admin 零变更(只改本地面板配置文件 models.json 的语义);待落 Docs v0.59 一条
This commit is contained in:
1 parent
1728addcfe
commit
910d154d35
6 files changed
+1016
-1
No files matched your search
@@ -0,0 +1,29 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"log/slog"
|
||||
|
||||
"git.yeij.top/AskaEth/Cyrene_v2/internal/config"
|
||||
"git.yeij.top/AskaEth/Cyrene_v2/internal/config/runtimeconfig"
|
||||
)
|
||||
|
||||
// materializeModels 在进程启动时跑一次「`.env` 默认层 → models.json 补齐」。
|
||||
//
|
||||
// 语义(主人裁决,规则见 runtimeconfig.Materialize):`.env` 只是基础入口/播种层,
|
||||
// models.json(面板专用配置文件)才是一等来源。每次启动把 `.env` 的 LLM 块补进面板
|
||||
// 配置里**缺失**的键,面板已有的键(含显式空值)绝不覆盖,组集合完全由面板决定
|
||||
// (面板删掉的组不会因 `.env` 仍声明它而复活);面板配置缺失/为空时才由 `.env`
|
||||
// 播种出合成组(既有行为)。幂等,重复启动不再改动文件。
|
||||
//
|
||||
// 失败一律只记日志、**不阻断启动**:模型栈的既有兜底(LoadModels 回退 `.env`)仍然
|
||||
// 兜住,配置文件的一次写失败不该让服务起不来。
|
||||
func materializeModels(path string, env config.LLMConfig, log *slog.Logger) {
|
||||
res, err := runtimeconfig.Materialize(path, env, log)
|
||||
if err != nil {
|
||||
log.Warn("models.json 补齐失败(模型栈仍按现状运行)", "path", path, "error", err)
|
||||
return
|
||||
}
|
||||
if res.Warn != nil {
|
||||
log.Warn("models.json 补齐未完成(模型栈仍按现状运行)", "path", path, "error", res.Warn)
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user