Files
social-app/docs/plans/2026-03-17-automation-memory-design.md
T
qzl 19981964fb refactor: 移除 LiteLLM proxy 架构,后端直连 Provider API
- 移除 backend/scripts/build_litellm_proxy_config.py
- 简化 LiteLLMService,移除 run_completion_with_cost 方法
- AgentScopeRunner 改为从 LlmFactory 获取 api_base 和 api_key
- 部署配置移除 litellm/litellm-config-job 服务
- Flutter 新增 AuthBootScreen 引导页
- Android 添加通知权限 (POST_NOTIFICATIONS, RECEIVE_BOOT_COMPLETED, SCHEDULE_EXACT_ALARM)
- 优化 LocalNotificationService 调度失败 fallback
- 更新 manifest.json (version 3)
2026-03-17 18:05:49 +08:00

228 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 自动化记忆任务设计方案(v1
## 1. 背景与目标
本方案用于落地后端自动化记忆任务:
- 提供每日/每周自动执行能力;
- 自动提取用户近期对话中的可沉淀记忆并写入 `memories`
- 支持“忘记”操作;
- 复用现有 Agent 运行链路,避免并行维护两套运行时;
- 保证可审计、可追溯,同时对用户界面隐藏自动输入提示词。
## 2. 范围与非目标
### 2.1 范围
- `automation_jobs` 增加 `config`JSONB,强约束);
- 调度器执行 `automation_jobs`,按用户本地时区计算执行时间;
- 自动任务复用现有 `router -> agent` 运行策略;
- 自动输入落库但对用户不可见;
- 工具集按任务配置分发,仅允许白名单工具;
- 正式启用 `memory_prompt`,将 `memories` 注入系统提示词。
### 2.2 非目标
- 不开放复杂 DSL 编排;
- 不开放细粒度策略配置(如 `execution_profile/history_window_days/memory_policy`);
- 不引入第二套独立 Agent 运行框架。
## 3. 关键决策
1. **调度与执行分离**
- `run_at/next_run_at/timezone` 负责“何时执行”;
- `config` 负责“如何执行”(提示词与工具集)。
2. **配置最小化**
- `automation_jobs.config` 仅保留:
- `prompt: string`
- `tools: string[]`
3. **自动输入可审计但用户不可见**
- 自动任务提示词作为“用户消息”写入 `messages`
- 在 metadata 加可见性标记并在用户历史接口中默认过滤;
- 审计路径可查询完整消息链路。
4. **时区策略**
- 调度语义采用“用户本地时区 10:00”;
- 存储执行时间统一为 UTC 的 `next_run_at`
- 调度器仅按 UTC 扫描,降低运维复杂度。
## 4. 数据模型设计
## 4.1 `automation_jobs` 调整
- 保留字段:`id`, `owner_id`, `title`, `schedule_type`, `run_at`, `next_run_at`, `timezone`, `last_run_at`, `status` 等;
- 新增字段:`config JSONB NOT NULL`
- 迁移策略:
- 将历史 `prompt` 迁移到 `config.prompt`
- 切换业务代码后删除旧 `prompt` 字段(可分两步灰度)。
### 4.2 `config` 强约束 schema
```json
{
"prompt": "提取最近对话中的稳定记忆并写入",
"tools": ["memory_write", "memory_forget"]
}
```
约束要求:
- `prompt`:必填、非空、长度受限(建议 <= 2000);
- `tools`:必填数组,元素为注册工具名;
- `extra="forbid"`,拒绝未知字段;
- 执行前二次校验:`tools` 必须与后端 allowlist 取交集,禁止越权。
### 4.3 `messages.metadata` 扩展
新增建议字段:
- `hidden_from_user: bool`
- `origin: "chat" | "automation"`
用途:
- `hidden_from_user=true` 的消息在用户历史默认不可见;
- 审计查询可读取全量。
## 5. 运行时架构
## 5.1 复用现有 Agent 链路
自动任务不新建运行时,沿用现有 `router -> orchestrator -> worker` 流程:
- 输入:来自 `automation_jobs.config.prompt` 的合成“用户输入”;
- 上下文:默认加载“今天 + 昨天”历史;
- 工具:仅启用 `config.tools` 且通过 allowlist 校验。
## 5.2 会话与消息策略
- 自动任务写入独立 `session_type=automation` 会话,并关联 `job_id`
- 普通对话维持 `session_type=chat`
- 自动输入消息:`role=user``hidden_from_user=true`
- Assistant 输出消息:默认可见。
## 6. 调度器设计
## 6.1 扫描与触发
- 周期扫描条件:
- `status='active'`
- `next_run_at <= now_utc`
- 命中后入队执行命令(复用现有任务队列)。
## 6.2 幂等与并发控制
- 使用任务槽位去重键:`job_id + scheduled_slot`
- 使用行级抢占或原子更新防止并发重复执行;
- 失败可重试并记录错误上下文。
## 6.3 下次执行时间计算
- 每次执行完成后按 `schedule_type + timezone` 计算下一次触发时间;
- 保存到 `next_run_at`UTC);
- `last_run_at` 记录实际执行时间。
## 7. 默认任务创建
用户创建后自动创建一条默认 daily 记忆任务:
- `schedule_type = 'daily'`
- 本地时区目标时间:10:00
- `timezone`:优先用户设置时区,缺省 `Asia/Shanghai`
- `config.prompt`:内置记忆提取提示词模板
- `config.tools = ["memory_write", "memory_forget"]`
## 8. 记忆工具设计
## 8.1 `memory_write`
- 用途:写入/更新用户记忆;
- 输入:受 schema 限制(标题、内容、来源等);
- 安全:owner 作用域强制绑定,不信任模型输入的 owner 信息。
## 8.2 `memory_forget`
- 用途:失效或删除用户记忆;
- 输入:`memory_id` 或受限条件;
- 安全:仅允许当前 owner 范围内操作。
## 8.3 工具授权
- 任务声明工具集来自 `config.tools`
- 运行时执行 `declared_tools ∩ allowlist`
- 非白名单工具直接拒绝并记录审计日志。
## 9. `memory_prompt` 启用策略
- 从数据库读取当前用户可用 `memories`
- 组装为系统提示词 memory section
- 设置条数与长度上限,避免 token 膨胀;
- 自动任务与普通对话统一使用该注入机制。
## 10. 前端展示策略
- 历史消息接口默认过滤 `hidden_from_user=true`
- 用户仅看到 assistant 输出(以及可选系统摘要,不包含原始自动 prompt);
- 前端无需大量工具分支 if/else,可统一按 metadata 标记处理。
## 11. 安全与审计
- 关键要求:
- 禁止越权工具调用;
- 禁止跨用户 memory 读写;
- 日志不输出敏感数据和完整私密上下文。
- 审计能力:
- 自动输入、工具调用、输出全链路可追踪;
- 用户界面只显示允许可见内容。
## 12. 迁移与发布步骤
1. 新增 `config` 字段与 schema 代码;
2. 数据迁移:旧 `prompt -> config.prompt`
3. 运行时切换到 `config.prompt/config.tools`
4. 灰度验证后移除旧 `prompt`
5. 上线调度器与默认任务创建;
6. 启用 `memory_prompt` 并完成联调。
## 13. 测试与验收
### 13.1 单元测试
- `config` schema 校验(非法字段、非法工具、空 prompt);
- `next_run_at` 计算(跨时区、边界时间);
- 隐藏消息过滤逻辑;
- `memory_write/memory_forget` owner 边界。
### 13.2 集成测试
- 用户创建触发默认 daily 任务创建;
- 调度触发 -> Agent 执行 -> memory 写入 -> `next_run_at` 更新;
- 自动输入在审计可见、在用户历史不可见。
### 13.3 验收标准
- 每日 10:00(用户本地时区)稳定执行;
- 自动化链路有完整审计;
- 工具授权边界有效;
- 前端历史展示符合“隐藏自动输入、展示输出”的预期。
## 14. 实施顺序建议
1. 先更新协议文档(`docs/protocols`)明确契约;
2. 数据库与 schema 改造(`automation_jobs.config`);
3. 工具集与授权边界实现;
4. 调度器与默认任务创建;
5. `memory_prompt` 注入与端到端验证;
6. 前端过滤逻辑收口。
---
本方案是最小可行版本(MVP)设计,重点保障:
- 复用现有架构;
- 低配置复杂度;
- 可审计与可维护并存;
- 为后续扩展保留演进空间。