Skip to content

fix(agent-teams): split inline member mentions - #549

Open
openjiuwen-sync-bot[bot] wants to merge 1 commit into
openJiuwen-ai:developfrom
openjiuwenai:sync/pr-2341
Open

fix(agent-teams): split inline member mentions#549
openjiuwen-sync-bot[bot] wants to merge 1 commit into
openJiuwen-ai:developfrom
openjiuwenai:sync/pr-2341

Conversation

@openjiuwen-sync-bot

@openjiuwen-sync-bot openjiuwen-sync-bot Bot commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

Paired: GitHub #549GitCode !2341

What type of PR is this?

/kind

Self-checklist:(请自检,在[ ]内打上x,我们将检视你的完成情况,否则会导致pr无法合入

    • 设计:PR对应的方案是否已经经过Maintainer评审,方案检视意见是否均已答复并完成方案修改
    • 测试:PR中的代码是否已有UT/ST测试用例进行充分的覆盖,新增测试用例是否随本PR一并上库或已经上库
    • 验证:PR描述信息中是否已包含对该PR对应的Feature、Refactor、Bugfix的预期目标达成情况的详细验证结果描述
    • 接口:是否涉及对外接口变更,相应变更已得到接口评审组织的通过,API对应的注释信息已经刷新正确
    • 文档:是否涉及官网文档修改,如果涉及请及时提交资料到Doc仓

@openjiuwen-collaboration-bot

Copy link
Copy Markdown

head_sha: a8b8d0cfbd25173f17587b5ae67a19a58adb8afc

变更摘要

该 PR 主要修复了 agent-teamsinteract 字符串解析对「行内成员提及」(inline member mentions)的支持:当输入形如 @m1 body1 @m2 body2 时,原逻辑无法按不同成员拆分不同内容,本次改动新增了行内提及切分逻辑,使每个成员能够收到各自对应的消息体。改动集中在 openjiuwen/agent_teams/interaction/router.py,通过新增 _INLINE_RECIPIENT_RE 正则与 _split_inline_segments() 函数,将包含多个 @成员 内容 片段的消息拆分为逐成员的 OperatorMessageHumanAgentMessage,并配套补充了相关单元测试。

主要改动

  • 新增行内提及正则 _INLINE_RECIPIENT_RE: 在 router.py 中新增 _INLINE_RECIPIENT_RE = re.compile(r"(?<!\S)@(\S+)\s+"),用于在消息体中识别非行首位置的 @成员 提及及其后内容。
  • 新增 _split_inline_segments() 函数: 该函数将 @m1 body1 @m2 body2 形式的消息拆分为「成员-消息体」片段列表;若首段消息体为空或消息以另一个接收者 token 开头(即传统 @m1 @m2 shared body 多播形式),则返回 None 走原有扇出路径。
  • parse_interact_str() 集成行内分段逻辑: 在原有 HumanAgentMessage/OperatorMessage 扇出前,先调用 _split_inline_segments();当成功切分时,对 HumanAgentMessage 保留 sender 并按各成员目标生成消息,对 OperatorMessage 则按各成员目标生成消息。
  • 新增行内分段相关单元测试: 在 tests/unit_tests/agent_teams/interaction/test_router.py 中新增 test_god_view_inline_recipient_segments_fan_out_with_distinct_bodiestest_human_agent_inline_recipient_segments_fan_out_with_distinct_bodies,验证上帝视角与人类代理场景下按成员拆分不同消息体的行为。

@openjiuwen-collaboration-bot

openjiuwen-collaboration-bot Bot commented Aug 13, 2026

Copy link
Copy Markdown

head_sha: a8b8d0cfbd25173f17587b5ae67a19a58adb8afc

代码审查

Closing Summary

已逐一审查 2 个变更文件:

  • openjiuwen/agent_teams/interaction/router.py:发现 2 个问题(均为 P2)。
  • tests/unit_tests/agent_teams/interaction/test_router.py:no issues(新增两个测试用例本身断言正确,但未覆盖上述「多前导收件人 + 内联 @」和「内联 @all/@*」的回归场景)。

发现统计:P0 0 个,P1 0 个,P2 2 个,P3 0 个。

整体风险判断:核心新增逻辑(内联 mention 拆分)在标准输入(单前导收件人 + 内联 @)下工作正常,但对混合输入存在静默丢收件人(消息丢失)的回归,以及内联广播 token 未按既有契约处理的一致性缺陷,建议合入前修复。

类型 数量
🔴 阻塞 0
🟡 建议 2

💬 仅评论

@CLAassistant

Copy link
Copy Markdown

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.
You have signed the CLA already but the status is still pending? Let us recheck it.

@openjiuwen-collaboration-bot

Copy link
Copy Markdown

head_sha: a8b8d0cfbd25173f17587b5ae67a19a58adb8afc

发送 $human-member @member-1 你来查询杭州今日天气 @member-2 你来查询上海今日天气和$human-member @member-1 @member-2 你来查询上海今日天气的的时候群聊展示如下member-2 avatar
报数成员二号
@team-leader报告 Leader:member-2 已完成报数任务 task-count-2,报数结果为「2」。
member-1 avatar
报数成员一号
@team-leader报告 leader,member-1 已完成报数任务 task-count-1,我的报数是「1」。
human-member avatar
人类报数成员
@team-leader控制者让我转告:human-member 完成报数任务 task-count-3,报数为「3」。
human-member avatar
人类报数成员
@报数成员一号你来查询杭州今日天气
human-member avatar
人类报数成员
@报数成员二号你来查询上海今日天气的时候
member-1 avatar
报数成员一号
@人类报数成员杭州今日(8月13日)天气查询结果:
🌧️ 当前实况:中到大雨阵雨,气温约 27°C(体感 32°C),湿度 91%,东北偏东风 18 km/h。

📅 今日天气概况:

气温:25°C ~ 32°C
白天多云转阴,午后有局部阵雨/雷阵雨(31~32°C,较闷热)
傍晚到夜间雨势增强:18 时起转中到大雨阵雨,夜间 21 时后有中雨,出门请带伞
日出 05:25 / 日落 18:43
💡 提醒:今天降雨概率较高(傍晚后尤其明显),外出记得携带雨具,注意防雨防滑。

member-2 avatar
报数成员二号
@人类报数成员收到!上海今日(8月13日 星期四)天气如下:
当前:多云,约 27°C
早上:局部有小雨,2832°C
中午:局部有小雨,29
33°C
傍晚:多云,2730°C
夜间:多云,26
29°C
风向风力:西风 16~25 km/h
降水:预计 0.0 mm,降水概率约 11%~24%
另外提醒:你的消息「你来查询上海今日天气的时候」似乎没有说完,如果还有后续内容(比如"……的时候记得告诉我什么"),请补充发我。

human-member avatar
人类报数成员
@报数成员一号你来查询上海今日天气的时候
human-member avatar
人类报数成员
@报数成员二号你来查询上海今日天气的时候
member-2 avatar
报数成员二号
@人类报数成员已收到你重复发送的消息~上海今日(8月13日 星期四)天气我已查询过:多云为主,当前约 27°C,白天最高 33°C(中午局部有小雨),夜间 2629°C,西风 1625 km/h,降水概率约 11%~24%。
另外,你的消息「你来查询上海今日天气的时候」看起来没说完(结尾是"的时候"),是不是后半句漏发了?如果需要我做什么具体的事,请把完整消息发给我。

member-1 avatar
报数成员一号
@人类报数成员上海今日(8月13日)天气查询结果:
⛅ 当前实况:多云,气温约 27°C(体感 29°C),湿度 79%,东风 18 km/h。

📅 今日天气概况:

气温:25°C ~ 29°C
白天多云转阴,午后局部有零星阵雨(降雨概率较低,约 20% 左右),傍晚转多云
午后体感较闷热(体感最高约 33°C),注意补水
日出 05:18 / 日落 18:39
💡 提醒:今日整体以多云为主、降雨概率低,适合出行;午后闷热,外出注意防晒补水。

if not first_body:
return None

segments: list[tuple[str, str]] = [(recipients[0], first_body)]

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

head_sha: a8b8d0cfbd25173f17587b5ae67a19a58adb8afc

🟡 Medium Priority

建议:将 first_body 扇出到所有前置收件人(保持多播语义),或在多前置收件人时退回旧路径。

Suggested change
segments: list[tuple[str, str]] = [(recipients[0], first_body)]
segments: list[tuple[str, str]] = [(name, first_body) for name in recipients]

fan-out path.
"""
if not recipients:
return None

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

head_sha: a8b8d0cfbd25173f17587b5ae67a19a58adb8afc

🟡 Medium Priority

新增函数 _split_inline_segments 的入口 guard(L100-101 if not recipients: return None)只排除了空 recipients 的情况,但 L111 segments = [(recipients[0], first_body)] 只取 recipients[0],其余前导收件人被直接丢弃。

触发条件:输入同时包含多个前导收件人与正文内联 @,例如 # @m1 @m2 ship @m3 docs。此时 recipients=["m1","m2"]final_body="ship @m3 docs"first_body="ship" 非空,函数返回 [("m1","ship"), ("m3","docs")],于是 m2 被静默丢弃,@m3 反而成为新收件人。

失败模式:用户点名 @m2 却收不到任何消息(静默消息丢失),且 @m3 被错误路由。这是一次行为回归——改动前该输入会向 m1、m2 各发一份 body="ship @m3 docs"。修复:内联拆分只在恰好一个前导收件人时有意义,len(recipients) != 1 时应返回 None,回退到旧的 multicast fan-out 路径。

建议:把空列表 guard 改为「恰好一个前导收件人」guard,使多前导收件人 + 内联 @ 的混合输入回退到 multicast fan-out,避免丢收件人。

Suggested change
return None
if len(recipients) != 1:
return None

@openjiuwen-collaboration-bot

Copy link
Copy Markdown

head_sha: a8b8d0cfbd25173f17587b5ae67a19a58adb8afc

任务名称 结果 日志操作
静态检查 ✅SUCCESS 点此跳转
禁用词扫描 N/A N/A
防投毒检查 ✅SUCCESS 点此跳转
开源合规检查 ✅SUCCESS 点此跳转
UT测试 ✅SUCCESS 点此跳转
ST测试 N/A N/A
build 编译包 N/A N/A
ruff codecheck ✅SUCCESS N/A

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants