Install
openclaw skills install octo-mention群成员昵称映射分析。基于 DMWork/OpenClaw 权威成员字段(robot/owner_uid)+ 主动拉取历史消息,为群 @ 列表每个成员建立带置信度、证据、冲突的称呼映射,支持增量 upsert 合并。当需要识别群内成员的昵称/花名/简称/常用称呼/机器人别名,或维护 mention 映射表时使用。
openclaw skills install octo-mention环境依赖:本 skill 针对 DMWork / OpenClaw 环境,依赖 DMWork
group-members接口的权威字段(robot / owner_uid)与message read历史。其他平台需自行适配字段。 数据路径:映射库固定为~/.mano-asr/mentions/openclaw.json,配合 mano-asr 使用。 ⚠️ 隐私:生成的映射库含群成员真实称呼与消息证据,属敏感数据,请勿公开提交(已配 .gitignore 排除*.json)。
为群 @ 列表中每个成员识别其自称昵称、花名、常用称呼和机器人别名,基于上下文证据建立带置信度、证据和冲突说明的称呼映射表。
本 skill 在通用昵称映射方法之上,针对 DMWork/OpenClaw 环境做了 4 点关键优化(对应需求 1/3/4/5)。
DMWork 的 dmwork_management(action=group-members) 直接返回权威结构化字段,必须优先采用:
robot 字段 → 定 member_type:robot=1 ⇒ bot,robot=0 ⇒ human(名称疑似 agent 但字段为 0 时标 unknown 并备注)owner_uid / owner_name → 定 bot 的主人,直接覆盖任何文本推断uid → 作为唯一主键(见下)⚠️ bot 自述的主人/身份(如「我的主人是小罗」)属于可能的幻觉,不得覆盖 API 字段。出现冲突时记入 conflicts,以 API 为准。
uid 作主键:DMWork @ 为 @[uid:displayName] 结构化格式,mention 自带 uid。所有绑定锚点用 uid,displayName 仅展示。规避改名/重名歧义。
不要只依赖单轮推送的窗口消息。分析前先用 message(action=read, target="group:<groupId>", limit=N) 拉取足量历史。明确拉取规范:
limit=200(或拉到最早可得),保证证据充分limit=100在结果里记录 evidence_window(实际分析的消息条数/时间范围)。
本 bot 可同时在多个群,同一 uid 跨群是同一人。所有群的映射按 uid 跨群合并进同一个 openclaw.json(persons 结构,非按群分区):
schema/version/last_updated + persons 字典(uid 为全局主键)groups 记录跨群出现,跨群使用越广置信度越高group_id 标签;seen_in_groups 记录该人出现过的群scripts/merge_mentions.py 执行(接受单群扁平结构或 persons 容器作为 --new)siri、拉拉)→ 高权重,可信@ 列表:来自 group-members(含 uid/name/robot/owner_uid)message read 或推送窗口,含 sender(uid)、time、text、mentions同一个 uid 在不同群里是同一个实体。所有群的映射按 uid 跨群汇总进同一个 ~/.mano-asr/mentions/openclaw.json,以人为中心(非按群分区):
{
"schema": "octo-mention.persons.v1",
"version": N,
"last_updated": "...",
"persons": {
"<uid>": {
"uid", "canonical_name", "member_type", "owner_uid", "owner", "owns_bots",
"seen_in_groups": ["<gid>", ...],
"aliases": [ {alias, alias_type, confidence, evidence_count,
evidence:[{time,sender,text,group_id}], groups:[gid], reason} ],
"uncertain_aliases": [...], "conflicts": [...]
}
}
}
同一人在所有群观测到的称呼汇聚成一条记录;每条证据标注来源 group_id,alias 用 groups 记录跨哪些群出现。人类可读汇总可选 openclaw.md。
每个人物记录的结构(alias 元素):
{
"member": "显示名",
"uid": "唯一ID",
"member_type": "human|bot|unknown",
"canonical_name": "标准名",
"owner": "主人显示名(bot)",
"owner_uid": "主人ID(bot)",
"aliases": [
{
"alias": "称呼",
"alias_type": "self_declared|common_call|short_name|nickname|bot_alias|possible_alias",
"confidence": 0.0,
"evidence_count": 0,
"evidence": [{"time": "", "sender": "", "text": ""}],
"reason": ""
}
],
"uncertain_aliases": [],
"conflicts": [],
"status": "active|inactive"
}
正式映射仅收录 confidence ≥ 0.7。bot 自述来源的证据先 ×0.5 再判档。
self_declared / common_call / short_name / nickname / bot_alias / possible_alias / rejected
group-members 拉成员表,按 uid 建标准表,用 robot/owner_uid 定 type 和 ownermessage read 拉足量历史(新群 limit=200 / 增量 100,不低于100),清洗为 {uid, time, text, mentions}merge_mentions.py 按 uid 跨群增量 upsert 进 openclaw.jsonrender_md.py 从 persons.json 生成 openclaw.md,保持 JSON/MD 同步普通名词(老师/老板)、外部人物、项目/产品名、bot 引用文本、被请求处理的对象、玩笑性一次称呼、同句多实体错绑。
特例:@王宜林 帮我养下毕达哥拉拉 → 毕达哥拉拉是另一对象,不是王宜林别名。
一个称呼指向多成员时输出 ambiguous candidates 列表,不强行归属。bot 自述与 API owner 冲突时以 API 为准并记 conflict。
# 将某群本轮分析结果(单群扁平 JSON,含 group_id)按 uid 跨群汇总进同一个 openclaw.json
python3 ~/.openclaw/skills/octo-mention/scripts/merge_mentions.py \
--base ~/.mano-asr/mentions/openclaw.json \
--new /tmp/round.json \
--out ~/.mano-asr/mentions/openclaw.json
# 合并后生成人类可读汇总(JSON/MD 同步)
python3 ~/.openclaw/skills/octo-mention/scripts/render_md.py \
--in ~/.mano-asr/mentions/openclaw.json \
--out ~/.mano-asr/mentions/openclaw.md
scripts/merge_mentions.py — 按 uid 跨群增量合并(证据去重/累加、置信度重算、每 alias 证据上限 MAX_EVIDENCE=5 取最新但 evidence_count 记真实总数、canonical_name 变更存 previous_names、记 last_evidence_time)。支持 locked 保护和 rejected 拦截。scripts/correct.py — 人工纠错工具:添加/删除/转移别名、修正标准名、锁定/解锁、拒绝词。手动修正自动标记 source:"manual" + locked:true,后续自动分析不会覆盖。scripts/lookup_alias.py — 消费端查询接口:别名字符串 → uid/canonical_name/置信度列表,带时间衰减scripts/render_md.py — 从 persons.json 生成 openclaw.mdtests/test_merge.py — 单元测试(11 case),跑:python3 tests/test_merge.py当模型分析结果有误时,通过 correct.py 进行人工修正。修正自动标记为锁定状态,后续自动分析不会覆盖人工修正的结果。
# 查看某人当前所有别名 + 锁定状态
python3 scripts/correct.py --db <db.json> --uid <uid> --show
# 添加正确别名(自动锁定)
python3 scripts/correct.py --db <db.json> --uid <uid> --add-alias "老李" --conf 1.0 --reason "手动确认"
# 删除错误别名
python3 scripts/correct.py --db <db.json> --uid <uid> --remove-alias "旭哥"
# 转移别名(绑错人了,转给对的人)
python3 scripts/correct.py --db <db.json> --move-alias "逸飞" --from <uid_a> --to <uid_b> --reason "绑错人"
# 修正标准名
python3 scripts/correct.py --db <db.json> --uid <uid> --set-name "李明"
# 锁定别名(防止自动覆盖)
python3 scripts/correct.py --db <db.json> --uid <uid> --lock-alias "老李"
# 解锁别名(允许自动分析更新)
python3 scripts/correct.py --db <db.json> --uid <uid> --unlock-alias "老李"
# 拒绝词(标记永不识别为该人别名)
python3 scripts/correct.py --db <db.json> --uid <uid> --reject-alias "老板" --reason "通用称呼不应绑定"
locked:true + source:"manual" 的别名:自动分析完全跳过,不修改 confidence、不删除、不追加证据rejected_aliases 列表中的词:自动分析不得重新收录为 aliascorrected_at 时间戳,可追溯收到消息里出现某称呼,反查是谁:
python3 ~/.openclaw/skills/octo-mention/scripts/lookup_alias.py \
--db ~/.mano-asr/mentions/openclaw.json --alias 小田 [--group <gid>] [--json] [--include-uncertain]
返回按 effective_confidence 降序。时间衰减:超过 decay_days(默认30天)未见新证据的别名,每满 30 天 ×0.9,过时称呼自然沉底(不改原始 confidence,仅查询时计算 effective_confidence)。
覆盖全部成员 / 区分 human-bot-unknown / 每 alias 有证据 / 不误绑被讨论对象 / 冲突单列 / 保留低置信 / 输出双格式 / API 字段优先于文本。