实现SuperAgent特殊入口结果处理

This commit is contained in:
andy
2026-07-10 12:05:57 +08:00
parent 9de4f0e7b6
commit 74e429a2cb
29 changed files with 1121 additions and 97 deletions

View File

@@ -4,8 +4,8 @@
| 项目 | 内容 |
| --- | --- |
| 文档版本 | 0.2 |
| 日期 | 2026-07-07 |
| 文档版本 | 0.3 |
| 日期 | 2026-07-10 |
| 状态 | 第二版需求与后端阶段实现记录 |
| 适用范围 | SourceMessage 之后的 AI 过渡层、订单挂靠、任务卡、人工确认、OPERA 模拟操作主流程 |
| 主要读者 | 产品、后端、前端、测试、后续协作 agent |
@@ -14,17 +14,18 @@
本文是 `M002-order-task-workflow-v1.md` 的第二版修正,目标是把本项目已经讨论确认的订单任务主流程,与 2026-07-06 导入的 AI 任务卡契约对齐。
本文定义业务边界、数据语义和后续实现约束。当前后端已经按拆分 checkpoint 实现了 AI 结果接收、订单任务基础流转、任务草稿保存、最终确认、审计列表、OPERA 模拟骨架、SuperAgent 查询上下文接口 1、2 的最小字段版,以及前端 P0 任务列表 / 订单详情查询接口;前端页面、真实 OPERA、普通任务切换订单、查询接口 3 和查询接口 4 仍未实现。
本文定义业务边界、数据语义和后续实现约束。当前后端已经按拆分 checkpoint 实现了 AI 结果接收、S000/S999 特殊入口结果、订单任务基础流转、任务草稿保存、最终确认、审计列表、OPERA 模拟骨架、SuperAgent 查询上下文接口 1、2 的最小字段版,以及前端 P0 任务列表 / 订单详情查询接口;前端页面、真实 OPERA、普通任务切换订单、查询接口 3 和查询接口 4 仍未实现。
## 2. 本版核心修正
相对 V1本版有以下修正
- 增加 `AI 过渡层`:系统必须先保存 AI 原始输出,再生成订单、任务和任务卡。
- 不再使用 `EXCEPTION` 作为底层结果类型,AI 第一版结果类型统一以 `normal_task``manual_review``informational_message` 为准
- 系统主任务类型收敛为 `NEW_BOOKING``UPDATE_BOOKING``CANCEL_BOOKING``MANUAL_REVIEW`,另保留 `INFORMATIONAL_MESSAGE` 作为不参与执行队列的只读提醒任务
- 不再使用 `EXCEPTION` 作为底层结果类型,SuperAgent 结构化 JSON 新入口只使用 `normal_task``manual_review``informational_message` 仅保留历史兼容
- 新增 SuperAgent 纯文本入口结果 `S000,source_message_id``S999,source_message_id`:两者都生成只读 `SOURCE_MESSAGE_ONLY` 特殊任务,任务列表可见,订单列表不可见
- 系统主任务类型收敛为 `NEW_BOOKING``UPDATE_BOOKING``CANCEL_BOOKING``MANUAL_REVIEW`,另保留历史 `INFORMATIONAL_MESSAGE`,并新增 `SOURCE_MESSAGE_ONLY` 用于 S000/S999 特殊入口结果。
-`New Booking``Cancel Booking``Fallback/manual_review` 外,其他业务处理类卡片原则上都归到 `UPDATE_BOOKING` 下的不同任务卡。
- `Message Notification` 也挂到临时订单下面,便于归档和详情查看,但不参与订单任务执行队列,不阻塞其他任务,也不被其他任务阻塞
- `Message Notification` / `INFORMATIONAL_MESSAGE` 只作为历史兼容路径;新数据中的纯信息类邮件由 `S000` 表达
- 任务卡后端完整规则以 `任务卡展示编辑矩阵.xlsx` 为权威来源,不在代码里随意扩展或重命名字段路径。
- 前端展示 / 编辑白名单以最新导入的 `任务卡前端展示字段表 3.0.xlsx` 为准;该文件只约束前端展示和可编辑范围,不替代后端完整校验、确认写入和 OPERA 映射规则。
- 系统必须同时保存 AI 原始 `task_type`、系统主任务类型、任务卡类型和业务动作 subtype。
@@ -69,16 +70,27 @@ AgentBus / 未来其他入口
→ 系统保存每条模拟操作结果、失败原因和重试记录
```
特殊分支:
```text
SuperAgent 返回 S000,source_message_id 或 S999,source_message_id
→ 本系统按默认酒店 + external_message_id 反查 SourceMessage Inbox
→ 创建隐藏技术订单 + SOURCE_MESSAGE_ONLY 只读任务
→ 任务列表可见,订单列表不可见
→ 不允许编辑、确认、转换、OPERA 模拟或重试
```
中文说明:
- `SourceMessage Inbox` 是来源事实层,不表达订单、任务或业务结论。
- AI 只输出 JSON不直接写数据库、不直接创建真实任务卡、不直接写 OPERA。
- 本系统负责保存 AI 原始 JSON、创建任务卡、接收用户修改、生成确认后的 payload、执行 OPERA 模拟并记录结果。
- SuperAgent 不直连本系统数据库,只能通过本系统后端接口查询已有订单和任务上下文。
- S000/S999 不是业务任务,也不是人工复核任务,只是来源邮件入口处理结论。
## 5. AI 输出接收边界
导入文档已经定义了 SuperAgent / Main Agent 应输出的核心业务结构,但还没有定义完整 HTTP 接口契约
导入文档已经定义了 SuperAgent / Main Agent 应输出的核心业务结构。当前正式 HTTP 接口同时支持结构化 JSON 和 S000/S999 纯文本入口结果
AI 聚合输出的顶层结构应包含:
@@ -88,14 +100,14 @@ AI 聚合输出的顶层结构应包含:
| `ai_task_results[]` | AI 拆分出的一个或多个任务结果,顺序必须保留 |
| `extraction_warnings[]` | 抽取警告,不直接等同于业务任务 |
`ai_task_results[]` 中关键字段包括:
结构化 JSON 的 `ai_task_results[]` 中关键字段包括:
| 字段 | 中文说明 |
| --- | --- |
| `source_event_index` | AI 拆分出的 current 事件序号,同一次来源消息内用于排序 |
| `catalog_code` | Skill 目录代码,例如 S01、S02 |
| `skill_id` | 具体 Skill 标识 |
| `result_type` | AI 结果类型,第一版只使用 `normal_task``manual_review``informational_message` |
| `result_type` | AI 结果类型,新入口只使用 `normal_task``manual_review``informational_message` 仅历史兼容 |
| `task_type` | AI 原始任务类型,例如 `New Booking``Voucher Received` |
| `task_subtype` / 业务动作 | 更细的业务动作,用于任务卡字段路由 |
| `current_or_history` | 当前事件还是历史证据 |
@@ -106,12 +118,27 @@ AI 聚合输出的顶层结构应包含:
| `context_used` | AI 使用的上下文摘要 |
| `extracted_fields` | 业务字段主体 |
| `manual_review` | 人工复核结构化原因和证据 |
| `informational_message` | 信息提醒内容 |
| `informational_message` | 信息提醒内容,仅历史兼容 |
| `additional_operations` | AI 建议的附加动作 |
| `idempotency_key` | 幂等键,最终来源和生成规则待确认 |
HTTP 契约已在 `docs/project/requirements/M002-superagent-task-result-api-contract.md``docs/project/integrations/superagent-api-contract.md` 中补充。正式契约要求任务结果通知携带 `hotel_id + source_message_id`,其中 `source_message_id` 是外部来源消息 ID后端会反查内部 SourceMessage Inbox ID 后再写入 `workflow_*` 表。
纯文本入口结果格式:
```text
S000,source_message_id
S999,source_message_id
```
中文说明:
- `S000` 表示纯信息类邮件,不形成业务素材包。
- `S999` 表示入口阶段无法形成业务素材包。
- `source_message_id` 是外部来源消息 ID对应 AgentBus `source.external_message_id`
- 第一版使用系统默认酒店反查 SourceMessage Inbox。
- 命中 SourceMessage 后创建 `SOURCE_MESSAGE_ONLY` 只读任务,并挂到 `order_visibility=HIDDEN_SYSTEM` 的技术订单下。
## 6. AI 过渡层数据要求
系统接收 AI 输出后,应先写入 AI 过渡层,再创建任务卡。过渡层用于追溯、幂等、筛选、人工确认和 OPERA 参数组装。
@@ -124,7 +151,7 @@ HTTP 契约已在 `docs/project/requirements/M002-superagent-task-result-api-con
| `case_keys_json` | AI 给出的订单关联候选键 |
| `extracted_fields_json` | AI 抽取的业务字段 |
| `manual_review_json` | 人工复核信息 |
| `informational_message_json` | 信息提醒内容 |
| `informational_message_json` | 信息提醒内容,仅历史兼容 |
| `attachments_json` | 附件和文件引用 |
| `context_used_json` | AI 使用的上下文 |
| `confirmed_payload_json` | 用户修改并确认后的最终参数 |
@@ -137,9 +164,9 @@ HTTP 契约已在 `docs/project/requirements/M002-superagent-task-result-api-con
| `source_event_index` | AI 事件序号 |
| `catalog_code` | Skill 目录代码 |
| `skill_id` | Skill 标识 |
| `result_type` | AI 结果类型 |
| `result_type` | AI 结果类型S000/S999 内部保存为 `source_message_only` |
| `ai_task_type` | AI 原始任务类型 |
| `system_task_type` | 系统主任务类型 |
| `system_task_type` | 系统主任务类型S000/S999 为 `SOURCE_MESSAGE_ONLY` |
| `task_card_type` | 任务卡类型 |
| `task_subtype` | 业务动作 subtype |
| `current_or_history` | 当前或历史标识 |
@@ -159,15 +186,17 @@ HTTP 契约已在 `docs/project/requirements/M002-superagent-task-result-api-con
### 7.1 AI 结果类型
AI 第一版结果类型只接受:
AI 新入口结构化 JSON 结果类型只接受:
| `result_type` | 中文说明 | 是否可直接 OPERA 模拟 |
| --- | --- | --- |
| `normal_task` | 可生成业务任务卡的正常任务 | 需用户确认后才允许 |
| `manual_review` | 需要人工复核的结构化任务 | 不允许直接写 OPERA |
| `informational_message` | 只读信息提醒 | 不允许写 OPERA |
| `informational_message` | 只读信息提醒,仅历史兼容 | 不允许写 OPERA |
不使用 `exception_task``no_action`。原来讨论中的异常任务,在本版统一落为 `manual_review`;没有业务动作的信息提醒,统一落为 `informational_message`
不使用 `exception_task``no_action`。原来讨论中的异常任务,在本版统一落为 `manual_review`;没有业务动作的信息类邮件,新入口不再生成 `informational_message` JSON而是返回 `S000,source_message_id`
S000/S999 不属于结构化 `result_type`,它们是纯文本入口结果,系统内部保存为 `source_message_only` 过渡记录和 `SOURCE_MESSAGE_ONLY` 只读任务。
### 7.2 系统主任务类型
@@ -179,7 +208,8 @@ AI 第一版结果类型只接受:
| `UPDATE_BOOKING` | 更新订单任务,下面承载多个不同任务卡 |
| `CANCEL_BOOKING` | 取消订单任务 |
| `MANUAL_REVIEW` | 人工复核或 Fallback 任务 |
| `INFORMATIONAL_MESSAGE` | 信息提醒任务,只归档展示,不参与执行队列 |
| `INFORMATIONAL_MESSAGE` | 信息提醒任务,只归档展示,不参与执行队列,仅历史兼容 |
| `SOURCE_MESSAGE_ONLY` | S000/S999 来源消息入口结果任务,只读展示,不参与执行队列 |
### 7.3 AI 任务类型到系统任务和卡片的映射
@@ -193,16 +223,38 @@ AI 第一版结果类型只接受:
| `Trace / Reservation Notes` | `UPDATE_BOOKING` | `TRACE_RESERVATION_NOTES` | Trace 或备注卡,可作为联动任务 |
| `TA Recorder` | `UPDATE_BOOKING` | `TA_RECORDER` | TA Recorder 维护卡,通常由 Rooming List 派生 |
| `Cancel Booking` | `CANCEL_BOOKING` | `CANCEL_BOOKING` | 取消 FIT、Group Block、Allotment / Control Block |
| `Message Notification` | `INFORMATIONAL_MESSAGE` | `MESSAGE_NOTIFICATION` | 挂临时订单,只读展示,不参与执行队列 |
| `Message Notification` | `INFORMATIONAL_MESSAGE` | `MESSAGE_NOTIFICATION` | 历史兼容路径;新纯信息类邮件改用 S000 |
| `Fallback` | `MANUAL_REVIEW` | `FALLBACK_REVIEW` | 人工复核任务 |
| `S000` 文本结果 | `SOURCE_MESSAGE_ONLY` | `SOURCE_MESSAGE_ONLY` | 纯信息类邮件,任务列表可见,订单列表不可见 |
| `S999` 文本结果 | `SOURCE_MESSAGE_ONLY` | `SOURCE_MESSAGE_ONLY` | 无法形成业务素材包,任务列表可见,订单列表不可见 |
系统不得丢弃 AI 原始 `task_type`。任务落库时应同时保存 AI 原始任务类型、系统主任务类型、任务卡类型和业务动作 subtype。
## 8. Message Notification 处理规则
## 8. S000/S999 和历史 Message Notification 处理规则
### 8.1 S000/S999 处理规则
`S000` / `S999` 是 SuperAgent 入口阶段返回的纯文本结果,不是结构化任务 JSON。
本系统处理规则:
- `S000` 表示纯信息类邮件。
- `S999` 表示无法形成业务素材包。
- 两者都按外部 `source_message_id` 反查 SourceMessage Inbox。
- 第一版使用系统默认酒店,不要求请求体携带 `hotel_id`
- 创建 `SOURCE_MESSAGE_ONLY` 只读任务,`task_subtype` 分别为 `S000``S999`
- 创建 `order_visibility=HIDDEN_SYSTEM` 的技术订单,仅用于满足任务归属,不进入订单列表和订单详情。
- 任务状态为 `COMPLETED``queue_participation=false`
- 任务列表可见;订单列表不可见。
- 任务详情可查看来源邮件、会话、附件和 SuperAgent 原始返回。
- 不允许保存草稿、最终确认、人工转换、普通切换订单、执行 OPERA 模拟或重试 OPERA。
- 不阻塞任何订单任务,也不被任何订单任务阻塞。
### 8.2 历史 Message Notification 处理规则
`Message Notification` 用于感谢、知会、已收到、转发说明、信息同步等没有明确业务执行动作的消息。
本系统处理规则:
该路径仅为历史兼容,新数据应由 SuperAgent 返回 `S000,source_message_id`。历史数据处理规则:
- 创建临时订单作为归档容器。
- 创建只读信息提醒任务卡。