agentscope-ai / agentscope-ai/agentscope-java

[Bug]: OpenAIChatModel structuted output fails on DeepSeek/vLLM — supportsNativeStructuredOutput() returns true for unsupported backends

未關閉
#1,742 0 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視
area/core/model bug
主要語言
Java
星號
5.6k
分支
1.3k
平均合併
4 天 12 小時
30 天內合併 PR
77

描述

## Summary

`OpenAIChatModel.supportsNativeStructuredOutput()` hardcodes `true`, but many OpenAI-compatible backends (DeepSeek, vLLM, Ollama, SiliconFlow) do not support `response_format`. This causes `agent.call(msg, OutputClass.class)` to fail with HTTP 400 on those backends.

## Root Cause

`OpenAIChatModel.java:195`:

```java
@Override
public boolean supportsNativeStructuredOutput() {
return true; // ← assumes ALL OpenAI-compatible APIs support response_format
}
```

`ReActAgent.doStructuredCall()` trusts this unconditionally:

```java
if (model.supportsNativeStructuredOutput()) {
return doNativeStructuredCall(msgs, jsonSchema); // sends response_format → 400
}
```

## Reproduction

```java
ReActAgent agent = ReActAgent.builder()
.model(OpenAIChatModel.builder()
.baseUrl("https://api.deepseek.com")
.modelName("deepseek-chat")
.formatter(new DeepSeekFormatter())
.build())
.build();

agent.call(userMsg, OutputClass.class).block();
// DeepSeek: "This response_format type is unavailable now" (400)
```

## Affected Backends

All OpenAI-compatible APIs using `OpenAIChatModel` that don't support `response_format`: DeepSeek, vLLM, Ollama, SiliconFlow, TogetherAI (partial).

## Fix

Add automatic fallback in `doStructuredCall()`: when native path fails, retry with the fallback (generate_response tool) path.

貢獻指南

開啟貢獻指南

評估

這個 Issue 還沒有評估資料。

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。