المستوى: مبتدئ
لو شات بوت شركتك بيرد بـ "مش معايا بيانات حديثة عن سعر الدولار النهارده"، انت مش محتاج تغيّر النموذج. انت محتاج Tool Use. في الـ 30 سطر اللي قدامك هتخلّي Claude يستدعي API الـ exchange rate بنفسه ويرجّع للعميل الرقم اللحظي، بدل ما يعتذر.
Tool Use: لما النموذج يبقى عارف يطلب مساعدة
Tool Use (المعروف برضو بـ Function Calling) هو ميكانيزم بيخلّي النموذج يقدر يستدعي دوال انت كاتبها بنفسك، بدل ما يحاول يتفلسف بمعلومات قديمة. النموذج بيقولّك "أنا محتاج استدعي دالة get_exchange_rate بالبراميتر USD/EGP"، انت بتشغّل الدالة وترجّعله النتيجة، وهو بيكمل الرد للمستخدم بلغة طبيعية.
مثال للمبتدئ: نادل المطعم
تخيّل نادل في مطعم. لما تسأله "في طبق فطار؟"، هو مش بيدخل المطبخ يطبخ. هو بيروح للطباخ ويسأله، الطباخ بيرد، النادل بيرجعلك بالرد. النموذج هنا هو النادل. الـ API الخارجي (سعر صرف، طقس، قاعدة بيانات داخلية) هو الطباخ. Tool Use بيدّي النموذج طريقة منظمة يكلّم بيها الطباخ، بدل ما يخمّن من نفسه.
الشرح العلمي بالظبط
الـ Tool Use بيتم على أربع مراحل بالتسلسل:
- انت بتعرّف الأدوات في الـ request: اسم الدالة، الوصف، الـ schema بتاع المدخلات بصيغة JSON Schema قياسية.
- النموذج بيقرر هل المهمة محتاجة أداة. لو آه، بيرجّع
stop_reason: "tool_use"ومعاه اسم الأداة والمدخلات اللي اقترحها. - كودك بيشغّل الدالة الفعلية بالمدخلات دي، وبيرجّع النتيجة في رسالة من نوع
tool_result. - النموذج بياخد النتيجة ويكمّل المحادثة بلغة طبيعية للمستخدم النهائي.
الفكرة الأساسية اللي لازم تركز عليها: النموذج مش بيشغّل كود بنفسه. هو بس بيقترح "اشغّل الدالة دي بالقيم دي". انت اللي بتشغّلها على سيرفرك، وانت اللي بتتحكم في الصلاحيات والـ rate limits.
الكود التنفيذي — 30 سطر شغّالة
import anthropic, requests
client = anthropic.Anthropic()
def get_exchange_rate(base: str, quote: str) -> dict:
url = f"https://open.er-api.com/v6/latest/{base}"
r = requests.get(url, timeout=4).json()
return {"pair": f"{base}/{quote}", "rate": r["rates"][quote]}
tools = [{
"name": "get_exchange_rate",
"description": "Get latest forex rate between two currencies (ISO 4217 codes, e.g. USD, EGP, EUR).",
"input_schema": {
"type": "object",
"properties": {
"base": {"type": "string", "description": "ISO 4217 code, e.g. USD"},
"quote": {"type": "string", "description": "ISO 4217 code, e.g. EGP"}
},
"required": ["base", "quote"]
}
}]
messages = [{"role": "user", "content": "كام الدولار قدام الجنيه دلوقتي؟"}]
resp = client.messages.create(model="claude-sonnet-4-6", max_tokens=512, tools=tools, messages=messages)
while resp.stop_reason == "tool_use":
tu = next(b for b in resp.content if b.type == "tool_use")
result = get_exchange_rate(**tu.input)
messages += [
{"role": "assistant", "content": resp.content},
{"role": "user", "content": [{"type": "tool_result", "tool_use_id": tu.id, "content": str(result)}]}
]
resp = client.messages.create(model="claude-sonnet-4-6", max_tokens=512, tools=tools, messages=messages)
print(next(b.text for b in resp.content if b.type == "text"))