agentscope-ai / agentscope-ai/QwenPaw
reasoning_content relay fails for thinking-mode models → 400 BadRequestError
- Linguagem predominante
- Python
- Estrelas
- 34.9k
- Forks
- 3.1k
- Merge médio
- 1d 15h
- PRs com merge (30d)
- 225
Descrição
## 问题描述
使用 thinking-mode 模型(如 DeepSeek V4 系列)进行多轮对话时,抛出 400 错误:
```
Model 'unknown' execution failed.
Reason: Error from provider (Console): Upstream request failed: [invalid_request_error] The `reasoning_content` in the thinking mode must be passed back to the API.
```
## 复现条件
1. 使用 thinking-mode 模型(DeepSeek V4 Flash / Pro 等)
2. 对话历史中包含 `thinking` block(前几轮 assistant 消息带有思考内容)
3. 发起新的 API 请求时,`reasoning_content` 未被正确 relay 到 wire 格式
## 根因分析
QwenPaw 源码中有两层保护机制应该处理此问题:
### 第一层:formatter 层 (`src/qwenpaw/agents/model_factory.py`)
`format()` 方法中的 `has_reasoning` 检测和 `reasoning_content` relay 逻辑(约 L1095-1110):
```python
if (
has_reasoning
and not is_anthropic_formatter
and not _is_response_formatter
and getattr(self, "relay_reasoning_content", True)
):
# ... 为每个 assistant wire message 添加 reasoning_content
```
但在某些路径下 `has_reasoning` 可能为 False(`_normalize_messages_for_formatter` 可能丢掉了 thinking block),导致 relay 未触发。
### 第二层:retry 层 (`src/qwenpaw/providers/retry_chat_model.py`)
`_is_missing_reasoning_content_error()` (L212-222) 应捕获 400 + `reasoning_content` 错误,`_inject_reasoning_content()` (L225-289) 应为缺少 reasoning_content 的 Msg 注入空占位符后重试。
但错误直接 propagate 到了用户侧,说明 retry 机制未生效。可能原因:
- `_inject_reasoning_content()` 返回了 False(消息已有 thinking block 但 wire 格式未正确转换)
- `_normalize_messages_for_formatter()` 的行为导致 formatter 和 retry 对 thinking block 的检测结果不一致
## 环境
- **QwenPaw 版本**:2.0.1(源码安装,`/home/xiaoxin/QwenPaw-2.0.1`)
- **Python**:3.13
- **agentscope**:2.0.4.post1
- **模型**:DeepSeek V4 Flash / Pro(通过 OpenAI-compatible endpoint)
- **错误 dump**:`/tmp/qwenpaw_query_error_aj8z5oy0.json`
## 涉及文件
- `src/qwenpaw/agents/model_factory.py` — formatter 的 format() 方法、`_normalize_messages_for_formatter()`
- `src/qwenpaw/providers/retry_chat_model.py` — `_is_missing_reasoning_content_error()`、`_inject_reasoning_content()`
Guia de contribuição
Avaliação
Esta issue ainda não foi avaliada.