跳转至

openclaw transcripts

用于持久化会议转录的检查与导出命令。 Google Meet、Microsoft Teams、 Slack huddles 和 Zoom 浏览器参与者会自动捕获笔记; transcripts 代理工具还支持提供方捕获和手动导入。

标准转录状态存放于共享 SQLite 数据库中,位置为 $OPENCLAW_STATE_DIR/state/openclaw.sqlite。show 和 path 会在状态目录下显式生成面向用户的产物文件:

$OPENCLAW_STATE_DIR/transcripts/YYYY-MM-DD/<session>/
  metadata.json
  transcript.jsonl
  summary.json
  summary.md

这些文件是导出物,而非第二个运行时存储。OpenClaw 在捕获、摘要生成或列出时不会重新读取它们。默认状态目录为 ~/.openclaw;可使用 OPENCLAW_STATE_DIR 覆盖。日期目录来自会话开始时间;会话目录是由会话 ID 派生的、文件系统安全的 slug。

在 Control UI 中查看转录

在 Control UI 中,打开侧边栏的铅笔菜单(Edit pinned items),选择 Meetings 即可浏览位于 /meetings 的同一个 SQLite 归档。你可以将 Meetings 固定到侧边栏;它默认未固定。会议笔记与 Sessions 中的代理聊天历史相互独立。

Meetings 按开始日期分组,以最新在前的顺序显示在时间线中,并为每个会议提供已保存的摘要预览。打开资料库会以全宽显示时间线;选择会议会打开其阅读器。资料库和阅读器在获取数据时会显示加载指示器;即使长会议超出聊天消息渲染限制,存储的笔记也会以 Markdown 渲染。

可搜索标题、会话/来源 ID、已保存的摘要笔记以及转录文本;不会搜索会议 URL。可按精确的提供方、账户或代理 ID 过滤,也可按会话开始日期过滤。日期过滤使用 UTC:Started on or after 包含所选日期,Started before 排除所选日期。结果按确定性分页加载。更改筛选条件或选择 Refresh 会重新开始分页。

选择会议即可打开其已存储的 Summary。现有的 /meetings?selector=... 书签仍然有效。选择 Transcript 可查看带时间戳的说话人文本。Search within this transcript 会在 Gateway 上搜索已存储的话语,包括尚未加载到浏览器中的文本。阅读器会自动加载每一页,并保持完整转录文本可见。阅读器、下载文件以及新生成的笔记都会省略 context: 和 ### 等独立转录产物。新的捕获会跳过这些行;现有的原始归档行保持不变。URL 会保留所选的会议和标签页。当你拥有写入权限时,打开包含已保存语音的会议会自动生成缺失的笔记。阅读器会显示生成进度,并在生成失败时提供重试。

Download Markdown 包含转录文本和任何已存储的摘要。Download JSONL 导出阅读器的公开话语投影,不包括提供方私有元数据和本地文件系统路径。本地 CLI 导出保留其现有的原始格式。大于 4 MiB 的浏览器导出会明确失败,且不会生成部分文件;如需更大的导出,请在 Gateway 主机上使用 openclaw transcripts path <session> --transcript 或 openclaw transcripts path <session> --dir。

读取归档需要 operator.read 或其写/管理权限含义,并且需要读取共享归档的权限。在受限的多用户配置中,选择代理过滤器并不会授予归档访问权限。捕获配置需要 operator.admin 权限。

命令

openclaw transcripts list
openclaw transcripts show <session>
openclaw transcripts show YYYY-MM-DD/<session>
openclaw transcripts path <session>
openclaw transcripts path YYYY-MM-DD/<session>
openclaw transcripts path <session> --dir
openclaw transcripts path <session> --metadata
openclaw transcripts path <session> --transcript
openclaw transcripts list --json
openclaw transcripts show <session> --json
openclaw transcripts path <session> --json
Command Description
list 列出已存储的会话。
show <session> 打印并生成 summary.md。
path <session> 生成并打印 summary.md 的路径。
path <session> --dir 生成所有产物并打印其目录。
path <session> --metadata 生成并打印 metadata.json。
path <session> --transcript 生成并打印 transcript.jsonl。
--json 打印机器可读的输出(任何子命令)。

