File size: 5,128 Bytes
ec7a35a
4d84df7
 
ec7a35a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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()