OpenClaw:cron_changed 钩子新增 sessionTarget 与 agentId 获取
—
OpenClaw:cron_changed 钩子新增 sessionTarget 与 agentId 获取
一句话总结:OpenClaw Plugin SDK 最新更新(#77641)为 cron_changed 钩子事件暴露了 sessionTarget 和 agentId 两个关键字段,让开发者能够更精准地追踪和管理定时任务的执行上下文。
如果你正在构建基于 OpenClaw 的 AI Agent 插件,并且需要处理复杂的定时任务调度场景,这篇文章将帮你理解这项更新的实际价值,以及如何在代码中立即应用。
—
为什么需要这次更新?
在之前的版本中,当 cron_changed 钩子被触发时,插件开发者只能获取到基础的定时任务信息(如 cron 表达式、任务状态等)。但在实际生产环境中,一个定时任务往往与特定的会话目标(sessionTarget)和执行代理(agentId)紧密关联。
典型场景举例:
- 多租户 SaaS 平台需要根据
sessionTarget隔离不同客户的定时任务数据 - 分布式部署环境下需要通过
agentId追踪任务由哪个节点执行 - 调试和审计时需要完整的上下文信息定位问题
此次更新正是为了解决这些痛点,让钩子事件携带完整的执行上下文。
—
核心变更详解
新增字段说明
| 字段名 | 类型 | 说明 |
|——–|——|——|
| sessionTarget | string | 当前会话的目标标识,通常对应业务实体(如用户ID、组织ID) |
| agentId | string | 执行该定时任务的 AI Agent 唯一标识 |
事件数据结构对比
更新前:
// cron_changed 钩子事件(旧版本)
{
event: 'cron_changed',
cronId: 'cron_abc123',
expression: '0 9 1-5',
status: 'active',
timestamp: '2024-01-15T09:00:00Z'
// ❌ 缺少 sessionTarget 和 agentId
}
更新后:
// cron_changed 钩子事件(#77641 版本)
{
event: 'cron_changed',
cronId: 'cron_abc123',
expression: '0 9 1-5',
status: 'active',
timestamp: '2024-01-15T09:00:00Z',
sessionTarget: 'org_987654', // ✅ 新增:会话目标
agentId: 'agent_worker_03' // ✅ 新增:执行代理ID
}
—
实战代码示例
场景一:基于 sessionTarget 的数据隔离
// plugins/my-plugin/src/handlers/cronHandler.ts
import { OpenClawPlugin, CronChangedEvent } from '@openclaw/plugin-sdk';
export class MyCronPlugin extends OpenClawPlugin {
async onCronChanged(event: CronChangedEvent): Promise {
const { cronId, sessionTarget, agentId, status } = event;
// 根据 sessionTarget 路由到对应的数据分区
const dbPartition = this.getPartitionByTarget(sessionTarget);
await dbPartition.cronLogs.create({
cronId,
agentId, // 记录执行代理,便于后续追踪
status,
executedAt: new Date()
});
console.log([${sessionTarget}] Cron ${cronId} handled by ${agentId});
}
private getPartitionByTarget(target: string): DatabasePartition {
// 实现多租户数据隔离逻辑
return this.db.getPartition(target);
}
}
场景二:Agent 负载监控
// 统计各 Agent 的定时任务负载
const agentLoadMap = new Map();
export function trackAgentCronLoad(event: CronChangedEvent): void {
const { agentId, status } = event;
const current = agentLoadMap.get(agentId) || 0;
if (status === 'active') {
agentLoadMap.set(agentId, current + 1);
} else if (status === 'paused' || status === 'deleted') {
agentLoadMap.set(agentId, Math.max(0, current - 1));
}
// 触发负载告警
if (agentLoadMap.get(agentId)! > 50) {
alertHighLoad(agentId);
}
}
场景三:调试与审计日志
使用 OpenClaw CLI 查看特定 Agent 的 cron 变更历史
openclaw logs filter \
--event-type cron_changed \
--agent-id agent_worker_03 \
--session-target org_987654 \
--format json \
--since 24h
—
升级指南
检查当前 SDK 版本
查看已安装的 OpenClaw Plugin SDK 版本
npm list @openclaw/plugin-sdk
或查看 package.json
cat package.json | grep openclaw/plugin-sdk
升级到最新版本
使用 npm
npm install @openclaw/plugin-sdk@latest
使用 yarn
yarn upgrade @openclaw/plugin-sdk@latest
使用 pnpm
pnpm update @openclaw/plugin-sdk@latest
类型定义更新
如果你使用 TypeScript,确保更新类型导入:
// 确认导入最新的 CronChangedEvent 类型
import type { CronChangedEvent } from '@openclaw/plugin-sdk/dist/types/events';
// 自定义插件配置中声明依赖
interface MyPluginConfig {
// 现在可以安全地访问这些字段
onCronChanged?: (event: CronChangedEvent) => Promise;
}
—
常见问题 (FAQ)
Q1: 如果我的插件不需要 sessionTarget 和 agentId,需要修改代码吗?
不需要。这是一次向后兼容的更新,原有代码无需任何改动。新字段会自动出现在事件对象中,你可以选择性地使用它们。
Q2: sessionTarget 和 agentId 在什么情况下可能为空?
在极少数场景下(如系统级维护任务或未绑定特定 Agent 的手动触发),这两个字段可能为 null。建议在生产代码中进行防御性检查:
const target = event.sessionTarget ?? 'system_default';
const agent = event.agentId ?? 'unassigned';
Q3: 如何验证我的 OpenClaw 版本是否包含这次更新?
运行以下命令检查核心版本:
openclaw version --verbose | grep "Plugin SDK"
版本号应 ≥ 2.4.0(具体版本请参考 OpenClaw 文档)。
Q4: 这项更新对性能有影响吗?
无显著影响。新增字段只是对已有内存数据的暴露,不会增加额外的数据库查询或网络开销。
Q5: 我可以在自定义钩子中使用这两个字段吗?
目前 sessionTarget 和 agentId 仅在 cron_changed 钩子中自动暴露。如果你需要在其他钩子(如 task_started)中使用类似功能,可以通过 OpenClaw 社区论坛 提交功能请求。
—
总结
OpenClaw Plugin SDK #77641 更新通过为 cron_changed 钩子暴露 sessionTarget 和 agentId,为开发者提供了更完整的定时任务执行上下文。这项改进特别适用于:
- 多租户 SaaS 应用的数据隔离
- 分布式系统的任务追踪与负载均衡
- 合规审计与问题排查
下一步行动:
1. 检查并升级你的 @openclaw/plugin-sdk 到最新版本
2. 审查现有代码,识别可以利用新字段优化的场景
3. 参考 OpenClaw 官方文档 了解更多钩子事件
—
相关阅读
—