gaia-agent / tools.py
melassy's picture
Upload 6 files
ae459ff verified
import os
import re
import json
import logging
import math
import requests
from typing import List, Dict, Any, Optional, Union
logger = logging.getLogger("GAIA-Agent-Tools")
class Tool:
"""الفئة الأساسية للأدوات التي يمكن للعميل استخدامها."""
def __init__(self, name: str, description: str):
self.name = name
self.description = description
def __call__(self, *args, **kwargs) -> str:
"""تنفيذ الأداة وإرجاع النتيجة كنص."""
raise NotImplementedError("يجب تنفيذ طريقة __call__ في الفئة الفرعية")
class WebSearchTool(Tool):
"""أداة للبحث على الويب."""
def __init__(self, api_key: Optional[str] = None):
super().__init__(
name="web_search",
description="البحث على الويب عن معلومات. المدخلات يجب أن تكون استعلام بحث."
)
self.api_key = api_key or os.environ.get("SEARCH_API_KEY")
def __call__(self, query: str) -> str:
"""تنفيذ بحث على الويب وإرجاع النتائج."""
logger.info(f"البحث على الويب عن: {query}")
# محاكاة نتائج البحث بناءً على الاستعلام
if "تغير المناخ" in query.lower() or "climate change" in query.lower():
results = [
{"title": "تغير المناخ: الأسباب والآثار والحلول",
"snippet": "يتسبب تغير المناخ في المقام الأول بانبعاثات غازات الدفيئة. تشمل الآثار ارتفاع مستويات سطح البحر والطقس المتطرف واضطراب النظام البيئي.",
"url": "https://example.com/climate-change"},
{"title": "تقرير الهيئة الحكومية الدولية المعنية بتغير المناخ 2023",
"snippet": "يحذر أحدث تقرير للهيئة الحكومية الدولية المعنية بتغير المناخ من أن العمل العاجل ضروري للحد من الاحترار العالمي إلى 1.5 درجة مئوية. تشمل الحلول الطاقة المتجددة واحتجاز الكربون وتغييرات السياسة.",
"url": "https://example.com/ipcc-report"}
]
elif "لابتوب" in query.lower() or "laptop" in query.lower():
results = [
{"title": "أفضل أجهزة الكمبيوتر المحمولة للطلاب لعام 2025",
"snippet": "يعد Dell XPS 13 وHP Envy 13 وLenovo IdeaPad 5 من أفضل أجهزة الكمبيوتر المحمولة للطلاب تحت 800 دولار في عام 2025.",
"url": "https://example.com/best-laptops-students"},
{"title": "مقارنة بين أجهزة الكمبيوتر المحمولة بميزانية محدودة 2025",
"snippet": "مقارنة شاملة بين أجهزة الكمبيوتر المحمولة تحت 800 دولار، بما في ذلك المعالج وعمر البطارية وجودة الشاشة وخيارات التخزين.",
"url": "https://example.com/budget-laptop-comparison"}
]
elif "باريس" in query.lower() or "paris" in query.lower():
results = [
{"title": "دليل سياحي لباريس: أفضل المعالم والأنشطة",
"snippet": "تشمل أفضل المعالم السياحية في باريس برج إيفل ومتحف اللوفر وقوس النصر وكاتدرائية نوتردام وحديقة لوكسمبورج.",
"url": "https://example.com/paris-travel-guide"},
{"title": "خطة لقضاء 3 أيام في باريس",
"snippet": "دليل يوم بيوم لقضاء 3 أيام في باريس، بما في ذلك المعالم السياحية والمطاعم وأفضل الأنشطة.",
"url": "https://example.com/3-days-paris"}
]
else:
results = [
{"title": f"نتائج البحث عن {query}",
"snippet": f"المعلومات المتعلقة بـ {query} ستظهر هنا.",
"url": "https://example.com/search"},
{"title": f"المزيد حول {query}",
"snippet": f"تفاصيل إضافية حول {query} والمواضيع ذات الصلة.",
"url": "https://example.com/details"}
]
# تنسيق النتائج
formatted_results = []
for i, result in enumerate(results, 1):
formatted_results.append(f"{i}. {result['title']}\n {result['snippet']}\n الرابط: {result['url']}")
return "\n\n".join(formatted_results)
class CalculatorTool(Tool):
"""أداة لإجراء العمليات الحسابية."""
def __init__(self):
super().__init__(
name="calculator",
description="إجراء العمليات الحسابية. المدخلات يجب أن تكون تعبيرًا رياضيًا صالحًا مثل '2 + 2' أو 'sin(30)'."
)
def __call__(self, expression: str) -> str:
"""تقييم التعبير الرياضي وإرجاع النتيجة."""
logger.info(f"حساب التعبير: {expression}")
try:
# تنظيف التعبير
expression = expression.strip()
# استبدال الوظائف المعروفة
expression = expression.replace("^", "**")
expression = expression.replace("sin", "math.sin")
expression = expression.replace("cos", "math.cos")
expression = expression.replace("tan", "math.tan")
expression = expression.replace("sqrt", "math.sqrt")
expression = expression.replace("log", "math.log10")
expression = expression.replace("ln", "math.log")
expression = expression.replace("π", "math.pi")
expression = expression.replace("pi", "math.pi")
# تنفيذ التعبير بأمان
# ملاحظة: هذه ليست الطريقة الأكثر أمانًا، في التطبيق الحقيقي
# يجب استخدام مكتبة متخصصة مثل simpy
result = eval(expression, {"__builtins__": {}}, {"math": math})
return f"نتيجة {expression} = {result}"
except Exception as e:
logger.error(f"خطأ في حساب التعبير {expression}: {str(e)}")
return f"خطأ في حساب التعبير: {str(e)}"
class CodeExecutionTool(Tool):
"""أداة لتنفيذ كود Python."""
def __init__(self):
super().__init__(
name="code_exec",
description="تنفيذ كود Python وإرجاع النتيجة. المدخلات يجب أن تكون كود Python صالح."
)
def __call__(self, code: str) -> str:
"""تنفيذ كود Python وإرجاع النتيجة."""
logger.info("تنفيذ كود Python")
# في بيئة حقيقية، يجب استخدام بيئة رملية محمية
# هنا نستخدم محاكاة للتنفيذ
# تحقق من وجود أنماط معينة في الكود
if "fibonacci" in code:
# محاكاة تصحيح خوارزمية فيبوناتشي
return """نتيجة التنفيذ:
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
المشكلة في الكود الأصلي: كنت تستخدم عملية الطرح (-) بدلاً من الجمع (+) في حساب الأرقام التالية في متسلسلة فيبوناتشي.
الكود المصحح:
def fibonacci(n):
if n <= 0:
return []
elif n == 1:
return [0]
result = [0, 1]
for i in range(2, n):
result.append(result[i-1] + result[i-2])
return result
"""
elif "sort" in code or "quicksort" in code or "mergesort" in code:
# محاكاة تنفيذ خوارزمية الفرز
return """نتيجة التنفيذ:
المصفوفة الأصلية: [3, 1, 4, 1, 5, 9, 2, 6, 5, 3]
المصفوفة المرتبة: [1, 1, 2, 3, 3, 4, 5, 5, 6, 9]
تم تنفيذ الكود بنجاح في 0.003 ثانية.
"""
elif "x**2" in code or "x^2" in code or "معادلة" in code or "equation" in code:
# محاكاة حل معادلة
return """نتيجة التنفيذ:
تحليل معادلة x^2 - 4x + 4 = 0:
الخطوة 1: نحسب المميز (b^2 - 4ac)
المميز = (-4)^2 - 4*1*4 = 16 - 16 = 0
الخطوة 2: بما أن المميز = 0، فإن المعادلة لها حل واحد مكرر
x = -b / (2*a) = 4 / (2*1) = 2
إذن حل المعادلة هو: x = 2
"""
else:
# محاكاة تنفيذ كود عام
return f"""نتيجة التنفيذ:
تم تنفيذ الكود بنجاح.
المخرجات:
{code.splitlines()[0] if code.splitlines() else 'No output'}
...
[تم تنفيذ {len(code.splitlines())} سطر من الكود]
"""