Skip to main content
الأداة دالة ذات أنواع محدّدة يستطيع النموذج استدعاءها. عرّفها بـ defineTool(): تُستنتج أنواع الوسائط والنتيجة من مخطط zod في input، ويُتحقَّق من صحة الوسائط قبل تشغيل execute، ويصلح الناتج للاستخدام في أي موضع يقبل الأدوات (createAgent({ tools: [...] })، ToolRegistry.register(tool)، AgentBuilder.addTool(tool)).

خيارات defineTool()

تتحقق defineTool() من الاسم والوصف ومخطط zod في input عند استدعائها، وترمي خطأً يبيّن كيفية إصلاح القيمة غير الصالحة. وتسجيل أداتين بالاسم نفسه يرمي خطأً يذكر التعارض. الأداة المعرَّفة هي ToolDescriptor عادي: تحمل مخططها في inputSchema (وهو المخطط نفسه في input) وتحمل دالة execute مباشرة. أما الحقل .tool (كائن { description, parameters, execute } من ai v4) فقديم: ما زال يُبنى للتوافق، ولا يُستخدم إلا في الواصفات المكتوبة يدويًا التي لا تحدّد inputSchema ولا execute.

ما يحدث عندما يستدعي النموذج أداة

  • التحقق أولًا. تُحلَّل وسائط النموذج بـ inputSchema (مع تطبيق القيم الافتراضية وتحويلات الأنواع والتحويلات المخصّصة) قبل أن تراها الخطّافات وneedsApproval وexecute. الوسائط غير المطابقة لا تصل إلى execute أبدًا: يحصل النموذج على نتيجة منظَّمة ToolArgumentsValidationError ويستطيع إعادة المحاولة.
  • الأخطاء نتائج. الأداة التي ترمي خطأً تعطي النموذج { error, toolName, message, kind } (دون تتبّع المكدّس stack trace) ويستمر التشغيل. راجع الأخطاء.
  • الاستدعاءات المتوازية. الاستدعاءات المتعددة في دورة نموذج واحدة تُنفَّذ بالتزامن؛ ضع لها حدًّا بـ toolConcurrency (1 للتنفيذ التسلسلي الصارم). وتصل النتائج إلى سجل المحادثة بترتيب استدعاءات النموذج. راجع استدعاءات الأدوات المتوازية.
  • الإلغاء. تصل AbortSignal الخاصة بالتشغيل إلى كل استدعاء في ctx.abortSignal، فيمكن إيقاف العمل الطويل مبكرًا.
  • إعادة المحاولة بعد انهيار. مع التنفيذ المتين قد تُنفَّذ الأداة أكثر من مرة إذا وقع انهيار؛ استخدم ctx.toolCallId مفتاحًا يمنع تكرار الأثر (idempotency key). راجع التنفيذ المتين.

سياق التنفيذ

تحصل execute(args, ctx) دائمًا على وسيط ثانٍ حقيقي، نوعه ToolExecutionContext (مصدَّر من جذر الحزمة؛ ويحلّ محل ToolExecutionOptions في ai SDK)، في كل مسار ينفّذ أداة: الحلقة الرئيسية، والاستدعاء الذي يُنفَّذ بعد موافقة، والأدوات التي تعمل في بيئة معزولة (sandboxExecute(args, sandbox, ctx))، وعقدة استدعاء الأداة في مسار عمل. الدالة sandboxExecute(args, sandbox) التي تتجاهل الوسيط الثالث تبقى تعمل.

الأخطاء

كل طريقة يمكن أن يفشل بها استدعاء أداة تصل إلى النموذج بالنتيجة نفسها، فيكفي فحص واحد في كل الحالات (ومنها الاستدعاء الذي يُنفَّذ بعد موافقة):
  • error: اسم الخطأ (TypeError، ToolArgumentsValidationError، …)، أو الاسم الافتراضي لنوع الفشل عندما لا يكون الفشل خطأً مرميًّا.
  • toolName وmessage: الرسالة فقط، دون مكدّس الاستدعاءات أبدًا، وبحد أقصى 2,000 حرف (العلامة ... (truncated) تدل على القطع).
  • kind: سبب فشل الاستدعاء.
  • بعض الأنواع تضيف حقولًا: issues مع validation، وnote مع rejected، وreason مع denied.
تحمل رسالة سجل المحادثة isError: true؛ وترى أحداث tool-result وonToolResult وخطّافات postToolCall وأحداث tool.error الاستدعاء فاشلًا. تبني toolErrorResult({ toolName, error, kind?, toolCallId?, details? }) هذه النتيجة؛ استخدمها في مغلِّفات الأدوات الخاصة بك لتكون نتائجها مطابقة. ويستطيع الخطأ المرمي أن يختار نوعه بحمل خاصية toolErrorKind. أما الخطأ الذي يرث من PropagatingToolError فليس نتيجة: إنه يُنهي التشغيل.

الأدوات المضمَّنة

تُمرَّر الواصفات المضمَّنة في كائن مفاتيحه الأسماء التي يستخدمها الوكيل: createAgent({ tools: { current_date: currentDateTool } }). وتشير ملفات المواصفات إلى http وcurrent-date وday-name بالاسم (راجع الإعدادات).

ToolRegistry

تبني createAgent() سجلًا لك. ومع AgentBuilder + AgentExecutor.execute()، أو لمشاركة الأدوات بين الوكلاء، املأ سجلًا بنفسك: register(tool) لناتج defineTool()، وregister(name, descriptor) لواصف ToolDescriptor خام (أداة مضمَّنة، أو أداة MCP، أو tool() قائمة من ai SDK)، وregisterMany() لكائن من الواصفات أو مصفوفة من الأدوات المعرَّفة.
مرّره في toolRegistry إلى AgentExecutor.execute()؛ وخريطة tools في إعدادات الوكيل تسمّي الأدوات التي يجوز له استخدامها.