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();
        }
    }
}
相关推荐
装不满的克莱因瓶1 天前
【SpringAI Alibaba】ReactAgent结构化输出OutputType与OutputSchema实战
java·人工智能·ai·springai·springaialibaba
装不满的克莱因瓶1 天前
【SpringAI Alibaba】ReactAgent响应SSE实时流式传输案例实战
java·人工智能·ai·sse·springai
装不满的克莱因瓶2 天前
【SpringAI Alibaba】ReactAgent记忆管理MessageTrimmingHook与MessageDeletionHook
java·人工智能·ai·ai编程·springai·springaialibaba
Flynn Liang6 天前
上线后怎么排查 AI 调用?Spring AI Observability:token/延迟/成本埋点与全链路追踪
java·人工智能·spring·监控·可观测性·observability·springai
Flynn Liang7 天前
AI 应用的安全红线:Spring AI 下的 Prompt 注入防护、PII 脱敏、输出审计与密钥管理
人工智能·安全·spring·数据泄露·springai·prompt注入
Flynn Liang7 天前
Spring AI 上生产:限流熔断、密钥与成本治理、私有化/混合部署、降级与 Prompt 灰度架构全解
人工智能·spring·架构·高可用·springai·成本治理·生产架构
Flynn Liang9 天前
Spring AI 多模态实战(下):文生图 + TTS 语音合成(含 2.0 流式音频分片)
人工智能·spring·文生图·音视频·语音合成·tts·springai
增量星球9 天前
Spring AI 2.0 Tool Calling 到底怎么跑起来的:从 @Tool 到两次模型调用
java·agent·springai·ai coding
Flynn Liang9 天前
让 AI 查订单、查库存、发消息:Spring AI 自定义工具(Tool)实战与工具描述工程
java·人工智能·spring·函数调用·springai·tool·自定义工具
Flynn Liang10 天前
大模型怎么自己调函数?Spring AI 2.0 Tool Calling 自动循环原理 + 完整时序图
java·人工智能·spring·agent·函数调用·springai·toolcalling