🏥Nursa دستیار هوشمند پزشکی
سیستم هوشمند تحلیل تداخلات دارویی و نتایج آزمایش
from openai import OpenAI import gradio as gr import logging import sqlite3 import easyocr from datetime import datetime import hashlib import io import base64 from PIL import Image import os import secrets logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) print("Loading API key...") KEY = os.getenv("KEY") if not KEY: logger.error("Error in token") print("Error in token - Please set KEY environment variable") client = OpenAI( base_url="https://openrouter.ai/api/v1", api_key=KEY, ) def extract_text_easyocr(image_path): try: reader = easyocr.Reader(["en", "fa"]) result = reader.readtext(image_path) text = "" for ocr in result: text += ocr[1] + " " return text.strip() except Exception as e: logger.error(f"Error in EasyOCR: {e}") return "" def init_database(): """ایجاد دیتابیس""" try: conn = sqlite3.connect("nurca.db") cursor = conn.cursor() cursor.execute('''CREATE TABLE IF NOT EXISTS chat_history( id INTEGER PRIMARY KEY AUTOINCREMENT, session_id TEXT, input_text TEXT, input_image TEXT, response TEXT, timestamp TEXT, query_type TEXT )''') conn.commit() conn.close() logger.info("Database initialized successfully") except Exception as e: logger.error(f"Error in creating database: {e}") def create_session(): try: x=datetime.utcnow().isoformat() n=secrets.token_hex(8) s=hashlib.sha256((str(x+n)).encode()).hexdigest() return s[:15] except Exception as e: print("error session") logger.error(f"error session:{e}") return "default_session" def save_to_database(session_id, input_text, input_image, response, query_type): """ذخیره در دیتابیس""" try: conn = sqlite3.connect("nurca.db") cursor = conn.cursor() image_data = None if input_image is not None: buffered = io.BytesIO() input_image.save(buffered, format="PNG") image_data = base64.b64encode(buffered.getvalue()).decode() timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") cursor.execute('''INSERT INTO chat_history(session_id, input_text, input_image, response, timestamp, query_type) VALUES(?, ?, ?, ?, ?, ?)''', (session_id, input_text, image_data, response, timestamp, query_type)) conn.commit() conn.close() logger.info("Data saved successfully") except Exception as e: logger.error(f"Error saving to database: {e}") def get_user_history(session_id): """دریافت تاریخچه کاربر""" try: conn = sqlite3.connect("nurca.db") cursor = conn.cursor() cursor.execute('''SELECT timestamp, query_type, input_text, response FROM chat_history WHERE session_id = ? ORDER BY timestamp DESC LIMIT 10''', (session_id,)) results = cursor.fetchall() conn.close() if not results: return "📝 هنوز تاریخچهای ندارید" history_text = "# 📊 تاریخچه شما\n\n" for i, (timestamp, query_type, input_text, response) in enumerate(results, 1): emoji = "💊" if query_type == "drug_interaction" else "🔬" if query_type == "lab_analysis" else "💬" history_text += f"## {emoji} مورد {i} - {timestamp}\n\n" history_text += f"**ورودی:** {input_text[:100]}...\n\n" history_text += f"**پاسخ:** {response[:200]}...\n\n---\n\n" return history_text except Exception as e: logger.error(f"Error getting history: {e}") return "❌ خطا در دریافت تاریخچه" def clear_user_history(session_id): """پاک کردن تاریخچه""" try: conn = sqlite3.connect("nurca.db") cursor = conn.cursor() cursor.execute("DELETE FROM chat_history WHERE session_id = ?", (session_id,)) conn.commit() conn.close() return "✅ تاریخچه شما پاک شد!" except Exception as e: logger.error(f"Error clearing history: {e}") return "❌ خطا در پاک کردن تاریخچه" def get_chat_history(session_id): """دریافت تاریخچه چت برای حافظه مکالمه""" try: conn = sqlite3.connect("nurca.db") cursor = conn.cursor() cursor.execute('''SELECT input_text, response FROM chat_history WHERE session_id = ? AND query_type = 'symptom_chat' ORDER BY timestamp ASC LIMIT 10''', (session_id,)) results = cursor.fetchall() conn.close() chat_messages = [] for input_text, response in results: chat_messages.append({"role": "user", "content": input_text}) chat_messages.append({"role": "assistant", "content": response}) return chat_messages except Exception as e: logger.error(f"Error getting chat history: {e}") return [] def analyze_drug_interaction(drug1, drug2, session_id): """تحلیل تداخل دارویی""" if not drug1.strip() or not drug2.strip(): return "⚠️ لطفاً نام هر دو دارو را وارد کنید" try: prompt = f"""شما یک متخصص داروسازی و فارماکولوژی هستید. لطفاً تداخل بین این دو دارو را به صورت کامل تحلیل کنید: دارو اول: {drug1} دارو دوم: {drug2} لطفاً موارد زیر را بررسی کنید: 1. آیا این دو دارو تداخل دارند؟ 2. نوع تداخل (فارماکوکینتیک یا فارماکودینامیک) 3. شدت تداخل (خفیف، متوسط، شدید) 4. مکانیسم تداخل 5. عوارض جانبی احتمالی 6. توصیههای عملی برای بیمار 7. نیاز به تغییر دوز یا زمانبندی پاسخ را به فارسی و با جزئیات کامل ارائه دهید.""" completion = client.chat.completions.create( extra_headers={ "HTTP-Referer": "https://medical-ai.com", "X-Title": "Medical Drug Interaction Checker", }, extra_body={}, model="openai/gpt-oss-20b:free", messages=[ { "role": "user", "content": prompt } ] ) result = completion.choices[0].message.content # ذخیره در دیتابیس save_to_database(session_id, f"تداخل دارویی: {drug1} + {drug2}", None, result, "drug_interaction") return f"# 💊 تحلیل تداخل دارویی\n\n## داروهای بررسی شده:\n- **{drug1}**\n- **{drug2}**\n\n## نتیجه تحلیل:\n\n{result}" except Exception as e: error_msg = f"❌ خطا در تحلیل: {str(e)}" logger.error(error_msg) return error_msg def analyze_lab_image(image, session_id): """تحلیل تصویر آزمایش""" if image is None: return "⚠️ لطفاً تصویر آزمایش را آپلود کنید" try: # ذخیره موقت تصویر برای OCR temp_path = "temp_image.png" image.save(temp_path) # استخراج متن از تصویر extracted_text = extract_text_easyocr(temp_path) # حذف فایل موقت if os.path.exists(temp_path): os.remove(temp_path) prompt = f"""شما یک متخصص آزمایشگاه و پاتولوژیست هستید. این متن از یک نتیجه آزمایش استخراج شده: {extracted_text} لطفاً این نتیجه آزمایش را تحلیل کنید: 1. نوع آزمایش را شناسایی کنید 2. مقادیر غیرطبیعی را مشخص کنید 3. تفسیر بالینی نتایج 4. نکات مهم برای بیمار 5. نیاز به آزمایشهای تکمیلی 6. توصیههای اولیه ⚠️ تأکید: این تحلیل صرفاً جهت اطلاع اولیه است و جایگزین مشاوره پزشک نیست. پاسخ را به فارسی و با جزئیات کامل بدهید.""" completion = client.chat.completions.create( extra_headers={ "HTTP-Referer": "https://medical-ai.com", "X-Title": "Medical Lab Analysis", }, extra_body={}, model="openai/gpt-oss-20b:free", messages=[ { "role": "user", "content": prompt } ] ) result = completion.choices[0].message.content # ذخیره در دیتابیس save_to_database(session_id, "تحلیل تصویر آزمایش", image, result, "lab_analysis") return f"# 🔬 تحلیل نتیجه آزمایش\n\n## متن استخراج شده:\n```\n{extracted_text}\n```\n\n## تحلیل:\n\n{result}" except Exception as e: error_msg = f"❌ خطا در تحلیل تصویر: {str(e)}" logger.error(error_msg) return error_msg def symptom_diagnosis(symptoms, session_id): """تشخیص بیماری بر اساس علائم""" if not symptoms.strip(): return "⚠️ لطفاً علائم خود را توضیح دهید" try: prompt = f"""شما یک پزشک عمومی مهربان و با تجربه هستید. بیمار این علائم را دارد: علائم: {symptoms} لطفاً به شکل مهربان و دلگرم کننده موارد زیر را بررسی کنید: 1. احتمالیترین تشخیصها (با ذکر احتمال) 2. علائم تکمیلی که باید سؤال شود 3. راهنماییهای خانگی و خودمراقبتی 4. داروهای بدون نسخه که ممکن است کمک کند 5. چه زمانی حتماً باید به پزشک مراجعه کند 6. کلمات آرامشبخش و امیدوارانه ⚠️ تأکید کنید که این تشخیص اولیه است و باید با پزشک مشورت شود. پاسخ را به زبان فارسی، مهربان و کامل بدهید. از کلمات دلگرم کننده استفاده کنید.""" completion = client.chat.completions.create( extra_headers={ "HTTP-Referer": "https://medical-ai.com", "X-Title": "Medical Symptom Analysis", }, extra_body={}, model="openai/gpt-oss-20b:free", messages=[ { "role": "user", "content": prompt } ] ) result = completion.choices[0].message.content # ذخیره در دیتابیس save_to_database(session_id, f"تشخیص علائم: {symptoms}", None, result, "symptom_diagnosis") return f"# 🩺 تشخیص بر اساس علائم\n\n## علائم شما:\n{symptoms}\n\n## نظر پزشک:\n\n{result}" except Exception as e: error_msg = f"❌ خطا در تشخیص: {str(e)}" logger.error(error_msg) return error_msg def symptom_chat(message, chat_history, session_id): """چت تعاملی برای تشخیص علائم""" if not message.strip(): return chat_history, "" try: # دریافت تاریخچه از دیتابیس db_history = get_chat_history(session_id) # ساخت context از تاریخچه context = "تاریخچه مکالمه قبلی:\n" for msg in db_history[-6:]: # آخرین 6 پیام if msg["role"] == "user": context += f"بیمار: {msg['content']}\n" else: context += f"پزشک: {msg['content']}\n" prompt = f"""شما یک پزشک مهربان هستید که با بیمار چت میکنید. {context} پیام جدید بیمار: {message} لطفاً: 1. به پیام بیمار پاسخ مهربانانه دهید 2. سؤالات تکمیلی مناسب بپرسید 3. اگر اطلاعات کافی دارید، تشخیص احتمالی ارائه دهید 4. همیشه تأکید کنید که باید با پزشک مشورت شود پاسخ کوتاه و مفید باشد.""" completion = client.chat.completions.create( extra_headers={ "HTTP-Referer": "https://medical-ai.com", "X-Title": "Medical Chat", }, extra_body={}, model="openai/gpt-oss-20b:free", messages=[ { "role": "user", "content": prompt } ] ) response = completion.choices[0].message.content # ذخیره در دیتابیس save_to_database(session_id, message, None, response, "symptom_chat") # بروزرسانی چت chat_history.append([message, response]) return chat_history, "" except Exception as e: error_msg = f"❌ خطا: {str(e)}" logger.error(error_msg) chat_history.append([message, error_msg]) return chat_history, "" # راهاندازی دیتابیس init_database() def create_app(): with gr.Blocks( theme=gr.themes.Soft(), css=""" .main-header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 30px; border-radius: 15px; margin-bottom: 20px; text-align: center; color: white; } .feature-box { background: #d97dfc; border-radius: 10px; padding: 20px; margin: 10px 0; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); } .warning-box { background: #ffa07a; border: 1px solid #ffeaa7; border-radius: 8px; padding: 15px; margin: 15px 0; } """, title="🏥 دستیار هوشمند پزشکی" ) as app: # session state برای ذخیره session id - هر بار رفرش جدید میشه session_state = gr.State() # هدر اصلی gr.HTML("""
سیستم هوشمند تحلیل تداخلات دارویی و نتایج آزمایش
این سیستم صرفاً جهت اطلاعرسانی اولیه است و هیچگاه جایگزین مشاوره پزشک نمیشود. برای تصمیمگیریهای درمانی حتماً با پزشک متخصص مشورت کنید.