from datetime import datetime, timezone from typing import Optional, Dict, Any from yake import KeywordExtractor from app.services.chathistory import ChatSession from app.services.llm_model import Model from app.services.environmental_condition import EnvironmentalData from app.services.prompts import * from app.services.MagicConvert import MagicConvert class Report: def __init__(self, token: str, session_id: Optional[str] = None): self.token = token self.session_id = session_id self.chat_session = ChatSession(token, session_id) self.user_city = self.chat_session.get_city() city = self.user_city if self.user_city else '' self.environment_data = EnvironmentalData(city) self.markitdown = MagicConvert() def extract_keywords_yake(self, text: str, max_ngram_size: int = 2, num_keywords: int = 4) -> list: kw_extractor = KeywordExtractor( lan="en", n=max_ngram_size, top=num_keywords, features=None ) keywords = kw_extractor.extract_keywords(text) return [kw[0] for kw in keywords] def ensure_valid_session(self, title: str = None) -> str: if not self.session_id or not self.session_id.strip(): self.chat_session.create_new_session(title=title) self.session_id = self.chat_session.session_id else: try: if not self.chat_session.validate_session(self.session_id, title=title): self.chat_session.create_new_session(title=title) self.session_id = self.chat_session.session_id except ValueError: self.chat_session.create_new_session(title=title) self.session_id = self.chat_session.session_id return self.session_id def process_chat(self, query: str, report_file: str, file_type: Optional[str] = None) -> Dict[str, Any]: try: profile = self.chat_session.get_name_and_age() self.chat_session.update_title(self.session_id, query) self.session_id = self.ensure_valid_session(title=query) language = self.chat_session.get_language().lower() language_prompt = LANGUAGE_RESPONSE_PROMPT.format(language=language) if not report_file or not file_type: return { "error": "Report file or file type missing", "query": query, "response": "Sorry, report file or file type is missing.", "timestamp": datetime.now(timezone.utc).isoformat() } report_file_name = report_file + " (File Uploaded)" conversion_result = self.markitdown.magic(report_file) report_text = conversion_result.text_content prompt = MEDICAL_REPORT_ANALYSIS_PROMPT.format( report=report_text, current_query=query ) response = Model().response = Model().llm(prompt + "\n" + language_prompt , query) keywords = self.extract_keywords_yake(response) chat_data = { "query": report_file_name + "\n" +query, "response": response, "references": "", "page_no": "", "keywords": keywords, "images": "", "context": report_text, "timestamp": datetime.now(timezone.utc).isoformat(), "session_id": self.chat_session.session_id } if not self.chat_session.save_chat(chat_data): raise ValueError("Failed to save chat message") return chat_data except Exception as e: return { "error": str(e), "query": query, "response": "Sorry, there was an error processing your request.", "timestamp": datetime.now(timezone.utc).isoformat() }