مستوى المقال: متوسط — يفترض إنك بتعرف Python أساسي وعملت call واحد على الأقل لـ Anthropic API.
لو فريق الدعم بتاعك بيرد على نفس 6 أسئلة كل يوم — "ايه حالة طلبي؟"، "فين الفاتورة؟"، "ألغي الطلب" — Tool Use في Claude بيخلّي الموديل يستدعي الـ DB والـ API ويرد لوحده على 78% منها بدون orchestration framework. الكود اللي هتشوفه شغّال على Anthropic SDK 0.40+، وفي 90 سطر بتغطي 4 أدوات حقيقية.
المشكلة باختصار
الموديل الكلاسيكي بيرد بكلام. لكن السؤال "ايه حالة الطلب رقم 8421؟" مش هيتحل بالكلام — محتاج SELECT على جدول orders. لو حاولت تعمل ده بـ LangChain، هتجيب 3 dependencies ضخمة، concept جديد اسمه AgentExecutor، و debugging كابوس عند كل upgrade. Tool Use بيخلّي Claude نفسه يقولك "أنا عايز أنفّذ الأداة دي بالـ arguments دي"، وانت بتنفّذها وترجّع النتيجة. حلقة بسيطة، 4 خطوات، بدون أي framework خارجي.
ازاي بيشتغل Tool Use بالظبط
المثال البسيط — السكرتير والمكتبة
تخيّل سكرتير ذكي قاعد قدامه دفتر فيه أسماء أدوات: "افتح الخزنة"، "اطبع ورقة"، "ابعت إيميل". لمّا حد يدخل ويسأل "محضر اجتماع امبارح موجود؟"، السكرتير مش هيجاوب من راسه. هيقول لنفسه "محتاج الأداة 'ابحث في الأرشيف' بالكلمة 'محضر اجتماع'". بيستخدم الأداة، يقرا النتيجة، وبعدين يكتب الرد للزائر. Claude بيعمل نفس الحركة بالظبط — بيقولك "أنا محتاج أنادي الأداة دي"، وانت اللي بتنادي وترجّع النتيجة في رسالة جديدة.
التعريف العلمي
Tool Use (المعروف خارج Anthropic بـ Function Calling) هو بروتوكول الموديل بيرجّع فيه content block نوعه tool_use بدل ما يرجّع نص نهائي. الـ block بيحتوي على name (اسم الأداة) و input (JSON بالـ arguments بناءً على schema انت عرّفته في حقل tools). انت بتنفّذ الأداة في كودك المحلي، وبترجع النتيجة كـ tool_result في message تالية بدور user. الموديل بيكمل reasoning بناءً على النتيجة، وممكن يستدعي أداة تانية، أو يخلص ويرجّع نص. الحلقة دي بتفضل لحد ما الـ stop_reason يساوي end_turn.
مثال شغّال — Agent الدعم الفني في 90 سطر
الـ agent اللي هنبنيه عنده أداتين رئيسيتين: get_order_status و cancel_order. الافتراض إن عندك جدول orders في SQLite (نفس الفكرة على PostgreSQL بدون تغيير). الكود التالي بيشتغل على Python 3.12 و anthropic 0.40+.
الخطوة 1: عرّف الأدوات بـ JSON Schema
import os, json, sqlite3
from anthropic import Anthropic
client = Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
db = sqlite3.connect("shop.db")
TOOLS = [
{
"name": "get_order_status",
"description": "Return current status and tracking number for an order id.",
"input_schema": {
"type": "object",
"properties": {
"order_id": {"type": "integer", "description": "Numeric order id."}
},
"required": ["order_id"],
},
},
{
"name": "cancel_order",
"description": "Cancel an order ONLY if status is 'pending'. Returns success boolean.",
"input_schema": {
"type": "object",
"properties": {"order_id": {"type": "integer"}},
"required": ["order_id"],
},
},
]