使用 list 打印的选择器来定位精确的捕获。现有的标准选择器优先于具有相同文本的原始会话 ID。否则,show 和 path 接受 YYYY-MM-DD/<raw-session-id>,整个后缀按字面处理,包括标点和斜杠。例如:

openclaw transcripts show '2026-05-22/notes: room/one'

如果两种限定形式都未找到捕获,则会将完整输入作为字面的原始会话 ID 或导出 slug 进行区分大小写的匹配。原始 ID 中类似日期的前缀不会阻止此查找。多个匹配需要带日期的选择器;不会对任何原始 ID 进行清理以选择捕获。默认会话 ID 包含时间戳和随机后缀;仅当某个 ID 在当天内唯一时,才为会话指定固定 ID。

如果文件系统安全的导出名称超过 255 字节,OpenClaw 会将其缩短为前缀加上完整原始会话 ID 的确定性 SHA-256 哈希。只有派生的导出名称及其选择器会改变;原始会话 ID、提供方停止句柄和已存储的笔记保持不变。已经符合长度要求的名称保持不变。对于缩短后的名称,请使用 list 打印的选择器。对于已存储名称过大的现有会话,请运行 openclaw doctor --fix 修复其派生的选择器,而不会更改已存储的笔记。

输出

list 为每个会话打印一行以制表符分隔的内容:选择器、开始时间、标题、摘要路径。

2026-05-22/standup  2026-05-22T09:00:00.000Z  Weekly standup  /Users/user/.openclaw/transcripts/2026-05-22/standup/summary.md

选择器是传回给 show 或 path 的最安全值。

工具选择器

从任意会话读取笔记

让智能体使用 transcripts 工具列出过往会议并读取其笔记。读取不绑定于捕获该会议的智能体会话。Operator 调用方可以读取 Gateway 上的所有会议。Channel 调用方只能读取源提供方允许的会议;Discord 语音读取仍限制在调用方所在的服务器内。这些读取权限不会改变录制或摘要的写入权限。

```json validate=false { "action": "list", "limit": 20 }

`list` 按最新会议优先返回,包含选择器、开始时间、标题或提供方名称、utterance 数量和参与者。`limit` 默认为 20,接受 1 到 50 的整数。文本有长度限制;结构化结果位于 `details.sessions`。

```json validate=false
{ "action": "show", "selector": "2026-05-22/notes-room-one" }

show 返回已存储的笔记 Markdown 和会话详情。其文本上限为 12,000 个字符;截断标记会指向 openclaw transcripts show <selector> 以获取完整笔记。没有摘要的录制会报告笔记尚不可用,并说明该录制是否处于活动状态。读取笔记不会重新生成摘要或导出产物。

选择一次录制

transcripts 工具会返回未更改的原始 sessionId 和规范 selector,这些值来自 start、import、stop 和 summarize。经授权的 status 结果会包含活动录制和等待最终化条目的选择器。其面向模型的文本最多显示三个完整选择器,优先显示等待最终化的录制,并报告被省略的数量。结构化状态详情保留完整的授权列表。受限的活动录制摘要包含来源定位符和标题,以便智能体识别目标会议。后续的 show、stop 或 summarize 调用请优先使用 selector:

