案例更新 2026-10-29

Twenty 会议摘要:生成成功以后,谁保证它回到正确记录

本页目录 · 5 个段落

会议摘要已经由模型生成,保存进 CRM 却失败了:应重新跑模型,还是只补存结果?Twenty 的 Call Recorder 公开代码作了具体取舍——保存失败返回 save-error,不重新抛给重投递机制,避免为已成功的模型调用再次付费。它同时留下另一个问题:不重跑,并不等于已可靠补存。

沿录制回调、转录导入、提示词装配、runAgent 与记录更新,可以看清会议应用如何接入生成能力。本页以固定提交的 Call Recorder 为范围,不把通用聊天、工作流和评分器拼成会议摘要处理链。

生成与保存分别返回结果
  1. 01

    转写更新并检查生成条件

  2. 02

    runAgent 生成事实纪要

  3. 03

    解析响应或无法总结原因

  4. 04

    按通话记录标识保存摘要

  5. 05

    保存失败返回独立状态

依据固定 Call Recorder 源码;纪要行动项不等于任务已创建或负责人已匹配。

异步录制先解决对象与状态

外部录制服务通过 webhook 主动回调状态。入口用原始正文验证 HMAC-SHA256:内容包含事件标识、时间戳、rawBody,要求正确格式的共享密钥,校验五分钟容差,再安全比较。验证后才处理事件。时间窗口降低旧消息重放风险,不等于业务事件只处理一次。签名验证

事件匹配优先用 metadata 中的 Call Recording 标识,再回退 externalBotId。处理器映射状态,拒绝将已知状态降回较早阶段的迟到事件;已知有录制产物时,避免错误退为未录制。这是在防止乱序消息与现有事实矛盾,而非把回调原样覆盖数据库。回调处理

媒体与 transcript(带说话人、时间信息的转录)分别排队导入,使用不同认领字段。认领是有期限的处理权:字段为空或已超过十分钟可领取,正常路径在 finally 释放,崩溃后过期可重领。认领条件|认领执行

租约减少并发重复导入,不是恰好执行一次。重复事件、长任务超过租期、释放与重领的边界仍需队列验证;媒体成功也不等于已经有转录和摘要。

转录更新触发摘要,摘要不会触发自己

录制产物、生成与保存的不同完成点可横向查看,点击打开原尺寸 ↗

固定版本 2692a40:媒体与转录分别导入;只有 transcript 更新进入摘要链;save-error 分支没有画成已实现的补存队列。

数据库触发器只响应 callRecording.updated,且 updatedFields 必须含 transcript。保存 summary 不会形成摘要循环。触发器要求记录来自 Call Recorder;外层异常转成可重试失败。触发器

生成函数有几道出口:功能关闭、记录不存在或没有真实转录、来源不合要求、已有摘要,都可跳过。默认 shouldRegenerateExistingSummary=false,只有明确要求才覆盖。这减少重复生成,却意味着转录修正不自动等于旧摘要已更新;需要决定何时显式重生成。生成流程

Prompt 不是整份对象直接塞给模型

构造器逐条读取 transcript entry 的 words,只保留非空文本,去空格后连接;说话人缺失则写 Unknown speaker。时间取该条第一个有效、有限的相对起点并格式化,没有有效时间不补造。无法形成文本行就不生成。构造器

这决定摘要可用的证据:没有可用姓名,就不应猜人;没有时间,不能为了整齐补时间点。管理员附加指令、会议标题和转录按顺序装配;通用摘要指令留在 Agent 的 prompt,不在每次输入重复。

默认指令要求 Gist、Overview、Action Items、Notes、Keywords 五部分:一句主旨、2–4句概览、按责任人分组的行动、按时间顺序的讨论、关键词。责任不清用 Unassigned,没有跟进写 None。姓名、数字、承诺、结果和时间只能来自转录。输入过短、无法理解或没有实质讨论,则返回带固定前缀和理由的无法总结结果,不强填五节。默认指令

有理由的 unavailable 比完整却编造的纪要有价值;但 Prompt 是行为约束,不等于输出已经通过事实核验。

应用调用 Agent,也负责落库

generateCallRecordingSummary 向 runAgent 传入注册的 summarizer 标识和装配好的 prompt。解析器先检查 success,再取 result.response;空白被拒。固定前缀解析成 not-summarizable,要求后面有理由;其他任意非空文本均作为 Markdown 返回。解析器

解析通过只证明成功响应有文本,没有验证五标题齐全、责任人真实、数字正确或时间来自转录。需要以这些约束作发布门槛,就要额外验证或人工检查,不能把 Prompt 当强制 schema。

落库不是模型自行挑客户记录。应用持有原 callRecordingId,调用 updateCallRecording,写入 summary 的 blocknote:null 与 markdown;无法总结则保存带原因的不可用文本。这条链的对象是录制记录。函数没有在此解析行动项并自动建任务,也不能推断它按姓名自动关联商机或客户。生成与保存

平台权限需结合调用身份核对。本版本构造 Agent 权限时,有 runAsRoleId 就使用该角色,否则用 Agent 角色;不能沿用其他版本描述,说成自动求 Agent 与用户角色交集。权限构造

三类失败,恢复动作不同

模型调用抛异常,会到触发器外层成为可重试失败;返回 success=false、响应空白或不可用前缀后没有理由,解析均为空并返回 empty-summary;内容不足则返回 not-summarizable 并保存理由。它们涉及调用可用性、输出契约、源材料质量,不能一律再问一次。

保存失败被应用捕获,记录步骤失败并返回 save-error;注释解释为避免重投递再次计费。函数没有同时展示持久化生成结果或独立的仅补存队列。因此能确认的是重试成本取舍,不能声称自动修复。若要求最终落库,迁移方需决定在哪里暂存生成结果、如何只重试更新、怎样让运营人员看到未完成项。失败分支

公开测试覆盖触发、输入装配、响应解析、流程出口、回调乱序等。确定性测试能证明代码分支与契约,不能代替真实会议事实性评测。遗漏异议、错认责任人、把讨论当承诺,仍需对照转录。README 的单次成本估计也不是端到端收益证明。流程测试

采用前,用允许测试且已有人工纪要的真实转录,逐项核对源句、摘要与原录制记录;再检查重复回调、转录修正、空输出,以及生成成功后保存失败。验收重点是每种状态由谁恢复、是否重复计费、能否仅补存结果,而非页面曾出现一段像纪要的文字。

案例资料与日期

公开企业研究 · Twenty · CRM 会议转写生成纪要

行业
企业软件
场景
会议记录与跟进
应用阶段
开源产品
上线时间
未披露
来源发布日期
未披露
站点更新
2026-10-29

来源发布日期与上线时间分别记录;未披露不表示尚未上线。

公开来源

封面:AIMatrix 依据所列公开来源独立绘制;非产品截图。

把这一页用到你的工作里

来源与使用范围

基于公开来源的案例研究;能力、效果与规模以来源披露范围为准,参考设计单独标明。

一起判断下一步

带一笔任务,聊一个具体决定。

培训、方案评审或落地辅导,从你的工作材料与当前困难开始。

交流我的场景