[Bug] reasoning_content 为空字符串时会生成空 ThinkPart 并写入上下文
Maintainer thường phản hồi trong vòng 1 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 2/5
- Thời gian dự kiến
- 1-3 giờ
- Mức phù hợp với người mới
- 74/100
Hướng nghiên cứu
Bắt đầu tại _complete_with_assistant_response trong astrbot/core/agent/runners/tool_loop_agent_runner.py quanh dòng 190, sau đó kiểm tra nhánh gọi công cụ quanh dòng 1084 để xác nhận điều kiện tương tự. Tái hiện bằng một nhà cung cấp tương thích với OpenAI trả về reasoning_content rỗng, rồi kiểm tra cả hai đường đi đều tránh tạo ThinkPart khi không có chữ ký reasoning. Issue cũng đề xuất dọn các khối think rỗng khỏi lịch sử; hãy xác nhận riêng phạm vi và các bài kiểm thử cho việc đó.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
问题描述
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)
- Ngôn ngữ chính
- Python
- Star
- 46.4k
- Fork
- 3.4k
- Merge trung bình
- 1 ngày 9 giờ
- Pull request đã merge (30 ngày)
- 123
Chuẩn bị môi trường
- Có Dockerfile hoặc tệp Docker Compose
- Có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của AstrBotDevs/AstrBot
-
enhancement
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
AstrBotDevs/AstrBot#11038 · 2 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 74/100
AstrBotDevs/AstrBot#10999 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
[Bug] OpenAI-compatible Gemini 工具 schema const 导致 400Có thể đã có người làm @arccat-114 đã nhận 15 ngày trước. Đang mởbug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 77/100
AstrBotDevs/AstrBot#10720 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
[Bug] Discord slash command sync aborts with KeyError when a plugin handler is defined in a submoduleCó thể đã có người làm @yuexia5 đã nhận 20 ngày trước. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 77/100
AstrBotDevs/AstrBot#10626 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
[Bug] QQ频道消息无法回复:markdown 回退顺序有误,误用主动消息导致 304049 限频Có thể đã có người làm @he-yufeng đã nhận 31 ngày trước. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
AstrBotDevs/AstrBot#10420 · 4 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của AstrBotDevs/AstrBot
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 77/100
-
needs-triage tooling
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 90/100
neilsh/stunt-reel#317 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 85/100
TandoorRecipes/recipes#4926 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
PyTomography/PyTomography#431 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 74/100
igormcsouza/tether#278 ·
Maintainer thường phản hồi trong vòng 1 ngày