```json validate=false { "action": "summarize", "selector": "2026-05-22/notes-room-one" }

show、stop 和 summarize 必须且只能提供 `selector` 或 `sessionId` 之一。其他操作会拒绝 `selector`;start 和 import 继续通过 `sessionId` 接受原始 ID。显式 `selector` 输入接受规范选择器以及上述历史日期/原始 ID 形式,但绝不会将整个输入作为原始 ID 回退处理。

旧版 `sessionId` 输入会同时考虑限定形式与 raw/slug 形式的含义。如果它们指向不同的录制,工具会报告歧义,而不列出候选详情。录制结束后,这种歧义仍然存在。请使用 start、import 或受授权的 list/status 返回的选择器,或在本地查看 `openclaw transcripts
list`,然后在 `selector` 字段中传入所需的值。raw-ID/selector 冲突中的两侧仍可通过各自的规范选择器寻址。

如果没有冲突的限定形式含义,也没有不同的 raw-ID/slug 候选,旧版 `sessionId` 会为 stop 和 summarize 选择当前精确匹配原始 ID 的录制,即使历史录制复用了该 ID。如果没有当前录制,重复的历史 ID 需要带日期的选择器。针对较旧录制的显式选择器不会停止其同 ID 的较新兄弟录制。

`show` 会选择并授权持久化录制,仅使用实时状态来报告该录制是否处于活动状态。即使有一个录制处于活动状态,重复的历史 ID 也需要带日期的选择器。

## Gateway 与 Control UI 读取 {#gateway-and-control-ui-reads}

无需终端即可在 [Control UI](../web/control-ui/settings.md#meetings-page) 中打开 **Meetings**,浏览已捕获的会议和笔记。该页面和其他 Gateway 客户端使用以下 RPC 方法:

| 方法                  | 参数                                                                                                                                             | 结果                                                                                                                                                                      |
| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `transcripts.list`    | 可选 `limit`(1–200,默认 50)、`cursor`、`query`、精确的 `providerId`/`accountId`/`agentId`,以及 `startedAfter`/`startedBefore` 日期时间范围     | 最新优先的 `sessions`,包括参与者、utterance 数量、活动状态、摘要可用性、受限概览和 `nextCursor`。                                                                          |
| `transcripts.get`     | 必需的 `selector`;可选的 `includeUtterances`、`limit`(1–100)、`cursor` 和 utterance `query`                                                   | 一个 `session`、已存储的 `summary`、可选的 `utterances` 和 `nextCursor`。显式分页返回完整文本;旧版请求保留下文所述的最近窗口。                                           |
| `transcripts.summarize` | 必需的 `selector`                                                                                                                               | 生成缺失的笔记,并返回与 `transcripts.get` 相同的 `session` 和 `summary` 结构。现有笔记会被保留;并发请求共享同一个摘要所有者。                                           |
| `transcripts.export`  | 必需的 `selector` 和 `format`(`markdown` 或 `jsonl`)                                                                                         | 一个 base64 编码的文件,包含 `filename`、`mimeType` 和 `sizeBytes`。                                                                                                      |


| 方法 | 参数 | 结果 |
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `transcripts.status`    | 无 | 捕获启用状态、提供商可用性和设置元数据、已配置源的健康状态、活动订阅以及最新保存的转录。 |

读取方法需要 `operator.read` 或其写入/管理员隐含权限;
`transcripts.summarize` 需要 `operator.write`。所有方法都在一个受信任的 Gateway 域内公开会议。受限的操作员配置文件需要读取共享归档的权限;选择代理过滤器不会授予访问权限。当读取者需要隔离时,请使用独立的 Gateway 域。源定位器仅包含 `providerId`、`accountId`、`guildId`、`channelId`、`threadTs`、`fileId`、`kind`,以及存在时经过清理的 `meetingUrl`,绝不包含任意捕获元数据。参见 [Gateway 协议](../gateway/protocol.md)。

列表搜索匹配标题、会话/源 ID、已保存的摘要 Markdown 和概览,以及存储的语句文本,排除源会议 URL 和私有元数据。
日期边界使用会话开始时间:`startedAfter` 包含边界,`startedBefore` 不包含边界。日期按时间点比较,使用 JavaScript 日期字符串语义,包括存储的 UTC 偏移。原始时间戳和选择器保持不变。无法解析的存储日期排在最后,并排除在日期范围之外。相同时间点按会话 ID 排序,然后按原始时间戳排序。
按时间顺序的页面选择会扫描候选捕获,并在搜索时扫描其已保存的笔记和语句,然后仅投影所选页面的笔记和参与者。搜索时间随被搜索的已保存文本增长。
游标属于其当前查询和过滤器;更改其中任何一项都需要重新获取第一页。空值 `nextCursor` 结束分页。

存储的摘要 Markdown 是规范笔记文本,与 CLI 的 `show` 输出一致。读取不会生成摘要或物化文件。除非 `includeUtterances` 为 true,否则省略语句。提供 `limit`、`cursor` 或 `query` 会选择分页读取:每页最多 100 条语句,默认 50 条,且不截断存储文本。`query` 搜索完整存储的转录,包括未加载的页面。分页读取、列表和状态结果限制为 1 MiB,并在传输到 JavaScript 之前强制存储负载边界。超出行或无效游标会显式失败。
摘要参与者和模型/启发式来源在可用时显示;旧摘要无需包含它们。

为了与归档分页之前发布的客户端兼容,`transcripts.get` 在没有 `limit`、`cursor` 或 `query` 时,保留按时间顺序最近的 2,000 条语句,每个清理后的文本截断为 4,000 个 UTF-16 单元。
这些旧式请求返回 `nextCursor: null`,并保留 25 MiB 的公共结果上限,与现有 Gateway 客户端传输限制一致。它们保留文本截断和公共投影之前的原始行读取行为。
发送显式 `limit` 以采用有界页面读取并获取完整文本;使用 `nextCursor` 继续,直到其为 null。所有归档访问检查都适用于两种请求形式。

导出限制为 4 MiB,失败时不会返回部分文件。Markdown 保留存储的笔记,并在单独的标题下追加完整转录。JSONL 包含公共语句投影:序列、语句 ID、完整文本、说话者身份、源时间戳,以及可用时的最终性。它排除私有提供商元数据和文件系统路径;本地 CLI 导出保留其原始语句格式。
在 Gateway 主机上使用 `openclaw transcripts path <session> --transcript` 进行更大的导出。

状态报告已注册的订阅,而非已确认的录制。`armed`、`not-active` 和 `unknown` 保持区分;仅凭一个清理后的 URL 无法证明哪个原始邀请启动了捕获。提供商、已配置源和活动列表限制为 100 个条目,并省略计数。已保存语句计数来自持久化行。最新转录是最近更新的包含语句的会话;源语音时间不是摄取时间戳。

## JSON 输出 {#json-output}

`list --json` 返回包含 `sessionId`、`selector`、`date`、`title`、`startedAt`、`stoppedAt`、`source`、`path`、`summaryPath`、`hasSummary` 的对象。
存储的会议源 URL 仅包含源和路径;查询字符串、片段和嵌入凭据在持久化之前被移除。

`show --json` 返回存储的会话元数据、选择器、会话目录、摘要路径和摘要 Markdown 文本。

`path --json` 返回所选路径以及该工件是否可以物化。对于存储的会话,元数据和转录导出始终存在;在会话拥有摘要之前,摘要路径报告 `exists: false`。

## 每天多个会话 {#many-sessions-per-day}

会话按日期分组,然后按会话 ID 分组。一天中的十次会议变成十个同级文件夹:

```text
~/.openclaw/transcripts/2026-05-22/
  transcript-2026-05-22T09-00-00-000Z-a1b2c3d4/
  transcript-2026-05-22T10-30-00-000Z-b2c3d4e5/
  standup/

