ForcePilot/backend/package/yuxi/channels/contract/dtos/stream_event.py

43 lines
1.3 KiB
Python
Raw Normal View History

"""流式事件 DTO。
定义 ``AgentRunPort.streamAgentRun`` 返回的流式事件类型替代原
``AsyncIterator[Any]`` 的弱类型签名CON-019
"""
from __future__ import annotations
from dataclasses import dataclass
from typing import Any
from yuxi.channels.contract.errors import ValidationError
@dataclass(frozen=True)
class StreamEvent:
"""Agent 运行流式事件。
封装从 Redis Stream 读取的事件供下游 SSE 渲染或事件重放使用
字段
event_type: 事件类型 ``messages`` / ``tool_call``
payload: 事件负载字典结构由事件类型决定
seq: Redis Stream 消息 ID用于分页与去重
关联约束CON-019端口返回类型不得使用 ``Any``
"""
event_type: str
payload: dict[str, Any]
seq: str
def __post_init__(self) -> None:
"""校验 event_type 与 seq 非空。
``event_type`` ``seq`` 必须非空在构造时即抛出 ``ValidationError``
避免空事件类型或空序列号导致事件渲染与去重失效INV-8 / CON-019
"""
if not self.event_type:
raise ValidationError("event_type", "must not be empty")
if not self.seq:
raise ValidationError("seq", "must not be empty")