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 "فشل استخراج النص النهائي."