What happened / 发生了什么
Discord 平台适配器中提供了 DiscordEmbed、DiscordButton、DiscordView 等 Discord 专用 MessageChain 组件。
但这些组件继承自 BaseMessageComponent,而 BaseMessageComponent 是 Pydantic BaseModel。
当前实现中,DiscordEmbed 等类只声明了 type 字段,却在 init 中直接给 title、description、label、components、view 等未声明字段赋值。
这会导致组件构造时报错,例如 ValueError: "DiscordEmbed" object has no field "title"。
因此插件或业务代码无法正常通过 MessageChain([DiscordEmbed(...)]) 发送 Discord Embed。
此外,DiscordPlatformEvent._parse_to_discord 目前主要依赖 isinstance(i, DiscordEmbed / DiscordView) 判断组件类型。
这会导致插件本地兼容组件、热重载后的类对象、或其他 duck-typed discord_embed 组件无法被识别。
还有一个相关问题:RespondStage._is_empty_message_chain 只识别内置组件类型。
纯 discord_embed / discord_view 消息链可能在进入 Discord adapter 前就被判定为空消息并跳过。
Reproduce / 如何复现?
在 AstrBot 项目根目录运行以下最小复现
from astrbot.core.platform.sources.discord.components import DiscordEmbed DiscordEmbed(title="test")
AstrBot version, deployment method (e.g., Windows Docker Desktop deployment), provider used, and messaging platform used. / AstrBot 版本、部署方式(如 Windows Docker Desktop 部署)、使用的提供商、使用的消息平台适配器
AstrBot:4.23.6,commit cb5c172,master 分支
部署方式:Linux 源码部署,使用 uv / venv 运行
消息平台:Discord adapter
OS
Windows
Logs / 报错日志
Traceback (most recent call last):
File "", line 2, in
File "/root/AstrBot/astrbot/core/platform/sources/discord/components.py", line 23, in init
self.title = title
File "/root/AstrBot/.venv/lib/python3.12/site-packages/pydantic/v1/main.py", line 380, in setattr
raise ValueError(f'"{self.class.name}" object has no field "{name}"')
ValueError: "DiscordEmbed" object has no field "title"
Are you willing to submit a PR? / 你愿意提交 PR 吗?
Code of Conduct
What happened / 发生了什么
Discord 平台适配器中提供了 DiscordEmbed、DiscordButton、DiscordView 等 Discord 专用 MessageChain 组件。
但这些组件继承自 BaseMessageComponent,而 BaseMessageComponent 是 Pydantic BaseModel。
当前实现中,DiscordEmbed 等类只声明了 type 字段,却在 init 中直接给 title、description、label、components、view 等未声明字段赋值。
这会导致组件构造时报错,例如 ValueError: "DiscordEmbed" object has no field "title"。
因此插件或业务代码无法正常通过 MessageChain([DiscordEmbed(...)]) 发送 Discord Embed。
此外,DiscordPlatformEvent._parse_to_discord 目前主要依赖 isinstance(i, DiscordEmbed / DiscordView) 判断组件类型。
这会导致插件本地兼容组件、热重载后的类对象、或其他 duck-typed discord_embed 组件无法被识别。
还有一个相关问题:RespondStage._is_empty_message_chain 只识别内置组件类型。
纯 discord_embed / discord_view 消息链可能在进入 Discord adapter 前就被判定为空消息并跳过。
Reproduce / 如何复现?
在 AstrBot 项目根目录运行以下最小复现
from astrbot.core.platform.sources.discord.components import DiscordEmbed DiscordEmbed(title="test")AstrBot version, deployment method (e.g., Windows Docker Desktop deployment), provider used, and messaging platform used. / AstrBot 版本、部署方式(如 Windows Docker Desktop 部署)、使用的提供商、使用的消息平台适配器
AstrBot:4.23.6,commit cb5c172,master 分支
部署方式:Linux 源码部署,使用 uv / venv 运行
消息平台:Discord adapter
OS
Windows
Logs / 报错日志
Traceback (most recent call last):
File "", line 2, in
File "/root/AstrBot/astrbot/core/platform/sources/discord/components.py", line 23, in init
self.title = title
File "/root/AstrBot/.venv/lib/python3.12/site-packages/pydantic/v1/main.py", line 380, in setattr
raise ValueError(f'"{self.class.name}" object has no field "{name}"')
ValueError: "DiscordEmbed" object has no field "title"
Are you willing to submit a PR? / 你愿意提交 PR 吗?
Code of Conduct