هل سمعت من قبل بظاهرة بايدر-ماينهوف؟ إنها حين تتعلم كلمة لأول مرة، ثم تبدأ فجأة في سماعها في كل مكان. أعتقد أن المبدأ نفسه ينطبق في هندسة البرمجيات: تتعلم نمط تصميم بسيطًا لكنه فعّال، ثم تبدأ فجأة في رؤيته في كل مكان.
نرى هذا يحدث مع الوكلاء الاستباقيين، حيث لاحظنا أن جميع أنظمتك الوكيلة الاستباقية الناشئة المفضلة تقريبًا تعمل بآلية بسيطة جدًا: يعمل الوكيل كمهام cron، مستفيدًا من مبدأ في أنظمة التشغيل عمره أكثر من خمسين عامًا لتحقيق حالة استخدام عصرية جدًا.
المستقبل يعود إلى الوكلاء الاستباقيين، والذين يعملون دائمًا، والمحيطين بنا. إن إطلاقات مثل Muse وInstinct وDots وClaude Duet وHone وغيرها تعكس هذا.
تُشغّل مهام Cron عددًا من الإمكانات التي تتكامل معًا لجعل هذه الوكلاء استباقيين ومخصصين و محيط — أي أنها قادرة على تنفيذ المهام من تلقاء نفسها، دون تعليمات يدوية.
في هذه المدونة، سنستعرض القدرات التي تفتحها وظائف cron، والجزأين الأساسيين اللذين تحتاجهما لبناء وكلاء كهذا، ثم نعرض أمثلة على كيفية القيام بذلك في وكلاء مُدارون بعمق.
لقد رأينا التأثير الذي يمكن أن تحدثه الـ crons. أصبحت الاستباقية هي السلوك الافتراضي الجديد للوكلاء بفضل اتساع الوظائف الجديدة التي تفتحها. أكثر من 70% من تشغيلات Managed Deepagent على LangSmith تأتي من التشغيلات المجدولة بدلاً من أن يكتب إنسان رسالة.
ما الذي تفتحه الـcrons؟
الـcrons، رغم كونها مفهومًا بسيطًا، تفتح سلوكيات مختلفة تشكّل هذه الوكلاء الاستباقيين الدائمي التشغيل.
الذاكرة: الجزء المميز في كل هذه الوكلاء هو أنهم يتذكرون معلومات عنك على مدى آفاق زمنية أطول. يتضمن تنفيذ ذلك جزئيًا تشغيل مهمة في الخلفية لتكثيف المحادثات السابقة في شكل ذاكرة أكثر كثافة. يُطلق على هذا بشكل عام اسم "الحُلم" (dreaming). في الواقع، هذا مجرد cron يعمل وفق إيقاع معين (مثلًا مرة واحدة يوميًا) ويحدّث الذاكرة طويلة الأمد بأي استنتاجات من التأمل في المحادثات.
الاستباقية: جزء مما يجعل هذه الوكلاء ناجحة هو أنهم يبدؤون التواصل بشأن فكرة يرون أنك قد تكون مهتمًا بها. في الواقع، الطريقة التي يعمل بها هذا هي وجود "فكرة" معينة عما ينبغي أن يحققه هذا الوكيل.
بالنسبة لوكيل متعدد الأغراض، قد يكون الأمر بسيطًا كأن يكون مساعدًا جيدًا: يتخذ خطوات لتوقع ما تحتاجه تاليًا، مثل التنبيه إلى موعد نهائي قادم، أو المتابعة على موضوع مفتوح، أو إبراز أخبار متعلقة بعملك. أما الوكلاء المتخصصون، مثل Hone، فالوكيل يعمل نحو هدف صريح. ثم يعمل الـcron وفق إيقاع معين (مرة كل ساعة) ويحث الوكيل على استكشاف إجراءات جديدة للتوقدم نحو هدفه. ثم تظهر هذه الإجراءات كرسائل استباقية للمستخدم.
الفرز الذكي: هناك ضوضاء هائلة في العالم. من أبرز حالات استخدام الوكلاء الدائمي التشغيل مراقبة مصدر معلومات (Slack، البريد الإلكتروني، إلخ) وتنبيه المستخدم بالرسائل ذات الصلة. في الواقع، يمكن تنفيذ ذلك كـcron يعمل وفق إيقاع معين (مرة كل عشر دقائق) ويحث وكيلًا على الاطلاع على تدفق الأحداث وإبلاغ المستخدم بأي شيء جدير بالملاحظة.
المتابعات: الـcrons ليست للاستخدام في الخلفية فقط. غالبًا ما قد يطلب المستخدمون أن يُذكَّروا بشيء ما في وقت لاحق. يمكن استخدام الـcrons لضبط جدول يوقظ النظام ليذكّر المستخدم حينها.
التنسيق: يمكن إدارة أساطيل من الوكلاء بواسطة وكيل تنسيق واحد يمتلك القدرة على إيقاظ نفسه في المستقبل. يستطيع وكيل التنسيق مراقبة أسطول بواسطة الـcrons. يمكنه السكون أثناء انتظار انتهاء مهمة فرعية غير متزامنة، ثم يوقظ نفسه مجددًا للاطلاع على التقدم في فترات منتظمة.
الجزآن الأساسيان لبناء وكلاء استباقيين
لبناء هذا النوع من الوكلاء، وجدنا أن هناك بشكل عام جزأين أساسيين.
الأول هو خادم crons قوي وموثوق. ستحتاج إلى خادم يسهّل على المطوّرين إضافة الـcrons. يجب أن يكونوا قادرين على إضافتها بالجدول الذي يحتاجونه، مع تضمين توجيه (prompt) ليُنفَّذ كجزء منها. إذا احتاج الوكيل إلى مهارات أو صلاحيات معينة عند التشغيل، فيجب تضمينها. وإذا كان هناك عدد كبير من التشغيلات في نقطة زمنية محددة، فينبغي للخادم أن "يهزّها" (jitter) قليلًا لتوزيع الحمل.
ثانيًا، تحتاج إلى واجهة صديقة للوكلاء. بالنسبة لإجراءات مثل المتابعات، يحتاج الوكيل إلى القدرة على التفاعل مع هذه التذكيرات. يحتاج إلى طريقة سهلة - لكنها مُحكَمة - لإنشاء التذكيرات وتعديلها.
ابنِ هذا باستخدام MDA
Managed Deep Agents - وهي مستضافة عبر LangSmith Deployments - توفر خادم cron مدمجًا يمكنه تشغيل تنفيذ الوكيل ديناميكيًا. التنفيذ المجدول يبدو بسيطًا بشكل خادع: إنه مجرد المطالبة (prompt) التي تم تمريرها، تُطلَق وفق جدول زمني، مع سلسلة المحادثات والذاكرة المرتبطة بالجهة (principal) التي أنشأت الجدول. توفر مجموعة الأدوات أعلاه الأساس لأدوات تقبل مطالبة وجدول cron فقط.
مع Managed Deep Agents، يمكن تعريف الجداول الزمنية إما بشكل ثابت أو ديناميكي بواسطة وكيل.
على سبيل المثال، بناء وكيل بجدول ثابت كجزء من تصميمه الأساسي - مثل قراءة مبيعات يومية - هو مجرد ملف في schedules/:
# schedules/daily_digest.py
from managed_deepagents import define_schedule
schedule = define_schedule(
cron="0 8 * * 1-5",
timezone="America/Los_Angeles",
prompt="Inspect the sales report using your tools and send a KPI readout.",
)تقدم Managed Deep Agents أيضًا جداول زمنية ديناميكية، حيث يمكن للمستخدمين النهائيين مطالبة وكيلك بجدولة مهام متكررة لم تتوقعها أثناء التطوير. لدعم ذلك، غلّف Schedules SDK داخل أدوات:
# tools/scheduling.py
from langchain.tools import tool
from managed_deepagents import ManagedDeepAgentRuntime
@tool
async def set_schedule(prompt: str, cron: str, runtime: ManagedDeepAgentRuntime) -> str:
"""Run a prompt for the current user on a cron schedule."""
item = await runtime.schedules.create(owner={"type": "user"}, cron=cron, prompt=prompt)
return f"Created schedule {item['id']}."
@tool
async def list_schedules(runtime: ManagedDeepAgentRuntime) -> str:
"""List the current user's schedules."""
page = await runtime.schedules.list(owner={"type": "user"})
return str(page["items"])
@tool
async def delete_schedule(schedule_id: str, runtime: ManagedDeepAgentRuntime) -> str:
"""Delete one of the current user's schedules."""
await runtime.schedules.delete(schedule_id, owner={"type": "user"})
return f"Deleted schedule {schedule_id}."يحتاج المطوّرون إلى المرونة، ونظام أدوات Managed Deep Agents مصمَّم مع وضع ذلك في الاعتبار. قد تحتاج أنواع الوكلاء المختلفة إلى كشف مجموعات أدوات مختلفة للجدولة. في بعض الحالات، قد يكون غلافًا أساسيًا remind_me لتشغيل لمرة واحدة أو check_in_later كافيًا:
from datetime import datetime, timedelta, timezone
from langchain.tools import tool
from managed_deepagents import ManagedDeepAgentRuntime
@tool
async def check_in_later(prompt: str, minutes: int, runtime: ManagedDeepAgentRuntime) -> str:
"""Run a prompt once for the current user, a number of minutes from now."""
at = datetime.now(timezone.utc) + timedelta(minutes=minutes)
item = await runtime.schedules.create(owner={"type": "user"}, at=at, prompt=prompt)
return f"Scheduled a check-in {item['id']}."ابدأ بإضافة الجداول إلى وكلائك المُدارين العميقين من وثائقنا: langch.in/mda. أنت على بعد mda init و mda deploy فقط من توزيع وكيل استباقي داخل مؤسستك.