import gradio as gr # تأكد أن المكتبة تسمى pyautogen في requirements ولكن تُستدعى كـ autogen import autogen from agents_config import create_agents from utils import validate_hf_token, format_chat_history def run_novel_completion(novel_text, hf_token, request: gr.Request): """ الوظيفة الرئيسية التي تشغل Pipeline """ # 1. التحقق من التوكن if not hf_token: # محاولة جلب التوكن من جلسة تسجيل الدخول (OAuth) إذا توفرت if request and request.username: # ملاحظة: الحصول على التوكن الفعلي من OAuth يتطلب إعدادات خاصة، # هنا سنعتمد على الإدخال اليدوي أو التوكن الممرر لضمان العمل pass return "الرجاء تسجيل الدخول أو إدخال HF Token الخاص بك.", "" is_valid, msg = validate_hf_token(hf_token) if not is_valid: return msg, "" # 2. إنشاء الوكلاء try: agents = create_agents(hf_token) except Exception as e: return f"حدث خطأ أثناء إعداد الوكلاء: {str(e)}", "" # 3. إعداد مجموعة الدردشة (GroupChat) groupchat = autogen.GroupChat( agents=[ agents["analyst"], agents["architect"], agents["style_guardian"], agents["draft_writer"], agents["humanizer"], agents["psychologist"], agents["continuity_guard"], agents["critic"], agents["editor"] ], messages=[], max_round=12, # عدد جولات المحادثة speaker_selection_method="auto" # أو يمكنك تحديد 'round_robin' ) manager = autogen.GroupChatManager(groupchat=groupchat, llm_config=agents["editor"].llm_config) # 4. بدء العملية # الرسالة الأولية التي يوجهها المستخدم (أنت) إلى المدير (Editor) initial_message = f""" إليك رواية غير مكتملة. أريد منك قيادة فريقك لإكمال الفصل التالي. النص الأصلي: "{novel_text}" الخطوات المطلوبة: 1. اطلب من Analyst تحليل النص. 2. اطلب من Architect و Style Guardian التخطيط. 3. دع Draft Writer يكتب المسودة. 4. مررها لـ Psychologist و Humanizer و Continuity Guard للتحسين. 5. اطلب من Critic المراجعة النهائية. 6. قدم لي النص النهائي المكتمل. """ # بدء المحادثة try: chat_result = agents["editor"].initiate_chat( manager, message=initial_message ) # استخراج النتائج full_history = format_chat_history(chat_result.chat_history) # محاولة استخراج آخر رسالة كنص نهائي final_text = chat_result.chat_history[-1]['content'] return full_history, final_text except Exception as e: return f"حدث خطأ أثناء المعالجة: {str(e)}\nتأكد من أن النماذج المختارة متاحة ولديها رصيد كافٍ.", "" # --- واجهة المستخدم --- with gr.Blocks(css="assets/custom.css", title="إكمال الروايات بالذكاء الاصطناعي") as demo: gr.Markdown("# 🖋️ استوديو إكمال الروايات - AI Novel Studio") gr.Markdown("منصة تعتمد على AutoGen ونخبة من النماذج لإكمال روايتك بأسلوبك الخاص.") with gr.Row(): with gr.Column(scale=1): hf_token_input = gr.Textbox( label="Hugging Face Token (Write Access)", type="password", placeholder="hf_..." ) gr.Markdown("*يتم استخدام التوكن الخاص بك فقط لاستدعاء النماذج ولن يتم تخزينه.*") with gr.Column(scale=3): novel_input = gr.Textbox( label="النص غير المكتمل", lines=10, placeholder="الصق نص الرواية هنا..." ) submit_btn = gr.Button("ابدأ البناء القصصي 🚀", variant="primary") with gr.Row(): with gr.Column(): gr.Markdown("### 🧠 سجل تفكير الوكلاء (Agent Workspace)") logs_output = gr.Markdown(label="سير العمل") with gr.Column(): gr.Markdown("### 📖 النص النهائي (Final Draft)") final_output = gr.TextArea(label="النتيجة", show_copy_button=True) submit_btn.click( fn=run_novel_completion, inputs=[novel_input, hf_token_input], outputs=[logs_output, final_output] ) if __name__ == "__main__": demo.launch()