自动化请使用默认生成的 ID。仅当固定 ID(如 standup)不会在同一天重复时,才使用它。

缺失的摘要

活动捕获在有新语音到达时,大约每五分钟保存一次更新的笔记。每次更新都会对已保存的转录快照进行摘要;生成期间到达的语音会保留到下一次更新。静默捕获不会重复调用模型。停止捕获时,会在接收到的语音处理完毕后保存最终摘要。Control UI 的 Summary 标签页显示最新保存的笔记及其生成时间。打开包含已保存语音的会议时,也会通过 transcripts.summarize 请求缺失的笔记;这会复用捕获摘要的所有者并保存笔记,而不会导出文件。只读客户端可以查看现有笔记,但无法请求生成。存档读取 RPC 本身保持只读。

会议笔记首先使用所属代理的实用模型,必要时再使用其主模型。如果没有可用模型、请求超时或模型返回无效输出,OpenClaw 会改为保存确定性的启发式笔记。模型生成是对笔记的增强,不会阻止笔记的保存。笔记包括概述、参与者、决策、行动项、风险,最后是转录文本,这样上下文受限的读者可以在长转录之前先看到笔记。参与者来自说话人标签,按首次出现顺序排列,而非模型猜测。摘要 JSON 将 source 记录为 model 或 heuristic,对于模型笔记,还会记录所使用的模型引用。

