Files
EP-Hub-Skill/.agents/skills/dingtalk-shared/references/recipes/lite-catalog.md
T
2026-09-02 11:44:52 +08:00

18 KiB
Raw Blame History

Lite Recipe 完整步骤

核心流程步骤 3 判定为 lite 后,按本文件中对应 recipe 的步骤直接执行。 所有命令均须加 --format json(下文省略)。

#1 消息沟通

所有消息沟通相关的命令详情、参数说明、意图路由和复合工作流,请查阅 dingtalk-chat

#2 任务管理

create-todo

  1. 确定执行者:指定姓名 → aisearch person --query "<姓名>" --dimension nameuserId;未指定 → contact user get-selfuserId;多人 → 逐个搜索逗号拼接。
  2. 创建:todo task create --title "<标题>" --executors <userId>[,<userId2>...] --priority <优先级>(可选 --due "<截止ISO>")→ todoTaskId

todo-query-ops

  • 查询:todo task list [--status false|true](不传=全部)
  • 详情:todo task get --task-id <id>
  • 完成/重开:todo task done --task-id <id> --status <true|false>
  • 按主题筛选:list 后按标题关键词过滤

#3 会议日程

list-today-meetings

优先:加载 dingtalk-calendar sub-skill 后按其「今天/明天/本周日程」recipe 执行;该自动化脚本只在 dingtalk-calendar 包内可用。 备选:dws calendar event list --start "<今日起始ISO>" --end "<今日结束ISO>"(须加 --format json

check-users-busy

查询多人在某时段内的闲忙(busy,不是用 event list 扫日程):

  1. 解析用户:对每个姓名执行 aisearch person --query "<姓名>" --dimension nameuserId;多人将 userId 用英文逗号拼接(无空格或按 dingtalk-calendar busy search 要求)。
  2. 确认时段:用户须给出或可收敛为明确的 --start / --endISO-8601);若未给出,先追问起止时间,禁止用任意默认全天窗口代替用户意图。
  3. 执行:dws calendar busy search --users <userId1,userId2,...> --start "<ISO>" --end "<ISO>" --format json

详见 dingtalk-calendar 中「查询用户闲忙状态」。

#4 文档知识

query-doc

  1. 全局搜索:drive search --query "<关键词>"nodeId(聚合钉盘+文档空间)
  2. 空间内搜索:wiki node search --workspace <WS_ID> --query "<关键词>"nodeId
  3. doc read --node <nodeId>(按需;大文档只抽章节)

list-folder-docs

drive list --workspace <WS_ID>wiki node list --workspace <WS_ID>

#5 工作汇报

query-report-list

  1. 收到的日志:先把用户时间词转成起止时间,再执行 report inbox list --start "<YYYY-MM-DDT00:00:00+08:00>" --end "<YYYY-MM-DDT23:59:59+08:00>" --cursor 0 --size 20 --format json。用户只说“最近/近期/最近收到”时默认最近 7 天。
  2. 我发过/我创建的日志:首条查询必须用 report outbox list --cursor 0 --size 20 --format json;如用户指定时间,补 --start "<YYYY-MM-DDT00:00:00+08:00>" --end "<YYYY-MM-DDT23:59:59+08:00>"
  3. 按发件人过滤收件箱:先 aisearch person --query "<姓名>" --dimension name --format jsonuserId/staffId,再加 --sender-user-ids <id>;空结果必须说明未找到该发件人的日志,不得改选其他人。
  4. 面向用户时必须基于 result[] 拼 Markdown 表,表头固定为 日期 | 标题 | 发送人 | 状态 | 钉钉链接;每条 result[] 都会带这五个中文字段,不要把 reportId / 日志ID 作为主列。
  5. 用户要正文、详情、统计、汇总或总结多篇日志时,必须用内部保留的 reportId 逐篇执行 report entry get --report-id <reportId> --format jsonreport entry stats --report-id <reportId> --format json;选前 5 篇时调用次数应等于实际选中篇数。

时间 flag 硬约束:只允许 --start / --end;禁止 --start-date / --end-date / --date。不要只传 2026-05-04,必须展开成 2026-05-04T00:00:00+08:00 这种完整 ISO;禁止 UTC Z / date -u

硬约束:report inbox list 是收到的日志(别人发给我),report outbox list 是我创建/发出的日志(我发给别人)。不要混淆方向;不要回答"API 不支持收到的日志"。

旧命令兼容:report list / report inbox / report sent / report created / report detail / report stats 仍可执行,但已 deprecated,stderr 会打废弃提醒,新计划一律使用 inbox list / outbox list / entry get / entry stats

