from loguru import logger from pydantic import ConfigDict from typing import Collection, Self from ctp_slack_bot.core import ApplicationComponentBase, Settings from ctp_slack_bot.enums import EventType from ctp_slack_bot.models import Chunk, SlackMessage, SlackResponse from .event_brokerage_service import EventBrokerageService from .language_model_service import LanguageModelService class AnswerRetrievalService(ApplicationComponentBase): """ Service for context-based answer retrievel from a language model. """ model_config = ConfigDict(frozen=True) settings: Settings event_brokerage_service: EventBrokerageService language_model_service: LanguageModelService async def push(self: Self, question: SlackMessage, context: Collection[Chunk]) -> None: channel_to_respond_to = question.channel thread_to_respond_to = question.thread_ts if question.thread_ts else question.ts answer = await self.language_model_service.answer_question(question.user, question.text, context) logger.debug("Pushing response to channel {} and thread {}: {}", channel_to_respond_to, thread_to_respond_to, answer) slack_response = SlackResponse(text=answer, channel=channel_to_respond_to, thread_ts=thread_to_respond_to) await self.event_brokerage_service.publish(EventType.OUTGOING_SLACK_RESPONSE, slack_response) @property def name(self: Self) -> str: return "answer_retrieval_service"