File size: 23,626 Bytes
a4cf7fd
6d36bb1
b55f8aa
a4cf7fd
b55f8aa
a4cf7fd
c6bc0d0
a4cf7fd
c6bc0d0
 
a4cf7fd
 
c6bc0d0
 
a4cf7fd
c6bc0d0
a4cf7fd
 
6d36bb1
a4cf7fd
 
c6bc0d0
a4cf7fd
c6bc0d0
a4cf7fd
c6bc0d0
 
a4cf7fd
 
 
 
 
 
 
 
 
 
 
 
 
 
998eef9
a4cf7fd
 
 
 
b55f8aa
 
 
 
 
a4cf7fd
 
 
 
 
6d36bb1
a4cf7fd
6d36bb1
71713c9
6d36bb1
b55f8aa
 
 
 
6d36bb1
b55f8aa
 
6d36bb1
b55f8aa
a4cf7fd
 
b55f8aa
a4cf7fd
 
 
 
 
 
 
 
b55f8aa
a4cf7fd
 
 
 
 
 
 
b55f8aa
c6bc0d0
b55f8aa
 
6d36bb1
a4cf7fd
c6bc0d0
a4cf7fd
6d36bb1
 
a4cf7fd
6d36bb1
 
 
c6bc0d0
6d36bb1
 
c6bc0d0
b55f8aa
6d36bb1
4a2ba1a
b55f8aa
 
6d36bb1
c6bc0d0
6d36bb1
 
 
b55f8aa
6d36bb1
 
a4cf7fd
6d36bb1
a4cf7fd
6d36bb1
a4cf7fd
6d36bb1
 
 
 
 
 
b55f8aa
4a2ba1a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a4cf7fd
 
 
 
 
 
 
b55f8aa
a4cf7fd
 
c6bc0d0
6d36bb1
 
 
 
 
 
 
 
c6bc0d0
a4cf7fd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6d36bb1
a4cf7fd
c6bc0d0
6d36bb1
c6bc0d0
6d36bb1
 
 
 
 
 
 
 
 
a4cf7fd
998eef9
a4cf7fd
 
 
 
 
 
b55f8aa
6d36bb1
a4cf7fd
 
 
 
 
6d36bb1
a4cf7fd
 
998eef9
a4cf7fd
 
c6bc0d0
a4cf7fd
c6bc0d0
6d36bb1
4a2ba1a
6d36bb1
 
 
4a2ba1a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a4cf7fd
 
998eef9
a4cf7fd
71713c9
a4cf7fd
71713c9
a4cf7fd
 
 
 
 
 
 
 
 
 
 
 
 
 
71713c9
a4cf7fd
 
 
 
 
 
71713c9
a4cf7fd
 
71713c9
c6bc0d0
48fea66
 
71713c9
a4cf7fd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
71713c9
a4cf7fd
 
 
71713c9
a4cf7fd
 
 
71713c9
a4cf7fd
71713c9
a4cf7fd
 
 
71713c9
a4cf7fd
 
71713c9
a4cf7fd
 
 
 
71713c9
998eef9
a4cf7fd
 
71713c9
a4cf7fd
 
 
 
 
 
71713c9
 
a4cf7fd
 
71713c9
a4cf7fd
 
 
 
71713c9
b55f8aa
4a2ba1a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a4cf7fd
 
71713c9
 
a4cf7fd
 
 
 
 
7950ff9
a4cf7fd
 
 
 
71713c9
a4cf7fd
 
7950ff9
a4cf7fd
 
71713c9
b55f8aa
7950ff9
 
 
71713c9
a4cf7fd
 
7950ff9
a4cf7fd
 
71713c9
 
a4cf7fd
7950ff9
a4cf7fd
 
71713c9
4a2ba1a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
71713c9
a4cf7fd
7950ff9
a4cf7fd
 
71713c9
 
a4cf7fd
7950ff9
a4cf7fd
 
71713c9
 
7950ff9
 
a4cf7fd
71713c9
7950ff9
48fea66
 
 
 
7950ff9
 
48fea66
 
7950ff9
c6bc0d0
b55f8aa
c6bc0d0
 