模型最多接收 48,000 个转录字符,当中间部分必须省略时,会保留开头和结尾。存储的语句保持完整。使用 transcripts summarize(代理工具的 summarize 操作)可以从存储的转录中重新生成笔记,包括在更改模型配置之后。

工具的 status 操作列出的是活动捕获订阅,而非历史笔记。当提供程序结束或替换订阅时,OpenClaw 会记录 stoppedAt 并存储其摘要;转录文本仍可通过 list、show 和工具的 summarize 操作访问。临时传输断开不会结束订阅。停止历史笔记不会停止更新的捕获,也不会更改记录的停止时间。

提供程序驱动的完成会存储摘要,但不导出文件。显式工具停止、导入、摘要以及配置的自动启动关闭也会尝试生成 summary.md。如果最终持久化失败,status 会在 pendingFinalization 下报告已结束的捕获,与活动捕获分开列出。对该会话使用工具的 stop 操作可以重试持久化,而无需再次停止提供程序。

如果提供程序无法完成清理且未报告捕获已结束,status 会将捕获保持为活动状态,并带有 cleanupPending: true。现有语句保持完整,最终笔记等待清理完成。提供程序恢复后,使用相同的选择器重试 stop。替换或禁用插件不会将清理工作转移到另一个提供程序实例。

如果提供程序在停止过程中失败,或者在任何语音到达之前就存储了元数据,会话可能在捕获仍处于活动状态时出现在 list 中但没有摘要。

使用 path <session> --transcript 检查原始的仅追加转录,或运行 transcripts 工具的 summarize 操作以重新生成 Markdown 摘要。

摘要先保存到 SQLite,然后再进行可选的产物导出。如果导出失败,即使缺少 summary.md,已保存的摘要仍然可用。配置的自动启动捕获会在关闭期间记录导出失败或提供程序停止错误的警告。修正导出目标问题后,运行 openclaw transcripts path <session> 或 openclaw transcripts show <session> 以重试导出;警告中的预期路径并不证明文件已导出。

没有完整账户所有者元数据的历史会话保留在本地恢复路径上。使用该代理的本地回合恢复代理拥有的行;没有代理归属的行需要本地主代理回合。没有账户绑定的源在其常规界面中保留主代理访问权限。缺失的提供程序、部分所有者元数据以及无账户的历史源也保留在此本地恢复路径上。

openclaw agent --agent <owning-agent-or-main> --local --message \
  "Use transcripts summarize for session <session>."

升级旧版文件存储

早于 SQLite 存储的 OpenClaw 版本将规范运行时状态直接写入 $OPENCLAW_STATE_DIR/transcripts/ 下。运行:

openclaw doctor --fix

Doctor 会将完整的旧版目录树导入 SQLite,验证行数和顺序,记录迁移凭证,并将已验证的源目录树移至带时间戳的 transcripts.migrated-* 存档。运行时命令不会回退到旧版文件。请保留存档,直到你确认导入的会话以及所依赖的任何导出均已验证无误。

配置

打开 Settings → Communications → Meeting capture 可编辑现有的 transcripts.enabled 和 transcripts.autoStart 设置。Enable transcript storage 控制是否允许持久捕获;每个自动启动源都会选择加入一个提供程序和源。你可以添加或删除源,并编辑其标题、账户、源定位符以及可选的自定义会话 ID。占用模式会自动选择会话 ID,因此其自定义 ID 字段会被禁用,同时保留已保存的值。

这些控件使用共享的设置草稿、自动保存、验证和应用流程。如果出现 Apply changes,请使用它来激活已保存的更改。如果重启中断了待处理的草稿,Autosave paused after reconnect 会保留该草稿,而不会将其发送到新连接。请审查它,并在 Settings 页脚中选择 Save。完整的转录架构编辑器可在 Meeting capture → Advanced settings 下使用。

