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 !