a4cf7fd
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
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("""
        <div class="main-header">
            <h1>🏥Nursa دستیار هوشمند پزشکی</h1>
            <p>سیستم هوشمند تحلیل تداخلات دارویی و نتایج آزمایش</p>
        </div>
        """)
        
        # هشدار مهم
        gr.HTML("""
        <div class="warning-box">
            <h3>⚠️ هشدار مهم</h3>
            <p>این سیستم صرفاً جهت اطلاع‌رسانی اولیه است و هیچ‌گاه جایگزین مشاوره پزشک نمی‌شود. 
            برای تصمیم‌گیری‌های درمانی حتماً با پزشک متخصص مشورت کنید.</p>
        </div>
        """)
        
        with gr.Tabs():
            # تب تداخل دارویی
            with gr.Tab("💊 بررسی تداخل دارویی"):
                with gr.Row():
                    with gr.Column(scale=2):
                        gr.HTML('<div class="feature-box"><h3>🔍 بررسی تداخل بین داروها</h3></div>')
                        
                        drug1_input = gr.Textbox(
                            label="نام دارو اول",
                            placeholder="مثال: آسپرین، پاراستامول، ...",
                            lines=1
                        )
                        
                        drug2_input = gr.Textbox(
                            label="نام دارو دوم", 
                            placeholder="مثال: وارفارین، دیکلوفناک، ...",
                            lines=1
                        )
                        
                        analyze_btn = gr.Button("🔬 تحلیل تداخل", variant="primary", size="lg")
                    
                    with gr.Column(scale=3):
                        drug_result = gr.Markdown(
                            value="نتیجه تحلیل اینجا نمایش داده می‌شود...",
                            label="نتیجه تحلیل"
                        )
            
            # تب تحلیل آزمایش
            with gr.Tab("🔬 تحلیل نتایج آزمایش"):
                with gr.Row():
                    with gr.Column(scale=2):
                        gr.HTML('<div class="feature-box"><h3>📋 آپلود و تحلیل نتایج آزمایش</h3></div>')
                        
                        image_input = gr.Image(
                            label="تصویر نتیجه آزمایش",
                            type="pil",
                            height=300
                        )
                        
                        analyze_lab_btn = gr.Button("🧪 تحلیل آزمایش", variant="primary", size="lg")
                    
                    with gr.Column(scale=3):
                        lab_result = gr.Markdown(
                            value="نتیجه تحلیل آزمایش اینجا نمایش داده می‌شود...",
                            label="نتیجه تحلیل"
                        )
            
            # تب تشخیص علائم
            with gr.Tab("🩺 تشخیص بر اساس علائم"):
                with gr.Row():
                    with gr.Column(scale=2):
                        gr.HTML('<div class="feature-box"><h3>💬 توضیح علائم شما</h3></div>')
                        
                        symptoms_input = gr.Textbox(
                            label="علائم و نشانه‌های شما",
                            placeholder="مثال: سردرد شدید، تب، گلودرد، سرفه خشک، ضعف عمومی...",
                            lines=4
                        )
                        
                        diagnose_btn = gr.Button("🔍 تشخیص علائم", variant="primary", size="lg")
                    
                    with gr.Column(scale=3):
                        symptom_result = gr.Markdown(
                            value="نتیجه تشخیص اینجا نمایش داده می‌شود...",
                            label="نتیجه تشخیص"
                        )
            
            # تب چت تشخیص علائم
            with gr.Tab("💬 چت تشخیص علائم"):
                with gr.Column():
                    gr.HTML('<div class="feature-box"><h3>🩺 چت با دستیار پزشکی</h3></div>')
                    
                    chatbot = gr.Chatbot(
                        label="مکالمه با دستیار پزشکی",
                        height=400
                    )
                    
                    msg_input = gr.Textbox(
                        label="پیام شما",
                        placeholder="علائم خود را توضیح دهید یا سؤالات بپرسید...",
                        lines=2
                    )
                    
                    with gr.Row():
                        send_btn = gr.Button("📤 ارسال", variant="primary")
                        clear_chat_btn = gr.Button("🗑️ پاک کردن چت", variant="secondary")
            
            # تب تاریخچه
            with gr.Tab("📊 تاریخچه و مدیریت"):
                with gr.Row():
                    with gr.Column():
                        gr.HTML('<div class="feature-box"><h3>📝 مدیریت تاریخچه</h3></div>')
                        
                        with gr.Row():
                            show_history_btn = gr.Button("📋 نمایش تاریخچه", variant="secondary")
                            clear_history_btn = gr.Button("🗑️ پاک کردن تاریخچه", variant="stop")
                            new_session_btn = gr.Button("🔄 جلسه جدید", variant="primary")
                        
                        history_display = gr.Markdown(
                            value="برای نمایش تاریخچه، روی دکمه مربوطه کلیک کنید.",
                            label="تاریخچه کاربر"
                        )
                        
                        session_info = gr.Textbox(
                            value="",
                            label="شناسه جلسه",
                            interactive=False
                        )
        
        def create_new_session():
            new_session_id = create_session()
            return new_session_id, f"Session ID: {new_session_id[:8].upper()}"
        
        # اتصال eventها
        analyze_btn.click(
            fn=analyze_drug_interaction,
            inputs=[drug1_input, drug2_input, session_state],
            outputs=drug_result
        )
        
        analyze_lab_btn.click(
            fn=analyze_lab_image,
            inputs=[image_input, session_state],
            outputs=lab_result
        )
        
        diagnose_btn.click(
            fn=symptom_diagnosis,
            inputs=[symptoms_input, session_state],
            outputs=symptom_result
        )
        
        send_btn.click(
            fn=symptom_chat,
            inputs=[msg_input, chatbot, session_state],
            outputs=[chatbot, msg_input]
        )

        msg_input.submit(
            fn=symptom_chat,
            inputs=[msg_input, chatbot, session_state], 
            outputs=[chatbot, msg_input]
        )

        clear_chat_btn.click(
            fn=lambda: ([], ""),
            outputs=[chatbot, msg_input]
        )
        
        show_history_btn.click(
            fn=get_user_history,
            inputs=session_state,
            outputs=history_display
        )
        
        clear_history_btn.click(
            fn=clear_user_history,
            inputs=session_state,
            outputs=history_display
        )
        
        new_session_btn.click(
            fn=create_new_session,
            outputs=[session_state, session_info]
        )
        
        # نمایش session id اولیه - هر بار رفرش جدید میشه
        def initialize_new_session():
            new_session_id = create_session()
            return new_session_id, f"Session ID: {new_session_id[:8].upper()}"
        
        app.load(
            fn=initialize_new_session,
            outputs=[session_state, session_info]
        )
    
    return app

if __name__ == "__main__":
    app = create_app()
    app.launch(
        server_name="0.0.0.0",
        server_port=7860,
        share=True,
        show_api=False
    )