| | |
| | | import org.springframework.ai.tool.resolution.SpringBeanToolCallbackResolver; |
| | | import org.springframework.ai.util.json.schema.SchemaType; |
| | | import org.springframework.context.support.GenericApplicationContext; |
| | | import org.springframework.http.client.SimpleClientHttpRequestFactory; |
| | | import org.springframework.stereotype.Component; |
| | | import org.springframework.util.StringUtils; |
| | | import org.springframework.web.client.RestClient; |
| | | import org.springframework.web.reactive.function.client.WebClient; |
| | | |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.Date; |
| | |
| | | private final GenericApplicationContext applicationContext; |
| | | private final ObservationRegistry observationRegistry; |
| | | |
| | | /** |
| | | * 对一份 AI 参数草稿做真实连通性校验。 |
| | | * 校验方式不是简单判断字段非空,而是直接构造聊天模型并发起一次最小探测调用, |
| | | * 用返回结果和耗时生成前端可展示的校验报告。 |
| | | */ |
| | | public AiParamValidateResultDto validate(AiParam aiParam) { |
| | | long startedAt = System.currentTimeMillis(); |
| | | try { |
| | |
| | | } |
| | | |
| | | private OpenAiChatModel createChatModel(AiParam aiParam) { |
| | | /** |
| | | * 构造仅用于校验的轻量聊天模型。 |
| | | * 这里沿用正式链路的 Observation 和 ToolCalling 依赖, |
| | | * 保证校验结论与真实运行环境尽量一致。 |
| | | */ |
| | | OpenAiApi openAiApi = buildOpenAiApi(aiParam); |
| | | ToolCallingManager toolCallingManager = DefaultToolCallingManager.builder() |
| | | .observationRegistry(observationRegistry) |
| | |
| | | } |
| | | |
| | | private OpenAiApi buildOpenAiApi(AiParam aiParam) { |
| | | int timeoutMs = aiParam.getTimeoutMs() == null ? AiDefaults.DEFAULT_TIMEOUT_MS : aiParam.getTimeoutMs(); |
| | | SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); |
| | | requestFactory.setConnectTimeout(timeoutMs); |
| | | requestFactory.setReadTimeout(timeoutMs); |
| | | return OpenAiApi.builder() |
| | | .baseUrl(aiParam.getBaseUrl()) |
| | | .apiKey(aiParam.getApiKey()) |
| | | .restClientBuilder(RestClient.builder().requestFactory(requestFactory)) |
| | | .webClientBuilder(WebClient.builder()) |
| | | .build(); |
| | | /** 统一兼容根地址、/v1 前缀和完整 completions endpoint 三种常见填法。 */ |
| | | return AiOpenAiApiSupport.buildOpenAiApi(aiParam); |
| | | } |
| | | |
| | | private String formatDate(Date date) { |
| | | /** 统一输出给前端的校验时间格式。 */ |
| | | return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); |
| | | } |
| | | } |