主人 2026-10-07 两条口径:「.env 只做兜底用,后端自动创建独立的面板配置文件
之后就走面板配置文件,这些键优先从面板配置上取」+「频率必须调,可以调到 1 小时
或者三小时,或者动态分配(白天短、静默期长)」。
此前 $DATA_DIR/config/memory-tidy.json 只有读路径(装配期读一次 + 启动播种):
主人要改频率只能改文件 + 重启后端。本切片补上「读回来 → 改 → 落盘 → 当场生效」。
后端(读写端点,契约待塔登记 v0.92):
- GET /api/v1/admin/memories/tidy/tuning 读盘上 7 键值 + 取值规则 specs +
缺位时 .env 档的进程生效值(与 /admin/config-facts 同源)
- PUT 同路径:三态补丁(键缺位 = 不改动 / 合法值 = 采用 / 非法值 = 400 且盘上一
个字节都不动)+ null 清除哨兵(删键 ⇒ 回到下一档)+ writeAuth + 审计
memory.tidy.tuning;值一个都没变时不落盘,文件解不开时拒绝覆盖(409)
- 落盘走 runtimeconfig.PatchMemoryTidyTuning(原子写 temp+rename,与
SeedMemoryTidy/SaveWebSearch 同族同手法);补丁语义保留下受管的其它键
(t1Judge/t1PerWindow/autoApplyPerRound 原样保留)
- 热生效:保存后按「面板 > .env > 代码默认」重算并叠到运行期对象;整理档会
重排心跳(否则新周期要等旧周期那一觉睡完),审查档当场改 ingestGate/tempTtlSec。
未接线/失败时如实回 hot:false + hotError,绝不把「落盘了」说成「生效了」
前端(Miuix):
- 记忆管理页新增「记忆整理调优」卡:7 键表单(中文标签、单位、留空⇒跟随谁、
env 档当前值、坏值就地报错并拦住保存、保存后回显从磁盘读回的真值)
- 试算卡的 recallMode 按契约 v0.91 如实渲染:embedding / lexical(已降级)/
mixed(部分分区降级)/ ""(无候选可比)——空串不再渲染成空标签;并把
error.code=tidy_recall_unavailable 单列一句(「尝试过但向量源不可用」,与
「没有候选可比」显式区分)
验证:go test ./internal/{services/gateway,runtime/memory,config/runtimeconfig}
全绿;三态/清除/坏文件拒写/同值不重写/热生效接线各有用例,并逐条做过变异自证;
tsc --noEmit + vite build 通过;两个 esbuild 前端测试 39 + 34 + 41 checks 通过。
76 lines
3.7 KiB
TypeScript
76 lines
3.7 KiB
TypeScript
import { request } from "./core";
|
||
|
||
/* ----------------------------------------------------------------------------
|
||
* 记忆整理**面板调优**(切片 MEMPANEL / M4)。真源:
|
||
* internal/services/gateway/admin_memory_tuning.go(形状与错误码)
|
||
* internal/services/gateway/admin_memory_tuning_file.go(取值规则 specs)
|
||
*
|
||
* GET /admin/memories/tidy/tuning 读:盘上 7 键值 + 取值规则
|
||
* PUT /admin/memories/tidy/tuning 写:三态补丁(键缺位 = 不改动 / 合法值 = 采用 /
|
||
* 非法值 = 400 且盘上不动;`null` = 清掉该键)
|
||
*
|
||
* 两条都是 writeAuth(owner|admin)——与同族的 `/admin/memories` 同档:它是私有记忆面
|
||
* 的运行期旋钮,不是给 viewer 的监控投影。
|
||
*
|
||
* ⚠️ 失败走 `error.code`,**绝不**回一份「已保存」的假成功:
|
||
* - `invalid_payload` 400:值非法 / 未知键(**盘上一个字节都没动**)
|
||
* - `tuning_corrupt` 409:盘上那份配置文件读不走 ⇒ 拒绝覆盖(要人工修/删)
|
||
* - `tuning_unavailable` 500:数据目录未接线
|
||
* - `tuning_write_failed` 500:落盘失败(盘上内容未改动)
|
||
*
|
||
* 响应里的 `hot` 是**如实**的:true = 保存后当场生效;false = 已落盘,但运行期没接到
|
||
* 可热生效的实现(`hotError` 说明原因),此时界面必须写「重启后端后生效」。
|
||
* -------------------------------------------------------------------------- */
|
||
|
||
/** 调的落点(面板配置文件的**相对**路径,形如 `config/memory-tidy.json`)。 */
|
||
const TUNING_PATH = "/admin/memories/tidy/tuning";
|
||
|
||
/** 一个可写键的取值规则(后端下发,面板不另抄一份枚举/上下界)。 */
|
||
export interface AdminMemoryTidyTuningSpec {
|
||
/** 键名,如 `intervalSec` / `ingestGate`。 */
|
||
key: string;
|
||
/** `int` | `bool`(面板据此选控件类型)。 */
|
||
kind: string;
|
||
/** `sec` | `hour`(仅 int 键;面板据此写单位)。 */
|
||
unit?: string;
|
||
min?: number;
|
||
max?: number;
|
||
/** 缺位时生效值从哪来:`env:MEMORY_TIDY_*` / `panel:<key>` / `code-default`。 */
|
||
fallback: string;
|
||
}
|
||
|
||
/** GET / PUT 的 data(PUT 的响应是**重新读盘**的结果,即真值回显)。 */
|
||
export interface AdminMemoryTidyTuningView {
|
||
/** 面板配置文件相对 `$DATA_DIR` 的路径。 */
|
||
path: string;
|
||
/** 文件是否已存在且有内容(false = 还没播种,后端下次启动会自动创建)。 */
|
||
present: boolean;
|
||
/** 本次结果是否**当场生效**。false = 已落盘,要等后端重启(见 hotError)。 */
|
||
hot: boolean;
|
||
/** `hot:false` 时的原因。 */
|
||
hotError?: string;
|
||
specs: AdminMemoryTidyTuningSpec[];
|
||
/** **盘上**的值:键缺位 ⇒ 该键不出现(= 跟随兜底),不是 0。 */
|
||
values: Record<string, number | boolean>;
|
||
/** 缺位时**下一档(`.env`)**的进程生效值(与 /admin/config-facts 同源)。 */
|
||
envValues?: Record<string, number>;
|
||
}
|
||
|
||
/** 写补丁:只放**真的要改**的键;`null` = 清掉该键(回到下一档兜底)。 */
|
||
export type AdminMemoryTidyTuningPatch = Record<string, number | boolean | null>;
|
||
|
||
/** GET /api/v1/admin/memories/tidy/tuning —— 读盘上的调优值 + 取值规则。 */
|
||
export function adminMemoryTidyTuning(): Promise<AdminMemoryTidyTuningView> {
|
||
return request<AdminMemoryTidyTuningView>(TUNING_PATH);
|
||
}
|
||
|
||
/** PUT /api/v1/admin/memories/tidy/tuning —— 三态补丁写盘(并尽量热生效)。 */
|
||
export function adminMemoryTidyTuningSave(
|
||
patch: AdminMemoryTidyTuningPatch
|
||
): Promise<AdminMemoryTidyTuningView> {
|
||
return request<AdminMemoryTidyTuningView>(TUNING_PATH, {
|
||
method: "PUT",
|
||
body: JSON.stringify(patch),
|
||
});
|
||
}
|