Skip to content

Skill 清单

钉钉组织架构识别场景的全部能力定义,按清海 AI 实际工作方式分层组织。 会话场景概览见 钉钉组织架构识别,角色维度的会话旅程见 角色场景


架构总览

钉钉组织架构识别的能力分为四层:

分层判断标准

层级判断标准当前状态
A — SkillAI 需要场景指导、权限规则、工具组合策略⬜ 无 SKILL.md
B — ToolAI 需要调用,tool schema 可自描述✅ 3 个复用 + 4 个待封装
C — 系统能力不需要 AI 感知,自动运行✅ PersonIndex 复用,同步层待实现
D — 主动推送非对话触发,由事件或定时驱动⬜ 全部待实现(钉钉特有事件订阅)

Skill / Tool 汇总

名称描述状态来源
search_contacts按姓名或部门查找员工信息✅ 复用飞书版直接复用
save_contact_aliasAI 在对话中学习并保存人员别名✅ 复用飞书版直接复用
link_platform_identity将外部平台身份绑定到公司人员✅ 复用飞书版直接复用
query_org_structure返回公司整体组织架构树与部门人数⬜ 待封装PersonIndex 已有方法
query_department_members查询指定部门的全部成员列表⬜ 待封装PersonIndex 已有方法
query_person_relations查询某人的上下级与同组关系⬜ 待封装PersonIndex 已有方法
query_staff_changes查询最近人员变动(入职/离职/调岗)⬜ 待实现需新建,依赖事件日志

A 层 — 当前无独立 Skill

现状

当前没有 skills/org-query-dingtalk/SKILL.md,AI 靠以下两条路径回答组织架构问题:

  1. system prompt 身份注入avatar_core.build_avatar_prompt() 在 Block 1 注入 "张三是销售一组的销售经理"
  2. search_contacts 工具:AI 主动调用查询人员信息

目标设计

后续计划创建 skills/org-query-dingtalk/SKILL.md,提供:

  • 触发词匹配:组织|部门|同事|上级|下属|团队|架构|人员|成员|谁是|有谁|几个人|负责人
  • 角色权限规则(老板 / 经理 / 员工各看什么)
  • 推荐工具组合和调用顺序
  • 回复格式要求

B 层 — Tool 清单

已实现(直接复用飞书版,3 个)

1. search_contacts — 通讯录搜索

按姓名或部门查找员工信息。底层调用 PersonIndex,PersonIndex 数据来源已切换为钉钉通讯录,工具本身无需修改

