OpenClaw Plugin SDK 新功能:如何在 cron_changed 事件中获取 sessionTarget 与 agentId
——
OpenClaw Plugin SDK 新功能:如何在 cron_changed 事件中获取 sessionTarget 与 agentId
OpenClaw 最新版本(commit cd24da0)为 Plugin SDK 带来了一项关键更新:在 cron_changed 钩子事件中正式暴露 sessionTarget 和 agentId 两个核心字段。这一改动让插件开发者能够更精准地追踪定时任务与 AI Agent 的关联关系,实现更细粒度的任务调度与监控。
本文将深入解析该功能的应用场景、技术实现细节,并提供可直接运行的代码示例,帮助你快速上手。
—
为什么需要这个更新?
在之前的版本中,cron_changed 事件仅返回基础的定时任务信息,开发者无法直接获知:
- 该任务关联的 目标会话(sessionTarget) 是什么
- 执行该任务的 AI Agent ID 是什么
这导致在构建多 Agent 协作系统或需要审计任务执行链路时,开发者不得不通过额外的 API 调用或数据库查询来补全信息,增加了系统复杂度和延迟。
本次更新(PR #77641)直接在事件 payload 中暴露这两个字段,让插件能够零额外成本获取完整的任务上下文。
—
核心概念解析
什么是 cron_changed 钩子?
cron_changed 是 OpenClaw Plugin SDK 提供的事件钩子(hook),当系统中的定时任务(cron job)发生以下变化时触发:
- 创建新任务
- 修改任务配置
- 删除任务
- 任务执行状态变更
插件通过订阅该钩子,可以实时响应任务生命周期的各个阶段。
sessionTarget 与 agentId 的作用
| 字段 | 类型 | 说明 |
|:—|:—|:—|
| sessionTarget | string | 任务关联的目标会话标识,通常为会话 ID 或会话名称 |
| agentId | string | 执行该任务的 AI Agent 唯一标识符 |
这两个字段的组合,让开发者能够:
- 追踪任务归属:明确知道哪个 Agent 负责执行特定任务
- 实现会话级隔离:确保任务操作不会跨会话泄露
- 构建审计日志:完整记录”哪个 Agent 在什么会话中执行了什么任务”
—
代码实战:在新版 SDK 中使用增强事件
环境准备
确保你的插件项目依赖已更新到包含该 commit 的版本:
更新 OpenClaw Plugin SDK
npm update @openclaw/plugin-sdk
或指定版本
npm install @openclaw/plugin-sdk@latest
基础用法:订阅 cron_changed 事件
// plugins/my-audit-plugin/index.js
import { definePlugin } from '@openclaw/plugin-sdk';
export default definePlugin({
name: 'my-audit-plugin',
version: '1.0.0',
hooks: {
// 订阅 cron_changed 事件
cron_changed: (event) => {
// 解构新增的字段
const {
jobId, // 任务 ID
action, // 变更类型: 'created' | 'updated' | 'deleted' | 'executed'
sessionTarget, // ⭐ 新增:目标会话标识
agentId, // ⭐ 新增:执行 Agent ID
schedule, // 定时表达式
payload // 任务负载数据
} = event.data;
// 示例:记录审计日志
console.log([审计] Agent ${agentId} 在会话 ${sessionTarget} 中${getActionLabel(action)}任务 ${jobId});
// 写入结构化日志(便于后续分析)
auditLogger.info({
event: 'cron_changed',
jobId,
agentId, // 现在可直接获取,无需额外查询
sessionTarget, // 会话上下文一目了然
action,
timestamp: new Date().toISOString()
});
}
}
});
// 辅助函数:美化操作类型
function getActionLabel(action) {
const labels = {
created: '创建',
updated: '更新',
deleted: '删除',
executed: '执行'
};
return labels[action] || action;
}
进阶场景:多 Agent 任务调度监控
以下示例展示如何基于新字段构建实时监控面板:
// plugins/agent-monitor/index.js
import { definePlugin } from '@openclaw/plugin-sdk';
// 内存中的实时状态(生产环境建议使用 Redis)
const agentTaskStats = new Map();
export default definePlugin({
name: 'agent-monitor',
hooks: {
cron_changed: (event) => {
const { action, agentId, sessionTarget, jobId, schedule } = event.data;
// 初始化 Agent 统计
if (!agentTaskStats.has(agentId)) {
agentTaskStats.set(agentId, {
totalJobs: 0,
sessions: new Set(),
recentExecutions: []
});
}
const stats = agentTaskStats.get(agentId);
// 根据操作类型更新统计
switch (action) {
case 'created':
stats.totalJobs++;
stats.sessions.add(sessionTarget);
break;
case 'deleted':
stats.totalJobs = Math.max(0, stats.totalJobs - 1);
break;
case 'executed':
// 记录最近执行(保留最近 10 条)
stats.recentExecutions.unshift({
jobId,
sessionTarget, // 明确知道在哪个会话执行
executedAt: new Date().toISOString()
});
stats.recentExecutions = stats.recentExecutions.slice(0, 10);
break;
}
// 实时推送监控数据(如通过 WebSocket)
broadcastMetrics(agentId, {
...stats,
sessions: Array.from(stats.sessions) // Set 转数组便于序列化
});
}
}
});
// 模拟广播函数
function broadcastMetrics(agentId, data) {
// 实际实现:发送到监控仪表盘或告警系统
console.log([监控] Agent ${agentId} 状态:, JSON.stringify(data, null, 2));
}
—
迁移指南:从旧版本升级
如果你已有基于旧版 SDK 的插件,迁移非常简单:
| 旧代码(需额外查询) | 新代码(直接获取) |
|:—|:—|
| const agent = await api.getAgentByJobId(jobId); | const { agentId } = event.data; |
| const session = await db.findSessionForJob(jobId); | const { sessionTarget } = event.data; |
注意事项:
- 该更新为向后兼容的增强,旧代码仍可正常运行
- 建议逐步替换冗余的查询逻辑,降低系统负载
—
最佳实践建议
1. 结合 RBAC 实现权限控制
利用 sessionTarget 和 agentId 实现细粒度访问控制:
hooks: {
cron_changed: async (event) => {
const { agentId, sessionTarget, action } = event.data;
// 验证当前用户是否有权操作该 Agent 和会话
const hasPermission = await checkPermission({
user: event.context.userId,
agent: agentId,
session: sessionTarget,
action
});
if (!hasPermission) {
throw new ForbiddenError(无权在会话 ${sessionTarget} 中操作 Agent ${agentId});
}
}
}
2. 构建任务执行链路追踪
将 agentId 和 sessionTarget 注入分布式追踪系统:
import { trace } from '@opentelemetry/api';
hooks: {
cron_changed: (event) => {
const { agentId, sessionTarget, jobId } = event.data;
const span = trace.getActiveSpan();
if (span) {
span.setAttribute('openclaw.agent.id', agentId);
span.setAttribute('openclaw.session.target', sessionTarget);
span.setAttribute('openclaw.job.id', jobId);
}
}
}
—
常见问题(FAQ)
Q1: 这个更新需要升级 OpenClaw 核心服务吗?
不需要。这是 Plugin SDK 的纯客户端更新,只需更新 npm 依赖即可。但建议确认你的 OpenClaw 核心版本不低于 v2.3.0,以确保服务端事件 payload 包含完整字段。
Q2: sessionTarget 和 agentId 在所有 cron_changed 事件中都有值吗?
是的。从该 commit 开始,所有 cron_changed 事件都会包含这两个字段。如果任务未显式关联 Agent 或会话,字段值为 null,而非缺失。
Q3: 如何验证我的插件已正确接收到新字段?
可在开发模式启用调试日志:
// openclaw.config.js
export default {
pluginSdk: {
debug: true, // 开启后会在控制台打印完整事件 payload
hooks: ['cron_changed']
}
};
Q4: 这个更新对性能有影响吗?
没有负面影响。新字段来自服务端已有的内存数据,仅减少了插件端的额外查询开销。在基准测试中,插件处理事件的平均延迟降低了 15-30%。
Q5: 如果我在 hook 中修改了 agentId 或 sessionTarget,会影响实际任务吗?
不会。事件 payload 是只读的副本,任何修改都不会回传到 OpenClaw 核心系统。如需修改任务关联的 Agent,请使用 jobs.update() API。
—
总结
OpenClaw Plugin SDK 的这次更新(#77641)通过暴露 sessionTarget 和 agentId,让 cron_changed 钩子事件具备了完整的上下文感知能力。开发者可以:
- ✅ 消除冗余的数据库/API 查询
- ✅ 构建更精准的 Agent 级监控和审计
- ✅ 实现会话隔离的权限控制
- ✅ 优化分布式追踪的完整性
下一步行动:
1. 运行 npm update @openclaw/plugin-sdk 更新依赖
2. 在现有插件中移除 agentId 和 sessionTarget 的查询逻辑
3. 参考本文示例,优化你的任务监控和审计功能
—
相关阅读
—