المستوى: مبتدئ — لو لسّه ما جرّبتش Tool Use ولا تعرف يعني إيه نموذج "بينادي function"، المقال ده مكتوب ليك بالظبط.
Tool Use في Claude بيخلّي النموذج يطلب منك تنفيذ function في كودك ويستنّى النتيجة قبل ما يكمّل إجابته. ده الفرق اللي بيخلّي شات بوت بيرد بكلام عام يبقى Agent بيرد بأرقام حقيقية من DB أو طقس فعلي من API.
Tool Use في Claude للمبتدئ: من شات بوت بيتكلم لـ Agent بينفّذ
المشكلة باختصار
لو سألت Claude "إيه درجة الحرارة في القاهرة دلوقتي؟" بدون Tool Use، النموذج هيقولك "ما عنديش بيانات live". Claude مش متوصّل بالإنترنت ولا بأي حاجة عندك. كل اللي عنده هو الـ training data بتاعته اللي توقفت في تاريخ معيّن.
Tool Use بيحلّ المشكلة دي بطريقة بسيطة: انت بتعرّف للنموذج functions موجودة في كودك (زي get_weather أو query_database)، وهو لما يحتاج واحدة منهم بيقولك "نفّذ get_weather('Cairo')". انت بتنفّذها وترجّع النتيجة، وهو يكمّل الرد للمستخدم بالبيانات اللي جابها.
المثال البسيط: جرسون المطعم
تخيّل إنك قاعد في مطعم. الجرسون بيعرف الأكل في المنيو ويقدر يوصفهولك. لو سألته "البصارة معاكم؟" هيرد طبيعي. لكن لو سألته "كم باقي في المخزن من البصارة دلوقتي؟" هو ميقدرش يرد من ذاكرته. هيمشي للمطبخ، يسأل الشيف، يرجع يقولك "باقي 3 أطباق".
الجرسون = Claude. المطبخ = الـ tools (functions) عندك. Tool Use بيخلّي Claude "يمشي للمطبخ" لما السؤال يحتاج بيانات real-time مش موجودة في رأسه.
الحلوة في الموضوع: الجرسون مش بيرجع كل سؤال للمطبخ. بس لما يحس إن السؤال محتاج بيانات مش معاه. Claude بيعمل نفس الشيء — بيقرّر هو إمتى يستخدم الـ tool وإمتى يرد من معلوماته.
التعريف العلمي
Tool Use ميكانيكية في Anthropic API بتسمح للنموذج إنه يولّد tool_use block في الرد بدل النص العادي. الـ block ده فيه اسم الـ tool والـ input parameters في صيغة JSON. الكود بتاعك بيستلم الـ block، بينفّذ الـ function المقابلة محلياً، ويرجّع النتيجة لـ Claude في رسالة بنوع tool_result. النموذج يكمّل بناءً على النتيجة دي ويبني رد طبيعي للمستخدم.
الـ pattern ده مأخوذ من ReAct framework (Yao et al., 2022) — النموذج بيعمل Reasoning ثم Action ثم Observation وكرر. Anthropic عملته جزء أساسي من الـ API الرسمي وبتدعمه كل موديلات Claude 3.5 وما بعد.
الكود التنفيذي
هنبني tool بسيط بيرجّع طقس وهمي (تقدر تستبدله بـ OpenWeatherMap API بعدين). الكود ده شغّال على anthropic SDK 0.45+ مع موديل claude-sonnet-4-6:
import anthropic
client = anthropic.Anthropic()
tools = [
{
"name": "get_weather",
"description": "يرجّع درجة الحرارة الحالية لمدينة محددة بالسلسيوس.",
"input_schema": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "اسم المدينة بالعربي أو الإنجليزي"
}
},
"required": ["city"]
}
}
]
def get_weather(city: str) -> str:
fake_data = {"القاهرة": 32, "الإسكندرية": 27, "أسوان": 39}
return f"{fake_data.get(city, 25)} درجة سلسيوس"
messages = [{"role": "user", "content": "إيه الجو في الإسكندرية النهارده؟"}]
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
tools=tools,
messages=messages
)
if response.stop_reason == "tool_use":
tool_block = next(b for b in response.content if b.type == "tool_use")
result = get_weather(**tool_block.input)
messages.append({"role": "assistant", "content": response.content})
messages.append({
"role": "user",
"content": [{
"type": "tool_result",
"tool_use_id": tool_block.id,
"content": result
}]
})
final = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
tools=tools,
messages=messages
)
print(final.content[0].text)