SpringAi适配DeepSeekV4

文章目录


前言

DeepSeekV4更新后调用方式出现了新的参数:

现有的以来无法支持:

xml 复制代码
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-model-deepseek</artifactId>
</dependency>

解决措施

在序列化的时候把这个参数加进去:

java 复制代码
@Configuration
public class DeepSeekV4CompatConfig {

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer thinkingDisabledCustomizer() {
        return builder -> {
            SimpleModule module = new SimpleModule();
            module.setSerializerModifier(new ThinkingDisabledBeanSerializerModifier());
            builder.modules(module);
        };
    }
}
java 复制代码
public class ThinkingDisabledBeanSerializerModifier extends BeanSerializerModifier {

    private static final String TARGET_CLASS = "org.springframework.ai.deepseek.api.DeepSeekApi$ChatCompletionRequest";

    @Override
    @SuppressWarnings("unchecked")
    public JsonSerializer<?> modifySerializer(SerializationConfig config,
                                               BeanDescription beanDesc,
                                               JsonSerializer<?> serializer) {
        if (TARGET_CLASS.equals(beanDesc.getBeanClass().getName())) {
            return new ThinkingDisabledSerializer((JsonSerializer<Object>) serializer);
        }
        return serializer;
    }

    static class ThinkingDisabledSerializer extends StdSerializer<Object> {

        private final JsonSerializer<Object> delegate;

        ThinkingDisabledSerializer(JsonSerializer<Object> delegate) {
            super(Object.class);
            this.delegate = delegate;
        }

        @Override
        public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException {
            TokenBuffer tb = new TokenBuffer(gen.getCodec(), false);
            delegate.serialize(value, tb, provider);

            gen.writeStartObject();

            JsonParser parser = tb.asParser();
            parser.nextToken();

            while (parser.nextToken() != JsonToken.END_OBJECT) {
                gen.copyCurrentEvent(parser);
                parser.nextToken();
                gen.copyCurrentStructure(parser);
            }

            gen.writeFieldName("thinking");
            gen.writeStartObject();
            gen.writeStringField("type", "disabled");
            gen.writeEndObject();

            gen.writeEndObject();
            parser.close();
        }
    }
}
相关推荐
2601_962077717 小时前
Spring AI企业级RAG落地实战:从基础架构到生产级高可用方案
知识库问答·rag·springai·企业级架构·高可用方案
武哥聊编程1 天前
【AI实战项目】AI Agent数据分析平台,基于SpringAI+Springboot+Vue+Agent的电商数据分析平台
人工智能·spring boot·数据分析·springai
武哥聊编程2 天前
【AI实战项目】基于SpringAI+Springboot+Vue的AI面试刷题训练平台
vue.js·人工智能·spring boot·springai
MinggeQingchun3 天前
AI - Java之SpringAI使用
ai·springai
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ3 天前
new AllMiniLmL6V2EmbeddingModel(); 相关方法介绍
springai
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ8 天前
model.onnx、tokenizer.json 文件介绍
springai
zhuodedao8 天前
Spring AI + MCP 文件工具未调用问题复盘:为什么初始化成功却没有写入文件?
java·debug·agent·springai·mcp
莫逸风25 天前
【AgentScope 2.0】10-总结回顾详解
java·ai·agent·springai·agentscope
番茄炒鸡蛋加糖1 个月前
主流 AI 框架 + RAG 落地实战
人工智能·rag·springai
Joy T1 个月前
Agent 开源项目全景解析(下):LlamaIndex、Dify、FastGPT 与真实工程选型
langchain·开源·框架·agent·springai·langgraph·mcp