File size: 8,986 Bytes
52853dc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cc796d9
 
52853dc
 
 
 
 
30a03bf
52853dc
 
 
 
 
 
30a03bf
52853dc
 
 
 
 
 
 
 
 
30a03bf
52853dc
 
 
 
 
 
30a03bf
52853dc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30a03bf
52853dc
 
 
 
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
import gradio as gr
from openai import OpenAI
import os
import time
import requests
from bs4 import BeautifulSoup
import json

# قم بقراءة المفتاح من متغيرات البيئة بشكل آمن
NVIDIA_API_KEY = os.getenv("NVIDIA_API_KEY")

# تحقق من وجود المفتاح قبل البدء
if not NVIDIA_API_KEY:
    raise ValueError("NVIDIA API Key not found in environment variables. Please set it in Hugging Face Space secrets.")

# إعداد العميل للاتصال بـ API
client = OpenAI(
    base_url="https://integrate.api.nvidia.com/v1",
    api_key=NVIDIA_API_KEY
)

MODEL_NAME = "qwen/qwen3-next-80b-a3b-thinking"

# دالة لتحديث الواجهة في Gradio
def update_ui_output(output_box, new_text):
    # استخدام yield لإظهار التحديثات المتتالية
    yield from output_box.update(value=output_box.value + new_text + "\n")

# دالة مساعدة لاستدعاء نموذج NVIDIA LLM
def call_nvidia_llm(prompt, stream=False, max_tokens=4096):
    messages = [{"role": "user", "content": prompt}]
    
    # استدعاء API
    completion = client.chat.completions.create(
        model=MODEL_NAME,
        messages=messages,
        temperature=0.6,
        top_p=0.7,
        max_tokens=max_tokens,
        stream=stream
    )
    
    # إذا كان الرد متدفقًا (streaming)
    if stream:
        for chunk in completion:
            reasoning = getattr(chunk.choices[0].delta, "reasoning_content", None)
            if reasoning:
                yield reasoning
            if chunk.choices[0].delta.content is not None:
                yield chunk.choices[0].delta.content
    # إذا كان الرد كاملاً
    else:
        full_response = ""
        for chunk in completion:
            full_response += chunk.choices[0].delta.content if chunk.choices[0].delta.content is not None else ""
        return full_response

# ----------------- الطبقات الأربعة للوكيل -----------------

# الطبقة الأولى: توليد الخطة
def generate_plan(user_request):
    prompt = f"""
أنت وكيل ذكاء اصطناعي مكلف بتحويل طلبات المستخدمين إلى خطط عمل مفصلة. طلب المستخدم هو: '{user_request}'.
أنشئ خطة مفصلة تتضمن خطوات متسلسلة وقابلة للتنفيذ خطوة بخطوة. يجب أن تكون الخطة دقيقة وتأخذ في الاعتبار أي متطلبات خاصة.
مثال:
1.  البحث عن أحدث الإيردروبات.
2.  تحديد إيردروب مناسب.
3.  طلب معلومات من المستخدم (مثل عنوان المحفظة).
4.  تنفيذ مهام الإيردروب.
5.  التحقق من إكمال المهمة.

الآن، أنشئ خطة لطلب المستخدم: '{user_request}'.
"""
    return call_nvidia_llm(prompt)

# الطبقة الثانية: التكيف وتوليد الأوامر
def generate_commands(plan_text, current_step_index):
    prompt = f"""
الخطة الكاملة هي:
{plan_text}

الخطوة الحالية التي يجب تنفيذها هي الخطوة رقم {current_step_index + 1}. مهمتك هي تحويل هذه الخطوة إلى أوامر تنفيذية محددة.
استخدم أدوات برمجية مثل 'requests' و 'BeautifulSoup' للبحث واستخراج البيانات من الويب.
لا تستخدم متصفحات كاملة. إذا كانت الخطوة تتطلب معلومات من المستخدم، قم بإنشاء أمر يطلبها.

مثال:
الخطوة: "البحث عن أحدث الإيردروبات."
الأوامر: "استخدم مكتبة 'requests' للبحث في جوجل عن 'أحدث ايردروبات العملات الرقمية'. ثم استخدم 'BeautifulSoup' لتحليل نتائج البحث واستخراج الروابط."

الآن، حول الخطوة الحالية إلى أوامر:
"""
    return call_nvidia_llm(prompt)

