今天我们发布 Managed Deep Agents v0.9,带来了新能力,让智能体可以安排自己的后续跟进、在每次运行时重新配置自己,并对 Slack 消息做出反应。
这些更新让你更容易构建驻留在 Slack 或你自己的频道中、工作方式更像队友的内部智能体。
让智能体安排自己的工作
这个新的 Schedules SDK让智能体可以在对话中途创建提醒、后续跟进和周期性任务,从而能够处理诸如“明天提醒我这件事”这样的请求。
智能体在对话过程中自行创建日程,日程以提出请求的人的身份、使用其权限和连接来运行,结果会返回到同一个频道。
在一次运行内部创建日程:
awaitschedules.create(owner={"type":"user"}, cron="0 9 * * 1-5",timezone="America/Los_Angeles",prompt="Write the daily digest.")它放在工具背后时最有用,这样你的智能体的用户只需聊天就能创建、列出、更新和删除日程。下面是一个提醒工具:
fromlangchain.toolsimporttoolfrommanaged_deepagentsimportschedules@toolasyncdefremind_me(prompt:str,cron:str,timezone:str="UTC") ->str:"""Run a prompt for the current user on a cron schedule."""item =awaitschedules.create(owner={"type":"user"},cron=cron,timezone=timezone,prompt=prompt,)returnf"Created schedule{item['id']}。"智能体传入一个 prompt 和一个 cron 表达式,每次 cron 触发时,LangSmith 都会用该 prompt 启动一次新的运行。日程会继承创建时所在的频道,因此结果会回发到请求来源处:在 Slack 中请求的工作日提醒会在每次运行时向该对话发布一条新消息。一次性日程(at而不是cron)会在原线程中回复,这适合诸如“一小时后检查一下这次部署”这样的后续跟进。
按运行配置智能体
智能体现在可以动态配置每次运行。将智能体设置为一个可调用函数:它在每次运行开始时接收runtime,并返回一个define_deep_agentdefinition,为该次运行选择模型、指令、技能、MCP 服务器和沙箱。
不必为每个团队或仓库维护一个几乎相同的智能体副本,而是只运行一个部署。这使你的部署能够更灵活地运作,其中单个智能体部署可以根据上下文(例如发起请求的频道或用户)为不同团队或用例进行定制。

假设一个内部 Slack 智能体服务于多个团队。你的智能体函数可以检查一次运行来自哪个频道,并为财务团队加载计费技能,或为平台团队加载事件响应的 MCP 服务器。这与告诉模型何时使用某项技能的指令不同:配置在模型运行之前就已设定,因此智能体永远不会看到其配置之外的技能或 MCP 工具。这使其上下文保持精简,同时兼作访问控制,并让你可以自行选择模型,而这是模型本身无法做到的。
总的来说,在我们确切知道智能体应该可以使用哪一组工具的情况下,它可以防止模型被要求选择工具包时产生非确定性输出。
同样的思路也适用于一个编码智能体,它为每个仓库加载不同的技能以及更便宜或更强大的模型:
# agent.py:一个编码智能体,在每次运行开始时按仓库进行配置fromdataclassesimportdataclassfrommanaged_deepagentsimportManagedServerRuntime, define_deep_agentREPOS = {"payments-service": {"model":"openai:gpt-5","instructions":"Python 服务。在打开 PR 之前运行 pytest。","skills": ["./skills/python-service"],},"storefront": {"model":"openai:gpt-5-mini","instructions":"Next.js 应用。在打开 PR 之前运行 Web 测试和 a11y 检查。","skills": ["./skills/typescript-web"],},}@dataclassclassAppContext:repository:str=""defagent(runtime: ManagedServerRuntime[AppContext]):execution = runtime.execution_runtimecontext = execution.contextifexecutionisnotNoneelseNonerepo = context.repositoryifcontextisnotNoneelseNoneconfig = REPOS.get(repo, REPOS["storefront"])returndefine_deep_agent(name="open-swe",context_schema=AppContext, **config)
该函数读取runtime.execution_runtime.context并在没有时回退到默认值,例如在频道运行时或 Agent Server 加载智能体以读取其 schema 时。调用方通过运行的context来选择配置:
# 同一部署,不同仓库:只需更改运行上下文awaitclient.runs.create(thread_id,"open-swe",input={"messages":[ {"role":"user","content":"修复不稳定的退款测试。"}]},context={"repository":"payments-service"},)对 Slack 消息做出反应
Slack 表情回应立即向发送者表明智能体已接收其消息,即便它还需要花些时间进行推理和调用工具才能回复。表情回应默认开启(👀),Slack 频道上的新reactions选项让你可以将其关闭、选择其他 emoji,或为每条消息单独选择。此示例在消息提到某处损坏时使用 🐛,否则使用 👀:
frommanaged_deepagentsimportchannelsasyncdefchoose_emoji(context:dict) ->str:return"bug"if"broken"incontext["text"].lower()else"eyes"channel = channels.slack(name="Support Bot",reactions=choose_emoji)表情回应可以很简单。不过,你也可以用一个调用模型来挑选更精准 emoji 的函数来配置你的表情回应。像 Jev 这样的决策模型能让这一过程保持快速且低成本;Slack 频道文档提供了完整示例。
快速上手
Managed Deep Agents v0.9 今日进入公开测试阶段。你可以在Managed Deep Agents 文档中了解更多,或通过以下方式开始:
uvx --frommanaged-deepagents mda init my-agentcd my-agentuv run mda deploy以防你没看到:v0.8 新增了按用户记忆、可从任何服务触发运行的自定义 HTTP 频道、由 Parallel 提供支持的内置网页搜索等。阅读 v0.8 文章。