File size: 3,151 Bytes
4bec409
 
7cfecec
4bec409
7cfecec
4bec409
7cfecec
4bec409
 
 
7cfecec
 
 
4bec409
 
7cfecec
4bec409
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7cfecec
 
 
4bec409
 
7cfecec
4bec409
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7cfecec
4bec409
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import re
from huggingface_hub import HfApi

def validate_hf_token(token: str):
    """
    التحقق من صحة توكن المستخدم وجلب بيانات الحساب لضمان صلاحية الاستهلاك.
    """
    if not token or not token.startswith("hf_"):
        return False, "⚠️ عذراً، يجب إدخال Hugging Face Token صحيح يبدأ بـ hf_"
    
    try:
        api = HfApi(token=token)
        user_info = api.whoami()
        username = user_info.get('name', 'User')
        return True, f"✅ تم الاتصال بنجاح. مرحباً كاتبنا المبدع: {username}"
    except Exception as e:
        return False, f"❌ خطأ في التحقق من الرمز: {str(e)}"

def clean_ai_output(text: str):
    """
    تنظيف مخرجات النماذج من العلامات الزائدة أو النصوص التقنية
    التي قد تظهر أثناء توليد النص الروائي.
    """
    if not text:
        return ""
    
    # إزالة علامات التفكير أو الوسوم التقنية إن وجدت
    text = re.sub(r'<\|thought\|>.*?<\|/thought\|>', '', text, flags=re.DOTALL)
    text = re.sub(r'\[SYSTEM_NOTE\].*?\[/SYSTEM_NOTE\]', '', text, flags=re.DOTALL)
    
    return text.strip()

def format_chat_history(chat_history):
    """
    تنسيق المحادثة الجماعية بين الوكلاء الـ 9 لعرضها في واجهة Gradio.
    يتم استخدام Markdown لتمييز الأدوار.
    """
    if not chat_history:
        return "جاري بدء النقاش بين الوكلاء..."

    formatted_output = ""
    
    # أيقونات مخصصة لكل وكيل لتمييزهم بصرياً
    icons = {
        "Analyst": "🔍",
        "Style_Guardian": "🛡️",
        "Architect": "📐",
        "Draft_Writer": "✍️",
        "Humanizer": "🎭",
        "Continuity_Guard": "⏳",
        "Psychologist": "🧠",
        "Critic": "⚖️",
        "Editor_In_Chief": "👑"
    }

    for message in chat_history:
        role = message.get("name", "Unknown")
        content = message.get("content", "")
        
        if not content:
            continue
            
        icon = icons.get(role, "🤖")
        
        # تنسيق مخصص لكل رسالة
        formatted_output += f"### {icon} {role}\n"
        formatted_output += f"{content}\n\n"
        formatted_output += "---\n\n"
        
    return formatted_output

def extract_final_story(chat_history):
    """
    محاولة استخراج النص الروائي النهائي المدمج من رسالة Editor-in-Chief الأخيرة.
    """
    if not chat_history:
        return "لم يتم توليد نص بعد."
    
    # نبحث عن آخر رسالة من رئيس التحرير أو آخر رسالة في الحوار
    for message in reversed(chat_history):
        if message.get("name") == "Editor_In_Chief" or message.get("role") == "assistant":
            return clean_ai_output(message.get("content", ""))
            
    return "فشل استخراج النص النهائي."