النقاط الرئيسية
- الجداول الزمنية التي ينشئها الوكيل (Agent): يمكن للوكلاء إعداد تذكيرات ومهام متكررة من داخل المحادثة.
- الإعداد لكل تشغيل: يمكن لنشر واحد أن يختار نموذجه ومهاراته وأدواته في كل تشغيل.
- تفاعلات Slack: يقر الوكلاء بالرسائل قبل الرد عليها.
اليوم نُصدر Managed Deep Agents v0.9، مع قدرات جديدة تتيح للوكلاء جدولة متابعاتهم بأنفسهم، وإعادة تهيئة أنفسهم في كل تشغيل، والتفاعل مع رسائل Slack.
تجعل هذه التحديثات بناء الوكلاء الداخليين الذين يعيشون في Slack أو في قنواتك الخاصة أسهل، بحيث يعملون بشكل أقرب إلى الزملاء.
دع الوكلاء يجدولون أعمالهم بأنفسهم
تتيح حزمة Schedules SDK الجديدة للوكلاء إنشاء تذكيرات ومتابعات ومهام متكررة في منتصف المحادثة، بحيث يمكنهم التعامل مع طلبات مثل "ذكّرني بهذا غدًا".
ينشئ الوكيل الجدول الزمني بنفسه أثناء المحادثة، ويعمل الجدول الزمني بصفة الشخص الذي طلبه مستخدمًا مجموعته من الأذونات والاتصالات، وتعود النتائج إلى القناة نفسها.
إنشاء جدول زمني من داخل التشغيل:
await schedules.create(owner={"type": "user"}, cron="0 9 * * 1-5", timezone="America/Los_Angeles", prompt="Write the daily digest.")الأكثر فائدة هو استخدامه خلف أداة، بحيث يمكن لمستخدمي الوكيل إنشاء الجداول الزمنية وعرضها وتحديثها وحذفها بمجرد الدردشة. إليك أداة تذكير:
from langchain.tools import tool
from managed_deepagents import schedules
@tool
async def remind_me(prompt: str, cron: str, timezone: str = "UTC") -> str:
"""Run a prompt for the current user on a cron schedule."""
item = await schedules.create(
owner={"type": "user"},
cron=cron,
timezone=timezone,
prompt=prompt,
)
return f"Created schedule {item['id']}."يمرر الوكيل توجيهًا (prompt) وتعبير cron، وفي كل مرة يعمل فيها cron، يبدأ LangSmith تشغيلًا جديدًا بهذا التوجيه. ترث الجداول الزمنية القناة التي أُنشئت فيها، فتُنشر النتائج في المكان الذي جاء منه الطلب: تذكير في يوم عمل طُلب في Slack ينشر رسالة جديدة في تلك المحادثة عند كل تشغيل. الجداول الزمنية لمرة واحدة (at بدلاً من cronترد في السلسلة الأصلية، وهو ما يناسب المتابعات مثل "تحقق من هذا النشر بعد ساعة".
تهيئة الوكلاء لكل تشغيل
يمكن الآن تهيئة الوكيل ديناميكيًا لكل تشغيل. أعدد الوكيل كدالة قابلة للاستدعاء: يستقبل runtime في بداية كل تشغيل ويعيد define_deep_agent definition، مختارًا النموذج والتعليمات والمهارات وخوادم MCP والصندوق المعزول لذلك التشغيل.
بدلاً من الاحتفاظ بنسخة شبه مطابقة من الوكيل نفسه لكل فريق أو مستودع، يمكنك تشغيل نشر واحد. يمكّن هذا نشرَك من العمل بمرونة أكبر، بحيث يمكن تخصيص نشر وكيل واحد لفرق مختلفة أو حالات استخدام مختلفة بناءً على السياق، مثل القناة أو المستخدم الذي ينشأ منه الطلب.

لنقل إن وكيل Slack داخلي واحد يخدم عدة فرق. يمكن لدالة الوكيل لديك أن تتحقق من القناة التي جاء منها التشغيل وتحمّل مهارات الفواتير للمالية، أو خادم MCP للاستجابة للحوادث لفريق المنصة. هذا يختلف عن التعليمات التي تُخبر النموذج متى يستخدم مهارة: يُضبط الإعداد قبل تشغيل النموذج، فلا يرى الوكيل أبدًا مهارات أو أدوات MCP خارج تهيئته. ذلك يُبقي سياقه صغيرًا، ويعمل كمِراقبة وصول في آن واحد، ويتيح لك اختيار النموذج نفسه، وهو ما لا يستطيع النموذج فعله.
بشكل عام، يمنع ذلك المخرجات غير الحتمية حيث تُكلَّف النموذج باختيار مجموعة الأدوات في الحالات التي نعرف فيها بدقة أي مجموعة أدوات يجب أن تكون متاحة للوكيل.
تنطبق الفكرة نفسها على وكيل برمجة يحمّل مهارات مختلفة ونموذجًا أرخص أو أكثر قدرة لكل مستودع:
# agent.py: one coding agent, configured per repo at the start of each run
from dataclasses import dataclass
from managed_deepagents import ManagedServerRuntime, define_deep_agent
REPOS = {
"payments-service": {
"model": "openai:gpt-5",
"instructions": "Python service. Run pytest before opening a PR.",
"skills": ["./skills/python-service"],
},
"storefront": {
"model": "openai:gpt-5-mini",
"instructions": "Next.js app. Run web tests and an a11y check before opening a PR.",
"skills": ["./skills/typescript-web"],
},
}
@dataclass
class AppContext:
repository: str = ""
def agent(runtime: ManagedServerRuntime[AppContext]):
execution = runtime.execution_runtime
context = execution.context if execution is not None else None
repo = context.repository if context is not None else None
config = REPOS.get(repo, REPOS["storefront"])
return define_deep_agent(name="open-swe", context_schema=AppContext, **config)
تقرأ الدالة runtime.execution_runtime.context وتعود إلى قيمة افتراضية عندما لا توجد قيمة، كما هو الحال في تشغيلات القنوات أو عندما يقوم Agent Server بتحميل الوكيل لقراءة مخططه. يختار المستدعون الإعدادات وفق context:
# Same deployment, different repo: just change the run context
await client.runs.create(
thread_id,
"open-swe",
input={"messages": [{"role": "user", "content": "Fix the flaky refund test."}]},
context={"repository": "payments-service"},
)التفاعل مع رسائل Slack
تفاعلات Slack تُظهر للمرسل على الفور أن الوكيل قد استلم رسالته، حتى أثناء قضائه وقتًا طويلًا في الاستدلال واستدعاء الأدوات قبل الرد. التفاعلات مُفعّلة افتراضيًا (👀)، والخيار الجديد reactions على قناة Slack الخاصة بك يتيح لك تعطيلها، أو اختيار رمز تعبيري آخر، أو اختيار رمز لكل رسالة. يستخدم هذا المثال 🐛 عندما تذكر الرسالة شيئًا معطوبًا، و👀 في غير ذلك:
from managed_deepagents import channels
async def choose_emoji(context: dict) -> str:
return "bug" if "broken" in context["text"].lower() else "eyes"
channel = channels.slack(name="Support Bot", reactions=choose_emoji)يمكن أن تكون التفاعلات بسيطة. ومع ذلك، يمكن إعداد استجابة التفاعل بدالة تستدعي نموذجًا لاختيار رمز تعبيري أدق. إن نموذج القرار مثل Jev يُبقي ذلك سريعًا ورخيصًا؛ وتستعرض وثائق قناة Slack مثالًا كاملًا.
البدء
إصدار Managed Deep Agents v0.9 متاح اليوم في النسخة التجريبية العامة. يمكنك معرفة المزيد في وثائق Managed Deep Agents، أو البدء عبر:
uvx --from managed-deepagents mda init my-agent
cd my-agent
uv run mda deployلمن فاته: أضاف الإصدار v0.8 ذاكرة لكل مستخدم، وقنوات HTTP مخصصة لتشغيل العمليات من أي خدمة، وبحثًا ويب مدمجًا مدعومًا من Parallel، والمزيد. اقرأ منشور الإصدار v0.8.
