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() |