- 后端:AdminLlmProvider 暴露 reasoning{kind}(恒下发,""=未声明=auto)、personaModels、personaProviders; 顶层新增 reasoningKinds / personaProviderOptions 两个**取值域**(唯一来源= runtimeconfig 导出枚举, 校验错误文案也由枚举拼接 ⇒ 不可能漂移) - 读写共用同一映射(admin_llm_provider.go),避免「读侧少一个键 ⇒ 面板一保存就抹掉」 - 写侧语义:缺失=保留、给出=整块/整表替换;非法值一律 runtimeconfig.Group.Validate() ⇒ 400 bad_request (实测非法 kind 返回 400 且 models.json 完全不动,而非 500 静默失败) - 前端:新增 LlmProviderRouting(推理形状下拉 + multimodal 开关 + 按角色路由编辑器); 目录能力位改三态(true/false/未标注),「未标注」不再谎称「不支持」;目录/角色清单不可用时 **不阻塞编辑**且与「字段为空」是不同状态;绝无 mock/sample 回退 - 复核:build/vet 绿 + gateway/config 包测试绿 + tsc 0 错 + vite build 成功;2 条变异反证(删 reasoning 补丁 → 2 例红;删 Group.Validate → 该 400 用例红)已还原 - 注意(主会话已知):npm run build 把新 SPA 写进 frontend/web/dist,而运行中的二进制优先从磁盘读该目录 ⇒ :10942 目前是「新面板 + 旧后端」,等阶段 5 全绿后按红线「先 build 到位、再一次 restart」切换
执行方案 DevDocs/audit/_plan.md 阶段 0 · G0-C:该文件是全仓第二大超限文件(666 行), 且后续多条裁决要改它(工具策略落盘、主人档案 GET/PUT、admin API 补推送结果、模型配置 自动化)⇒ 先拆。 - admin.go(169):共享地基 —— backthinkListLimit 常量、全部 DTO 类型、 collectSessions/collectMemories 收集器、iotDeviceSummary - admin_query.go(467):只读 GET 聚合(personas/sessions/memories/plugins/channels/iot/ llm/automations/users/backthink/rag 的列表与查询 handler + 渠道账号脱敏等私有辅助) - admin_mutate.go(41):写操作(adminSetPolicy,带审计的 owner 写) 纯搬移机械证明:拆前与拆后(非空、非 package、非 import 块行)排序后 **md5 相同** (605=605 行);顶层声明集合 43 条守恒;唯一新增 = 两个新文件的 package 行与 import 块。 未触碰 admin_write_*.go / admin_channels_*.go 及任何 _test.go。 验证:go build/vet 绿;internal/services/gateway 测试绿(含 -run Admin 定向); linux/amd64 + darwin/arm64 交叉编译绿;三文件 169/467/41 行均 ≤500;gofmt -l 无输出。