/
akadnikov
/
CMIS_agent_Java
Обзор
Документация
Войти
/
akadnikov
/
CMIS_agent_Java
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/main/java/com/example/cmisagent/LlmModelFactory.java
146 строк
6 KB
akadnikov
Initial commit
25 фев 2026, 23:17
Верифицирован
25 фев 2026, 23:17
882add4
Код
Авторство
О чём код?
package com.example.cmisagent; import chat.giga.langchain4j.GigaChatChatModel; import chat.giga.langchain4j.GigaChatChatRequestParameters; import chat.giga.model.ModelName; import chat.giga.model.Scope; import chat.giga.auth.AuthClient; import chat.giga.auth.AuthClientBuilder; import com.example.cmisagent.model.LlmProvider; import dev.langchain4j.model.anthropic.AnthropicChatModel; import dev.langchain4j.model.chat.ChatLanguageModel; import dev.langchain4j.model.openai.OpenAiChatModel; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.time.Duration; /** * Фабрика LLM-моделей. * Создаёт нужную реализацию ChatLanguageModel на основе конфигурации. * Для добавления нового провайдера достаточно добавить один case в switch. */ @Slf4j @Component public class LlmModelFactory { private final CMISAgentConfig config; public LlmModelFactory(CMISAgentConfig config) { this.config = config; } /** * Создаёт ChatLanguageModel для выбранного провайдера. */ public ChatLanguageModel create() { LlmProvider provider = config.getLlmProvider(); log.info("Creating LLM model for provider: {}", provider); return switch (provider) { case ANTHROPIC -> buildAnthropicModel(); case OPENAI -> buildOpenAiModel(); case GIGACHAT -> buildGigaChatModel(); }; } // ------------------------------------------------------------------------- // Anthropic / Claude // ------------------------------------------------------------------------- private ChatLanguageModel buildAnthropicModel() { String apiKey = requireKey(config.getAnthropicApiKey(), "ANTHROPIC_API_KEY"); log.info("Anthropic model: {}", config.getAnthropicModel()); return AnthropicChatModel.builder() .apiKey(apiKey) .modelName(config.getAnthropicModel()) .temperature(0.0) .maxTokens(config.getMaxTokens()) .timeout(Duration.ofSeconds(config.getTimeout())) .build(); } // ------------------------------------------------------------------------- // OpenAI / ChatGPT // ------------------------------------------------------------------------- private ChatLanguageModel buildOpenAiModel() { String apiKey = requireKey(config.getOpenaiApiKey(), "OPENAI_API_KEY"); log.info("OpenAI model: {}", config.getOpenaiModel()); OpenAiChatModel.OpenAiChatModelBuilder builder = OpenAiChatModel.builder() .apiKey(apiKey) .modelName(config.getOpenaiModel()) .temperature(0.0) .timeout(Duration.ofSeconds(config.getTimeout())); // Кастомный baseUrl: Azure OpenAI, прокси, Ollama и др. if (config.getOpenaiBaseUrl() != null && !config.getOpenaiBaseUrl().isBlank()) { log.info("OpenAI baseUrl override: {}", config.getOpenaiBaseUrl()); builder.baseUrl(config.getOpenaiBaseUrl()); } return builder.build(); } // ------------------------------------------------------------------------- // Сбер GigaChat // ------------------------------------------------------------------------- private ChatLanguageModel buildGigaChatModel() { String authKey = requireKey(config.getGigachatAuthKey(), "GIGACHAT_AUTH_KEY"); Scope scope = resolveGigaChatScope(config.getGigachatScope()); String model = config.getGigachatModel(); log.info("GigaChat model: {}, scope: {}", model, scope); return GigaChatChatModel.builder() .defaultChatRequestParameters( GigaChatChatRequestParameters.builder() .modelName(model) .build()) .authClient(AuthClient.builder() .withOAuth(AuthClientBuilder.OAuthBuilder.builder() .scope(scope) .authKey(authKey) .build()) .build()) .logRequests(config.isGigachatLogRequests()) .logResponses(config.isGigachatLogResponses()) .build(); } /** * Маппинг строкового значения scope из конфига в enum Scope. * * <ul> * <li>GIGACHAT_API_PERS — физические лица (по умолчанию)</li> * <li>GIGACHAT_API_B2B — ИП и юрлица, предоплата</li> * <li>GIGACHAT_API_CORP — ИП и юрлица, постоплата</li> * </ul> */ private Scope resolveGigaChatScope(String scopeValue) { if (scopeValue == null || scopeValue.isBlank()) { return Scope.GIGACHAT_API_PERS; } return switch (scopeValue.toUpperCase()) { case "GIGACHAT_API_B2B" -> Scope.GIGACHAT_API_B2B; case "GIGACHAT_API_CORP" -> Scope.GIGACHAT_API_CORP; default -> Scope.GIGACHAT_API_PERS; }; } // ------------------------------------------------------------------------- // Helpers // ------------------------------------------------------------------------- private String requireKey(String value, String envName) { if (value == null || value.isBlank()) { throw new IllegalStateException( "API key is not configured. Set the '" + envName + "' environment variable " + "or the corresponding property in application.yml."); } return value; } }