Please do a quick search on GitHub issues first, there might be already a duplicate issue for the one you are about to create. If the bug is trivial, just go ahead and create the issue. Otherwise, please take a few moments and fill in the following sections:
Bug description
java.lang.RuntimeException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of org.springframework.ai.deepseek.api.ResponseFormat
(no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: REDACTED (StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION
disabled); line: 1, column: 21] (through reference chain: org.springframework.ai.deepseek.DeepSeekChatOptions["response_format"])
at org.springframework.ai.model.ModelOptionsUtils.mapToClass(ModelOptionsUtils.java:252)
at org.springframework.ai.model.ModelOptionsUtils.merge(ModelOptionsUtils.java:196)
at org.springframework.ai.model.ModelOptionsUtils.merge(ModelOptionsUtils.java:212)
at org.springframework.ai.deepseek.DeepSeekChatModel.buildRequestPrompt(DeepSeekChatModel.java:393)
at org.springframework.ai.deepseek.DeepSeekChatModel.call(DeepSeekChatModel.java:149)
at org.springframework.ai.chat.client.advisor.ChatModelCallAdvisor.adviseCall(ChatModelCallAdvisor.java:54)
at org.springframework.ai.chat.client.advisor.DefaultAroundAdvisorChain.lambda$nextCall$1(DefaultAroundAdvisorChain.java:110)
at io.micrometer.observation.Observation.observe(Observation.java:564)
Environment Spring AI 1.0.0
Steps to reproduce DeepSeekChatOptions deepSeekChatOptions = DeepSeekChatOptions.builder() .responseFormat(ResponseFormat.builder().type(ResponseFormat.Type.JSON_OBJECT).build()) .build();
Prompt prompt = new Prompt(messages, modelOptions)
then chatClient call
Expected behavior success call llm
Minimal Complete Reproducible example
see Steps to reproduce
Comment From: sunyuhan1998
I tried to reproduce your issue, but I couldn't. I use the latest version of Spring AI code, Below is my test code:
DeepSeekApi api = DeepSeekApi.builder()
.baseUrl("https://api.deepseek.com")
.apiKey("<API_KEY>")
.build();
DeepSeekChatModel model = DeepSeekChatModel.builder().deepSeekApi(api).build();
DeepSeekChatOptions deepSeekChatOptions = DeepSeekChatOptions.builder()
.responseFormat(ResponseFormat.builder().type(ResponseFormat.Type.JSON_OBJECT).build())
.build();
Prompt prompt = new Prompt("What are the planets in the solar system? Please respond using JSON.", deepSeekChatOptions);
ChatClient client = ChatClient.builder(model).build();
String content = client.prompt(prompt).call().content();
System.out.println(content);
Here is the response I received:
{
"planets": [
"Mercury",
"Venus",
"Earth",
"Mars",
"Jupiter",
"Saturn",
"Uranus",
"Neptune"
],
"note": "Pluto was reclassified as a dwarf planet in 2006 by the International Astronomical Union (IAU) and is not considered a major planet in the solar system."
}
Comment From: ilayaperumalg
@sunyuhan1998 Thanks for the follow up!
Comment From: johnyannj
@sunyuhan1998 use your example:
maven:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>deepseek</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<package.version>${project.version}.${maven.build.timestamp}</package.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>1.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-deepseek</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-client-chat</artifactId>
</dependency>
</dependencies>
</project>
code
package com.demo;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.deepseek.DeepSeekChatModel;
import org.springframework.ai.deepseek.DeepSeekChatOptions;
import org.springframework.ai.deepseek.api.DeepSeekApi;
import org.springframework.ai.deepseek.api.ResponseFormat;
public class DeepSeek {
public static void main(String[] args) {
DeepSeekApi api = DeepSeekApi.builder()
.baseUrl("https://api.deepseek.com")
.apiKey("xxxx")
.build();
DeepSeekChatModel model = DeepSeekChatModel.builder().deepSeekApi(api).build();
DeepSeekChatOptions deepSeekChatOptions = DeepSeekChatOptions.builder()
.responseFormat(ResponseFormat.builder().type(ResponseFormat.Type.JSON_OBJECT).build())
.build();
Prompt prompt = new Prompt("What are the planets in the solar system? Please respond using JSON.", deepSeekChatOptions);
ChatClient client = ChatClient.builder(model).build();
String content = client.prompt(prompt).call().content();
System.out.println(content);
}
}
run code
SLF4J(W): No SLF4J providers were found.
SLF4J(W): Defaulting to no-operation (NOP) logger implementation
SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details.
Exception in thread "main" java.lang.RuntimeException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `org.springframework.ai.deepseek.api.ResponseFormat` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 21] (through reference chain: org.springframework.ai.deepseek.DeepSeekChatOptions["response_format"])
at org.springframework.ai.model.ModelOptionsUtils.mapToClass(ModelOptionsUtils.java:252)
at org.springframework.ai.model.ModelOptionsUtils.merge(ModelOptionsUtils.java:196)
at org.springframework.ai.model.ModelOptionsUtils.merge(ModelOptionsUtils.java:212)
at org.springframework.ai.deepseek.DeepSeekChatModel.buildRequestPrompt(DeepSeekChatModel.java:393)
at org.springframework.ai.deepseek.DeepSeekChatModel.call(DeepSeekChatModel.java:149)
at org.springframework.ai.chat.client.advisor.ChatModelCallAdvisor.adviseCall(ChatModelCallAdvisor.java:54)
at org.springframework.ai.chat.client.advisor.DefaultAroundAdvisorChain.lambda$nextCall$1(DefaultAroundAdvisorChain.java:110)
at io.micrometer.observation.Observation.observe(Observation.java:564)
at org.springframework.ai.chat.client.advisor.DefaultAroundAdvisorChain.nextCall(DefaultAroundAdvisorChain.java:110)
at org.springframework.ai.chat.client.DefaultChatClient$DefaultCallResponseSpec.lambda$doGetObservableChatClientResponse$1(DefaultChatClient.java:469)
at io.micrometer.observation.Observation.observe(Observation.java:564)
at org.springframework.ai.chat.client.DefaultChatClient$DefaultCallResponseSpec.doGetObservableChatClientResponse(DefaultChatClient.java:467)
at org.springframework.ai.chat.client.DefaultChatClient$DefaultCallResponseSpec.doGetObservableChatClientResponse(DefaultChatClient.java:446)
at org.springframework.ai.chat.client.DefaultChatClient$DefaultCallResponseSpec.content(DefaultChatClient.java:441)
at com.demo.DeepSeek.main(DeepSeek.java:28)
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `org.springframework.ai.deepseek.api.ResponseFormat` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 21] (through reference chain: org.springframework.ai.deepseek.DeepSeekChatOptions["response_format"])
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)
at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1888)
at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:414)
at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1375)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1512)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:348)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:185)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:310)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)
at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:342)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4931)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3868)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3836)
at org.springframework.ai.model.ModelOptionsUtils.mapToClass(ModelOptionsUtils.java:249)
... 14 more
Comment From: sunyuhan1998
@johnyannj I think maybe you could try upgrading to version 1.1.0-SNAPSHOT ? Your problem may have been solved in that version, it just hasn't been released in GA yet !