package com.xly.config; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import dev.langchain4j.model.chat.ChatModel; import dev.langchain4j.model.openai.OpenAiChatModel; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import java.time.Duration; import java.util.List; @Configuration public class ModelConfig { @Value("${llm.base-url}") private String baseUrl; @Value("${llm.api-key:ollama}") private String apiKey; @Value("${llm.sql-model}") private String sqlModelName; /** NL2SQL 专用模型(QueryTool 经 AgentFactory 注入),OpenAI 兼容协议。 */ @Bean("sqlChatModel") public ChatModel sqlChatModel(TracingChatModelListener tracingListener) { return OpenAiChatModel.builder() .baseUrl(baseUrl) .apiKey(apiKey) .modelName(sqlModelName) .temperature(0.0) .topP(0.95) .reasoningEffort("none") .listeners(List.of(tracingListener)) .timeout(Duration.ofSeconds(120)) .maxRetries(3) .build(); } @Bean @Primary public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new JavaTimeModule()); mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); mapper.configure(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); return mapper; } }