agentscope-ai / agentscope-ai/QwenPaw

reasoning_content relay fails for thinking-mode models → 400 BadRequestError

Aberta
#6,821 3 comentários 0 reações 0 responsáveis Ver no GitHub
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

Abrir o guia de contribuição

Avaliação

Esta issue ainda não foi avaliada.

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.