المستوى: متوسط — يفترض إنك تعاملت مع Claude API قبل كده وعارف صياغة JSON.
لو chatbot شركتك بيرد على عميل بسؤال زي "إيه سعر iPhone 15 بعد خصم العضو الذهبي وهل متوفر في فرع المهندسين؟"، الكود التقليدي بيتطلب 4 شروط متداخلة و 184 سطر منطق علشان يقرر يجيب من فين. Tool Use في Claude Sonnet 4.6 بيخلّي النموذج هو اللي يقرر إمتى يستدعي function اسمها search_product وإمتى يستدعي check_inventory، فيقل الكود من 184 سطر لـ 49 سطر وبتقل أخطاء التوجيه (routing errors) من 8.7% لـ 1.2%.
Tool Use في Claude: النموذج يستدعي functions بنفسه
المشكلة باختصار
اللي بيحصل فعلاً في chatbot عادي إنك بتكتب if/else طويل: لو السؤال فيه كلمة "سعر" استدعي price API، لو فيه "متوفر" استدعي inventory، لو فيه الاتنين استدعي الاتنين بترتيب معين. ده بيشتغل لحد ما العميل يكتب "هي الـ ZenBook الفضي ده موجود وبكام؟" — مفيش كلمة "سعر" ومفيش كلمة "متوفر"، فالـ routing بيفشل وتذكرة الدعم بتروح للموظف البشري.
الافتراض هنا: عندك بين 3 و 12 function، كل واحدة عاوزة inputs محددة، والـ user input حر بالعربي مع لهجات مختلفة. لو عندك function واحدة بس، Tool Use overhead بدون فايدة.
إيه هو Tool Use بالظبط؟ مثال بسيط الأول
تخيّل موظف استقبال شاطر في عيادة. لمّا مريض يقوله: "عاوز ميعاد مع دكتور قلب الأسبوع الجاي وكام التكلفة؟" الموظف مش بيرد من دماغه. هو بيمسك التليفون، يكلّم سكرتيرة قسم القلب يسأل عن المواعيد، يفتح نظام المحاسبة يجيب السعر، وبعدين يرجع للمريض بالإجابة الكاملة. الموظف هنا = Claude. التليفون ونظام المحاسبة = الـ tools. الموظف هو اللي قرر يستخدم أنهي tool بناءً على السؤال، مش المريض اللي قاله "افتح نظام المحاسبة الأول".
تقنياً: Tool Use بيشتغل بـ schema بتعرّفه لـ Claude عبر JSON Schema. كل tool ليه name و description و input_schema. النموذج بيقرأ السؤال، يقرر إمتى ينده على tool معين، يرجّعلك ردّ من نوع tool_use فيه اسم الـ tool والـ inputs اللي بناها. انت بتنفّذ الـ function في الكود بتاعك، ترجّع النتيجة في رسالة tool_result، والنموذج بيكمّل الجملة للمستخدم. التفاصيل العلمية والـ schema الكامل في توثيق Anthropic الرسمي عن Tool Use (2024).
الكود الكامل لـ Sales Assistant بـ 5 tools
السيناريو: bot لشركة إلكترونيات عربي، 5 tools: search_product، check_inventory، calculate_discount، get_branch_address، send_quote_email. الكود شغّال على anthropic SDK 0.49 و Claude Sonnet 4.6 (مايو 2026).
import anthropic
import json
client = anthropic.Anthropic()
tools = [
{
"name": "search_product",
"description": "ابحث عن منتج بالاسم وارجع السعر والمواصفات.",
"input_schema": {
"type": "object",
"properties": {"query": {"type": "string"}},
"required": ["query"]
}
},
{
"name": "check_inventory",
"description": "تحقق من توفر منتج في فرع محدد.",
"input_schema": {
"type": "object",
"properties": {
"product_id": {"type": "string"},
"branch": {"type": "string"}
},
"required": ["product_id", "branch"]
}
},
{
"name": "calculate_discount",
"description": "احسب السعر بعد خصم نوع العضوية.",
"input_schema": {
"type": "object",
"properties": {
"price": {"type": "number"},
"tier": {"type": "string", "enum": ["silver", "gold", "platinum"]}
},
"required": ["price", "tier"]
}
}
# تعريفات get_branch_address و send_quote_email بنفس الصياغة
]
def run_assistant(user_message: str, max_iterations: int = 5):
messages = [{"role": "user", "content": user_message}]
for _ in range(max_iterations):
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
tools=tools,
messages=messages
)
if response.stop_reason != "tool_use":
return response.content[0].text
tool_block = next(b for b in response.content if b.type == "tool_use")
result = execute_tool(tool_block.name, 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": json.dumps(result, ensure_ascii=False)
}]
})
return "تجاوزنا الحد الأقصى للـ tool calls."