المخرج المنظم عبر الموردين
تكافؤ function calling — 3 APIs، قدرة واحدة
Function calling (بيتسمّى "tool use" على API بتاع Anthropic و"tool calls" على Google) هو البديل الحديث لإنك تعمل prompt-engineering عشان توصل لـJSON. بدل ما تسأل النموذج "رجّع JSON من فضلك، من غير markdown fence"، إنت بتدّي للـAPI schema بـtypes والنموذج بيرجّع object منظم مجبور إنه يملاه. ده الـprimitive الصح لأي code path في production بياخد بيانات منظمة.
التلات vendors بيدعموه. التسميات وشكل الـrequest وشكل الـresponse مختلفين. القدرة نفسها تقريباً.
"نفس القدرة" دي تعني إيه فعلاً
كل API بيكشف contract يخليك تعلن function signature في JSON Schema والنموذج بيرجّع: أنهي function هيستدعي وبأنهي arguments. الكود بتاعك بياخد الـarguments دي كـobject بـtypes، يشغّل الـfunction الفعلية، ويرجّع النتيجة تاني. الحلقة دي هي اللبنة الأساسية لأي agent.
عبر التلاتة:
| الـvendor | اسم الحقل في الـrequest | اسم الحقل في الـresponse |
|---|---|---|
| Anthropic | tools | content[].type === "tool_use" |
| OpenAI | tools (مع type: "function") | tool_calls |
tools[].function_declarations | parts[].functionCall |
Function calling — 3 APIs، 3 أشكال response
شكل الـrequest هو الجزء الأسهل للنقل. شكل الـresponse هو المكان اللي بيحصل فيه أغلب شغل النقل. Anthropic بترجّع content block بـtype tool_use. OpenAI بترجّع tool_calls array على الـmessage. Google بتعشّش الـcall جوه parts array على الـcandidate. 3 access paths مختلفة لنفس الحاجة المفهومية.
الموثوقية عبر الـvendors
موثوقية الـfunction calling بتختلف بنفس الطريقة تقريباً اللي اختلف بيها prompt-only JSON في الدرس اللي فات، بس الفجوة بتضيق. لما الـJSON schema بيتفرض من الـAPI بدل ما يكون مجرد تلميح في الـprompt:
- failure mode بتاع Claude "بيلفّ في markdown fence" بيختفي خالص. الـtool-use mode بيطلّع typed objects، مش نص.
- الـstrict-JSON mode بتاع GPT-4o-mini هو الأكتر موثوقية فيهم التلاتة على schemas بسيطة؛ نادراً بيرجّع object معطوب.
- pattern التقطّع بتاع Gemini Flash بيقلّ بس ما بيختفيش على قوايم arguments طويلة. خلّي الـschema صغير.
لـuse case بتاع هاجر في الـstartup القاهرية، التوصية العملية: لو عندك مهمة استخراج structured data، ما تعملش prompt-engineering عشان توصل لـJSON. استخدم function calling. التكلفة schema definition واحدة في الأول؛ المكسب إنك بتبطل تـdebug parsing المخرج وتبدأ تـdebug الـlogic الحقيقي.
اللي ما بينتقلش
3 حاجات بتتكسر بشكل ثابت لما بتنقل function-calling logic بين الـvendors:
-
اختيار أدوات multi-tool. نماذج مختلفة بتختار tools مختلفة لما بتديهم نفس الـset. Claude بيميل يـchain tools بشكل أكتر عدوانية. GPT بيستدعي tool واحدة ويوقف. Gemini أحياناً بيرجّع نص يقول "I would call tool X" بدل ما يستدعيها فعلاً. راجع tool-selection traces بتاعتك أثناء النقل.
-
دعم nested object في الـarguments. Anthropic و OpenAI بيتعاملوا مع nested JSON Schema بنضافة. فرض Gemini أضحل؛ arguments متعشّشة بعمق أحياناً بترجع مملوية جزئياً. سطّح الـarguments قدر الإمكان.
-
شكل tool-result. كل vendor متوقّع قيمة رجوع الـfunction في message shape مختلف شوية. ده المكان اللي بيعيش فيه أغلب porting bugs.
التالي: فروق الـschema بالتفصيل — الشكل بالظبط لـtools عبر الـ3 APIs.
:::
سجّل الدخول للتقييم