Spaces:
Running
Running
Commit
·
4a2ba1a
1
Parent(s):
48fea66
Initial commit
Browse files
app.py
CHANGED
|
@@ -107,7 +107,7 @@ def get_user_history(session_id):
|
|
| 107 |
|
| 108 |
history_text = "# 📊 تاریخچه شما\n\n"
|
| 109 |
for i, (timestamp, query_type, input_text, response) in enumerate(results, 1):
|
| 110 |
-
emoji = "💊" if query_type == "drug_interaction" else "🔬"
|
| 111 |
history_text += f"## {emoji} مورد {i} - {timestamp}\n\n"
|
| 112 |
history_text += f"**ورودی:** {input_text[:100]}...\n\n"
|
| 113 |
history_text += f"**پاسخ:** {response[:200]}...\n\n---\n\n"
|
|
@@ -130,6 +130,27 @@ def clear_user_history(session_id):
|
|
| 130 |
logger.error(f"Error clearing history: {e}")
|
| 131 |
return "❌ خطا در پاک کردن تاریخچه"
|
| 132 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 133 |
def analyze_drug_interaction(drug1, drug2, session_id):
|
| 134 |
"""تحلیل تداخل دارویی"""
|
| 135 |
if not drug1.strip() or not drug2.strip():
|
|
@@ -236,10 +257,121 @@ def analyze_lab_image(image, session_id):
|
|
| 236 |
return f"# 🔬 تحلیل نتیجه آزمایش\n\n## متن استخراج شده:\n```\n{extracted_text}\n```\n\n## تحلیل:\n\n{result}"
|
| 237 |
|
| 238 |
except Exception as e:
|
| 239 |
-
error_msg = f" خطا در تحلیل تصویر: {str(e)}"
|
| 240 |
logger.error(error_msg)
|
| 241 |
return error_msg
|
| 242 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 243 |
# راهاندازی دیتابیس
|
| 244 |
init_database()
|
| 245 |
|
|
@@ -340,6 +472,46 @@ def create_app():
|
|
| 340 |
label="نتیجه تحلیل"
|
| 341 |
)
|
| 342 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 343 |
# تب تاریخچه
|
| 344 |
with gr.Tab("📊 تاریخچه و مدیریت"):
|
| 345 |
with gr.Row():
|
|
@@ -379,6 +551,29 @@ def create_app():
|
|
| 379 |
outputs=lab_result
|
| 380 |
)
|
| 381 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 382 |
show_history_btn.click(
|
| 383 |
fn=get_user_history,
|
| 384 |
inputs=session_state,
|
|
|
|
| 107 |
|
| 108 |
history_text = "# 📊 تاریخچه شما\n\n"
|
| 109 |
for i, (timestamp, query_type, input_text, response) in enumerate(results, 1):
|
| 110 |
+
emoji = "💊" if query_type == "drug_interaction" else "🔬" if query_type == "lab_analysis" else "💬"
|
| 111 |
history_text += f"## {emoji} مورد {i} - {timestamp}\n\n"
|
| 112 |
history_text += f"**ورودی:** {input_text[:100]}...\n\n"
|
| 113 |
history_text += f"**پاسخ:** {response[:200]}...\n\n---\n\n"
|
|
|
|
| 130 |
logger.error(f"Error clearing history: {e}")
|
| 131 |
return "❌ خطا در پاک کردن تاریخچه"
|
| 132 |
|
| 133 |
+
def get_chat_history(session_id):
|
| 134 |
+
"""دریافت تاریخچه چت برای حافظه مکالمه"""
|
| 135 |
+
try:
|
| 136 |
+
conn = sqlite3.connect("nurca.db")
|
| 137 |
+
cursor = conn.cursor()
|
| 138 |
+
cursor.execute('''SELECT input_text, response
|
| 139 |
+
FROM chat_history WHERE session_id = ? AND query_type = 'symptom_chat'
|
| 140 |
+
ORDER BY timestamp ASC LIMIT 10''', (session_id,))
|
| 141 |
+
results = cursor.fetchall()
|
| 142 |
+
conn.close()
|
| 143 |
+
|
| 144 |
+
chat_messages = []
|
| 145 |
+
for input_text, response in results:
|
| 146 |
+
chat_messages.append({"role": "user", "content": input_text})
|
| 147 |
+
chat_messages.append({"role": "assistant", "content": response})
|
| 148 |
+
|
| 149 |
+
return chat_messages
|
| 150 |
+
except Exception as e:
|
| 151 |
+
logger.error(f"Error getting chat history: {e}")
|
| 152 |
+
return []
|
| 153 |
+
|
| 154 |
def analyze_drug_interaction(drug1, drug2, session_id):
|
| 155 |
"""تحلیل تداخل دارویی"""
|
| 156 |
if not drug1.strip() or not drug2.strip():
|
|
|
|
| 257 |
return f"# 🔬 تحلیل نتیجه آزمایش\n\n## متن استخراج شده:\n```\n{extracted_text}\n```\n\n## تحلیل:\n\n{result}"
|
| 258 |
|
| 259 |
except Exception as e:
|
| 260 |
+
error_msg = f"❌ خطا در تحلیل تصویر: {str(e)}"
|
| 261 |
logger.error(error_msg)
|
| 262 |
return error_msg
|
| 263 |
|
| 264 |
+
def symptom_diagnosis(symptoms, session_id):
|
| 265 |
+
"""تشخیص بیماری بر اساس علائم"""
|
| 266 |
+
if not symptoms.strip():
|
| 267 |
+
return "⚠️ لطفاً علائم خود را توضیح دهید"
|
| 268 |
+
|
| 269 |
+
try:
|
| 270 |
+
prompt = f"""شما یک پزشک عمومی مهربان و با تجربه هستید. بیمار این علائم را دارد:
|
| 271 |
+
|
| 272 |
+
علائم: {symptoms}
|
| 273 |
+
|
| 274 |
+
لطفاً به شکل مهربان و دلگرم کننده موارد زیر را بررسی کنید:
|
| 275 |
+
1. احتمالیترین تشخیصها (با ذکر احتمال)
|
| 276 |
+
2. علائم تکمیلی که باید سؤال شود
|
| 277 |
+
3. راهنماییهای خانگی و خودمراقبتی
|
| 278 |
+
4. داروهای بدون نسخه که ممکن است کمک کند
|
| 279 |
+
5. چه زمانی حتماً باید به پزشک مراجعه کند
|
| 280 |
+
6. کلمات آرامشبخش و امیدوارانه
|
| 281 |
+
|
| 282 |
+
⚠️ تأکید کنید که این تشخیص اولیه است و باید با پزشک مشورت شود.
|
| 283 |
+
|
| 284 |
+
پاسخ را به زبان فارسی، مهربان و کامل بدهید. از کلمات دلگرم کننده استفاده کنید."""
|
| 285 |
+
|
| 286 |
+
completion = client.chat.completions.create(
|
| 287 |
+
extra_headers={
|
| 288 |
+
"HTTP-Referer": "https://medical-ai.com",
|
| 289 |
+
"X-Title": "Medical Symptom Analysis",
|
| 290 |
+
},
|
| 291 |
+
extra_body={},
|
| 292 |
+
model="openai/gpt-oss-20b:free",
|
| 293 |
+
messages=[
|
| 294 |
+
{
|
| 295 |
+
"role": "user",
|
| 296 |
+
"content": prompt
|
| 297 |
+
}
|
| 298 |
+
]
|
| 299 |
+
)
|
| 300 |
+
|
| 301 |
+
result = completion.choices[0].message.content
|
| 302 |
+
|
| 303 |
+
# ذخیره در دیتابیس
|
| 304 |
+
save_to_database(session_id, f"تشخیص علائم: {symptoms}", None, result, "symptom_diagnosis")
|
| 305 |
+
|
| 306 |
+
return f"# 🩺 تشخیص بر اساس علائم\n\n## علائم شما:\n{symptoms}\n\n## نظر پزشک:\n\n{result}"
|
| 307 |
+
|
| 308 |
+
except Exception as e:
|
| 309 |
+
error_msg = f"❌ خطا در تشخیص: {str(e)}"
|
| 310 |
+
logger.error(error_msg)
|
| 311 |
+
return error_msg
|
| 312 |
+
|
| 313 |
+
def symptom_chat(message, chat_history, session_id):
|
| 314 |
+
"""چت تعاملی برای تشخیص علائم"""
|
| 315 |
+
if not message.strip():
|
| 316 |
+
return chat_history, ""
|
| 317 |
+
|
| 318 |
+
try:
|
| 319 |
+
# دریافت تاریخچه از دیتابیس
|
| 320 |
+
db_history = get_chat_history(session_id)
|
| 321 |
+
|
| 322 |
+
# ساخت context از تاریخچه
|
| 323 |
+
context = "تاریخچه مکالمه قبلی:\n"
|
| 324 |
+
for msg in db_history[-6:]: # آخرین 6 پیام
|
| 325 |
+
if msg["role"] == "user":
|
| 326 |
+
context += f"بیمار: {msg['content']}\n"
|
| 327 |
+
else:
|
| 328 |
+
context += f"پزشک: {msg['content']}\n"
|
| 329 |
+
|
| 330 |
+
prompt = f"""شما یک پزشک مهربان هستید که با بیمار چت میکنید.
|
| 331 |
+
|
| 332 |
+
{context}
|
| 333 |
+
|
| 334 |
+
پیام جدید بیمار: {message}
|
| 335 |
+
|
| 336 |
+
لطفاً:
|
| 337 |
+
1. به پیام بیمار پاسخ مهربانانه دهید
|
| 338 |
+
2. سؤالات تکمیلی مناسب بپرسید
|
| 339 |
+
3. اگر اطلاعات کافی دارید، تشخیص احتمالی ارائه دهید
|
| 340 |
+
4. همیشه تأکید کنید که باید با پزشک مشورت شود
|
| 341 |
+
|
| 342 |
+
پاسخ کوتاه و مفید باشد."""
|
| 343 |
+
|
| 344 |
+
completion = client.chat.completions.create(
|
| 345 |
+
extra_headers={
|
| 346 |
+
"HTTP-Referer": "https://medical-ai.com",
|
| 347 |
+
"X-Title": "Medical Chat",
|
| 348 |
+
},
|
| 349 |
+
extra_body={},
|
| 350 |
+
model="openai/gpt-oss-20b:free",
|
| 351 |
+
messages=[
|
| 352 |
+
{
|
| 353 |
+
"role": "user",
|
| 354 |
+
"content": prompt
|
| 355 |
+
}
|
| 356 |
+
]
|
| 357 |
+
)
|
| 358 |
+
|
| 359 |
+
response = completion.choices[0].message.content
|
| 360 |
+
|
| 361 |
+
# ذخیره در دیتابیس
|
| 362 |
+
save_to_database(session_id, message, None, response, "symptom_chat")
|
| 363 |
+
|
| 364 |
+
# بروزرسانی چت
|
| 365 |
+
chat_history.append([message, response])
|
| 366 |
+
|
| 367 |
+
return chat_history, ""
|
| 368 |
+
|
| 369 |
+
except Exception as e:
|
| 370 |
+
error_msg = f"❌ خطا: {str(e)}"
|
| 371 |
+
logger.error(error_msg)
|
| 372 |
+
chat_history.append([message, error_msg])
|
| 373 |
+
return chat_history, ""
|
| 374 |
+
|
| 375 |
# راهاندازی دیتابیس
|
| 376 |
init_database()
|
| 377 |
|
|
|
|
| 472 |
label="نتیجه تحلیل"
|
| 473 |
)
|
| 474 |
|
| 475 |
+
# تب تشخیص علائم
|
| 476 |
+
with gr.Tab("🩺 تشخیص بر اساس علائم"):
|
| 477 |
+
with gr.Row():
|
| 478 |
+
with gr.Column(scale=2):
|
| 479 |
+
gr.HTML('<div class="feature-box"><h3>💬 توضیح علائم شما</h3></div>')
|
| 480 |
+
|
| 481 |
+
symptoms_input = gr.Textbox(
|
| 482 |
+
label="علائم و نشانههای شما",
|
| 483 |
+
placeholder="مثال: سردرد شدید، تب، گلودرد، سرفه خشک، ضعف عمومی...",
|
| 484 |
+
lines=4
|
| 485 |
+
)
|
| 486 |
+
|
| 487 |
+
diagnose_btn = gr.Button("🔍 تشخیص علائم", variant="primary", size="lg")
|
| 488 |
+
|
| 489 |
+
with gr.Column(scale=3):
|
| 490 |
+
symptom_result = gr.Markdown(
|
| 491 |
+
value="نتیجه تشخیص اینجا نمایش داده میشود...",
|
| 492 |
+
label="نتیجه تشخیص"
|
| 493 |
+
)
|
| 494 |
+
|
| 495 |
+
# تب چت تشخیص علائم
|
| 496 |
+
with gr.Tab("💬 چت تشخیص علائم"):
|
| 497 |
+
with gr.Column():
|
| 498 |
+
gr.HTML('<div class="feature-box"><h3>🩺 چت با دستیار پزشکی</h3></div>')
|
| 499 |
+
|
| 500 |
+
chatbot = gr.Chatbot(
|
| 501 |
+
label="مکالمه با دستیار پزشکی",
|
| 502 |
+
height=400
|
| 503 |
+
)
|
| 504 |
+
|
| 505 |
+
msg_input = gr.Textbox(
|
| 506 |
+
label="پیام شما",
|
| 507 |
+
placeholder="علائم خود را توضیح دهید یا سؤالات بپرسید...",
|
| 508 |
+
lines=2
|
| 509 |
+
)
|
| 510 |
+
|
| 511 |
+
with gr.Row():
|
| 512 |
+
send_btn = gr.Button("📤 ارسال", variant="primary")
|
| 513 |
+
clear_chat_btn = gr.Button("🗑️ پاک کردن چت", variant="secondary")
|
| 514 |
+
|
| 515 |
# تب تاریخچه
|
| 516 |
with gr.Tab("📊 تاریخچه و مدیریت"):
|
| 517 |
with gr.Row():
|
|
|
|
| 551 |
outputs=lab_result
|
| 552 |
)
|
| 553 |
|
| 554 |
+
diagnose_btn.click(
|
| 555 |
+
fn=symptom_diagnosis,
|
| 556 |
+
inputs=[symptoms_input, session_state],
|
| 557 |
+
outputs=symptom_result
|
| 558 |
+
)
|
| 559 |
+
|
| 560 |
+
send_btn.click(
|
| 561 |
+
fn=symptom_chat,
|
| 562 |
+
inputs=[msg_input, chatbot, session_state],
|
| 563 |
+
outputs=[chatbot, msg_input]
|
| 564 |
+
)
|
| 565 |
+
|
| 566 |
+
msg_input.submit(
|
| 567 |
+
fn=symptom_chat,
|
| 568 |
+
inputs=[msg_input, chatbot, session_state],
|
| 569 |
+
outputs=[chatbot, msg_input]
|
| 570 |
+
)
|
| 571 |
+
|
| 572 |
+
clear_chat_btn.click(
|
| 573 |
+
fn=lambda: ([], ""),
|
| 574 |
+
outputs=[chatbot, msg_input]
|
| 575 |
+
)
|
| 576 |
+
|
| 577 |
show_history_btn.click(
|
| 578 |
fn=get_user_history,
|
| 579 |
inputs=session_state,
|