276 lines
7.3 KiB
Markdown
276 lines
7.3 KiB
Markdown
# 0718 业务基线:Agent 回调结构说明
|
||
|
||
> 以下是 0718 确认的目标业务契约,不代表旧 Agent 和当前 0711 P0 接口已经完成改造。
|
||
|
||
## 1. 最终回调是否仍为 `source_message + message_events[]`?
|
||
|
||
是。
|
||
|
||
一封当前邮件对应一个结果包:
|
||
|
||
```json
|
||
{
|
||
"source_message": {},
|
||
"message_events": []
|
||
}
|
||
```
|
||
|
||
规则:
|
||
|
||
- `source_message` 在包级只出现一次。
|
||
- `message_events[]` 可以包含同一订单的多个事件,也可以包含不同订单的事件。
|
||
- 信息系统根据每个事件的 `target_order` 聚合同订单、拆分不同订单。
|
||
- `message_events` 是当前工作字段名,最终需要与 Adapter、MCP Schema 和信息系统入站 DTO 统一冻结。
|
||
|
||
## 2. 每个 Event 是否有稳定的订单标识?
|
||
|
||
每个具体业务 Event 都必须有稳定的 `target_order`。
|
||
|
||
不再使用旧的 `case_keys`。
|
||
|
||
```json
|
||
{
|
||
"target_order": {
|
||
"booking_type": "GROUP",
|
||
"locator_type": "GROUP_CODE",
|
||
"locator_value": "LLTQ260510QVIPA"
|
||
}
|
||
}
|
||
```
|
||
|
||
合法定位组合:
|
||
|
||
| 场景 | `booking_type` | `locator_type` | `locator_value` |
|
||
|---|---|---|---|
|
||
| Group 的所有业务 | `GROUP` | `GROUP_CODE` | Group Code,即 Block Name |
|
||
| Fit New Booking | `FIT` | `BOOKING_CODE` | Booking Code |
|
||
| 已创建 Fit 的 Update / Cancel / Trace / Payment | `FIT` | `CONFIRMATION_NUMBER` | Confirmation Number |
|
||
|
||
如果 Agent 已识别出具体业务,但定位参数缺失或无法确定:
|
||
|
||
- 未解决的定位字段为 `null`;
|
||
- 该 Event 输出 `manual_review: true`;
|
||
- 不输出候选订单数组、`case_keys` 或复杂缺失原因。
|
||
|
||
S10 纯通知是例外,不需要 `target_order`。
|
||
|
||
## 3. Trace、Payment、Rooming List 是独立 Event 还是 Booking Event 的子结构?
|
||
|
||
都是独立 Event,与 Booking Event 平级放在 `message_events[]` 中。
|
||
|
||
```json
|
||
{
|
||
"message_events": [
|
||
{
|
||
"event_type": "UPDATE_BOOKING",
|
||
"target_order": {}
|
||
},
|
||
{
|
||
"event_type": "TRACE_RESERVATION_NOTES",
|
||
"target_order": {}
|
||
},
|
||
{
|
||
"event_type": "PAYMENT",
|
||
"target_order": {}
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
它们不是 `NEW_BOOKING` 或 `UPDATE_BOOKING` 下的子结构。
|
||
|
||
信息系统通过相同的 `target_order` 判断这些 Event 属于同一订单,并生成同一订单下的多张独立任务卡。每张卡有自己的状态和“确认”按钮,互不阻塞。
|
||
|
||
业务限制:
|
||
|
||
- Trace 可以与 New 或 Update 同时出现,Cancel 不带 Trace。
|
||
- Rooming List 只适用于 Group。
|
||
- Payment 只适用于已有订单,即 Update 场景。
|
||
|
||
## 4. 同一封邮件、同一订单的多个 Event,Agent 是否保证使用同一订单标识?
|
||
|
||
是,这是 Agent 输出契约的强制要求。
|
||
|
||
同一订单的所有 Event 必须输出完全一致的:
|
||
|
||
```text
|
||
booking_type + locator_type + locator_value
|
||
```
|
||
|
||
例如同一 Group 订单的 Update、Trace 和 Payment 都必须使用同一个 Group Code:
|
||
|
||
```json
|
||
{
|
||
"booking_type": "GROUP",
|
||
"locator_type": "GROUP_CODE",
|
||
"locator_value": "LLTQ260510QVIPA"
|
||
}
|
||
```
|
||
|
||
不需要额外增加父子关系、Event 关联索引或 `same_order_id`。
|
||
|
||
如果 Agent 无法获得稳定订单标识,应保留对应 Event,并设置 `manual_review: true`,不能自行猜测订单。
|
||
|
||
## 5. 纯通知如何返回?
|
||
|
||
纯通知统一使用 `S10`,不再使用 S99、Fallback 或 `Need Manual Review`。
|
||
|
||
业务语义为:
|
||
|
||
```json
|
||
{
|
||
"route_code": "S10",
|
||
"source_message": {},
|
||
"message_events": []
|
||
}
|
||
```
|
||
|
||
其中 `route_code` 是当前建议字段名,最终需要与 Adapter/MCP Schema 冻结。
|
||
|
||
S10 规则:
|
||
|
||
- 只返回 S10 类型标识和完整 `source_message`。
|
||
- 不返回 Basic Information、房间信息或其他业务 Event。
|
||
- 不需要 `target_order`、Account 或业务参数。
|
||
- 不进入人工复核,语义上 `manual_review=null`。
|
||
- 前端只显示“邮件展示”卡。
|
||
- 用户查看后点击“确认”,任务完成。
|
||
- 纯通知任务不存在“人工终止”。
|
||
|
||
## 6. Agent 技术异常如何返回?
|
||
|
||
Agent 技术异常不应转换成 S10、人工复核或任何业务 Event。
|
||
|
||
需要区分两种情况:
|
||
|
||
### 业务参数不完整
|
||
|
||
Agent 已经识别出具体业务类型,只是参数缺失或无法确定:
|
||
|
||
```json
|
||
{
|
||
"event_type": "UPDATE_BOOKING",
|
||
"manual_review": true
|
||
}
|
||
```
|
||
|
||
这种情况正常回调信息系统并生成对应业务卡。
|
||
|
||
### 技术异常
|
||
|
||
例如:
|
||
|
||
- Agent 输出不是合法 JSON;
|
||
- 输出不符合 Schema;
|
||
- Adapter 转换失败;
|
||
- MCP 提交失败;
|
||
- Agent 或 Skill 执行异常。
|
||
|
||
这类情况不生成用户业务任务,也不回调一份伪装成正常业务结果的 Payload。
|
||
|
||
如果系统需要记录,应走独立的技术失败状态、日志或告警通道,不进入 `message_events[]`,前端不展示预订任务卡。
|
||
|
||
## 7. 附件字段以及 Payment 如何关联凭证?
|
||
|
||
附件统一放在包级:
|
||
|
||
```json
|
||
{
|
||
"source_message": {
|
||
"attachments": [
|
||
{
|
||
"id": "att-1",
|
||
"name": "payment-slip.jpg",
|
||
"content_type": "image/jpeg",
|
||
"url": "https://upstream-storage/...",
|
||
"size": 251524
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
附件字段:
|
||
|
||
| 字段 | 是否必需 | 说明 |
|
||
|---|---|---|
|
||
| `id` | 是 | 包内稳定附件引用 |
|
||
| `name` | 是 | 原始文件名 |
|
||
| `content_type` | 是 | MIME 类型 |
|
||
| `url` | 是 | 上游邮件监听或文件存储层提供 |
|
||
| `size` | 否 | 上游有值时原样传递 |
|
||
|
||
Agent 只转发附件 URL,不负责生成、拼接或刷新 URL。
|
||
|
||
Payment Event 使用附件 ID 指向具体凭证:
|
||
|
||
```json
|
||
{
|
||
"event_type": "PAYMENT",
|
||
"target_order": {},
|
||
"account_code": "ACCOUNT_CODE",
|
||
"attachment_ids": ["att-1", "att-2"],
|
||
"manual_review": null
|
||
}
|
||
```
|
||
|
||
规则:
|
||
|
||
- 多张付款凭证放在一个 Payment Event 中。
|
||
- 凭证之间没有业务顺序。
|
||
- Payment Event 不重复传文件名、URL或完整附件对象。
|
||
- `attachment_ids` 是当前建议字段名,最终联调时需要与 Adapter/MCP Schema 冻结。
|
||
|
||
## 8. Basic Information 的 Account、Market、Source 由谁提供?
|
||
|
||
职责划分如下:
|
||
|
||
- Agent 只输出 `account_code`。
|
||
- Agent 可以根据邮件发件人识别 Account。
|
||
- Market 和 Source 不由 Agent 输出。
|
||
- 信息系统根据 Account 目录自动带出 Market 和 Source。
|
||
|
||
```json
|
||
{
|
||
"account_code": "ACCOUNT_CODE"
|
||
}
|
||
```
|
||
|
||
如果 Agent 无法可靠确定 Account:
|
||
|
||
```json
|
||
{
|
||
"account_code": null,
|
||
"manual_review": true
|
||
}
|
||
```
|
||
|
||
前端规则:
|
||
|
||
- Account、Market、Source 都是信息系统已有目录中的受控选项。
|
||
- 不允许自由文本输入,也不存在 Manual 选项。
|
||
- 用户可以通过选择器修改 Account。
|
||
- Account 改变后,信息系统自动带出对应的 Market 和 Source。
|
||
- Market 和 Source 仍允许用户从信息系统已有值中改选。
|
||
- Agent 不需要输出选项列表或 Account、Market、Source 的联动规则。
|
||
|
||
## 开发结论
|
||
|
||
前端可以按照以下关系建模:
|
||
|
||
```text
|
||
source_message
|
||
└── 提供邮件展示及附件资源
|
||
|
||
message_events[]
|
||
├── 每个具体业务 Event 都有 target_order
|
||
├── 同一 target_order 聚合到同一订单
|
||
├── 每个 Event 对应一张独立任务卡
|
||
└── 每张任务卡独立确认和维护状态
|
||
|
||
S10
|
||
└── 只显示邮件展示卡
|
||
```
|
||
|
||
需要注意:`message_events`、S10 discriminator 和 `attachment_ids` 是当前建议字段名,正式联调前需要由 Agent、Adapter、MCP Schema 和信息系统入站接口统一冻结。
|