main: 引入 AgentProvider 流式事件与 OpenAI 兼容适配
- 增加流式事件流支持,Provider 输出 `message.delta` 等事件 - 实现 OpenAI 兼容适配器,包括 RequestBuilder、ApiClient 等模块 - 更新 Agent Run 逻辑,支持流式增量写入与模型完成状态管理 - 扩展配置项 `agent.openai.*`,支持模型、密钥等配置 - 优化文档,完善流式事件与消息类型说明 - 增加单元测试,覆盖 Provider 和 OpenAI 适配相关逻辑 - 更新环境变量与配置示例,支持新功能
This commit is contained in:
@@ -9,13 +9,15 @@
|
||||
- 2025-02-14:MVP-1.1 增加会话列表、会话更新(重命名/状态变更),列表附带最后一条消息摘要。
|
||||
- 2025-02-15:Agent Run MVP-0 —— RunDispatcher + AgentRunJob + DummyProvider;自动在 user.prompt 后触发一次 Run,落地 run.status / agent.message。
|
||||
- 2025-12-18:Agent Run 可靠性增强 —— 并发幂等、终态去重、取消语义加强、Provider 超时/重试/错误归一,SSE gap 回补与心跳。
|
||||
- 2025-12-19:AgentProvider Streaming 接入 —— ProviderEvent 统一事件流,新增 message.delta 输出与 OpenAI-compatible 适配器。
|
||||
|
||||
## 本次变更摘要(2025-12-18)
|
||||
## 本次变更摘要(2025-12-19)
|
||||
- RunDispatcher 并发幂等:同 trigger_message_id 只产生一个 RUNNING,且仅新建时 dispatch。
|
||||
- RunLoop/OutputSink 幂等:agent.message 与 run.status 采用 dedupe_key;重复执行不重复写。
|
||||
- Cancel 强化:多检查点取消,确保不落 agent.message 且落 CANCELED 终态。
|
||||
- Provider 可靠性:超时/重试/429/5xx,错误落库包含 retryable/http_status/provider/latency_ms。
|
||||
- SSE 可靠性:gap 触发回补,心跳保活,publish 异常不影响主流程。
|
||||
- Streaming:AgentProvider 以事件流产出 message.delta,RunLoop 汇总后写入 agent.message。
|
||||
|
||||
## 领域模型
|
||||
- `ChatSession`:`session_id`(UUID)、`session_name`、`status`(`OPEN`/`LOCKED`/`CLOSED`)、`last_seq`
|
||||
@@ -51,7 +53,7 @@
|
||||
| 字段 | 必填 | 类型 | 说明 |
|
||||
| --- | --- | --- | --- |
|
||||
| role | 是 | enum | `USER|AGENT|TOOL|SYSTEM` |
|
||||
| type | 是 | string(≤64) | 如 `user.prompt`/`agent.message` 等 |
|
||||
| type | 是 | string(≤64) | 如 `user.prompt`/`agent.message`/`message.delta` 等 |
|
||||
| content | 否 | string | 文本内容 |
|
||||
| payload | 否 | object | jsonb 结构 |
|
||||
| reply_to | 否 | uuid | 引用消息 |
|
||||
@@ -163,8 +165,8 @@
|
||||
- 终态检测:若已 DONE/FAILED/CANCELED 则直接返回。
|
||||
- Cancel 检查:存在 `run.cancel.request`(payload.run_id) 则写入 `run.status=CANCELED`,不产出 agent.message。
|
||||
- ContextBuilder:提取最近 20 条 USER/AGENT 消息(type in user.prompt/agent.message),seq 升序提供给 Provider。
|
||||
- Provider 返回一次性文本回复(内置超时/重试/退避)。
|
||||
- OutputSink 依次写入:`agent.message`(payload 含 run_id, provider,dedupe_key=`run:{run_id}:agent:message`)、`run.status=DONE`(dedupe_key=`run:{run_id}:status:DONE`)。
|
||||
- Provider 以 Streaming 事件流产出文本增量(message.delta)。
|
||||
- OutputSink 持续写入 `message.delta`,最终写入 `agent.message`(payload 含 run_id, provider,dedupe_key=`run:{run_id}:agent:message`)与 `run.status=DONE`(dedupe_key=`run:{run_id}:status:DONE`)。
|
||||
6. 异常:ProviderException 写入 `error` + `run.status=FAILED`(dedupe),error payload 包含 retryable/http_status/provider/latency_ms。
|
||||
|
||||
### Run 相关消息类型(落库即真相源)
|
||||
@@ -172,6 +174,7 @@
|
||||
| --- | --- | --- | --- |
|
||||
| run.status | SYSTEM | run_id, status(RUNNING/DONE/CANCELED/FAILED), trigger_message_id?, error? | Run 生命周期事件,CLOSED 状态下允许写入 |
|
||||
| agent.message | AGENT | run_id, provider | Provider 的一次性回复 |
|
||||
| message.delta | AGENT | run_id, delta_index | Provider 的增量输出(Streaming) |
|
||||
| run.cancel.request | USER/SYSTEM | run_id | CancelChecker 依据该事件判断是否中止 |
|
||||
| error | SYSTEM | run_id, message, retryable?, http_status?, provider?, latency_ms?, raw_message? | 任务异常时落库 |
|
||||
|
||||
|
||||
@@ -433,6 +433,7 @@ components:
|
||||
oneOf:
|
||||
- $ref: '#/components/schemas/RunStatusPayload'
|
||||
- $ref: '#/components/schemas/AgentMessagePayload'
|
||||
- $ref: '#/components/schemas/MessageDeltaPayload'
|
||||
- $ref: '#/components/schemas/RunCancelPayload'
|
||||
- $ref: '#/components/schemas/RunErrorPayload'
|
||||
- type: object
|
||||
@@ -506,6 +507,14 @@ components:
|
||||
format: uuid
|
||||
provider:
|
||||
type: string
|
||||
MessageDeltaPayload:
|
||||
type: object
|
||||
properties:
|
||||
run_id:
|
||||
type: string
|
||||
format: uuid
|
||||
delta_index:
|
||||
type: integer
|
||||
RunCancelPayload:
|
||||
type: object
|
||||
properties:
|
||||
|
||||
Reference in New Issue
Block a user