diff --git a/src/main/java/ru/cathub/telegabot/model/TextRole.java b/src/main/java/ru/cathub/telegabot/model/TextRole.java new file mode 100644 index 0000000..a43f5c0 --- /dev/null +++ b/src/main/java/ru/cathub/telegabot/model/TextRole.java @@ -0,0 +1,17 @@ +package ru.cathub.telegabot.model; + +public enum TextRole { + DEFAULT("Ты помощник в Telegram-боте для книгоманов"), + REVIEWER("Анализируй текст как профессиональный редактор"), + RECOMMENDER("Рекомендуй книги на основе предпочтений"); + + private final String systemPrompt; + + TextRole(String systemPrompt) { + this.systemPrompt = systemPrompt; + } + + public String getPrompt() { + return systemPrompt; + } +} diff --git a/src/main/java/ru/cathub/telegabot/service/OpenRouterService.java b/src/main/java/ru/cathub/telegabot/service/OpenRouterService.java index 567f2ee..300b201 100644 --- a/src/main/java/ru/cathub/telegabot/service/OpenRouterService.java +++ b/src/main/java/ru/cathub/telegabot/service/OpenRouterService.java @@ -1,7 +1,12 @@ package ru.cathub.telegabot.service; import ru.cathub.telegabot.exception.OpenRouterException; +import ru.cathub.telegabot.model.TextRole; +import java.util.List; +import java.util.Map; public interface OpenRouterService { - String getChatResponse(String message) throws OpenRouterException; + String getChatResponse(String userMessage, TextRole role) throws OpenRouterException; + String getChatResponseWithContext(String userMessage, List> context) throws OpenRouterException; + String getSimpleResponse(String message) throws OpenRouterException; } diff --git a/src/main/java/ru/cathub/telegabot/service/impl/OpenRouterServiceImpl.java b/src/main/java/ru/cathub/telegabot/service/impl/OpenRouterServiceImpl.java index abcf5cc..b8d3fdb 100644 --- a/src/main/java/ru/cathub/telegabot/service/impl/OpenRouterServiceImpl.java +++ b/src/main/java/ru/cathub/telegabot/service/impl/OpenRouterServiceImpl.java @@ -13,6 +13,7 @@ import ru.cathub.telegabot.configuration.OpenRouterConfig; import ru.cathub.telegabot.exception.OpenRouterException; import ru.cathub.telegabot.service.OpenRouterService; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -26,7 +27,27 @@ public class OpenRouterServiceImpl implements OpenRouterService { private final RestTemplate restTemplate; @Override - public String getChatResponse(String message) throws OpenRouterException { + public String getChatResponse(String userMessage, TextRole role) throws OpenRouterException { + List> messages = new ArrayList<>(); + messages.add(Map.of("role", "system", "content", role.getPrompt())); + messages.add(Map.of("role", "user", "content", userMessage)); + return sendChatRequest(messages); + } + + @Override + public String getChatResponseWithContext(String userMessage, List> context) throws OpenRouterException { + context.add(Map.of("role", "user", "content", userMessage)); + return sendChatRequest(context); + } + + @Override + public String getSimpleResponse(String message) throws OpenRouterException { + return sendChatRequest(List.of( + Map.of("role", "user", "content", message) + )); + } + + private String sendChatRequest(List> messages) throws OpenRouterException { HttpHeaders headers = new HttpHeaders(); headers.setBearerAuth(config.getKey()); headers.add("HTTP-Referer", "https://github.com/your-username/telegabot"); @@ -34,10 +55,7 @@ public class OpenRouterServiceImpl implements OpenRouterService { Map request = new HashMap<>(); request.put("model", config.getModel()); - request.put("messages", List.of(Map.of( - "role", "user", - "content", message - ))); + request.put("messages", messages); try { ResponseEntity response = restTemplate.postForEntity( @@ -55,12 +73,25 @@ public class OpenRouterServiceImpl implements OpenRouterService { private String extractResponse(Map response) throws OpenRouterException { try { - List> choices = (List>) response.get("choices"); - Map firstChoice = choices.get(0); - Map message = (Map) firstChoice.get("message"); - return message.get("content"); - } catch (Exception e) { - throw new OpenRouterException("Error parsing API response"); + if (!response.containsKey("choices")) { + throw new OpenRouterException("Invalid API response format"); + } + + List choices = (List) response.get("choices"); + if (choices.isEmpty()) { + throw new OpenRouterException("No choices in API response"); + } + + Map firstChoice = (Map) choices.get(0); + Map message = (Map) firstChoice.get("message"); + + if (message == null || !message.containsKey("content")) { + throw new OpenRouterException("Malformed message in API response"); + } + + return (String) message.get("content"); + } catch (ClassCastException e) { + throw new OpenRouterException("Type casting error in API response"); } } }