OpenOats会议格式规范详解如何设计一份LLM与Obsidian都能读懂的Markdown会议记录【免费下载链接】OpenOatsA meeting note-taker that talks back.项目地址: https://gitcode.com/gh_mirrors/op/OpenOatsOpenOats 是一款 Mac 上的开源会议记录 App它坐在你的通话旁边实时转写双方的对话会后把内容保存为一份结构化的Markdown 会议记录。这份记录遵循一份名为 OpenOats 会议格式规范openoats/v1的标准——它同时做到了四件事人眼好读、grep 可搜、Obsidian 可查询、LLM 可直接消费。本文将带你快速看懂这套会议记录格式的设计思路与关键规则。为什么会议记录需要一套标准会议笔记工具的常见困境是输出要么是一坨没有结构的纯文本要么是锁死在私有格式里的数据库记录。前者人读可以但工具读不了后者工具友好人却看不了。OpenOats 的答案是把.md文件本身当作API来设计。规范的目标非常明确目标谁受益人类可读你在任何编辑器 / Obsidian / 预览里打开都能懂Agent 就绪LLMClaude Code、RAG 管线无需额外解析层CLI 友好rgripgrep一行命令就能检索全部会议Obsidian 原生YAML frontmatter 可被 Dataview 直接查询增量可用文件在每一个处理阶段都是完整、有效的一个文件 四层信息每份会议记录从上到下由四层构成各层职责清晰文件名唯一标识自带时间线YAML Frontmatter约 20 行以内的会议元数据正文分区# 标题 若干##章节转写行每句话一行的固定格式文本下面逐层拆解。文件命名规范字典序 时间序文件名格式固定为YYYY-MM-DD-HHMM-kebab-case-title.md例如2026-03-20-1400-weekly-product-sync.md。三条规则值得注意时间取会议开始时刻本地时间、24 小时制、时与分之间无分隔符标题部分只允许小写字母、数字和连字符kebab-case不超过 60 字符无法确定标题时回退为meeting文件名不允许出现空格按文件名排序就等于按时间排序这样ls一下目录就是会议时间线无需 UUID 字段——文件名本身就是唯一标识。重名时自动追加-2、-3后缀避免覆盖。YAML Frontmatter20行以内的会议元数据每个文件以一段 YAML frontmatter 开头。核心字段如下字段类型必填说明schema字符串✅恒为openoats/v1标识格式版本title字符串✅会议标题必须加引号且与正文 H1 一致dateISO 8601✅会议开始时间尽量带时区偏移duration整数✅会议时长分钟≥1participants字符串数组✅参与者名单默认[You, Them]recorder字符串❌记录人用于把You映射到真实身份tags字符串数组❌主题标签由 LLM 或用户生成language字符串❌BCP 47 语言码如en、plengine字符串❌转写引擎如parakeet-tdt-v2app字符串❌检测到的会议应用zoom、meet、teamsx_*任意❌扩展命名空间如x_openoats_session规范中有几条针对机器解析的硬规则每条都在防一类真实事故title必须加引号——否则 YAML 会把yes解析成布尔值、把#后面的内容当注释截掉扁平结构禁止嵌套对象——Dataview 查嵌套 YAML 需要 DataviewJS普通查询直接失效数组用 YAML 数组语法绝不写逗号分隔字符串frontmatter 里不放 wikilink[[链接]]只允许出现在正文x_前缀是扩展字段——解析器必须忽略不认识的x_字段第三方工具可安全写入自己的元数据一个最小示例LLM 处理前就能成立的完整文件--- schema: openoats/v1 title: Meeting date: 2026-03-20T14:00:0001:00 duration: 32 participants: - You - Them engine: parakeet-tdt-v2 ---三阶段处理文件在任何阶段都可用这是整套格式最精妙的设计OpenOats 分三个阶段生成同一份文件每一阶段的产物都是完整有效的——你不需要跑 LLM 就拥有一份干净可用的会议记录。阶段做什么产物① 转写原始 ASR 输出frontmatter # 标题## Transcript② 后处理去语气词um/uh、修标点、纠正说话人就地清洗结构不变③ 智能层插入 LLM 生成的章节新增 Summary / Action Items / Decisions正文章节顺序固定为# 标题 ## Summary ← 仅阶段③LLM 生成 ## Action Items ← 仅阶段③LLM 生成 ## Decisions ← 仅阶段③可选 ## Transcript ← 始终存在摘要在上、转写在底并非随意安排LLM 对上下文窗口开头和结尾的权重更高lost in the middle 效应人扫读文件也想先看高信号内容。而阶段③只插入新章节、绝不改动转写原文保证原始记录可追溯。转写行格式每句话一行正则即解析器## Transcript章节里每句话utterance独占一行格式严格统一[HH:MM:SS] **说话人:** 这句话的内容。部件规则示例时间戳相对会议开始时刻零填充可超 24h[00:05:23]说话人粗体 Markdown 冒号**You:**文本自由文本单行不折行I think we should launch earlier.规范给出了参考解析正则^\[(\d{2}:\d{2}:\d{2})\] \*\*(.?):\*\* (.*)$三个捕获组直接对应时间、说话人、文本。相关实现可参考 MarkdownMeetingWriter.swift 中的转写行组装与相对时间戳计算逻辑。两个关键设计决策时间戳用相对时间而非墙上时钟——[00:01:24]表示会议进行到 1 分 24 秒音频回放工具直接可用绝对开始时间已存在 frontmatter 的date字段里说话人用完整粗体名而非 ID——**Alice Chen:**自解释、grep 友好LLM 无需查表句间空行只是排版解析器应忽略说话人模型目前很简单麦克风流 →You系统音频流所有远端参会者→Them不做多方分离。但格式已为未来留好口子——当接入日历标注或说话人分离后participants里换成真实姓名即可转写行结构零改动。Obsidian 视角行动项即数据库行## Action Items是格式与 Obsidian 生态咬合最深的地方。每条行动项是标准 Markdown 复选框行尾带 Dataview 内联字段- [ ] Finalize launch announcement blog post [owner:: You] [due:: 2026-03-25] - [x] Run load testing on SQLite concurrency [owner:: Them]规则很克制owner必须取自participants数组due必须是 ISO 8601 日期、没有就整个省略owner必须排在due前面每项单行。在 Obsidian 里一行 Dataview 查询就能跨全部会议聚合任务TASK FROM OpenOats WHERE !completed AND contains(text, owner:: You)非 Obsidian 用户打开文件时这些中括号也只是略带装饰的复选框阅读零障碍——这就是格式对生态的宽容度。LLM 视角grep 友好的 Agent 接口对 LLM Agent 来说这套格式等于送上了现成的检索接口。几条常用rg命令感受一下# 所有会议中还没完成的行动项 rg ^- \[ \] ~/Documents/OpenOats/ # 分配给我的未完成任务 rg \[ \].*\[owner:: You\] ~/Documents/OpenOats/ # 用过 Zoom 的会议 rg ^app: zoom ~/Documents/OpenOats/因为文件名即时间线、行格式即正则、frontmatter 即扁平键值对Agent 不需要理解任何私有协议用文本工具就能完成列出我本周的所有待办这类请求。规范甚至明确了兼容性承诺新增可选字段不改schema版本号破坏性变更才会升到openoats/v2并附迁移说明——这让其他工具敢于把它当作共享标准来依赖。上手参考从规范到源码想做的事去哪看读完整格式规范字段、正则、解析指南docs/meeting-format-spec.md看一份完整的openoats/v1会议记录示例docs/example-transcript.md看生成文件的写入器实现MarkdownMeetingWriter.swift看格式的自动化测试保障MarkdownMeetingWriterTests.swift一句话总结OpenOats 会议格式的核心哲学是把 Markdown 文件当 API 设计——命名带时间线、元数据扁平、行格式可正则、未知字段可忽略。于是同一份.md人读是会议纪要grep 读是日志库Dataview 读是任务数据库LLM 读是结构化上下文。这正是它值得其他工具采纳的原因。【免费下载链接】OpenOatsA meeting note-taker that talks back.项目地址: https://gitcode.com/gh_mirrors/op/OpenOats创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考