已批准设计 · 已实现并验收

设置界面方案

统一外壳、明确设置入口,仅提供对应真实运行行为的设置。

记忆
OpenProgram 记忆topics/projects/openprogram-memory.md · 今天修改

OpenProgram 记忆

4 条记录 · 可查看 Git 历史

记忆操作

模型可直接编辑 Topic 文件,也可通过 Memory API 提交结构化变更。两条路径共享 Runtime 验证和派生视图。

Scheduler Agent 可以在规划时创建持久 Memory 记录,执行期间更新,任务结束时关闭或删除。
^7a12e4c9 · 3 个来源引用

当前检索

关键词检索对 Topic 和 Source 事件使用 BM25。语义检索在安装并选择 embedding 模型前不可用。

▤

尚未写入记忆

对话积累足够后,OpenProgram 写入持久主题。可先配置写入模型和召回方式。

设置

记忆

选择 OpenProgram 写入、存储和召回长期记忆的方式。

采集对话归档
写入MiniMax-M3
存储本地 + Git
召回仅 BM25

记忆服务

启用记忆开启召回、后台写入、整理和记忆工具。修改此开关需要重启 OpenProgram。
存储Topic Markdown,附派生视图与 Git 历史。
本地工作区 · Git 已启用

后台写入

写入模型除非在此选择已启用模型,否则使用默认聊天模型。
即时生效
自动写入在后台将已完成对话转为 Topic 记录。
写入频率控制后台写入前需积累的对话量。

检索

召回方式选择自动排序召回,或让 Agent 仅在需要时检查记忆。
即时生效
Embedding 模型仅语义与混合检索需要。
未安装
召回深度添加到每轮的匹配记录上限。
搜索 Source 证据在整理后的 Topic 记录之外,包含归档证据。

上下文与历史

每段聊天注入核心记忆向每个 system prompt 注入紧凑的 Core 视图。
Recent 视图大小Recent 派生视图保留的最新记录数。
工作区当前记忆数据位置。Runtime 管理的文件保持只读。
~/.openprogram/memory

已实现界面合同

  • Memory 保留标准 64px 标题栏,并提供直接访问 /settings/memory 的链接。
  • Topics、Timeline、Recent 和 Core 组成 Topic 树上方的垂直分区列表。
  • 720px 视口下,分区列表、树和内容纵向排列,不移除记忆导航。
  • Settings 读写 CLI/TUI 使用的同一 schema。
  • Memory 复用 Settings 固定页头、正文边距、字体、分区卡片和紧凑行合同。生命周期摘要是唯一专属视觉结构。
  • 每个可编辑记忆控件在用户修改后立即通过 POST /api/settings 持久化。页面没有独立保存按钮;写入被拒绝时恢复旧值并显示行内错误。
  • Memory 后端开关说明修改需要重启 OpenProgram,但不永久显示“下次启动”状态标签,因为设置 API 不提供待重启状态。
  • 打开 /settings/memory 仅请求声明的 memory.* 配置行,有限请求完成后立即渲染;工作区状态和写入模型选项独立加载,不能阻塞可编辑页面。
  • GET /api/memory/status?settings=true 只返回工作区路径和固定 embedding 快照可用性,不解析 Topics、遍历 Sources、计算 revision 或扫描 session/写入器状态。
  • 状态路径检查固定 embedding 快照的每个必需文件是否存在且非空,不导入数值检索代码、不构造 encoder、不加载模型权重。Encoder 初始化属于语义检索,不属于 Settings。
  • Intel macOS 保持核心记忆和 BM25 可用,但即使缓存模型快照也报告语义 embedding 不可用。安装操作在下载前失败,并提供使用 BM25 或支持平台的可执行说明。
  • Memory Settings 进入时不请求 Agent runtime 设置。已启用模型独立请求以填充写入模型选项,且 /api/models/enabled 在 FastAPI worker 线程运行而不阻塞服务端事件循环;缓慢或不可用的 provider/model 枚举不能延迟可编辑记忆行。
  • 进入 Settings 不预取 Providers、Search 或 Channels 数据;各页打开时自行请求。
  • Agent · 按需 不自动执行 BM25、embedding 或混合查询。Agent 可通过 memory_browse, memory_get以及 memory_grep显式检查记忆;排序检索 memory_search 报告此模式下已禁用。
  • Embedding 快照不可用时提供明确的 安装 操作。产品运行时不包含 sentence-transformers 或 torch。 POST /api/memory/embedding/install 在 worker 线程只下载固定 encoder 配置、tokenizer 和 safetensors 权重,然后验证所有必需文件。不构造 encoder,失败时返回可重试错误且不改变当前召回方式。Semantic 和 Hybrid 保持不可用,直到源码 checkout 安装可选 embedding extra 且快照存在。

实现与验收

  • 公开入口: /memory, /settings/memory、即时 GET/POST /api/settings 更新、自动召回、 memory_search以及 Topic/API 写入。
  • Runtime 设置覆盖自动写入、频率、含 agent的召回方式、召回深度、Source 范围、Core 注入和 Recent 大小。
  • 本地 embedding 快照存在前,Semantic 与 Hybrid 禁用;保存任一方式仍执行既有完整可用性验证。
  • Agent 模式下,自动轮次召回为空,depth/Source 控件因不参与该模式而禁用。Core Memory 注入是独立设置。
  • 四张生命周期卡片在可滚动设置列中按固有高度显示;当分区多于视口时,不得因 flex-shrink 缩进 overflow: hidden 后而不可见。
  • 以下情况验收失败:设置状态路径调用 store.ensure() 或完整工作区检查器、初始化 encoder、仍在页面阻塞请求组中;已启用模型发现阻塞设置行;进入 Settings 触发同级页面预取。
  • 冷进程验证解析本地 embedding 快照而不导入 numpy、BM25 或 sentence_transformers;可编辑设置、模型选择和有限状态分别完成。
  • 过长的写入模型标签应在右侧控件组内缩小;不能使左侧标题或描述在窄设置区域中每行只剩一个字符。
  • 记忆选择框聚焦时保留单一中性边框,不添加强调色外轮廓。
  • 本页不增加外部 API 权限控件。
  • 已通过专项与受影响测试、TypeScript 验证、独立规格和质量审查,以及默认 App 普通宽度与 720px 下的可见检查。