禁止:不要先查 help,不要为了格式化列表创建脚本;不要传 --size 50/100report inbox 可作为兼容入口使用,但新计划优先写规范命令 report inbox list --start "<YYYY-MM-DDT00:00:00+08:00>" --end "<YYYY-MM-DDT23:59:59+08:00>" --cursor 0 --size 20 --format json

check-report-read-status

report entry stats --report-id <reportId> → 已读/未读

#7 听记与会后

产品命令完整参考见 dingtalk-minutes。full recipe 见 dingtalk-minutes/references/07-minutes.md

minutes-query(查询与获取)

scope 选择铁律(P2 真实 badcaselist 后的 scope 决定查询范围,最高频误判是把"我能访问的所有听记"错选成 mine

  • mine = 仅我自己创建/发起的听记(范围最窄)
  • shared = 仅他人共享给我的听记
  • all = 我可访问的全部= mine shared,范围最广)
  • 判定口诀query 含"访问/权限/可见/能看到/所有/我的"等覆盖范围语义 → 一律走 all仅当明确说"我创建的/我发起的/我录的" → 才走 mine不要因为句子里有"我"字就退化成 mine
  • 错误:我能访问的所有听记list mine(漏掉共享给我的,判定不通过)
  • 正确:我能访问的所有听记dws minutes list all --format json

选对象铁律(0605 P2 EDD badcase 提炼,命令对了但选错听记 = 整任务失败):list/搜索拿到结果后,必须按语义精准锁定目标听记,详见 dingtalk-minutes「选对象铁律 S1~S6」。速记:

  • S1 跨组织汇总:以 list 返回的 taskUuid + title + organizationName 三元组为准逐条照抄,组织与听记不可张冠李戴。
  • S2 "最近一次某类会议":先 --query "<主题词>"(如周会)过滤出该类,再在候选里取时间最新;主题匹配优先级高于时间。
  • S3 比时长最长:必须读 durationMicros 字段做数值比较,禁止凭印象/标题猜,口头结论与操作的 taskUuid 须自洽。
  • S4 内容为空:锁定 taskUuid 后所有 get/update 复用同一 id;某字段为空就如实说,禁止偷偷切换到另一条听记
  • S5 模糊日期匹配不到:日期可能是"会议主题日期"而非"创建日期",按标题关键词搜,精确日期没命中就放宽 ±7 天/同主题候选请用户确认,禁止直接报"找不到"。搜索回退策略:① 先 --query "<主题关键词>" 不带日期搜 → ② 若结果过多则加 --start/--end 扩大到 ±7 天 → ③ 列出候选让用户确认。
  • S6 给标题没给 id:必须先 list all --query "<标题关键词>" 定位 taskUuid 再 update/get,禁止凭记忆直接填 --id 跳过定位。

列表查询list必须跟 scopemine/shared/all,默认补 all):

# 我可访问的所有听记(默认)
dws minutes list all --format json
# 按关键词服务端搜索(严禁全量拉取后本地 grep)
dws minutes list all --query "周会" --format json
# 按时间范围筛选(ISO-8601 格式)
dws minutes list mine --start "2026-05-01T00:00:00+08:00" --end "2026-05-25T23:59:59+08:00" --format json
# 关键词 + 时间组合
dws minutes list all --query "需求评审" --start "2026-05-25T00:00:00+08:00" --end "2026-05-25T23:59:59+08:00" --format json
# 限制条数
dws minutes list mine --limit 5 --format json
# 共享给我的听记
dws minutes list shared --query "ROI" --format json
参数 说明
--query "<关键词>" 服务端关键词搜索
--start "<ISO-8601>" 开始时间
--end "<ISO-8601>" 结束时间
--limit <N> 每页条数,默认 10--max 为兼容别名)
--cursor "<token>" 分页 token,首页留空(--next-token 为兼容别名)

获取详情

  • 批量基础信息:minutes get batch --ids <uuid1,uuid2,...>
  • 单篇摘要:minutes get summary --id <taskUuid>
  • 转写原文(自动翻页):minutes get transcription --id <taskUuid>(返回 cursor / nextToken / nextCursor 时用 --cursor <token> 继续)
  • 关键词:minutes get keywords --id <taskUuid>
  • 待办事项:minutes get todos --id <taskUuid>
  • 基础信息:minutes get info --id <taskUuid>
  • 音频地址:minutes get audio --id <taskUuid>