# الطبقة الثالثة: التنفيذ (تمثيل بسيط)
def execute_commands(commands_text):
    # هذا جزء تمثيلي، يجب أن يتم تطويره ليكون أكثر تعقيدًا
    if "requests" in commands_text and "google" in commands_text:
        try:
            response = requests.get("https://www.google.com/search?q=أحدث+ايردروبات+العملات+الرقمية")
            soup = BeautifulSoup(response.text, 'html.parser')
            # هنا يمكنك إضافة منطق لتحليل النتائج الفعلية
            return "✅ تم تنفيذ أمر البحث بنجاح (تمثيلي)."
        except Exception as e:
            return f"❌ فشل التنفيذ: {str(e)}"
    
    # يمكنك إضافة منطق أكثر تعقيدًا للتعامل مع أوامر مختلفة
    return "✅ تم تنفيذ الأوامر بنجاح (تمثيلي)."

# الطبقة الرابعة: المراجعة والتصحيح
def review_and_correct(original_plan, execution_result):
    prompt = f"""
الخطة الأصلية كانت:
{original_plan}

نتيجة التنفيذ كانت:
{execution_result}

هل تم تحقيق هدف الخطوة؟ إذا كانت الإجابة لا، ما هو سبب الفشل؟
قدم خطة تصحيح جديدة أو عدّل الخطة الأصلية لتجاوز الفشل وإكمال المهمة.
إذا كانت النتيجة 'تم التنفيذ بنجاح'، فقدم ملخصًا مختصرًا لما تم إنجازه.
"""
    return call_nvidia_llm(prompt)

# ----------------- دالة تشغيل الوكيل الرئيسية -----------------
# تم تعديل ترتيب المعلمات
def run_agent(user_request, output_box, progress=gr.Progress()):
    # تحديث واجهة Gradio
    yield from output_box.update(value="")
    
    # --- الطبقة الأولى: توليد الخطة ---
    yield from update_ui_output(output_box, "🔍 مرحلة التخطيط: يتم الآن توليد خطة عمل للوكيل...")
    progress.update(0.25, label="25% - جاري التخطيط")
    plan_text = generate_plan(user_request)
    yield from update_ui_output(output_box, "✅ تم توليد الخطة بنجاح:\n" + plan_text)
    time.sleep(1) # تأخير بسيط للعرض
    
    # --- الطبقة الثانية: التكيف وتوليد الأوامر ---
    yield from update_ui_output(output_box, "\n⚙️ مرحلة التكيف: يتم الآن تحويل الخطة إلى أوامر تنفيذية...")
    progress.update(0.5, label="50% - جاري التكيف")
    
    # يمكنك تكرار هذا الجزء لتنفيذ كل خطوة في الخطة
    # مثال بسيط لتنفيذ أول خطوة فقط
    commands_text = generate_commands(plan_text, 0)
    yield from update_ui_output(output_box, "✅ تم توليد الأوامر بنجاح:\n" + commands_text)
    time.sleep(1)
    
    # --- الطبقة الثالثة: التنفيذ ---
    yield from update_ui_output(output_box, "\n🚀 مرحلة التنفيذ: جاري تنفيذ الأوامر...")
    progress.update(0.75, label="75% - جاري التنفيذ")
    execution_result = execute_commands(commands_text)
    yield from update_ui_output(output_box, "✅ نتيجة التنفيذ:\n" + execution_result)
    time.sleep(1)
    
    # --- الطبقة الرابعة: المراجعة والتصحيح ---
    yield from update_ui_output(output_box, "\n🔄 مرحلة المراجعة: يتم مراجعة النتائج...")
    progress.update(1.0, label="100% - اكتملت المراجعة")
    review_and_correction_text = review_and_correct(plan_text, execution_result)
    yield from update_ui_output(output_box, "✅ تقرير المراجعة:\n" + review_and_correction_text)
    
    yield from output_box.update(value=output_box.value + "\n\n🎉 تم اكتمال مهمة الوكيل بنجاح!")
    
# ----------------- إعداد واجهة Gradio -----------------

with gr.Blocks(theme=gr.themes.Soft()) as demo:
    gr.Markdown("# وكيل ذكاء اصطناعي مرن")
    gr.Markdown("أدخل طلبك ليقوم الوكيل بتحويله إلى خطة عمل، تنفيذها، ومراجعتها تلقائيًا.")
    
    with gr.Row():
        user_input = gr.Textbox(
            label="طلبك للوكيل",
            placeholder="مثال: أريد وكيل يجلب لي ايردروبات ويقوم بتنفيذ المهام."
        )
    
    run_button = gr.Button("🚀 تشغيل الوكيل")
    
    with gr.Column():
        output_box = gr.Textbox(
            label="سير عمل الوكيل (الطبقات الأربعة)",
            interactive=False,
            lines=20
        )
    
    run_button.click(
        fn=run_agent,
        inputs=[user_input, output_box],
        outputs=output_box
    )

demo.launch()