agentscope-ai / agentscope-ai/agentscope-java
[Feature]: DashScopeChatModel 在开启思考时强制 stream=true,与 Python SDK 行为不一致,建议解耦
- Dominant language
- Java
- Stars
- 5.6k
- Forks
- 1.3k
- Avg merge
- 4d 12h
- Merged PRs (30d)
- 77
Description
### 标题
`DashScopeChatModel` 在开启思考时强制 `stream=true`,与 Python SDK 行为不一致,建议解耦
---
**环境**
- agentscope-java: `2.0.3-SNAPSHOT` (commit `d20ebbe`)
**问题描述**
Java 版 `DashScopeChatModel` 构造时,只要 `enableThinking=true` 就无条件把 `stream` 改写为 `true`,用户显式设置的 `stream=false` 被忽略。而 Python SDK 中 `stream` 与 `thinking` 是完全独立的,两者行为不一致。
**证据**
1)Java 强制改写 `stream` —— `DashScopeChatModel.java` L154-161:
```java
// Thinking mode requires streaming; override stream setting if needed
if (enableThinking != null && enableThinking && !stream) {
log.info("...Forcing stream=true as thinking mode requires streaming.");
}
this.stream = enableThinking != null && enableThinking ? true : stream;
```
2)Python 版无此约束 —— Python 的 `DashScopeChatModel` 是 OpenAI 兼容实现(用 `openai` SDK 打 `compatible-mode/v1`),`stream` 忠实透传、`enable_thinking` 独立设置,二者解耦。
3)Java 自己的 `OpenAIChatModel` 也无此约束 —— 同仓库 `OpenAIChatModel.java` 完全没有 thinking→强制 stream 的逻辑,`stream` 由 `GenerateOptions.getStream()` 独立决定(默认 `false`)。可见强制流式是 `DashScopeChatModel` 独有的,并非框架统一约定。
**服务端真实约束(以阿里云百炼文档为例)**
"非流式 + 思考"的约束是**按模型区分**的:
- 商业版(`qwen-plus` / `qwen3-max` / `qwen-flash` / `qwen3.7-plus`):**支持**非流式 + 思考;
- 开源版思考模型(`qwen3-235b-a22b` / `qwen3-32b`):非流式 + 思考才报 `400 parameter.enable_thinking only support stream call`。
即使"thinking 必须 stream"只对部分模型成立,各家也有不同的报错兜底,不应无差别套用到所有模型。
**影响**
1. 需要"非流式 + 思考"的场景(流式返回不稳定)被无差别剥夺;
2. 与 Python SDK 行为不一致,跨语言用户困惑。
**建议方案(择一)**
- **方案 A(推荐,opt-out)**:`Builder.stream` 改用 `Boolean`,区分"用户显式设置"与"未设置"。仅当未显式设置时才默认强制 `true`;用户显式 `stream(false)` 则尊重。改动小、向后兼容。
- **方案 B(模型感知)**:仅对已知"非流式+思考会报错"的开源思考模型强制流式,商业版不强制。
**疑问**
Java 版是否有计划与 Python 版对齐,将 `stream` 与 `thinking` 解耦?
Contributor guide
Assessment
This issue has not been assessed yet.