ctp-slack-bot / src /ctp_slack_bot /services /answer_retrieval_service.py
LiKenun's picture
Refactor #5
a1a6d79
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"