ForcePilot/backend/package/yuxi/channels/contract/dtos/outbound.py
Kris b88c0ae29e feat(channels): 批量新增多渠道网关限界上下文基础代码与契约
新增完整的 channels 限界上下文模块,包含契约层、领域核心层、应用服务、管道编排、插件体系、基础设施组合根等全层级代码,新增飞书与微信 iLink 渠道插件基础结构,补充各类 DTO、端口协议与领域服务实现。
2026-07-02 03:22:12 +08:00

265 lines
7.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""出站 DTO。
定义出站管道的富消息与最终输出值对象,包括富消息按钮、富消息选项、
富消息、富消息字段、出站负载、格式化消息、可信消息与最终消息。
所有 DTO 均为 ``dataclass(frozen=True)``,仅依赖标准库与契约层内部
类型,用于出站消息的格式化、可信注入与最终投递。集合字段使用 tuple
以保证 frozen dataclass 的不可变语义。
"""
from __future__ import annotations
from dataclasses import dataclass
from typing import Any
from yuxi.channels.contract.dtos.common import Attachment, MessageFormat
@dataclass(frozen=True)
class RichMessageButton:
"""富消息按钮。
描述富消息中的可点击按钮,由适配器按渠道协议渲染为对应交互元素。
字段:
label: 按钮显示文本。
action: 按钮动作标识。
value: 按钮动作携带的值(可选)。
"""
label: str
action: str
value: str | None = None
@dataclass(frozen=True)
class RichMessageOption:
"""富消息选项。
描述富消息中的可选项,用于下拉 / 列表类交互组件。
字段:
label: 选项显示文本。
value: 选项值。
"""
label: str
value: str
@dataclass(frozen=True)
class RichMessageSelect:
"""富消息下拉选择器组件。
字段:
name: 表单字段名。
label: 显示标签。
options: 可选项列表。
placeholder: 占位文本,可选。
default_value: 默认值,可选。
"""
name: str
label: str
options: tuple[RichMessageOption, ...]
placeholder: str | None = None
default_value: str | None = None
@dataclass(frozen=True)
class RichMessageDatePicker:
"""富消息日期选择器组件。
字段:
name: 表单字段名。
label: 显示标签。
placeholder: 占位文本,可选。
default_value: 默认日期ISO 格式),可选。
min_date: 最小可选日期ISO 格式),可选。
max_date: 最大可选日期ISO 格式),可选。
"""
name: str
label: str
placeholder: str | None = None
default_value: str | None = None
min_date: str | None = None
max_date: str | None = None
@dataclass(frozen=True)
class RichMessageCheckbox:
"""富消息复选框组件。
字段:
name: 表单字段名。
label: 显示标签。
options: 可选项列表。
default_values: 默认选中值列表。
"""
name: str
label: str
options: tuple[RichMessageOption, ...]
default_values: tuple[str, ...] = ()
@dataclass(frozen=True)
class RichMessageInput:
"""富消息输入框组件。
字段:
name: 表单字段名。
label: 显示标签。
placeholder: 占位文本,可选。
default_value: 默认值,可选。
max_length: 最大输入长度,可选。
input_type: 输入类型text/number/email 等),默认 text。
"""
name: str
label: str
placeholder: str | None = None
default_value: str | None = None
max_length: int | None = None
input_type: str = "text"
@dataclass(frozen=True)
class RichMessage:
"""富消息。
描述结构化的富消息内容,包括标题、正文、描述、图片、视频与交互元素
(按钮 / 选项),由适配器按渠道协议渲染。集合字段使用 tuple 以
保证不可变。
字段:
text: 正文文本。
title: 标题(可选)。
description: 描述(可选)。
image_url: 图片 URL可选向后兼容
video_url: 视频 URL可选FR-50
attachments: 多附件列表承载多图、文件等FR-50
buttons: 按钮列表(默认空 tuple
options: 选项列表(默认空 tuple
metadata: 渠道侧元数据(可选)。
selects: 下拉选择器组件列表。
date_pickers: 日期选择器组件列表。
checkboxes: 复选框组件列表。
inputs: 输入框组件列表。
"""
text: str
title: str | None = None
description: str | None = None
image_url: str | None = None
video_url: str | None = None
attachments: tuple[Attachment, ...] = ()
buttons: tuple[RichMessageButton, ...] = ()
options: tuple[RichMessageOption, ...] = ()
metadata: dict[str, Any] | None = None
selects: tuple[RichMessageSelect, ...] = ()
date_pickers: tuple[RichMessageDatePicker, ...] = ()
checkboxes: tuple[RichMessageCheckbox, ...] = ()
inputs: tuple[RichMessageInput, ...] = ()
@dataclass(frozen=True)
class RichMessageFields:
"""富消息字段。
包装富消息与其回退格式,用于出站负载携带富消息渲染信息,当渠道
不支持富消息时按回退格式渲染。
字段:
rich_message: 富消息内容。
fallback_format: 回退格式(默认 MARKDOWN
"""
rich_message: RichMessage
fallback_format: MessageFormat = MessageFormat.MARKDOWN
@dataclass(frozen=True)
class OutboundPayload:
"""出站负载。
描述出站管道的统一负载,关联 Agent 运行 ID携带流式分块、可选的
富消息字段与附件列表,用于驱动出站消息的格式化与投递。
字段:
agent_run_id: 关联的 Agent 运行 ID。
stream_chunks: 流式分块列表(默认空 tuple
rich_message_fields: 富消息字段(可选)。
attachments: 附件列表(默认空 tupleFR-51
"""
agent_run_id: str
stream_chunks: tuple[str, ...] = ()
rich_message_fields: RichMessageFields | None = None
attachments: tuple[Attachment, ...] = ()
@dataclass(frozen=True)
class FormattedMessage:
"""格式化消息。
描述经格式化后的消息内容,携带文本、格式、可选的富消息与附件列表,
用于适配器按渠道协议渲染最终消息。
字段:
content: 消息文本内容。
format: 消息格式(默认 TEXT
rich_message: 渲染后的渠道原生富消息对象(可选,由
RichMessageAdapter.renderRichMessage 产生,类型由具体适配器
决定)。
attachments: 附件列表(默认空 tupleFR-51
"""
content: str
format: MessageFormat = MessageFormat.TEXT
rich_message: Any = None
attachments: tuple[Attachment, ...] = ()
@dataclass(frozen=True)
class TrustedMessage:
"""可信消息。
描述经服务端强制注入发送者身份与所有者标记的消息,用于可信注入
边界FR-25确保渠道侧无法伪造发送者。
字段:
content: 消息文本内容。
sender_id: 发送者 ID服务端强制注入
is_owner: 是否为会话所有者(服务端强制注入,默认 False
rich_message: 渲染后的渠道原生富消息对象(可选,从
FormattedMessage 透传FR-08
"""
content: str
sender_id: str
is_owner: bool = False
rich_message: Any = None
@dataclass(frozen=True)
class FinalMessage:
"""最终消息。
描述出站管道最终投递至渠道适配器的消息,携带文本、发送者 ID 与
可选前缀,前缀用于所有者标记等场景。
字段:
content: 消息文本内容。
sender_id: 发送者 ID。
prefix: 前缀(可选,如所有者标记)。
rich_message: 渲染后的渠道原生富消息对象(可选,从
TrustedMessage 透传FR-08
"""
content: str
sender_id: str
prefix: str | None = None
rich_message: Any = None