--id/--uuid/--task-uuid 三者等价。推荐 --id

minutes-edit(编辑与替换)

  • 替换转写文字minutes replace-text --id <taskUuid> --search "旧文字" --replace "新文字"
    • 执行前检查特殊字符(引号/书名号/括号等),若包含先提示用户确认去除
    • 替换成功后追问是否加热词:minutes hot-word add --words "新文字"
  • 替换发言人:先统一搜人取得 dingUid → minutes speaker replace --id <taskUuid> --from "发言人X" --to "姓名" --target-uid <userId>
    • 查询 dingUidaisearch person --query "姓名" --dimension name --format json → 取 userId
    • 多个匹配 → 列出候选让用户选;无匹配 → 不带 --target-uid 执行
  • 修改标题minutes update title --id <taskUuid> --title "新标题"
  • 修改摘要minutes update summary --id <taskUuid> --content "新内容"
  • 热词管理minutes hot-word add --words "词1,词2" / minutes hot-word list
  • 思维导图minutes mind-graph create --id <taskUuid>mind-graph status --id <taskUuid> 轮询至完成

minutes-tag(标签/分组查询)

  • 查询标签列表:minutes tag list → 返回用户在听记页面创建的所有标签/分组(含 tagId 和名称)
  • 按标签查听记:minutes tag query --tag-id <tagId> [--limit 20] [--cursor <token>]
    • tagId 来自 tag list 返回值,不可编造
    • 支持分页,--cursor 传入上一次返回的 nextToken

典型链路:用户说"帮我看看'周会'标签下的听记" →

  1. dws minutes tag list --format json → 按名称匹配找到 tagId
  2. dws minutes tag query --tag-id <tagId> --format json

minutes-permission(权限管理)

  • 添加成员:minutes permission add --ids <uuid1,uuid2> --member-uids <uid1,uid2> --policy 4
    • 需先通过 aisearch person --query "<姓名>" --dimension name 获取目标 userId
    • policy0=不可见 / 1=仅查看 / 2=查看+下载 / 3=查看+下载+编辑 / 4=全部权限
  • 移除成员:minutes permission remove --ids <uuid1,uuid2> --member-uids <uid1,uid2>

minutes-upload(音频上传)

# 创建上传会话
dws minutes upload create --file-name "meeting.mp3" --file-size 61565431 --format json
# 上传完成后确认
dws minutes upload complete --session-id <sid> --format json
# 取消上传
dws minutes upload cancel --session-id <sid> --format json