会议捕获设置无需重启 Gateway 即可生效。已删除或更改的源会在替换前处理完接收到的语音并完成笔记;未更改的源继续录制。源标题的编辑适用于未来的捕获。当前和历史笔记保留其原始标题、源、代理归属和选择器。

启动重试仅当确切的失败提供商尝试保留重试权限时,才保留相同的已接纳 ID、原始标题、开始时间、来源和已保存的笔记。这适用于生成的和配置的 ID。重试在十二次尝试后、服务关闭、手动停止或保留清理托管的失败后停止。状态报告一个有界诊断,不包含提供商错误详情。在尝试新的捕获之前,使用工具的 stop 操作恢复待处理的清理。

会议转录捕获默认启用。要全局退出:

{
  "transcripts": {
    "enabled": false
  }
}
  • enabled(默认 true):启用自动会议笔记、转录工具以及配置的自动启动来源。当会议笔记不应持久化到主机时,将其设置为 false。显式请求的会议 transcribe 模式会保留其现有的有界实时字幕尾部,但在该设置为 false 时不会写入持久化行。

使用 transcripts.autoStart 配置自动启动来源。每个条目只要存在即启用;省略某个条目可禁用该来源。discord-voice 是内置的具备自动启动能力的来源,需要 guildId 和 channelId。当恰好有一个已配置的 Discord 账户具有凭据并启用了语音时,OpenClaw 会自动选择它。当多个账户具备语音能力时,OpenClaw 会选择具备能力的 channels.discord.defaultAccount。否则,将 accountId 设置为 channels.discord.accounts 下对应的键;省略账户会因歧义而被拒绝:

{
  "transcripts": {
    "enabled": true,
    "autoStart": [
      {
        "providerId": "discord-voice",
        "accountId": "work",
        "guildId": "1234567890",
        "channelId": "2345678901",
        "whenOccupied": true
      }
    ]
  }
}

whenOccupied 默认为 false:捕获随 Gateway 启动并持续运行,直到停止。将其设置为 true 以等待人类,然后为每个占用事件捕获一次会议。如果启动时人类已经存在,它也会启动;机器人永远不计入。最后一名人类离开后,固定的 30 秒宽限期允许短暂重连,而不会拆分会议。人类在该宽限期内返回会取消停止。否则,OpenClaw 停止捕获并生成笔记。

占用事件使用生成的 ID;条目的 sessionId 会被忽略。为了在 Gateway 重启后继续会议,当同一提供商、账户、服务器和频道的最近会话在过去 10 分钟内停止,且其存储的 ID 来源为 generated 时,OpenClaw 会重新打开该会话。会话保留其原始 ID、标题和开始时间,新的话语会追加到其中。在该时间窗口内的后续返回也会复用该会议;在窗口外,捕获会获得新 ID。 新接纳会记录转录 ID 是生成的还是提供的。如果最新候选项具有提供的 ID,或其来源缺失或无效,捕获将重新开始,而不搜索旧历史。现有笔记保持不变且可读。因此,没有记录来源的旧版生成会议在升级或重启后可能会拆分。Doctor 在恢复元数据时保留已记录的来源;它不会推断或回填缺失的来源。 如果房间被路由到另一个代理,该代理会启动新的捕获;原始代理保留其存储的会议和摘要权限。

提供商必须报告占用状态。discord-voice 支持它;不支持的提供商会记录警告并跳过该条目,而不是持续捕获。为每个 Discord 账户和服务器最多配置一个 whenOccupied: true 条目,即使频道 ID 不同:Discord 机器人在每个服务器中只能占用一个语音频道。后续冲突条目会被跳过并记录警告。完整的仅收听设置,请参阅 Discord 会议笔记。

会议提供商 ID 为 google-meet、teams、slack-huddle 和 zoom。它们的别名分别为 googlemeet/meet、teams-meetings/microsoft-teams/msteams、slack-huddles 和 zoom-meetings。会议提供商会附加到已激活的会议机器人会话;正常加入会议不需要 autoStart 条目。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw