Spaces:
Sleeping
Sleeping
| 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() | |