[Bug] reasoning_content 为空字符串时会生成空 ThinkPart 并写入上下文
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 2/5
- 見積もり時間
- 1〜3時間
- 初心者へのやさしさ
- 74/100
調査の方向性
astrbot/core/agent/runners/tool_loop_agent_runner.py の190行目付近にある _complete_with_assistant_response から調べ、次に1084行目付近のツール呼び出し分岐で同じ条件を確認してください。空の reasoning_content を返す OpenAI 互換プロバイダーで再現し、reasoning の署名がない場合に両方の経路で ThinkPart の作成が回避されることを確認してください。Issue では履歴から空の think ブロックを削除することも提案されています。その範囲とテストについては別途確認してください。
索引モデルが issue の本文から書いたものです。
説明
问题描述
Provider 返回的 reasoning_content 是空字符串时,AstrBot 仍然会生成一个 think 为空的 ThinkPart,并写进对话上下文。表现是:
data_v4.db里conversations.content的 assistant 消息几乎每条开头都多一个空思考块:
[
{"type": "think", "think": "", "encrypted": null},
{"type": "text", "text": "……正常正文……"}
]
- 个别轮次模型会把这个结构当成正文原样输出,QQ 里直接显示成
{"type": "think", "think": "", "encrypted": null},后面再跟一句模型自己写的「(来源:本对话)」。
如何复现?
- 配置一个会返回
reasoning_content=""的 OpenAI 兼容 Provider(我用的是 deepseek 系推理模型,很多轮返回空字符串)。 - 正常和机器人聊 3~5 轮。
- 查
data_v4.db的conversations.content,assistant 消息开头就是上面那个空 think 块。 - 继续聊,偶尔就能看到模型把这段 JSON 当正文吐出来。
AstrBot 版本
4.29.4(Windows 桌面版,runtime-manifest.json 里 core 也是 4.29.4)
操作系统
Windows
部署方式
桌面版(Desktop 安装包)
使用的消息平台适配器
aiocqhttp(QQ,SnowLuma 反向 WS)
错误日志
不报错,属于静默数据问题。关键代码在 astrbot/core/agent/runners/tool_loop_agent_runner.py:190(_complete_with_assistant_response):
if llm_resp.reasoning_content is not None or llm_resp.reasoning_signature:
parts.append(
ThinkPart(
think=llm_resp.reasoning_content or "",
encrypted=llm_resp.reasoning_signature,
)
)
reasoning_content 为 "" 时 "" is not None 为真,于是生成了 think="" 的 ThinkPart。
同样的写法在工具调用分支 tool_loop_agent_runner.py:1084 还有一处。
期望行为:reasoning_content 为空且没有 reasoning_signature 时不生成 ThinkPart。
建议修复(两处都改):
if llm_resp.reasoning_content or llm_resp.reasoning_signature:
另外可以考虑在读取历史时丢弃 {"type": "think", "think": ""} 的块,把已经写进库的脏数据清掉。
辅助信息
无
检查清单
- 我已经搜索了现有的 issues,没有找到重复的问题
- 我使用的是最新版本的 AstrBot
- 我已经阅读了文档和常见问题
相关
- #10215(handle empty OpenAI completions and Gemini history parts)
- #10866(Gemini 原始 provider 回放历史时空 text part 触发 400)
- 主要言語
- Python
- スター
- 46.4k
- フォーク
- 3.4k
- 平均マージ
- 1日 9時間
- マージ済み PR(30日)
- 123
環境構築
- Dockerfile または Docker Compose ファイルあり
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
AstrBotDevs/AstrBot のほかの issue
-
enhancement
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
AstrBotDevs/AstrBot#11038 · コメント 2 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 74/100
AstrBotDevs/AstrBot#10999 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
[Bug] OpenAI-compatible Gemini 工具 schema const 导致 400対応中かも @arccat-114 が 15 日前に担当しました。 オープンbug
難易度 2/5 1〜3時間 初心者へのやさしさ 77/100
AstrBotDevs/AstrBot#10720 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
[Bug] Discord slash command sync aborts with KeyError when a plugin handler is defined in a submodule対応中かも @yuexia5 が 20 日前に担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 77/100
AstrBotDevs/AstrBot#10626 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
[Bug] QQ频道消息无法回复:markdown 回退顺序有误,误用主动消息导致 304049 限频対応中かも @he-yufeng が 31 日前に担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
AstrBotDevs/AstrBot#10420 · コメント 4 件 ·
メンテナーはふだん 1 日以内に返信
AstrBotDevs/AstrBot の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 77/100
-
needs-triage tooling
難易度 1/5 1時間未満 初心者へのやさしさ 90/100
neilsh/stunt-reel#317 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 85/100
TandoorRecipes/recipes#4926 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
PyTomography/PyTomography#431 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 74/100
igormcsouza/tether#278 ·
メンテナーはふだん 1 日以内に返信