Laravel AI SDK 1.1: دعم Agent Skills وCohere وموافقة على الأدوات
Laravel AI SDK 1.1 يضيف Agent Skills لتحميل تعليمات الوكيل عند الحاجة فقط، مع دعم Cohere وموافقة بشرية على الأدوات. إليك ما الجديد وكيف تترقّى.
إذا بنيت وكيلًا (Agent) بـ Laravel AI SDK فربما وقعت في مشكلة تضخّم الـ system prompt. كل قاعدة عمل جديدة تضيفها إلى instructions() تكبّر الطلب وتكلّفك توكنات في كل استدعاء. الإصدار 1.1 هو أول إصدار minor بعد 1.0، ويقدّم حلًا لذلك عبر Agent Skills، إضافةً إلى تحسينات تهمّ من يعمل مع أكثر من مزوّد. المصدر الأساسي هنا ملاحظات الإصدار على GitHub ومقال Laravel News عنه.
ما الذي صدر في Laravel AI SDK 1.1؟
بحسب صفحة الإصدار v1.1.0 على GitHub (وسم الإصدار ظهر في 5 أكتوبر، وغطّته Laravel News في 7 أكتوبر 2026) تضم القائمة نحو 15 تغييرًا، أهمها:
- دعم Agent Skills مع عقد
HasSkillsوأداةLoadSkill. - دعم Cohere كمزوّد لتوليد النصوص.
- إمكانية اشتراط الموافقة (
requireApproval()) على الأدوات المدمجة. - تجاهل أدوات المزوّد غير المدعومة تلقائيًا عند الـ failover.
- دعم خادم Laya المستضاف ذاتيًا للتصنيف، وأدوات إضافية لـ Azure وGroq، وأداة
MoveFile.
لم يذكر المقال تغييرات كاسرة صريحة. لكن هناك أثرًا سلوكيًا واحدًا: تحديث النماذج الافتراضية للمزوّدين.
Agent Skills: تعليمات تُحمَّل عند الطلب
فكرة الـ Skill مأخوذة من معيار Agent Skills: مجلد يحوي ملف SKILL.md يصف مهارة معيّنة. لا يرى الوكيل في البداية إلا اسم كل مهارة ووصفها، ولا يقرأ التعليمات الكاملة إلا إذا احتاجها. بهذا تبقى التعليمات الأساسية خفيفة.
بنية المجلد
resources/skills/
└── refund-policy/
├── SKILL.md
└── references/EDGE-CASES.md
---
name: refund-policy
description: Use when a customer asks for a refund or a partial credit.
---
Check the order date first. Orders older than 30 days...
الحقل description إلزامي، أما name فيأخذ اسم المجلد افتراضيًا. الوصف هو ما يعتمد عليه الوكيل ليقرّر متى يحمّل المهارة، فاكتبه بصيغة "استخدم هذا عندما...".
تفعيلها في الوكيل
يكفي أن يطبّق الوكيل العقد HasSkills:
use Laravel\Ai\Contracts\Agent;
use Laravel\Ai\Contracts\HasSkills;
use Laravel\Ai\Promptable;
use Laravel\Ai\Skills\Skill;
class SupportAgent implements Agent, HasSkills
{
use Promptable;
public function instructions(): string
{
return 'You are a support agent.';
}
public function skills(): iterable
{
return [
resource_path('skills'),
base_path('.agents/skills'),
new Skill('house-style', 'Use when you write copy for a customer.', view('skills.house-style')),
fn () => $this->user->team->skills->map(
fn ($skill) => new Skill($skill->name, $skill->description, $skill->instructions)
),
];
}
}
مصادر المهارات ثلاثة: مجلدات، أو كائنات Skill تبنيها بنفسك (الوسيطات بالترتيب: الاسم، ثم الوصف، ثم التعليمات، ومنها view)، أو closures. الـ closure لا يُنفَّذ إلا عند أول قراءة للمهارات، فيمكنك جلب مهارات خاصة بكل مستخدم أو فريق من قاعدة البيانات. في المثال أعلاه يفترض الـ closure أن لدى فريقك جدول مهارات فيه الاسم والوصف والتعليمات، والمتغير $this->user من تطبيقك أنت.
تفاصيل يجب معرفتها
- يحصل الوكيل على أداة
LoadSkillتعرض الأسماء والأوصاف، ثم تقرأ التعليمات الكاملة أو الملفات المرفقة عند الطلب. - يمكنك إضافة
new LoadSkill([...])يدويًا إلىtools()؛ وإن استخدمت الطريقتين دُمجتا في أداة واحدة مع تسجيل تحذير. - الملفات المرفقة يجب أن تكون داخل مجلد المهارة، وأقل من 256 KB، وغير ثنائية.
لماذا Agent Skills مهمة عمليًا؟
تخيّل وكيل دعم فني يتعامل مع الاستردادات، وسياسة الشحن، ونبرة الكتابة مع العملاء، وحالات التصعيد. وضع كل ذلك في instructions() يعني أن كل رسالة، حتى "مرحبًا"، تحمل آلاف الكلمات من القواعد التي لا تحتاجها. مع Skills يرى الوكيل قائمة قصيرة (اسم + وصف لكل مهارة)، وحين يسأل العميل عن استرداد يستدعي LoadSkill ليقرأ مهارة refund-policy وحدها، وربما ملف references/EDGE-CASES.md المرفق بها.
الفوائد المتوقعة من هذا التصميم:
- تعليمات أساسية أقصر: يبقى الـ prompt الدائم صغيرًا، وهذا ينعكس منطقيًا على عدد التوكنات في كل طلب.
- صيانة أسهل: كل قاعدة عمل في ملف Markdown مستقل يمكن لغير المبرمج مراجعته وتعديله، ويدخل ضمن الـ version control.
- قابلية إعادة الاستخدام: لأن الصيغة هي معيار Agent Skills العام، فالمجلد نفسه قد يصلح لأدوات أخرى تدعم المعيار.
- تخصيص لكل مستخدم: بفضل الـ closures يمكن لكل فريق أن يملك مهاراته الخاصة المخزّنة في قاعدة البيانات.
هذه فوائد تصميمية، ولم يقدّم المقال الرسمي أرقامًا لتوفير التوكنات، لذا قِس الأثر على وكيلك بنفسك.
متى لا تستخدم Skills؟
- القواعد القصيرة التي يحتاجها الوكيل في كل محادثة تقريبًا (الهوية، اللغة، قيود الأمان) أبقِها في
instructions()؛ فتحميلها عبر أداة يضيف خطوة بلا فائدة. - لأن الوكيل هو من يقرر تحميل المهارة بناءً على الوصف، فالوصف الغامض يعني أنها قد لا تُحمَّل أبدًا. اكتب أوصافًا محددة، واختبر بأسئلة حقيقية أن المهارة المناسبة تُستدعى.
- مصادر المهارات الديناميكية (closures) تعني محتوى قادمًا من قاعدة البيانات؛ عامله كمدخل موثوق فقط إذا كان من يكتبه موثوقًا، لأنه سيصبح تعليمات تُنفَّذ بواسطة النموذج.
موافقة بشرية على الأدوات الحساسة
أدوات MCP والوكلاء والبحث بالتشابه ونظام الملفات المدمجة صارت تنفّذ Approvable، فتستدعي requireApproval() عليها دون وراثة. الموافقة معطّلة افتراضيًا، فلا تتأثر الوكلاء الحالية. وتوثيق الـ SDK يعرض الاستخدام هكذا داخل tools() في الوكيل:
(new DeleteFile)->requireApproval('Deletion review required.'),
ولأداة لا تحتاج موافقة تستدعي withoutApproval(). ويعرض مقال Laravel News مثالًا عمليًا: اطلب موافقة لكل أداة GitHub MCP لا تُعلن نفسها للقراءة فقط (readOnlyHint). راجع المقال للكود الكامل.
هذا نمط جيد: اسمح بالقراءة تلقائيًا، واطلب تأكيد إنسان قبل أي كتابة أو حذف.
Cohere والـ failover وبقية المزوّدين
Cohere
صار Cohere مزوّد نصوص عبر Chat API v2 مع البث والأدوات والمخرجات المنظّمة والاستدلال، والنموذج الافتراضي command-a-03-2025:
$response = (new SupportAgent)->prompt('Hello', provider: 'cohere');
يحتاج المفتاح في COHERE_API_KEY. تحقق من اسم المزوّد في config/ai.php عندك.
قيود: لا يمكن إجباره على أداة محددة (ToolChoice::tool('X') يرسل الأداة X فقط ويجعل استدعاءها مطلوبًا)، ولا تُدعم مرفقات المستندات والاقتباسات بعد.
الـ failover أكثر أمانًا
سابقًا كانت أداة مزوّد غير مدعومة لدى المزوّد الاحتياطي قد توقف التنفيذ، مثل WebFetch على OpenAI الذي يرمي RuntimeException. الآن تُزال الأدوات غير المدعومة قبل كل محاولة. وإن لم يدعم المزوّد tool search المستضاف تُفكّ ToolSearch وتُرسل أدواتها كأدوات عادية. تعدد غلافات ToolSearch ما زال يرمي استثناءً.
إضافات أخرى
- خادم Laya المستضاف ذاتيًا للتصنيف (Classification) عبر driver من نوع
typesafeمعurlمحلي. تفاصيل الاستخدام في ملاحظات الإصدار والتوثيق. ToolSearchعلى Azure OpenAI.- على Groq:
WebSearchيقابلbrowser_searchوCodeExecutionيقابلcode_interpreter، لنماذج GPT-OSS فقط. - أداة
MoveFileلنقل الملفات أو تسميتها في استدعاء واحد.
كيف تترقّى؟
composer require laravel/ai:^1.1
قبل الترقية:
- إذا لم تحدد النموذج في
config/ai.phpفستتغير النماذج الافتراضية (مثلًا Anthropic صار الافتراضي لديهclaude-sonnet-5-5، وGeminigemini-3.8-flash). ثبّت النماذج صراحةً لتبقى النتائج والتكلفة متوقعة. - إن ترقّيت من 0.x فراجع دليل ترقية 1.0؛ وقد أُضيف إليه أن أمر ترقية Boost يحتاج
laravel/boostبإصدار 2.10.0 أو أحدث، وأن الحزمة تتعارض معlaravel/mcpالأقدم من 1.0. - جرّب Skills على وكيل واحد أولًا: انقل قاعدة عمل طويلة من
instructions()إلى مهارة، وقارن عدد التوكنات وجودة الإجابات.
الخلاصة
أهم ما في 1.1 هو Agent Skills: تعليمات خفيفة دائمًا وثقيلة عند الحاجة فقط، ويمكن جعلها ديناميكية لكل مستخدم. مع requireApproval() وتحسينات الـ failover يصبح بناء وكلاء إنتاجيين أكثر أمانًا. خطوتك العملية اليوم: ثبّت النماذج في الإعدادات، ثم حوّل أطول جزء في تعليمات أحد وكلائك إلى Skill.