9.6 KiB
AgentBus 用户回复契约
本契约只约束执行完成后发给 AgentBus 用户的业务回执,不改变 Agent/Skill 的解析 JSON 契约。
组长任务摘要不再走 AgentBus
组长任务摘要已经从 AgentBus 主动帧迁移到独立的外部 Webhook,具体契约见 leader-summary-webhook-contract.md。AgentBus 只继续处理员工自己的入站任务、受理回复、最终结果和业务附件;组长摘要不再依赖组长 AgentBus 账号、渠道、from、conversation_id 或 WebSocket 在线状态,也不参与员工回复队列。
历史 task.summary 仍作为保留入站事件拒绝创建任务,以防旧桥接器回显或重放旧主动帧。迁移后的控制面不会再生成这种帧。
归属和执行路由
每个 AgentBus 渠道必须一对一绑定一个有效的普通用户或组长平台账号;管理员负责配置和查看,但不能成为员工渠道的归属账号,也不能代替归属账号确认或领取 ERP 执行。渠道只有在归属账号已配置唯一 ERP 账号后才能启用 listener。AgentBus 入站任务在创建时同时固化渠道与 assigned_user_id,使用归属账号当时有效的业务类型白名单;不得在领取时按当前在线浏览器、用户名、管理员身份或任意空闲云电脑重新推断归属。
员工云电脑必须同时登录该员工的平台账号和平台绑定的 ERP 账号并打开扩展。同一平台账号在 90 秒心跳新鲜期内只允许一个执行 worker;扩展只回传期望 ERP 账号是否匹配,控制面不接收页面中的其他账号文本。领取任务和提交结果都会重新校验任务归属、worker 连接与 ERP 身份。任一项缺失、过期、冲突或不匹配都失败关闭,不把任务转交给管理员或其他在线员工。
旧未绑定渠道默认停用,历史上无法可靠推断归属的 AgentBus 任务保持未分配且不得自动执行。渠道删除后,历史任务保留原 assigned_user_id,该渠道尚未投递的回执随渠道删除且不得改投其他渠道。
用户侧消息
用户侧只收到必要的阶段消息:
- 普通任务受理通知:
已受理,正在处理。 - 名单附件阶段通知:首次文字指令进入等待时,直接提示需要
.xls/.xlsx名单附件;附件到达后提示名单附件已收到,正在校验并处理。,不再重复普通受理文案。 - 最终返回通知:成功返回业务回执;失败返回 ERP 业务反馈或简短错误摘要。同一任务的同一次最终结果只发送一次。
解析完成、进入全自动化 ERP 执行、页面打开、提交中、写后回查等状态只进入平台生命周期和审计,不发送为用户进度。
名单入站附件
两项名单业务固定走 Program Parser。首次文字指令到达但没有名单文件时,任务进入 awaiting_attachment,并返回一条要求发送 .xls/.xlsx 的重要消息;该状态不是最终失败,也不会触发 ERP。后续可以在同一 conversation_id,或明确携带 payload.task_id,发送一个附件而不带正文。
首次等待附件的入站消息只拥有等待提示,不拥有后续 ERP 最终回执。通过校验并触发解析的附件消息才是该次任务最终回执的归属消息;若历史或重放场景存在多条可归属消息,耐久回执只选择最新一条。因此“文字指令 + 附件”不会在任务完成后各返回一次相同成功信息。
名单入站 payload.attachments 最多一个,使用 name、content_type、size、可选 sha256 和不含凭据的 HTTPS url。当前服务运行在受信内网,控制面允许该 URL 直接使用内网域名、私网 IPv4/IPv6 或 localhost;仍拒绝 HTTP、URL 用户名密码、无法解析的地址、超过大小限制、大小或 SHA-256 不一致以及超过两次的重定向。每次 DNS 解析后固定到选定地址发起 HTTPS 请求,重定向目标重新执行同一 URL 与 DNS 流程。附件 URL 和原始字节不写入任务 JSONB 或日志;允许内网目标意味着 AgentBus 渠道及其上游桥接器必须是受信输入源。
微信传输信封的 Conversation: 在帧未显式提供 conversation_id 时作为会话键,显式字段优先。[WeChat attachment: 文件名] 只是桥接器的文字占位符:没有同时提供 payload.attachments[] 时,控制面不得把它作为新业务消息创建任务,也不得假装已收到文件;应保留原任务的 awaiting_attachment 状态并提示附件内容尚未传到平台。附件元数据或安全下载校验失败时只返回预定义的安全摘要,不回显 URL、文件内容或名单值。
服务端诊断以 diagnostic_event=agentbus.<agentbus_event> 串联 frame、conversation、channel、任务和最终回执。附件入口必须分别记录元数据、DNS、解析地址数量/IP family、HTTPS 状态、重定向、字节校验、结果和耗时,但不能记录 URL、hostname、IP、文件名、文件内容或名单值。异常使用错误码、稳定指纹和清理后的代码栈定位;生产环境不得启用正文 payload 日志。
附件通过程序模板校验后,任务从 awaiting_attachment 转为 parse_queued;校验失败则保留等待状态并只返回安全错误码和行列位置,不回显名单值。原始工作簿不持久化,只暂存加密 canonical TSV 供 Program Parser 使用。
失败
按以下顺序选择最终文本:
- ERP 明确返回业务规则提示时,返回 ERP 提示原文,例如
此团还有【应收团款】账,不能取消!。 - 没有 ERP 业务提示时,返回一条简短错误摘要。
- ERP 写入结果不确定时,不称为成功,也不伪装成普通业务失败;返回“ERP 写入结果暂不确定,请人工回查后再处理。”。
错误码、插件 blocker、HTTP 状态、请求哈希、隐藏 ID、执行阶段和回查证据不进入 AgentBus 用户文本。
成功回执矩阵
| action | 用户回执 | 必须包含 |
|---|---|---|
team_order_create |
新订单成功 | 团号 |
team_order_batch_create |
批量下单成功 | 全部团号,不只第一条 |
shared_plan_create |
散拼计划创建成功 | 全部母团团号 |
shared_child_order_create |
新子单成功 | 子单号;有母团号时可同时返回母团号 |
arrangement_guide |
导游安排成功/清除成功 | 团号、导游或清除结果 |
arrangement_vehicle |
用车安排成功/清除成功 | 团号、用车日期、数量、车辆/项目 |
arrangement_hotel |
客户酒店模板或清除成功 | 团号、入住/退房、晚数、房型/房数 |
arrangement_transport |
大交通安排成功/清除成功 | 团号、交通日期、数量、项目 |
arrangement_other |
其他/备案安排成功/清除成功 | 团号、业务日期、项目/数量(有值才返回) |
order_update_* |
信息修改成功 | 团号/子单号、已更新业务字段和值 |
passenger_list_import |
名单导入成功 | 团号/子单号、导入行数(可取得时) |
order_cancel |
订单已取消 | 团号/子单号;母团级联时说明子单状态同步 |
order_restore |
订单已恢复 | 团号/子单号、目标状态(可取得时) |
confirmation_export |
团队文件已准备 | 团号/子单号;独立团/子单游客名单或散拼母团整团游客信息的真实 .xlsx(原始 ERP .xls 只保留在平台归档);其他类型 PDF(转换失败时使用对应源文件);附件通过受控元数据交付 |
成功回执中的字段必须来自已验证的 ERP 回执或写后回查;不能使用“已提交并完成回查”这种技术过程作为业务正文。
酒店安排客户模板
酒店新增成功且执行结果包含完整酒店字段时,使用以下格式。变量全部由真实回查结果填充;英文和中文日期使用同一组实际日期。
①NEW BOOKING
GROUP CODE: {group_code}
IN. {in_date_dd_mm_yyyy}
OUT {out_date_dd_mm_yyyy}
{nights}Night(s). {room_count}{room_type_en}
②新订单
团号:{group_code}{customer_suffix}
入住日期:{in_date_yyyy_mm_dd_with_dots}
退房日期:{out_date_yyyy_mm_dd_with_dots}
几 晚:{nights}晚
房型/房数:{room_type_zh} {room_count}间
其中 customer_suffix 在有客户名称时才追加。若酒店变更或回查缺少模板所需字段,使用简洁的“酒店安排已更新/已完成”业务回执,不输出空占位符。
文件交付
最终回执可携带 payload.attachments 附件元数据:name、content_type、size、inline: false、HTTPS url,以及可选的 id、sha256。微信渠道适配器会按数组顺序下载 URL 并发送文件;URL 必须能被适配器的 HTTPS 域名白名单访问。
AgentBus 回执不发送原始文件字节或 content_base64,也不发送后台鉴权下载地址。确认单必须使用 OSS 存储并生成可供渠道适配器访问的 HTTPS URL;数据库存储或 HTTP/后台登录 URL 的附件只保留在平台任务详情中,不投递到外部渠道。原始文件字节、base64、SHA-256、ERP URL、artifact ID 和执行状态不能进入用户文本;文件正文不写入任务 JSONB 或日志,耐久 outbox 只保存附件引用。
visitor-list 在平台任务中同时保留源归档 .xls 与移动端交付 .xlsx;其中源归档明确标记为不可投递,AgentBus/微信回执只允许携带真实 .xlsx。独立团/散拼子单游客名单来自 did+tid,散拼母团整团游客信息来自 tid-only,两种范围必须在 existing_refs.kind 中明确。若 .xlsx 生成失败,任务阻断且不把原始 .xls 发送给外部渠道。