最佳实践案例速查(详见 dingtalk-minutes

案例 场景 正确链路
案例 1 听记 URL + 创建思维导图 提取 taskUuid → mind-graph createmind-graph status 轮询;禁止走 app-development 或前端库
案例 2 替换文字后未引导热词 检查特殊字符 → replace-text → 追问加热词 hot-word add
案例 3 查听记拉了不必要的转写 用户只要列表 → list 即可,不要自动拉 get transcription
案例 4 拉完转写只输出时间线原文 拉完后追问按发言人聚类 → 引导匹配 → 调用 speaker replace 写回
案例 5 查某人说了什么不引导替换 推断发言人 → 用户确认 → 结构化总结 → 引导 speaker replace
案例 6 通讯录+部门+转写三路印证 Step 3 画像 + Step 4 aisearch person 并发 → 置信度 ≥70% → 确认 → 替换
案例 7 grep 花名误判未参会 禁止在转写文本里 grep 人名判参会;必须aisearch person
案例 8 听记类 query 不走 dws 禁止用 session_search/browser_use/activity:search 替代 dws;模糊请求先 list mine
案例 9 按标签筛选听记 tag list → 按名称匹配 tagId → tag query --tag-id <tagId>禁止编造 tagId

听记取数深度约束(0609 点踩 case 提炼)

详细说明见 dingtalk-minutes

  • 转写原文硬约束:用户诉求含「聚焦原话/逐字/沟通细节/具体讨论了什么」等词时,必须先调 get transcription 翻页拉全,禁止仅凭 summary 出稿
  • 数据源下钻:听记维度必须 get summary(或 get transcription)读正文,严禁只取标题列表;scope 用 all;空时换窗重试或标注
  • 听记链接解析:聊天消息中遇到听记链接(flash_minutes_detail/SHANJI)→ 解析 minutesId → 调 minutes get summary/transcription,禁止把链接降级为关键词
  • 忠实性约束:源数据无某要素(行动项/责任人/数字)时禁止生成;统计字段基于实际取数计数,不得编造
  • 多源全覆盖:用户枚举多数据源时每个来源都必须调对应工具;瞬时错误重试;如实声明缺失来源,禁编无来源数字

间接意图识别铁律

query 未提"听记"但任务产出依赖会议讨论内容时(报告/总结/日报/复盘/商业分析/市场感知),听记采集是必跑前置步骤

  1. 铁律 A:任务含"会议/讨论/沟通"信息需求 → dws minutes list 必跑
  2. 铁律 B:用户说"文档啥也没有" → 听记优先级更高(唯一结构化数据源)
  3. 铁律 C:多源聚合场景 → 每个被提及的数据源都必须有采集动作,听记侧 0 调用 = 严重失败

#8 通讯录

get-contact-self

contact user get-self → 当前用户 userId、部门、主管等

search-person

搜人首选入口。凡是“找人/搜人/找同事/谁负责/上级/下级/负责人/团队成员”均优先用 aisearch person

  1. 从用户问题中提取 keyword(人名/业务关键词)和 dimension(维度),规则见 dingtalk-aisearch
  2. aisearch person --query "<关键词>" --dimension <维度>
  3. 结果中提取 userIdtitle(姓名)展示给用户。
  4. 若需要 userId 做后续操作(发消息/建待办),可直接使用结果中的 userId
  5. 重名消歧:多人同名时禁止默认选第一个,须追加 contact user get --ids 获取部门/职位后请用户确认,详见 dingtalk-contact/references/08-directory.md「多命中」。

search-user

仅在以下精确查询场景使用,搜人请优先用 search-person

  • 需要获取 userId 给其他产品使用(发消息/建待办/约日程)
  • 已有 userId 需查完整详情(contact user get --ids
  1. aisearch person --query "<姓名>" --dimension nameuserId多命中须列出候选请用户确认
  2. 重名消歧:多人同名时禁止默认选第一个,须追加 contact user get --ids 获取部门/职位后请用户确认,详见 dingtalk-contact/references/08-directory.md「多命中」。
  3. 需详情时:contact user get --ids <userId>(多人可 --ids id1,id2,...

#9 邮件

mail-list-mailbox

查询当前用户自己的可用邮箱地址列表。仅返回自己的邮箱,不能查他人邮箱(查他人邮箱请走 dingtalk-mail 中「查找他人邮箱地址」三路并发查询流程)。

mail mailbox list

搜索邮件。必须使用 KQL 语法通过 --query 传递查询条件,禁止臆造 --subject--from 等不存在的 flag。

  1. 获取邮箱地址:mail mailbox list → 取用户邮箱地址。若用户已提供邮箱可跳过。
  2. 构造 KQL 查询:根据用户意图将搜索条件转为 KQL 表达式(详见 dingtalk-mail 中 KQL 查询字段说明)。
    • 按主题:subject:周报subject:"项目 进展"(含空格须加双引号)
    • 按发件人:from:alice@company.comfrom:"张三"
    • 按日期:date>2025-06-01T00:00:00Z(ISO8601 格式,必须含时间部分)
    • 按文件夹:folderId:2(2=收件箱, 1=已发送, 5=草稿, 6=已删除)
    • 按是否有附件:hasAttachments:true
    • 组合:from:alice AND subject:周报 AND date>2025-06-01T00:00:00Z
  3. 执行搜索:mail message search --email <邮箱> --query "<KQL表达式>" --limit 20
  4. 查看详情(按需):mail message get --email <邮箱> --id <messageId>

mail-send

发送邮件。

  1. 获取邮箱地址:mail mailbox list → 取用户邮箱作为 --from
  2. 确定收件人:用户直接提供邮箱地址 → 直接使用;用户提供姓名 → 走「查找他人邮箱地址」三路并发流程(见 dingtalk-mail)。
  3. 发送:mail message send --from <发件邮箱> --to <收件邮箱> --subject "<主题>" --content "<正文>"(可选 --cc--attachment--inline-attachment)。

mail-reply-forward

回复或转发邮件。

  1. 获取邮箱地址:mail mailbox list → 取用户邮箱。
  2. 定位原始邮件:若用户未提供 messageId → 先用 mail-search 搜索定位。
  3. 执行:
    • 回复:mail message reply --from <邮箱> --id <messageId>(可选 --to--subject--content
    • 回复全部:mail message reply-all --from <邮箱> --id <messageId>(可选 --to--subject--content
    • 转发:mail message forward --from <邮箱> --to <收件邮箱> --id <messageId>(可选 --subject--content