الدرس 8 من 9

الـ Agents و Tool Use

الخطوة من chatbot بيرد، لـ agent بينفذ.

الموديل لوحده محبوس في النص

Claude مايقدرش يعرف حالة أوردر رقم ١٠٢٤ في السيستم بتاعك، ولا يعمل حجز، ولا يحسب بدقة على داتا حقيقية. بس لو اديته أدوات (tools)، يقدر يقرر إمتى يستخدمها، وانت كودك اللي بينفذها فعلاً.

الدورة

  • بتبعت للموديل السؤال ووصف الأدوات المتاحة (اسمها، بتعمل إيه، ومحتاجة مدخلات إيه).
  • الموديل يقرر: يرد على طول، ولا يطلب يستخدم أداة بمدخلات معينة.
  • كودك ينفذ الأداة (استعلام من قاعدة بيانات، API، حساب) ويرجّع النتيجة للموديل.
  • الموديل يكمل: يستخدم أداة تانية أو يكتب الرد النهائي.
agent.py
from dotenv import load_dotenv
import anthropic

load_dotenv()
client = anthropic.Anthropic()

# ---- your real business logic (a fake DB here) ----
ORDERS = {"1024": {"status": "out for delivery", "eta": "today before 9 PM"},
          "1031": {"status": "processing", "eta": "in 2 days"}}

def get_order_status(order_id):
    order = ORDERS.get(order_id)
    return str(order) if order else "Order not found"

# ---- describe the tool to the model ----
tools = [{
    "name": "get_order_status",
    "description": "Get the current status and delivery estimate of a customer order.",
    "input_schema": {
        "type": "object",
        "properties": {"order_id": {"type": "string", "description": "The order number"}},
        "required": ["order_id"],
    },
}]

messages = [{"role": "user", "content": "الأوردر رقم 1024 هيوصل إمتى؟"}]

while True:
    reply = client.messages.create(model="claude-sonnet-5", max_tokens=500,
                                   tools=tools, messages=messages)
    if reply.stop_reason != "tool_use":          # model is done -> final answer
        print(reply.content[0].text)
        break

    messages.append({"role": "assistant", "content": reply.content})
    results = []
    for block in reply.content:
        if block.type == "tool_use":             # the model asked to use a tool
            output = get_order_status(**block.input)
            results.append({"type": "tool_result",
                            "tool_use_id": block.id, "content": output})
    messages.append({"role": "user", "content": results})

لاحظ إن الموديل مابينفذش حاجة بنفسه. هو بيطلب، وكودك هو اللي بيقرر ينفذ ولا لأ. وده مهم جداً للأمان: انت اللي ماسك الصلاحيات.

⚠ خلي بالك من الأدوات الخطيرةأداة بتقرا حالة أوردر حاجة، وأداة بتلغي أوردر أو بتحول فلوس حاجة تانية خالص. الأدوات اللي بتغيّر حاجات لازم يبقى فيها تأكيد من اليوزر، وحدود واضحة، و log لكل عملية. وأي نص جاي من برا (إيميل، صفحة ويب) ممكن يكون فيه تعليمات مدسوسة للموديل، فمتسيبهوش يعمل حاجة خطيرة بناءً عليه من غير مراجعة.

الـ Frameworks

الأداةبتستخدمها لإيه
LangChain / LangGraphبناء agents وسلاسل خطوات معقدة، ومعاها integrations كتير
LlamaIndexمتخصصة في RAG: تحميل المستندات وتقطيعها والبحث فيها
MCPبروتوكول مفتوح بيخلي أي أداة أو مصدر بيانات يتوصل بأي موديل بطريقة موحدة
💡 افهم قبل ما تستخدم frameworkالـ loop اللي فوق ده هو قلب أي agent. لو فهمته، أي framework هيبقى مجرد اختصارات فوقه، ولما حاجة تبوظ هتعرف تصلحها. ناس كتير بتبدأ بـ framework ومش فاهمة هو بيعمل إيه من جوه.
الدرس اللي فات