Riy777 commited on
Commit
52853dc
·
verified ·
1 Parent(s): 1e57138

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +190 -0
app.py ADDED
@@ -0,0 +1,190 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from openai import OpenAI
3
+ import os
4
+ import time
5
+ import requests
6
+ from bs4 import BeautifulSoup
7
+ import json
8
+
9
+ # قم بقراءة المفتاح من متغيرات البيئة بشكل آمن
10
+ NVIDIA_API_KEY = os.getenv("NVIDIA_API_KEY")
11
+
12
+ # تحقق من وجود المفتاح قبل البدء
13
+ if not NVIDIA_API_KEY:
14
+ raise ValueError("NVIDIA API Key not found in environment variables. Please set it in Hugging Face Space secrets.")
15
+
16
+ # إعداد العميل للاتصال بـ API
17
+ client = OpenAI(
18
+ base_url="https://integrate.api.nvidia.com/v1",
19
+ api_key=NVIDIA_API_KEY
20
+ )
21
+
22
+ MODEL_NAME = "qwen/qwen3-next-80b-a3b-thinking"
23
+
24
+ # دالة لتحديث الواجهة في Gradio
25
+ def update_ui_output(output_box, new_text):
26
+ # استخدام yield لإظهار التحديثات المتتالية
27
+ yield from output_box.update(value=output_box.value + new_text + "\n")
28
+
29
+ # دالة مساعدة لاستدعاء نموذج NVIDIA LLM
30
+ def call_nvidia_llm(prompt, stream=False, max_tokens=4096):
31
+ messages = [{"role": "user", "content": prompt}]
32
+
33
+ # استدعاء API
34
+ completion = client.chat.completions.create(
35
+ model=MODEL_NAME,
36
+ messages=messages,
37
+ temperature=0.6,
38
+ top_p=0.7,
39
+ max_tokens=max_tokens,
40
+ stream=stream
41
+ )
42
+
43
+ # إذا كان الرد متدفقًا (streaming)
44
+ if stream:
45
+ for chunk in completion:
46
+ reasoning = getattr(chunk.choices[0].delta, "reasoning_content", None)
47
+ if reasoning:
48
+ yield reasoning
49
+ if chunk.choices[0].delta.content is not None:
50
+ yield chunk.choices[0].delta.content
51
+ # إذا كان الرد كاملاً
52
+ else:
53
+ full_response = ""
54
+ for chunk in completion:
55
+ full_response += chunk.choices[0].delta.content if chunk.choices[0].delta.content is not None else ""
56
+ return full_response
57
+
58
+ # ----------------- الطبقات الأربعة للوكيل -----------------
59
+
60
+ # الطبقة الأولى: توليد الخطة
61
+ def generate_plan(user_request):
62
+ prompt = f"""
63
+ أنت وكيل ذكاء اصطناعي مكلف بتحويل طلبات المستخدمين إلى خطط عمل مفصلة. طلب المستخدم هو: '{user_request}'.
64
+ أنشئ خطة مفصلة تتضمن خطوات متسلسلة وقابلة للتنفيذ خطوة بخطوة. يجب أن تكون الخطة دقيقة وتأخذ في الاعتبار أي متطلبات خاصة.
65
+ مثال:
66
+ 1. البحث عن أحدث الإيردروبات.
67
+ 2. تحديد إيردروب مناسب.
68
+ 3. طلب معلومات من المستخدم (مثل عنوان المحفظة).
69
+ 4. تنفيذ مهام الإيردروب.
70
+ 5. التحقق من إكمال المهمة.
71
+
72
+ الآن، أنشئ خطة لطلب المستخدم: '{user_request}'.
73
+ """
74
+ return call_nvidia_llm(prompt)
75
+
76
+ # الطبقة الثانية: التكيف وتوليد الأوامر
77
+ def generate_commands(plan_text, current_step_index):
78
+ prompt = f"""
79
+ الخطة الكاملة هي:
80
+ {plan_text}
81
+
82
+ الخطوة الحالية التي يجب تنفيذها هي الخطوة رقم {current_step_index + 1}. مهمتك هي تحويل هذه الخطوة إلى أوامر تنفيذية محددة.
83
+ استخدم أدوات برمجية مثل 'requests' و 'BeautifulSoup' للبحث واستخراج البيانات من الويب.
84
+ لا تستخدم متصفحات كاملة. إذا كانت الخطوة تتطلب معلومات من المستخدم، قم بإنشاء أمر يطلبها.
85
+
86
+ مثال:
87
+ الخطوة: "البحث عن أحدث الإيردروبات."
88
+ الأوامر: "استخدم مكتبة 'requests' للبحث في جوجل عن 'أحدث ايردروبات العملات الرقمية'. ثم استخدم 'BeautifulSoup' لتحليل نتائج البحث واستخراج الروابط."
89
+
90
+ الآن، حول الخطوة الحالية إلى أوامر:
91
+ """
92
+ return call_nvidia_llm(prompt)
93
+
94
+ # الطبقة الثالثة: التنفيذ (تمثيل بسيط)
95
+ def execute_commands(commands_text):
96
+ # هذا جزء تمثيلي، يجب أن يتم تطويره ليكون أكثر تعقيدًا
97
+ if "requests" in commands_text and "google" in commands_text:
98
+ try:
99
+ response = requests.get("https://www.google.com/search?q=أحدث+ايردروبات+العملات+الرقمية")
100
+ soup = BeautifulSoup(response.text, 'html.parser')
101
+ # هنا يمكنك إضافة منطق لتحليل النتائج الفعلية
102
+ return "✅ تم تنفيذ أمر البحث بنجاح (تمثيلي)."
103
+ except Exception as e:
104
+ return f"❌ فشل التنفيذ: {str(e)}"
105
+
106
+ # يمكنك إضافة منطق أكثر تعقيدًا للتعامل مع أوامر مختلفة
107
+ return "✅ تم تنفيذ الأوامر بنجاح (تمثيلي)."
108
+
109
+ # الطبقة الرابعة: المراجعة والتصحيح
110
+ def review_and_correct(original_plan, execution_result):
111
+ prompt = f"""
112
+ الخطة الأصلية كانت:
113
+ {original_plan}
114
+
115
+ نتيجة التنفيذ كانت:
116
+ {execution_result}
117
+
118
+ هل تم تحقيق هدف الخطوة؟ إذا كانت الإجابة لا، ما هو سبب الفشل؟
119
+ قدم خطة تصحيح جديدة أو عدّل الخطة الأصلية لتجاوز الفشل وإكمال المهمة.
120
+ إذا كانت النتيجة 'تم التنفيذ بنجاح'، فقدم ملخصًا مختصرًا لما تم إنجازه.
121
+ """
122
+ return call_nvidia_llm(prompt)
123
+
124
+ # ----------------- دالة تشغيل الوكيل الرئيسية -----------------
125
+
126
+ def run_agent(user_request, progress_bar, output_box):
127
+ # تحديث واجهة Gradio
128
+ yield from output_box.update(value="")
129
+
130
+ # --- الطبقة الأولى: توليد الخطة ---
131
+ yield from update_ui_output(output_box, "🔍 مرحلة التخطيط: يتم الآن توليد خطة عمل للوكيل...")
132
+ yield from progress_bar.update(value=25, label="25% - جاري التخطيط")
133
+ plan_text = generate_plan(user_request)
134
+ yield from update_ui_output(output_box, "✅ تم توليد الخطة بنجاح:\n" + plan_text)
135
+ time.sleep(1) # تأخير بسيط للعرض
136
+
137
+ # --- الطبقة الثانية: التكيف وتوليد الأوامر ---
138
+ yield from update_ui_output(output_box, "\n⚙️ مرحلة التكيف: يتم الآن تحويل الخطة إلى أوامر تنفيذية...")
139
+ yield from progress_bar.update(value=50, label="50% - جاري التكيف")
140
+
141
+ # يمكنك تكرار هذا الجزء لتنفيذ كل خطوة في الخطة
142
+ # مثال بسيط لتنفيذ أول خطوة فقط
143
+ commands_text = generate_commands(plan_text, 0)
144
+ yield from update_ui_output(output_box, "✅ تم توليد الأوامر بنجاح:\n" + commands_text)
145
+ time.sleep(1)
146
+
147
+ # --- الطبقة الثالثة: التنفيذ ---
148
+ yield from update_ui_output(output_box, "\n🚀 مرحلة التنفيذ: جاري تنفيذ الأوامر...")
149
+ yield from progress_bar.update(value=75, label="75% - جاري التنفيذ")
150
+ execution_result = execute_commands(commands_text)
151
+ yield from update_ui_output(output_box, "✅ نتيجة التنفيذ:\n" + execution_result)
152
+ time.sleep(1)
153
+
154
+ # --- الطبقة الرابعة: المراجعة والتصحيح ---
155
+ yield from update_ui_output(output_box, "\n🔄 مرحلة المراجعة: يتم مراجعة النتائج...")
156
+ yield from progress_bar.update(value=100, label="100% - اكتملت المراجعة")
157
+ review_and_correction_text = review_and_correct(plan_text, execution_result)
158
+ yield from update_ui_output(output_box, "✅ تقرير المراجعة:\n" + review_and_correction_text)
159
+
160
+ yield from output_box.update(value=output_box.value + "\n\n🎉 تم اكتمال مهمة الوكيل بنجاح!")
161
+
162
+ # ----------------- إعداد واجهة Gradio -----------------
163
+
164
+ with gr.Blocks(theme=gr.themes.Soft()) as demo:
165
+ gr.Markdown("# وكيل ذكاء اصطناعي مرن")
166
+ gr.Markdown("أدخل طلبك ليقوم الوكيل بتحويله إلى خطة عمل، تنفيذها، ومراجعتها تلقائيًا.")
167
+
168
+ with gr.Row():
169
+ user_input = gr.Textbox(
170
+ label="طلبك للوكيل",
171
+ placeholder="مثال: أريد وكيل يجلب لي ايردروبات ويقوم بتنفيذ المهام."
172
+ )
173
+
174
+ run_button = gr.Button("🚀 تشغيل الوكيل")
175
+
176
+ with gr.Column():
177
+ progress_bar = gr.Progress(label="حالة المهمة")
178
+ output_box = gr.Textbox(
179
+ label="سير عمل الوكيل (الطبقات الأربعة)",
180
+ interactive=False,
181
+ lines=20
182
+ )
183
+
184
+ run_button.click(
185
+ fn=run_agent,
186
+ inputs=[user_input, progress_bar, output_box],
187
+ outputs=output_box
188
+ )
189
+
190
+ demo.launch()