数据来源PersonIndex 内存索引(底层数据来自钉钉 POST /topapi/v2/user/list
参数必填说明
query搜索关键词(姓名或部分名字)
department部门名称(支持模糊匹配)

返回字段

字段来源钉钉 API 字段说明
namename姓名
job_titletitle职位
department通过 dept_id_list 关联部门名所属部门
useriduserid钉钉用户唯一标识
mobilemobile手机号(需申请 Contact.User.Mobile 权限)

实现位置scripts/direct/tools/feishu.py → 复用(PersonIndex 底层已切换钉钉数据)


2. save_contact_alias — 学习别名

AI 在对话中学习到某人的别名后保存。工具无需修改,PersonIndex 层通用。

参数必填说明
person_name通讯录中的正式姓名
alias新别名(如"阿明""明哥")

将外部平台(如 CRM、GitLab 等)的用户标识绑定到公司人员。工具无需修改

参数必填说明
person_name通讯录中的正式姓名
platform平台名(crm / gitlab 等)
identifier平台上的用户标识

待封装的工具(4 个)

PersonIndex 已有对应方法,封装为 AI 可调用的 tool:

4. query_org_structure — 组织架构概览

目标返回公司整体组织架构:部门树 + 各部门人数 + 负责人

底层方法PersonIndex.get_org_summary(role)

钉钉数据来源POST /topapi/department/list(一次返回所有部门,字段 dept_idnameparent_id

注:钉钉根部门 dept_id=1,与飞书 parent_department_id=0 不同。


5. query_department_members — 部门成员查询

目标返回指定部门的全部成员列表(姓名 + 职位 + 是否主管)
参数说明
department部门名称(支持模糊匹配)

底层方法PersonIndex.get_department_members(department)

钉钉数据来源POST /topapi/v2/user/list(参数 dept_id,游标分页 cursor + size


6. query_person_relations — 人员关系查询

目标查询某人的上下级关系
参数说明
name人名
relation_typeleader(上级)/ members(下属)/ team(同组)/ all

底层方法:PersonIndex 通过 manager_userid 字段反向查询

钉钉字段依赖

  • 上级:manager_userid → 反查对应姓名
  • 下属:反查 manager_userid = 当前用户 userid 的所有人
  • 是否主管:leader_in_dept 字段

7. query_staff_changes — 人员变动查询

目标查询最近的人员变动(入职/离职/调岗)
参数说明
days查询最近 N 天的变动(默认 7)
change_typejoin / leave / transfer / all

钉钉数据来源:变动日志表(基于事件订阅记录)unified_users.change_log

底层实现:事件接收端点写入变动日志,本工具从日志读取


C 层 — 系统能力

不暴露给 AI,在消息处理链路中自动运行。

能力说明状态实现位置
钉钉通讯录同步每日凌晨全量同步部门树 + 人员到 MongoDB⬜ 待实现scripts/dingtalk_sync.py(新建)
PersonIndex 构建启动时从 unified_users 加载全量数据建立内存索引✅ 复用scripts/contacts/index.py
PersonContext 档案按场景裁剪输出人物上下文切片✅ 复用scripts/memory/person_context.py
userid 身份解析钉钉消息 senderStaffIdperson_id 自动解析 + 注入 system prompt⬜ 适配层avatar_core.py(扩展 dingtalk 渠道)
权限过滤根据用户角色过滤查询结果中的人员数据⬜ 待实现与飞书版共用同一机制
数据质量自检同步后检测缺失字段(职位/上级/部门),通知管理员⬜ 待实现
离职处理user_leave_org 事件触发 → is_active=False → 消息静默⬜ 待实现事件处理器

通讯录同步流程(全量)

事件订阅接收流程(实时)

Access Token 管理

POST https://api.dingtalk.com/v1.0/oauth2/accessToken
Body: { "appKey": "xxx", "appSecret": "xxx" }
→ accessToken(有效期 7200 秒)

存储:内存缓存 + 到期前 5 分钟自动刷新
旧版 API 调用:?access_token=xxx(URL 参数)
新版 API 调用:x-acs-dingtalk-access-token: xxx(Header)

身份解析流程


D 层 — 主动推送

非对话触发,由事件或定时任务驱动。

事件订阅(实时)

场景钉钉事件推送对象状态
新员工入职通知user_add_org管理员(钉钉消息)⬜ 待实现
员工离职通知user_leave_org人事负责人(钉钉消息)⬜ 待实现
员工信息变更user_modify_org静默处理(仅更新数据)⬜ 待实现
部门变更org_dept_create/modify/remove静默处理(仅更新数据)⬜ 待实现

定时任务

场景频率触发条件推送对象状态
每日全量同步每日凌晨 2:00定时触发⬜ 待实现
数据质量告警每日最多 1 次同步后检测到新增缺失项管理员⬜ 待实现

推送约束

约束说明
防骚扰数据质量告警每日最多 1 次,只通知新增缺失项
去重已通知过的缺失项不重复发送
工作时段仅在工作时间推送(9:00-19:00)
事件幂等同一事件可能重复推送,处理时以 userid + 时间戳去重

复用的现有能力

能力本场景用途状态
PersonIndex跨平台人员索引(按名/别名/平台 ID 查找)✅ 直接复用
PersonContextResolver统一人物工作档案(分层存储 + 按场景切片输出)✅ 直接复用
contacts_learn 工具AI 学习别名 + 平台身份绑定✅ 直接复用
search_contacts 工具通讯录查询(PersonIndex 底层,数据来源切换即可)✅ 直接复用
NotificationEngine主动通知的防骚扰控制(冷却/时段/每日上限)✅ 直接复用
avatar_core消息处理主流程(扩展 dingtalk 渠道适配层)✅ 扩展适配

全局约束

约束说明
钉钉为权威源组织相关字段(部门/职位/上级)以钉钉通讯录 userid 返回值为准
权威性层级qinghai_manual > authoritative_sync > inferred > observed
只读查询不修改钉钉通讯录数据,仅读取和同步
手机号权限获取 mobile 字段需申请 Contact.User.Mobile 权限,否则返回脱敏值
事件幂等处理钉钉事件可能重复推送,接收端点需以 userid + event_type + timestamp 去重
离职即静默user_leave_org 事件触发后立即静默,不等全量同步
缓存降级钉钉 API 不可用时使用 data/cache/dingtalk_contacts.json 继续服务
Token 有效期accessToken 有效期 7200 秒,需自动刷新,避免请求失败

实现路线

Phase 1:数据打通 + 身份识别

#事项状态
1钉钉 Access Token 获取与自动刷新
2钉钉通讯录全量同步(DingTalkSync
3avatar_core 适配 senderStaffId 身份解析
4PersonIndex 扩展 channels.dingtalk 支持
5事件订阅接收端点(HTTP 回调 + 验签)
6事件处理:user_add_org / user_leave_org / user_modify_org

Phase 2:专用工具 + 权限

#事项状态
7封装 query_org_structure 工具
8封装 query_department_members 工具
9封装 query_person_relations 工具(依赖 manager_userid
10封装 query_staff_changes 工具(依赖事件日志)
11权限过滤中间件(角色 × 数据范围)
12org-query-dingtalk SKILL.md 场景化编写

Phase 3:主动推送 + 数据质量

#事项状态
13数据质量自检 + 管理员通知
14人员变动通知(入职/离职推送给管理员)
15事件处理:部门变动(org_dept_*

Boss-AGI · 超级 AI 企业助理