gh-aw 记忆机制完全指南:cache-memory 与 repo-memory 持久化原理详解
【免费下载链接】gh-awGitHub Agentic Workflows项目地址: https://gitcode.com/GitHub_Trending/gha/gh-aw
gh-aw(GitHub Agentic Workflows)是一个让 AI Agent 在 GitHub Actions 中自动处理 Issue、PR 和维护任务的开源项目。它的记忆机制通过cache-memory(缓存记忆)与repo-memory(仓库记忆)两种存储方式,让 Agent 在多次工作流运行之间"记住"进度、状态和历史数据,从而把一次次孤立的运行串联成有记忆的持续任务。
1. 为什么 AI Agent 需要"记忆"?
GitHub Actions 的每次运行都是全新环境:Runner 执行完就销毁,Agent 上一次记下的进度、读过的上下文全部丢失。没有记忆的 Agent 每次都要从零开始,无法做到:
- ⏸️ 长任务断点续传(比如批量处理 10000 条记录)
- 📊 跨运行积累历史数据、计算趋势
- 🔁 多个工作流之间共享数据
gh-aw 的解法是:在 Agent 运行期间挂载一个确定的记忆目录,运行结束后由编译器自动生成的步骤把文件同步到持久化存储,下次运行时再自动恢复。整个过程对 Agent 是"透明"的——它只需要正常读写文件即可。
2. 三大记忆机制一览 🗂️
gh-aw 提供三种记忆存储,按"生命周期"从轻到重排列:
| 机制 | 存储位置 | 保留时长 | 适合场景 | 默认路径 |
|---|---|---|---|---|
| cache-memory | GitHub Actions 缓存 | 7 天 | 临时状态、会话数据 | /tmp/gh-aw/cache-memory/ |
| repo-memory | Git 专用分支 | 永久 | 历史数据、长期状态 | /tmp/gh-aw/repo-memory-{id}/ |
| comment-memory | Issue/PR 受管评论 | 永久 | PR 跟进上下文 | /tmp/gh-aw/comment-memory/ |
三者共用同一套设计哲学:Agent 只操作普通文件,持久化由 gh-aw 编译器生成的步骤在幕后完成。
3. cache-memory:7 天有效期的高速缓存记忆
3.1 一键启用
在 Markdown 工作流的 frontmatter 中只需一行:
tools: cache-memory: true编译后,Agent 就能在/tmp/gh-aw/cache-memory/目录下自由读写.json、.jsonl、.txt、.md、.csv等文件。gh-aw 还会自动把这段"记忆目录说明"注入 Agent 的提示词,见 pkg/workflow/prompts/cache_memory_prompt.md。
3.2 持久化原理:restore → 读写 → validate → save
cache-memory 的每次运行都遵循一条自动生成的流水线:
- Restore:用
actions/cache按缓存 key 恢复整个目录。gh-aw 会自动生成带降级链的 restore-keys(自动剥离github.run_id),本次运行没命中最新缓存时,可以回落到更早的运行,甚至回落到默认分支的缓存; - Agent 读写:Agent 把文件当作"简易文件共享"随意组织,比如
notes.md记观察、history.jsonl记流水日志、state/存结构化状态; - Validate:校验文件扩展名白名单、文件大小数量限制,还允许用
validation.script写一段自定义 JS 做业务级校验(此时不传入任何 GitHub token); - Save:校验通过后才把目录打包存回缓存(仓库级 10GB 上限,LRU 淘汰)。
核心生成逻辑在 pkg/workflow/cache_memory.go,目录、缓存 key、restore-keys 的拼装都发生在编译期。
3.3 完整性感知缓存:防止"低信任数据投毒"
这是 cache-memory 最有意思的设计。当工作流启用了tools.github.min-integrity时,缓存目录内部会初始化一个git 仓库,并建立merged / approved / unapproved / none四级完整性分支:
- 运行前脚本 actions/setup/sh/setup_cache_memory_git.sh 检出当前运行对应的完整性分支,并从高完整性分支向下合并(冲突时高完整性数据胜出);
- 效果是:低信任运行能读到高信任数据,但高信任运行永远看不到低信任数据,从机制上阻断"恶意/低质数据污染可信缓存"的路径;
- 同时该脚本还会做预 Agent 消毒:删除符号链接、剥离可执行位、按
allowed-extensions清理不合规文件。
3.4 自动清理
gh-aw 的 Agentic Maintenance 工作流会定期按"key 前缀"分组清理 cache-memory,每个组只保留最新一条,避免缓存无限膨胀。
4. repo-memory:写入 Git 分支的永久记忆
4.1 启用方式
同样只需在 frontmatter 中声明,例如把记忆写入自定义分支并限制文件类型:
tools: repo-memory: branch-name: memory/custom-agent-for-aw file-glob: ["*.md", "*.json"] max-file-size: 1048576分支默认自动以orphan(孤儿)分支创建(create-orphan: true),无需预先存在。
4.2 持久化原理:五个阶段的数据流
与 cache-memory 的"缓存整目录"不同,repo-memory 走的是**"缓存中转 + Git 落地"**的双阶段模型,完整架构定义在 scratchpad/repo-memory.md:
- Clone:Agent 作业开始时,脚本 actions/setup/sh/clone_repo_memory_branch.sh 以
--depth 1 --single-branch克隆memory/{id}分支到/tmp/gh-aw/repo-memory/{id}/,分支不存在则创建孤儿分支; - Execution:Agent 直接在目录里读写文件,提示词中会明确告知这个记忆路径;
- Upload:作业结束时把目录上传为 GitHub Actions artifact(
repo-memory-{id}),且使用if: always()——即使作业失败,记忆也会保存,方便事后调试; - Download + Validate:独立的 Push 作业下载 artifact,逐项校验
file-glob、max-file-size(默认 10KB)、max-file-count(默认 100)和max-patch-size(单次 diff 上限,默认 10KB); - Push:actions/setup/js/push_repo_memory.cjs 把文件提交到
memory/{id}分支。提交通过 GitHub GraphQL 的createCommitOnBranch变更完成,自动携带 GitHub GPG 签名,满足"提交必须已验证"的分支保护规则;并发推送时以-X ours合并策略重放,你的文件变更永远胜出。
4.3 多记忆分区
支持一次声明多个记忆分区(数组形式),每个分区独立分支、独立限制,例如一个metrics分支存时序数据、一个config分支存 schema。记忆 ID 遵循[a-zA-Z0-9-]+命名规则,Go 层与 JavaScript 层共用同一套路径推导规则(repo_memory.go中的目录、artifact 名、分支名构建函数),由专门的跨层一致性测试保证不漂移。
5. 如何选择:cache-memory vs repo-memory
| 维度 | cache-memory | repo-memory |
|---|---|---|
| 保留时长 | 7 天(LRU 淘汰) | 永久 |
| 版本控制 | ❌ | ✅(每次运行 = 一次提交) |
| 性能 | 快(整目录 tar 恢复) | 稍慢(clone + commit) |
| 上限 | 10GB/仓库 | 受仓库限制 |
| 最佳用途 | 会话状态、API 缓存、断点续传 | 历史指标、趋势分析、跨工作流共享 |
经验法则:7 天内还会再用的状态放 cache-memory;需要留档、审计、回溯的历史数据放 repo-memory。两者可以同时启用——用缓存做工作集,用分支做档案库,这是官方 MemoryOps 模式(Pattern 6)推荐的组合。
6. 安全建议与安全机制 🔒
- 不要存敏感数据:两种记忆都跟随仓库权限,任何能访问仓库的人/流程都能读到;凭据、token、PII 一律禁止;
- 收紧白名单:用
allowed-extensions/file-glob限制文件类型,cache-memory 在恢复后还会做预消毒(删符号链接、去可执行位、清 hooks); - 威胁检测联动:启用 threat detection 后,cache-memory 的保存动作被推迟到独立校验作业,"restore → 修改 → 上传 artifact → 校验 → save",校验不过则不落盘;
- 自定义校验:
validation.script以受限 Node 环境执行,可用memoryRoot、memoryId等全局变量做 schema 级检查,抛异常即拒绝持久化。
7. 延伸阅读 📚
- 官方参考文档:docs/src/content/docs/reference/cache-memory.md、docs/src/content/docs/reference/repo-memory.md
- 实战模式库:docs/src/content/docs/patterns/memory-ops.md(穷尽式处理、断点续传、趋势计算等 7 种模式)
- 设计决策记录:docs/adr/28482-centralize-cache-memory-directory-path-computation.md(缓存目录路径集中化)、docs/adr/26587-pre-agent-cache-memory-working-tree-sanitization.md(预 Agent 消毒)、docs/adr/27479-comment-memory-file-based-agent-memory-with-github-persistence.md(comment-memory)
- 核心源码:pkg/workflow/cache_memory.go、pkg/workflow/repo_memory.go、actions/setup/js/push_repo_memory.cjs
💡 一句话总结:cache-memory 让 Agent 拥有"短期记忆",repo-memory 让它拥有"档案记忆"——而 Agent 本身始终只需要会读写文件。
【免费下载链接】gh-awGitHub Agentic Workflows项目地址: https://gitcode.com/GitHub_Trending/gha/gh-aw
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考