gbrain conversation-archive 技能实战:把 AI 聊天导出与会话转录归档为可检索、可追溯的大脑页面
发布时间:2026/9/23 1:06:39 作者:尧图编辑部 阅读量:1,286

gbrain conversation-archive 技能实战把 AI 聊天导出与会话转录归档为可检索、可追溯的大脑页面【免费下载链接】gbrainGarrys Opinionated OpenClaw/Hermes Agent Brain项目地址: https://gitcode.com/gh_mirrors/gb/gbrain导读conversation-archive是 gbrain 中负责历史对话资产化的核心技能它将 ChatGPT / Claude / Perplexity 等 AI 助手的聊天导出conversations.json以及 Claude Code、Codex、OpenClaw、Hermes、Grok Build 等 Agent 的会话日志导入大脑成为conversations/目录下一页一次对话的带日期 Markdown 页面并通过内置对话解析器校验、原生事实提取、缺口检测与回填循环保证档案无缝隙。读完本文你将掌握从原始导出到可检索档案的完整六步流水线、原生导入命令gbrain transcripts ingest的参数与行为边界、三条防数据丢失不变式、密钥/隐私脱敏机制以及我第一次讨论 X 是什么时候这类时间线追溯问题的标准检索路径。技能定义位于 plugin/skills/conversation-archive/SKILL.md。一、它解决什么问题两半合一的循环对大多数用户而言数年 AI 助手的对话历史是个人拥有的最大语料之一。conversation-archive的定位是让这段历史成为大脑的一等公民内容而不是 downloads 文件夹里的一坨 JSON。技能本身由两个半环组成IMPORT导入半环——原始导出或会话日志 →conversations/下带日期的 Markdown 页面原生导入器直接写页并拆分长会话手动路径先一页一页转换再gbrain import/gbrain sync→ 解析器校验 → 事实提取 → 缺口检查。RETRIEVE检索半环——搜索档案、拉取线程、构建时间线回答我第一次讨论 X 是什么时候。技能元数据frontmatter声明了它的触发词、副作用与写入范围triggers: - chatgpt export - claude export - perplexity export - when did I first discuss - backfill missing conversations mutating: true writes_pages: true writes_to: - conversations/ upstream: conversation-historytranscript-savefc834ee完整触发列表还包括conversation history、import my conversations、search my conversations、archive my session transcripts等见 SKILL.md 的 frontmatter。与之配套的路由评测样例routing-eval.jsonl给出了结构性匹配要求每个正向意图必须包含至少一个触发词子串同时保留真实用户口语化表达例如 when did I first discuss seed-stage pricing with any AI assistant? 与 search my conversations with Claude and Perplexity about agent memory and build me a timeline 都路由到本技能而 did my colleague answer in the group channel last night?实时聊天状态问题则明确不应命中expected_skill为 null。二、原生导入通道gbrain transcripts ingest技能文档首先强调优先使用原生导入器。当来源是以下七种格式之一时检测、密钥脱敏、imessage-slack 渲染、长会话拆分、幂等重跑全部原生完成应胜过手动流程gbrain transcripts ingest ~/Downloads/conversations.json # 导出先解压 gbrain transcripts ingest # 自动发现 harness 日志 gbrain transcripts ingest --max-bytes 4gb store # 超大存储省略则用各格式自带上限 gbrain transcripts status # found vs imported 缺口表2.1 支持的格式与命令家族从 src/commands/transcripts.ts 的FORMATS常量可以看到原生通道覆盖七种格式claude-code、codex、openclaw、hermes、grok、chatgpt、claude-export同一命令还承载gbrain transcripts recent --days 7从梦周期语料目录读取近期原始转录仅限本地与gbrain transcripts status。ingest解析后调用核心实现runTranscriptsIngestsrc/core/transcripts/ingest.ts其逐会话管线为detect → adapter.parse (AsyncGenerator, 逐会话) → since/limit 过滤 → redactSession (fail-closed) → renderSessionParts → 逐 part 导入 → putRawData(baseSlug) → 陈旧 part 对账删除超出数量的 part关键参数transcripts.ts 的parseIngestArgs参数作用--dry-run只解析 脱敏 报告零写入批量--all前先预览将被擦除的内容--all导入发现到的全部会话日志--since T只导入最后一条消息严格晚于 ISO 时间 T 的会话字面量last表示上次干净扫描的水印--limit N以会话为粒度的最大导入数被截断 ⇒ 不算干净扫描水印不前移--format F显式指定格式胜过自动检测--embed导入时立即嵌入默认关闭批量导入推迟到 embed 回填通道--max-bytes N逐格式字节上限的显式覆盖--source id解析出的 source id贯穿导入、raw-data、对账--facts导入后走原生事实提取--dry-run下为预计划--include-self发现阶段也纳入 gbrain 自身 claude-cli 子进程会话issue #44722.2 幂等、原子性与水印的源码级细节src/core/transcripts/ingest.ts 的头部注释揭示了三个实现事实值得在理解命令行为时牢记原子性粒度是会话而非文件一个多会话文件按通过则提交、失败则跳过处理幂等重跑会补齐剩余会话错误分层文件级错误不可读/未知格式/符号链接计数后继续会话级错误扫描失败、超大 part、adapter 抛错计数后文件继续运行级错误 fail-closed——导入重复查找、回读失败、putRawData缺失会中止整个运行水印只在干净扫描后前进结果携带cleanScan全程无错误且未被 limit 截断与maxSessionTs命令仅在此条件下推进--since last检查点被截断或部分失败的运行绝不会被误认为已扫描完。关于--max-bytesSKILL.md 专门强调上限是--since last检查点指纹的一部分参见 transcripts.ts 中可单测的ingestCheckpointFingerprintInput——用不同上限或去掉上限运行会开启全新的水印作用域因此一次带上限运行跳过的小尾巴永远不会被误认为已扫描。这对应 gbrain issue #4149指纹中只有显式上限才携带maxBytes键无条件写入maxBytes: auto会让升级时所有既有水印被重新哈希静默触发一次性全量重扫。2.3 原生通道与手动通道的三个差异脱敏按格式而非仅按厂商前缀vendor 密钥前缀、JWT、云端/API key 形状、Bearer头、携带内联密码的连接串、PEM 私钥块、高熵KEY/TOKEN/PASSWORD赋值加上你的~/.gbrain/harvest-private-patterns.txt正则以及把agent 指令式语句计数进 frontmatter。但广义 PII姓名、电话、地址仍需你人工审查——手动流程的人工清洗步骤对敏感语料依然适用。每条消息正文有约 4K 字符上限可读档案而非逐字稿source_uri指名的会话文件才是逐字记录工具/思考流量只以单行占位符出现。没有原生 adapter 的提供商如 Perplexity继续走下面的手动转换。提示gbrain transcripts ingest与所有打开引擎的命令一样无法在gbrain serve持有单写者锁时运行——锁错误会指名持有 PID见 transcripts.ts。三、对话档案落在哪里目录布局与 slug 冲突conversations/chatgpt/YYYY-MM-DD-slug.md — ChatGPT 线程 conversations/claude/YYYY-MM-DD-slug.md — Claude 线程 conversations/perplexity/YYYY-MM-DD-slug.md — Perplexity 线程 conversations/sessions/YYYY-MM-DD-slug.md — Agent 会话转录一页一次对话。日期前缀的 slug 让来源溯源可排序并喂给时效性排序frontmatter 中的date:驱动页面effective_date供--since/--until过滤使用。Slug 冲突是真实存在的必须确定性消歧。无标题线程共享 New chat 标题且同日可落多条对话于是YYYY-MM-DD-new-chat会跨线程碰撞。put_page没有 compare-and-swap对碰撞 slug 的第二次写入会静默覆盖第一次数据无声丢失。正确做法是给 slug 追加线程 id 或导出 URL 的短稳定哈希YYYY-MM-DD-new-chat-a1b2c3并先查后写gbrain get slug——若命中但不是同一线程就追加哈希而非覆盖。四、手动导入六步流水线Step 1 — 解析导出ChatGPTSettings → Data controls → Export data → 得到conversations.json。每条对话在mapping中以树结构存消息需沿父指针从current_node走回线性线程。ClaudeSettings → Privacy → Export data → 得到每条对话含扁平chat_messages数组的conversations.json。Perplexity无整库导出线程一次只来一条页面保存或粘贴。同样适用下述页面格式。格式会随导出版本漂移——写转换器前先检查实际 JSON 结构不要相信记忆中的 schema。Step 1.5 — 脱敏密钥与 PII强制写前执行聊天导出与会话转录常含有粘贴进来的密钥与个人数据——有人丢进 prompt 的 API key、访问令牌、私人地址。扫描不可省略每写一页conversations/前都要跑因为写出的页面会被索引、被搜索一旦大脑被分享或发布就会泄露。写页前扫描密钥形状字符串与 PII把每个命中替换为带标签的占位符[REDACTED_API_KEY]、[REDACTED_TOKEN]、[REDACTED_EMAIL]。扫描范围包括厂商前缀 keysk-…、ghp_…、AKIA…/ASIA…、AIza…、sk_live_…、glpat-…、npm_…、hf_…无前缀、仅凭格式即可识别的凭据JWTeyJ….eyJ….…、账户 SID、携带内联密码的连接串bearer/authorization 令牌、PEM 私钥块、值呈高熵的KEY/TOKEN/PASSWORD赋值转录本本不该发布的人个数据电话号码、住址、政府证件号、私人邮箱。SKILL.md 指出模型的依据是 gbrain 自己的~/.gbraindeny-list /runPrivacyLint模式src/core/skillpack/harvest-lint.ts一套固定、确定性匹配的密钥形状模式在内容提交前完成脱敏。该文件的默认模式还包含邮箱正则、Slack 频道形如#channel-name的模式以及 fork 名Wintermute的屏蔽正则文件语法错误会在加载时响亮失败避免带病配置进入任何 harvest。脱敏改变了转录原文因此要在导入回执中注明Redacted: N secrets / M PII spans——这是对逐字转录的唯一一次被允许的编辑逐字从来不代表放出活凭据。源码深处的脱敏实现两阶段 会话级 echo 字典src/core/transcripts/render.ts 展示了原生通道脱敏的工程细节两阶段、一个会话级 echo 字典。阶段 1 对每个将被持久化的字段消息正文、speaker 标签、标题、raw-meta 字符串字段做扫描与 span 认领所有字段认领到的 bearer/高熵值累积进同一个echoValues字典阶段 2 应用各计划时读取完整字典——于是某条工具消息Authorization: Bearer …头里认领的令牌也会在另一条消息中 assistant 裸回显它的位置被一并擦除无论两者出现先后。逐字段独立脱敏曾让跨字段回显漏进页面。另外注意三点扁平性是被强制的字符串字段被计划化原始标量透传任何嵌套结构恶意导出数据放行的数组/对象会被丢弃——否则它们会未扫描地抵达putRawData转录内容先过sanitizeForJsonbNUL 剥离 规范化因为转录会捕获合法的 U0000而 Postgres text/jsonb 在写边界拒绝它issue #4392高熵赋值启发式值须含数字且通过熵门槛仅在本通道开启——转录是最可能粘贴整行.env的语料此处召回优先于误报成本push gate 与编译上下文扫描则保持该启发式关闭。Step 2 — 转换一次对话一页 Markdown--- title: Agent memory architectures type: conversation date: 2025-03-15 source: chatgpt url: https://chatgpt.com/c/thread-id message_count: 24 tags: [conversation, chatgpt] --- **You:** How should long-term agent memory be structured? **ChatGPT:** There are three broad approaches...让页面机器可读而不只是人可读的规则type: conversation必填——它使页面有资格被gbrain extract-conversation-facts处理消息行用**Speaker:** text走内置bold-name-no-time模式日期取自 frontmatter导出若带逐条时间戳优先用**Speaker** (YYYY-MM-DD H:MM AM): textimessage-slack模式行内日期。运行gbrain conversation-parser list-builtins可查看全部受支持的行形态转录正文逐字保留。用户的精确措辞就是信号——正文里不做转述、清洗、摘要你的示例与报告中的人/公司形状名字保持泛化alice-example、acme-example导入的转录本身是用户私密内容保持精确。解析器侧的佐证src/commands/conversation-parser.ts 实现了gbrain conversation-parser三个子命令scan slug在页面上干跑解析器报告命中模式与消息数、list-builtins打印内置模式注册表含 id、正则形态、source_doc、validate file校验用户声明的 simple_pattern JSON 规范。内置模式注册表在 src/core/conversation-parser/builtins.ts18 个手工审定模式不是文档所说的 12 个——以当前仓库为准每条都携带test_positive/test_negative集合并在启动时强制校验imessage-slack的正则形如^\*\*(.?)\*\*\s*\((\d{4}-\d{2}-\d{2})\s(\d{1,2}):(\d{2})\s*(AM|PM|am|pm)?\)\s*:\s*(.*)$优先级约定行内日期格式歧义更少排在仅时间格式之前quick_reject提供 O(1) 前缀筛查每条模式声明multi_line与timezone_policy内置正则经过手工 ReDoS 审查任意用户正则会在 config-set 时被拒绝v1 仅支持simple_pattern结构化规范。Step 3 — 先试后批量先转换 3-5 条对话跑完 Step 4-5 并读页然后才跑全量档案。对数千线程的导出用 bulk-ingestion 的 manifest 跟踪运行崩溃后可从 ground truth 续跑。Step 4 — 导入页面写在 brain repo 内gbrain sync --no-pull独立转换目录gbrain import dir --source-id id写路径 提交路径见下文不变式 3转换器写入的目录与 import/commit 覆盖的目录必须来自同一个常量。绝不要让包装脚本git add或 import 转换器实际并不写入的路径——这种失败是静默且永久的。Step 5 — 用对话解析器表面校验gbrain conversation-parser scan conversations/chatgpt/2025-03-15-agent-memory报告命中哪个模式与解析出的消息数。转录页上的no_match意味着转换器发出了解析器读不了的行形态——修转换器并重新生成不要手工补丁个别页面。Step 6 — 原生流程提取事实# 预览分段 计数不写库 gbrain extract-conversation-facts --types conversation --dry-run --limit 5 # 正式运行带成本上限大档案用 --background gbrain extract-conversation-facts --types conversation --max-cost-usd 5这是随包发布的批处理提取器gbrain extract-conversation-facts --help可看 workers、逐页--slug、可恢复性在 src/cli.ts 中被注册为extract-conversation-facts主机侧命令要求本地引擎 聊天网关。实体页、反向链接与更深层富集走既有 ingest / enrich 技能——不要在这里重新实现它们。五、三条不变式上游根因已定位——不要重新引入上游某次部署的这条管线静默丢失了数天转录。根因是三个叠加的 bug修复是结构性的。用本技能构建任何归档器都要守住它们采集节奏必须跑赢存储淘汰capture cadence must outrun store eviction。会话存储会把内容轮出保留窗口。长会话早期写入、在下次归档 tick 前被淘汰的内容不可恢复。选择的归档周期必须严格短于来源的保留窗口对日内淘汰的存储每 6 小时优于每日。若用户明确说过的话缺失先查淘汰 vs 节奏。没有缺口检测 静默空洞。只归档昨天的归档器会把任何一次漏跑机器宕机、任务失败、重启变成永久缺失的一天且无告警。每次运行都要在尾随窗口内对比来源日期与已归档页面并回填差异——每个 tick 自愈。写路径 提交路径。最致命的一个 bug包装脚本提交了转换器从未写过的目录使定时归档成为永久的 no-op只在手动运行时有效。一个常量定义输出目录写入器与 commit/import 步骤都读它。六、缺口自愈回填流程任何导入之后运行它持续采集则定期运行枚举来源尾随窗口30 天是好的默认值首次导入后用全范围内从导出文件或会话存储取得对话日期/ID枚举档案在 brain repo 中列出同一窗口内的conversations/页面日期前缀 slug 让这变成一次文件名扫描Diff。任何没有对应页面的来源对话都是一个缺口治愈转换缺失对话重新导入Step 4-6验证重跑 diff。第二次扫描报告零缺口才是完成信号——一次不算。对持续会话采集通过 cron-scheduler / minion-orchestrator 调度归档 缺口治愈。调度是用户设置的路由约定——技能存在本身不会机械触发任何东西提出它时要明说这一点。七、Agent 会话转录harness 日志同一管线也归档 Agent 自己的会话日志conversations/sessions/下每会话或每天一页相同 frontmatter、相同消息格式、相同三条不变式。写入前过滤子 Agent 会话与 cron 触发的运行系统消息、心跳、bootstrap 提示空会话相关原生表面gbrain transcripts recent --days 7从梦周期语料目录读取近期原始转录仅本地。那是原始语料的读取不是持久档案——让会话历史变得永久、可搜索、已提取事实的是这个技能。八、检索与追溯找一次对话gbrain search 你记得的内容 --limit 20——然后按提供商前缀过滤结果到conversations/slug拉一条线程gbrain get conversations/chatgpt/2025-03-15-agent-memory我第一次讨论 X 是什么时候gbrain query X --limit 50按 slug 的日期前缀排序conversations/命中更早探测gbrain query X --until earliest-date-found重复直到无更早命中宣布起源前先用同义词与相邻措辞重试——用户对某个想法的早期词汇往往与当前术语不同读最早页面确认它是真正的首次讨论然后用日期、逐字引用与 slug 作答。想法演变时间线收集带日期命中逐字引用关键节点按旧 → 新呈现slug 作为引文某日上下文gbrain day 2025-03-15看那天还发生了什么gbrain recall --query X走已提取事实支路。九、输出格式导入回执任何导入或回填运行后## Conversation Archive Import — YYYY-MM-DD - Source: chatgpt export (conversations.json, N threads) - Pages written: N under conversations/chatgpt/ (YYYY-MM-DD → YYYY-MM-DD) - Redacted: N secrets / M PII spans (pre-write scan) - Parser validation: N/N scanned clean (pattern: bold-name-no-time) - Facts extracted: N facts / N pages (cost $X.XX) - Gaps healed: N (dates: ...) | Gap re-check: clean追溯答案针对我第一次讨论 X 是什么时候First discussed: YYYY-MM-DD — conversations/chatgpt/YYYY-MM-DD-slug 首次提及的逐字引用 Evolution: - YYYY-MM-DD — 一行进展 (conversations/...) - YYYY-MM-DD — 一行进展 (conversations/...)十、反模式清单对照自查❌ 导入时对转录做摘要或转述——页面就是转录只留精确措辞❌ 不先做写前密钥/PII 扫描就写转录——粘贴了sk-…key 或ghp_…令牌的 prompt 会变成一页可索引、可搜索、可泄露的页面脱敏是唯一被允许的编辑❌ 覆盖碰撞 slug同一天多条 New chat——追加短线程哈希put_page无 CAS盲写会静默丢失第一个线程❌ 发明解析器读不了的消息行格式——批量转换前先用gbrain conversation-parser scan校验❌ 手工补丁解析器拒绝的页面——修转换器并重新生成写路径纪律❌ 只归档昨天——每次运行 diff 尾随窗口并回填不变式 2❌ 归档节奏慢于来源淘汰——被淘汰内容不可恢复不变式 1❌ 包装脚本提交/导入与转换器写入不同的目录不变式 3❌ 一次搜索失败就宣称你从未讨论过 X——先试同义词、查gbrain recall然后才能给出否定答案❌ 校验 3-5 页样本前就批量转换数千线程❌ 把对话归到sources/或作为摘要笔记——导入聊天导出的归档规则是conversations/十一、与其他技能的边界去重边界清晰chat-connectors——在线、已连接账号通道连接 ChatGPT/Claude 账号自动同步新对话cookie/OAuth、增量水印、定时调度。本技能拥有导出文件通道下载的conversations.json与全部检索/追溯。路由 connect my chatgpt / keep my conversations synced 去那边I downloaded my export / when did I first discuss X 来这边。Perplexity无在线连接器使用本技能的手动转换。voice-note-ingest——音频。语音备忘与音频消息去那边转写 精确措辞归档。本技能处理文本聊天导出与会话日志。meeting-ingestion——人类会议。会议转录归档到meetings/带与会者富集与时间线合并。AI 助手线程不是会议。capture——单条目前门gbrain capture→inbox/。单条粘贴片段去那边对话语料来这边。bulk-ingestion——通用大语料生命周期manifest、试转 → 批量、续跑。数千线程导出时用它的 manifest 跟踪本技能的转换流程——两者是组合而非竞争。concept-synthesis——跨全脑概念、笔记、文章的想法演变追踪。本技能回答想法在对话语料内何时/如何出现把发现交给 concept-synthesis 做跨语料工作。signal-detector——实时逐条消息的实体/信号捕获。档案是批量持久层它保留一切而不只是检测到的信号。配套的 routing-eval.jsonl 还记录了一个真实歧义场景4000 线程的 Claude 导出既是对话归档也是大语料生命周期标注为ambiguous_with: [bulk-ingestion]——两个技能都可能触发这是设计使然而非缺陷。十二、技能契约conformance test 的验收清单本技能保证导入的对话以conversations/provider/YYYY-MM-DD-slug.md落为每对话一页带type: conversation、date:frontmatter以及解析器可识别消息格式的逐字转录每段对话在写页前都按线格式而非仅厂商前缀——JWT、云/API key 形状、连接串凭据、高熵赋值与 PII 扫描命中脱敏为带标签占位符并计入导入回执untrusted-content 约定。仍捕获到密钥的页面立即用gbrain delete slug --purge移除仅限本地 CLI无 72 小时墓碑期brain-repo git 历史或已同步文件仍可能持有它需先轮换密钥碰撞 slug无标题/同日线程用短稳定线程哈希与先查后写消歧绝不覆盖每次导入运行在批量转换前用gbrain conversation-parser scan校验样本并在导入回执中报告解析结果事实提取走原生gbrain extract-conversation-facts流程成本封顶、可恢复——绝不使用手写提取器每次导入或定时归档运行在尾随窗口上执行缺口 diff来源 vs 档案并回填差异仅在干净的第二次通过后宣称完成基于本技能构建的任何归档器守住三条不变式节奏跑赢淘汰、缺口被检测并治愈、写路径等于提交路径追溯答案引用带日期 slug 与逐字引用否定答案从未讨论只在同义词重试与事实支路检查之后给出输出只写writes_to:声明的目录隐私契约示例与报告中无真实姓名、无 fork 特定文件系统路径字面量、无上游 fork 引用。完整行为契约见正文各节本节约束存在是为 conformance test 服务。【免费下载链接】gbrainGarrys Opinionated OpenClaw/Hermes Agent Brain项目地址: https://gitcode.com/gh_mirrors/gb/gbrain创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考