Skip to content

[Feature] 优化 QQ Official 适配器 markdown 发送策略 #5845

@KBVsent

Description

@KBVsent

Description / 描述

2026/03/26更新:
目前QQ官Bot已经开放md权限,因此可以将优化方式改为在MessageChain数据结构中增加use_markdown_(和 use_t2i_ 模式一致),后续其他支持发送md文本的适配器(tg 飞书等)也可以根据这个表示来选择是发送纯文本还是md

QQ Official 适配器 _send_with_markdown_fallback 优化:增加 markdown 模式配置与按目标能力缓存

当前 QQ Official 适配器在发送消息时,始终优先尝试以 markdown 格式发送,若服务端返回"不允许发送原生 markdown"错误则回退至纯文本模式重试。此设计存在以下问题:

无能力缓存,重复失败请求:对于没有 markdown 权限的目标(非沙盒群/用户)以及对于没有使用markdown需求的用户,每条消息都会先发送一次 markdown 请求(失败),再用纯文本重试(成功),导致 API 调用量翻倍,日志无用信息增加。

建议方案

建议实现两种模式,通过配置项 markdown_mode 控制:

模式 行为
auto(默认) 按目标(群/用户)缓存 markdown 能力:首次尝试 markdown,若被拒绝则缓存结果,后续直接使用纯文本。缓存带 TTL。
always_plain 跳过 markdown,始终使用纯文本 content 模式。适用于确认无 markdown 需求的用户。

此方案向后兼容:auto 作为默认值时行为与当前基本一致,但更智能(同一目标最多首次产生一次额外请求)。

这种设计实际上也是权宜之计,我的想法是应该由发送源控制消息是否使用markdown消息格式,而不是在适配器层默认转换为markdown消息的行为。这种行为只考虑了Astrbot在沙盒环境中展示LLM信息更美观的情况,而实际上对于只把Astrbot作为Bot框架来使用,不使用LLM的用户来说,输出结果根本不需要Markdown格式,因为有些输出结果在Markdown格式下,会渲染出歧义。

Use Case / 使用场景

  • 大部分无 markdown 权限的 Bot:auto 模式下增加 per-target 缓存后,每个目标最多只有首次触发一次额外的失败请求,后续消息不再产生冗余调用。

  • 明确无权限或者不需要markdown:配置 always_plain 后彻底消除所有 markdown 相关请求,零额外开销。

Willing to Submit PR? / 是否愿意提交PR?

  • Yes, I am willing to submit a PR. / 是的,我愿意提交 PR。

Code of Conduct

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:platformThe bug / feature is about IM platform adapter, such as QQ, Lark, Telegram, WebChat and so on.enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions