Wink Pings

70% 的 Agent 运行来自定时任务,人类只负责偶尔开口

Nathan Drezner 发现,几乎所有主动型 Agent 都是 cron 任务加一段提示词。LangSmith 上超过 70% 的 Managed Deepagent 运行来自调度,不是人打字。那些会做梦的记忆、主动找你的助理,底层都是五十年前的老机制。

如果你用过那种会主动给你发消息的 AI 助手,比如提醒你回邮件、跟进某个话题、早上推一份摘要,翻一下它的底层,大概率能找到一个 cron 表达式。

Nathan Drezner 在 LangChain 的博客里写了个观察(原文):几乎所有你见过的 proactive agent,本质上就是一个定时任务加一段提示词。所谓“记忆在夜间做梦”,也是同一个机制,一个每天跑一次的 cron,把之前的对话压缩成更密集的长期记忆。

有个回复说,原来不是只有我这样。他提到的 Baader-Meinhof 现象,学会一个词之后突然到处都能看到它,用在这儿挺合适。

这句话听起来像在拆台。但它解释了为什么这类产品突然多起来:Muse、Instinct、Dots、Claude Duet、Hone,底层都是同一个五十多年前的操作系统概念。

cron 解锁了什么

作者把能力拆成几块:

记忆整理。后台任务按频率压缩历史对话,更新长期记忆,俗称 dreaming。

主动性。cron 按小时唤醒 agent,让它围绕目标探索下一步动作,再把结果推给用户。Hone 这类专用 agent 有明确目标;通用 agent 的目标可能只是当个好助理,比如提醒截止日期、跟进悬而未决的话题。

智能分诊。监控 Slack、邮箱等信息流,每十分钟跑一次,挑出值得提醒的消息。

跟进提醒。用户让 agent 稍后提醒自己,本质上是排一个定时任务。

编排。一个编排 agent 管理一组 agent,等待异步子任务时自己睡去,过一阵醒来检查进度。

一个数据:LangSmith 上 Managed Deepagent 的运行里,超过 70% 来自调度,不是人打字发消息。

需要两块东西

第一,一个好用的 cron 服务器。开发者能按任意频率添加任务,带上要执行的提示词、需要的技能和权限。同一时间点任务太多时,服务器要做抖动,把负载摊开。

第二,agent 友好的接口。像跟进提醒这种动作,agent 得能自己创建和修改提醒,但需要受管控。

MDA 的做法

Managed Deep Agents 托管在 LangSmith Deployments 上,自带 cron 服务器。一次调度运行的内容很朴素:一个提示词,按时间触发,线程和记忆归属于创建者。

静态调度就是一个文件:

# 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.",
)

动态调度把 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}."

有时候一个简单的“稍后提醒”就够了:

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。

评论区里的实话

有人补了两句。一个网友说,随之而来的是那些无聊的问题:重叠运行、任务悄悄停掉、一周没人发现。另一个提到 ramp up 阶段:你得全程盯着 agent,把自己的做事方式喂给它,它才能真的干活。

这两条比大部分 demo 都值得看。cron 不新鲜,新鲜的是这次它驱动的东西会说话。

发布时间: 2026-10-29 11:36