ForcePilot/backend/package/yuxi/channels/adapters/yuanbao/template.py
Kris eb25707668 feat(yuanbao): 新增元宝渠道适配器完整实现
新增元宝(Yuanbao)渠道的完整适配器实现,包含以下核心模块:
- 基础适配器与导出入口
- 协议编解码与WebSocket帧处理
- 会话管理与路由逻辑
- 事件队列与出站消息队列
- 消息格式转换与发送重试
- 安全审计与权限校验
- 配置映射与账户管理
- 视觉分析与工具函数
- 文档生成与设置向导
2026-05-12 00:52:20 +08:00

139 lines
3.7 KiB
Python

from __future__ import annotations
from dataclasses import dataclass, field
from typing import Any
@dataclass
class TemplateButton:
text: str
action_type: str = "url"
value: str = ""
style: str = "default"
def to_dict(self) -> dict[str, Any]:
return {
"text": self.text,
"type": self.action_type,
"value": self.value,
"style": self.style,
}
@dataclass
class SelectorOption:
label: str
value: str
description: str = ""
def to_dict(self) -> dict[str, Any]:
result = {"label": self.label, "value": self.value}
if self.description:
result["description"] = self.description
return result
@dataclass
class ActionSelector:
placeholder: str = "请选择"
options: list[SelectorOption] = field(default_factory=list)
selector_id: str = ""
def to_dict(self) -> dict[str, Any]:
return {
"type": "action_select",
"selector_id": self.selector_id,
"placeholder": self.placeholder,
"options": [opt.to_dict() for opt in self.options],
}
@dataclass
class TemplateCard:
title: str = ""
content: str = ""
image_url: str = ""
link_url: str = ""
buttons: list[TemplateButton] = field(default_factory=list)
selectors: list[ActionSelector] = field(default_factory=list)
def to_dict(self) -> dict[str, Any]:
result: dict[str, Any] = {"type": "card"}
if self.title:
result["title"] = self.title
if self.content:
result["content"] = self.content
if self.image_url:
result["image_url"] = self.image_url
if self.link_url:
result["link_url"] = self.link_url
if self.buttons:
result["buttons"] = [b.to_dict() for b in self.buttons]
if self.selectors:
result["selectors"] = [s.to_dict() for s in self.selectors]
return result
class TemplateMessageBuilder:
def __init__(self) -> None:
self._content: str = ""
self._buttons: list[TemplateButton] = []
self._card: TemplateCard | None = None
self._selectors: list[ActionSelector] = []
def set_content(self, content: str) -> TemplateMessageBuilder:
self._content = content
return self
def add_button(
self,
text: str,
action_type: str = "url",
value: str = "",
style: str = "default",
) -> TemplateMessageBuilder:
self._buttons.append(TemplateButton(text=text, action_type=action_type, value=value, style=style))
return self
def set_card(self, card: TemplateCard) -> TemplateMessageBuilder:
self._card = card
return self
def add_selector(
self,
placeholder: str = "请选择",
options: list[SelectorOption] | None = None,
selector_id: str = "",
) -> TemplateMessageBuilder:
self._selectors.append(
ActionSelector(
placeholder=placeholder,
options=options or [],
selector_id=selector_id,
)
)
return self
def build_metadata(self) -> dict[str, Any]:
metadata: dict[str, Any] = {}
if self._buttons:
metadata["buttons"] = [b.to_dict() for b in self._buttons]
if self._card:
metadata["card"] = self._card.to_dict()
if self._selectors:
metadata["selectors"] = [s.to_dict() for s in self._selectors]
return metadata
def build_content(self) -> str:
return self._content
def reset(self) -> None:
self._content = ""
self._buttons.clear()
self._card = None
self._selectors.clear()