302 lines
13 KiB
Markdown
302 lines
13 KiB
Markdown
# IM Chat Skill 精简与渐进加载优化方案
|
||
|
||
## 1. 背景
|
||
|
||
当前 `im-chat-skill-hint-align` 分支已经增强了 Chat Skill 的 Shortcut 路由、执行骨架、身份边界、查询与资源处理、低频原子回退和错误导航。与 Lark IM Skill 对比后,DWS 在 Agent 路由和执行约束上更直接,但根 Skill 仍存在以下问题:
|
||
|
||
- 高频执行骨架与核心意图表重复。
|
||
- Runtime Shortcut Catalog、leaf Schema 和 leaf Help 的读取规则在多处重复。
|
||
- Shortcut 错误处理与 Workflow 错误导航重复。
|
||
- 身份、ID 和三种置顶对象的边界分散在不同章节。
|
||
- 缺少简短、集中且可复用的核心对象与查询结果语义。
|
||
- Frontmatter 能力召回仍可扩展,但不能削弱 DING、邮件和班级群等产品边界。
|
||
|
||
本方案只调整根文件 `skills/multi/dingtalk-chat/SKILL.md` 的组织和必要语义,不把 API 手册、完整 Shortcut 清单或权限表重新放回根 Skill。
|
||
|
||
## 2. 修改目标
|
||
|
||
1. 提高高频 Chat 意图的直接命中率,减少不必要的 Catalog、Schema 和 `--help` 调用。
|
||
2. 提前建立渐进加载顺序,避免模型在高频任务中优先进入原子命令树。
|
||
3. 补齐身份、核心对象、ID 和查询结果的必要语义,降低错误重试和 ID 混用。
|
||
4. 合并重复 SOP,确保新增内容不会增加根 Skill 的总体 token。
|
||
5. 保持参数、安全和完整 API 事实由 leaf Schema、Help 和 references 按需提供。
|
||
|
||
## 3. 设计原则
|
||
|
||
### 3.1 根 Skill 只保留决策必需信息
|
||
|
||
根 Skill 应负责:
|
||
|
||
- Skill 触发范围和跨产品排除边界。
|
||
- 渐进加载与能力选择顺序。
|
||
- 高频意图到精确 Shortcut 的映射。
|
||
- 身份、ID、幂等、分页、部分失败等跨命令不变量。
|
||
- 低频能力的导航入口。
|
||
- 错误恢复和停止条件。
|
||
|
||
以下内容继续留在 Schema 或 references:
|
||
|
||
- 完整 Shortcut Catalog。
|
||
- API Resources 全量列表。
|
||
- 权限 scope 表。
|
||
- 叶级参数全集和接口字段格式。
|
||
- 只服务单个命令的实现细节。
|
||
|
||
### 3.2 渐进加载规则必须早于命令骨架
|
||
|
||
模型应在看到具体命令前,先知道何时直接执行、何时才加载额外上下文。但完整一级命令树不应提前,以免低频原子命令干扰高频 Shortcut 选择。
|
||
|
||
### 3.3 同一事实只保留一个权威位置
|
||
|
||
- 高频 Shortcut 只出现在一张核心意图表中。
|
||
- Catalog、Schema 和 Help 的读取顺序只定义一次。
|
||
- 错误恢复与 reference 导航只定义一次。
|
||
- 身份、对象和 ID 的公共边界集中定义,后续章节只引用,不重复解释。
|
||
|
||
## 4. 目标章节结构
|
||
|
||
```text
|
||
1. Frontmatter
|
||
2. Preconditions
|
||
3. 加载与路由顺序
|
||
4. 核心对象与 ID
|
||
5. 核心意图与执行骨架
|
||
6. 统一发送
|
||
7. 查询、资源与卡片
|
||
8. 低频原子路由
|
||
├── 一级命令树
|
||
├── branch references
|
||
└── 低频操作回退表
|
||
9. 错误恢复与按需 Reference
|
||
10. 跨产品协作
|
||
```
|
||
|
||
## 5. 具体修改
|
||
|
||
### 5.1 扩展 Frontmatter 产品能力
|
||
|
||
扩展 `description` 的正向能力召回,覆盖:
|
||
|
||
- 单聊、群聊、建群、群搜索和群成员管理。
|
||
- 消息发送、回复、转发、撤回、查询和聊天记录搜索。
|
||
- 图片、文件和消息资源下载。
|
||
- 表情回应、收藏、Pin、消息置顶和会话置顶。
|
||
- 应用机器人、Webhook 和互动卡片。
|
||
- 未读、红点、消息已读状态和会话分类。
|
||
|
||
同时保留明确排除:
|
||
|
||
- DING、短信和电话转到 `dingtalk-ding`。
|
||
- 邮件转到 `dingtalk-mail`。
|
||
- 班级群转到对应的低频产品 Skill。
|
||
- 找人本身由 `dingtalk-contact` 或 `dingtalk-aisearch` 负责,Chat 只消费真实人员 ID。
|
||
|
||
Frontmatter 只描述真实能力和路由边界,不加入参数、SOP 或 token 实现细节。
|
||
|
||
### 5.2 前移并合并渐进加载规则
|
||
|
||
将现有“Shortcut 发现”“Shortcut 执行契约”和“渐进加载与一级路由”的加载决策部分合并为紧随 Preconditions 的唯一章节:
|
||
|
||
```markdown
|
||
## 加载与路由顺序
|
||
|
||
1. 已知高频意图:直接使用“核心意图与执行骨架”,不查 Help。
|
||
2. 已有匹配 Shortcut:直接执行;参数、约束或安全不确定时才查 leaf Schema。
|
||
3. 仅 Cobra flags 不确定时查 leaf `--help`。
|
||
4. 现有路由无法定位低频能力时,才查 Runtime Shortcut Catalog。
|
||
5. 没有 Shortcut 时,按需读取对应 branch reference,进入原子命令。
|
||
```
|
||
|
||
同一章节保留以下公共规则:
|
||
|
||
- 路由优先级为 `exact recipe/runnable script > public Shortcut > atomic command`。
|
||
- 不猜测 `cli_path` 或参数名称。
|
||
- `confirmation=user_required` 时先确认,再添加 `--yes`。
|
||
- 来源冲突时采用更安全的解释并报告契约漂移。
|
||
- 命令已确定且参数清楚时直接执行,不为验证已知路径重复发现。
|
||
|
||
删除其他章节重复出现的 Catalog、Schema、Help 选择说明。
|
||
|
||
### 5.3 新增“核心对象与 ID”小表
|
||
|
||
增加不超过 8 行的表格,集中表达:
|
||
|
||
| 对象 | 核心标识与边界 |
|
||
|---|---|
|
||
| 人员 | 姓名必须先解析成唯一真实的 `userId` 或 `openDingTalkId`,名称不能作为 ID 传递 |
|
||
| 会话 | 使用真实 `openConversationId` / cid;群名只能用于 Shortcut 的目标解析 |
|
||
| 消息 | 使用真实 `openMessageId` / msgId,并保持与身份及会话一致 |
|
||
| 发送任务 | `openTaskId` 只用于查询发送状态,不能替代消息 ID |
|
||
| Thread | thread/topic ID 必须绑定真实会话,不跨会话复用 |
|
||
| 身份 | current-user、app-bot 和 Webhook 是不同操作者,不能自动互换 |
|
||
| 状态 | 收藏、消息置顶、消息 Pin 和会话置顶作用于不同对象 |
|
||
|
||
新增后删除后文对这些边界的重复说明。
|
||
|
||
### 5.4 合并高频骨架与核心意图表
|
||
|
||
删除独立的“高频直接执行骨架”,将其全部合入唯一的“核心意图与执行骨架”表。表格固定为三列:
|
||
|
||
| 用户意图 | 精确 Shortcut 骨架 | 必须保留的执行边界 |
|
||
|---|---|---|
|
||
|
||
至少覆盖以下高频场景:
|
||
|
||
- 姓名发单聊、群名发群消息。
|
||
- user、bot、webhook 三种身份发送。
|
||
- 建群、改群名、拉人和成员查询。
|
||
- 拉取会话消息、查询详情、撤回和发送状态。
|
||
- 关键词搜索、组合搜索和查询 @ 我的消息。
|
||
- 群邀请链接和群机器人。
|
||
- 会话置顶和收藏列表。
|
||
- 查和某人的聊天记录。
|
||
- 群消息翻页导出。
|
||
- 机器人多群广播。
|
||
|
||
表中直接给出正确参数骨架;命中后照抄参数名,不先调用 `--help`。同一个 Shortcut 不再在其他表中重复列出。
|
||
|
||
### 5.5 补充统一身份规则
|
||
|
||
在“统一发送”开头加入统一规则:
|
||
|
||
> 身份决定真实操作者、可见范围和可用能力;同一目标使用 user、bot 或 webhook 时,结果和权限可能不同,禁止自动切换身份重试。
|
||
|
||
继续保留:
|
||
|
||
- 发送前检查身份、目标、正文、标题、@、消息类型和附件路径。
|
||
- 重试复用相同 `--idempotency-key`。
|
||
- user、bot、webhook 的精确发送模板。
|
||
- @ 占位符、新行和文件能力边界。
|
||
|
||
不加入 Lark 的 access token 类型说明。
|
||
|
||
### 5.6 补充查询结果与增强失败语义
|
||
|
||
在“查询、资源与卡片”中增加:
|
||
|
||
- 发送者名称缺失时保留真实 ID,不猜姓名,也不自动扩大通讯录查询。
|
||
- 可选增强字段缺失不代表主查询失败;增强请求失败时保留主结果并写入 per-item ledger。
|
||
|
||
继续保留:
|
||
|
||
- `--page-all` 只在确需完整分页时使用。
|
||
- 部分失败保留已有结果,禁止把不完整结果声明为完整。
|
||
- 资源下载默认关闭,显式请求后才增加请求和本地输出。
|
||
- 子消息资源优先使用子 `messageId`。
|
||
- 输出路径、覆盖、HTTPS 和重定向安全限制。
|
||
|
||
### 5.7 拆分“渐进加载”与“一级命令树”
|
||
|
||
前移的只有加载决策。完整一级命令树及 branch references 改名为“低频原子路由”,保留在高频意图、统一发送和查询规则之后。
|
||
|
||
这样可以:
|
||
|
||
- 防止高频任务优先进入 atomic branch。
|
||
- 降低不必要的 Schema 和 Help 查询。
|
||
- 继续为没有 Shortcut 的能力提供确定导航。
|
||
|
||
低频原子回退表继续保留收藏、编辑、外部群升级、群昵称、分类、共同群、群公告、群身份、置顶、未读、已读、授权、退群和解散群等差异化入口。
|
||
|
||
### 5.8 合并错误恢复与 Workflow 导航
|
||
|
||
将现有“Shortcut 错误处理”和“Workflow 与错误导航”合并为:
|
||
|
||
```markdown
|
||
## 错误恢复与按需 Reference
|
||
```
|
||
|
||
只保留以下规则:
|
||
|
||
- 路径或参数错误时,按 Catalog、Schema、Help 的既定顺序校正一次。
|
||
- 始终从实际输出重新提取下游 ID。
|
||
- 复杂消息任务按需读取 `01-messaging.md`。
|
||
- Onboarding 按需读取对应 workflow。
|
||
- 命令错误按需读取 `chat-error-recovery.md`。
|
||
- 权限不足、歧义未消除、无结果或契约冲突时停止并报告。
|
||
|
||
删除其他位置重复的 `01-messaging.md` 和错误恢复入口。
|
||
|
||
### 5.9 保留跨产品协作边界
|
||
|
||
继续保留根 Skill 中不可由 Chat 自己完成的路由:
|
||
|
||
- 人名解析到 Contact / AISearch。
|
||
- DING、短信和电话到 Ding Skill。
|
||
- 邮件到 Mail Skill。
|
||
- 本地文件与已有 mediaId 的发送差异。
|
||
|
||
如果某项边界已经在 Frontmatter 或核心对象表中完整表达,正文只保留执行阶段真正需要的补充,不重复整段说明。
|
||
|
||
## 6. 删除与合并清单
|
||
|
||
| 当前内容 | 处理方式 |
|
||
|---|---|
|
||
| “Shortcut 发现(按需)” | 合入前置“加载与路由顺序” |
|
||
| “Shortcut 执行契约” | 公共规则合入前置章节 |
|
||
| “高频直接执行骨架” | 删除,内容合入核心意图表 |
|
||
| “渐进加载与一级路由”中的加载说明 | 前移并去重 |
|
||
| 完整一级命令树 | 保留,改放“低频原子路由” |
|
||
| “Shortcut 错误处理” | 合入统一错误章节 |
|
||
| “Workflow 与错误导航” | 合入统一错误章节 |
|
||
| 分散的身份、ID、置顶说明 | 合入核心对象表或统一身份规则 |
|
||
| 重复的 `01-messaging.md` 入口 | 只保留一处 |
|
||
|
||
## 7. 不纳入本次修改
|
||
|
||
- 不展开 97 个公开 Shortcut。
|
||
- 不复制 Lark 的完整 API Resources 和权限 scope 表。
|
||
- 不在根 Skill 中维护 leaf 参数全集。
|
||
- 不引入与当前 CLI 不一致的新命令或参数。
|
||
- 不改变 Schema、Help、Runtime Catalog 和 reference 的事实优先级。
|
||
- 不通过增加默认查询、自动通讯录查询或默认资源增强来换取结果丰富度。
|
||
|
||
## 8. 实施顺序
|
||
|
||
1. 更新 Frontmatter description,确认能力召回和排除边界。
|
||
2. 合并并前移“加载与路由顺序”。
|
||
3. 新增“核心对象与 ID”表,删除相应重复边界。
|
||
4. 合并高频骨架和核心意图表。
|
||
5. 补充统一身份规则。
|
||
6. 补充查询结果和增强失败语义。
|
||
7. 将一级命令树调整为后置的“低频原子路由”。
|
||
8. 合并错误恢复与 reference 导航。
|
||
9. 全文检查重复命令、重复 reference 和冲突参数。
|
||
10. 运行 Skill 格式及相关策略测试,并用高频场景做静态路由验证。
|
||
|
||
## 9. 验收标准
|
||
|
||
### 9.1 内容与结构
|
||
|
||
- 根 Skill 中只有一份 Catalog、Schema、Help 读取顺序。
|
||
- 根 Skill 中只有一张高频意图与 Shortcut 骨架表。
|
||
- 根 Skill 中只有一个错误恢复章节。
|
||
- `01-messaging.md` 的同类导航不重复。
|
||
- 核心对象与 ID 表不超过 8 行数据。
|
||
- 一级原子命令树位于高频路由之后。
|
||
- Frontmatter 同时覆盖主要产品能力和明确排除边界。
|
||
|
||
### 9.2 执行行为
|
||
|
||
- “发给某人”“发到某群”“查 @ 我”“改群名”等高频意图可直接选中已评审 Shortcut,不先查 Help。
|
||
- 低频未知意图才触发 Runtime Shortcut Catalog。
|
||
- 参数或安全不确定时读取 leaf Schema;只有 Cobra flags 不确定时读取 leaf Help。
|
||
- user、bot、webhook 不被自动互换。
|
||
- `openTaskId`、消息 ID、会话 ID 不混用。
|
||
- 发送者名称或 reaction 等增强缺失时,不把主查询误判为失败。
|
||
- 部分失败保留已有结果并明确报告 ledger/completeness。
|
||
|
||
### 9.3 Token 与维护成本
|
||
|
||
- 修改后的根 Skill 不超过当前 211 行,并以不丢失必要路由和边界为前提尽量低于 195 行。
|
||
- 文件单词数和字符数不高于修改前基线。
|
||
- 新增内容通过删除重复 SOP 抵消。
|
||
- 不新增完整 Shortcut、API 或权限清单。
|
||
|
||
## 10. 预期收益
|
||
|
||
- 减少高频任务中的 `--help` 和重复 Schema 查询。
|
||
- 降低因身份切换、ID 混用和发送者名称缺失导致的错误重试。
|
||
- 让 Shortcut、Schema、Help、Catalog 和 references 各自保持单一职责。
|
||
- 在不增加默认 token 和耗时的前提下,提高 Chat Skill 的选择准确率和执行成功率。
|
||
- 降低后续新增 Shortcut 时同时维护多张表和多处规则的漂移风险。
|