derm-ai / app /services /report_process.py
muhammadnoman76's picture
update
75e2b6c
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()
}