Skip to content

fix(dashscope): avoid 400 for non-streaming qwen3.5 multimodal requests#1003

Open
rrrjqy66 wants to merge 2 commits intoagentscope-ai:mainfrom
rrrjqy66:main
Open

fix(dashscope): avoid 400 for non-streaming qwen3.5 multimodal requests#1003
rrrjqy66 wants to merge 2 commits intoagentscope-ai:mainfrom
rrrjqy66:main

Conversation

@rrrjqy66
Copy link

@rrrjqy66 rrrjqy66 commented Mar 20, 2026

Fixes #984

AgentScope-Java Version

1.0.11

Description

Background

When DashScopeChatModel is used with qwen3.5-plus in non-streaming mode, DashScope may return HTTP 400.

At first glance this can look like an endpoint routing issue, but the multimodal endpoint is actually correct here. According to DashScope's Qwen 3.5 model behavior, qwen3.5-plus should still be treated as a multimodal model. The real problem is that Qwen 3.5 enables thinking by default, while thinking mode requires streaming. In the previous implementation, when stream=false and enableThinking was not explicitly set, the request did not explicitly disable thinking, which could cause DashScope to reject the request.

Checklist

Please check the following items before code is ready to be reviewed.

  • Code has been formatted with mvn spotless:apply
  • All tests are passing (mvn test)
  • Javadoc comments are complete and follow project conventions
  • Related documentation has been updated (e.g. links, examples, etc.)
  • Code is ready for review

@rrrjqy66 rrrjqy66 requested review from a team and Copilot March 20, 2026 08:02
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Fixes DashScope HTTP 400 errors for non-streaming qwen3.5-* requests by explicitly disabling the model’s default “thinking mode” when streaming is off, and adds regression tests to ensure the correct endpoint and request parameters are used.

Changes:

  • In DashScopeChatModel, auto-disable enable_thinking for non-streaming requests when using qwen3.5-* models (unless explicitly configured).
  • Add unit/integration-style tests to verify thinking is opted out and the multimodal endpoint is selected for qwen3.5-plus non-streaming calls.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

File Description
agentscope-core/src/main/java/io/agentscope/core/model/DashScopeChatModel.java Adds model-name detection and forces enableThinking=false for non-streaming qwen3.5-* defaults.
agentscope-core/src/test/java/io/agentscope/core/model/DashScopeChatModelTest.java Adds regression tests covering non-stream qwen3.5 thinking opt-out and multimodal endpoint selection.

Comment on lines +346 to +351
private boolean isThinkingEnabledByDefaultModel(String modelName) {
if (modelName == null) {
return false;
}
return modelName.toLowerCase(Locale.ROOT).startsWith("qwen3.5");
}
Copy link

Copilot AI Mar 20, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

isThinkingEnabledByDefaultModel duplicates the same model-name pattern check (startsWith("qwen3.5")) that already exists in DashScopeHttpClient.isMultimodalModel(...). To reduce drift when DashScope adds/renames models, consider centralizing the “qwen3.5*” detection in a shared utility (or reusing an existing helper) so endpoint selection and default-thinking behavior stay consistent.

Copilot uses AI. Check for mistakes.
@codecov
Copy link

codecov bot commented Mar 20, 2026

Codecov Report

❌ Patch coverage is 66.66667% with 2 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
...a/io/agentscope/core/model/DashScopeChatModel.java 66.66% 1 Missing and 1 partial ⚠️

📢 Thoughts on this report? Let us know!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]:

2 participants