Agent Zero 通知系统完全指南:后端 Python 与前端 Alpine.js 的 Toast 通知与持久化实战
【免费下载链接】agent-zeroAgent Zero AI framework项目地址: https://gitcode.com/GitHub_Trending/ag/agent-zero
Agent Zero 内置了一套前后端一体化的通知系统:后端 Python 代码可随时推送 info / success / warning / error / progress 五类通知,前端通过 Alpine.js 的notificationStore以 toast 形式展示在屏幕右下角,并通过铃铛图标进入完整历史弹窗。本指南基于仓库文档 docs/developer/notifications.md 并对照底层源码,系统讲解从后端调用、前端接入、分组替换到前后端自动同步的完整用法,读完后你可以在插件、调度任务、Web UI 组件中自由接入通知能力。
一、通知系统的整体架构
通知模块由三部分组成,它们协作完成"产生 → 传输 → 展示 → 持久化"的完整链路:
- 后端管理器:helpers/notification.py 中的
NotificationManager持有所有通知的内存状态(列表、增量更新游标、GUID),并以线程安全(threading.RLock)方式提供增删改查;每次变更还会调用mark_dirty_all通知状态监控(state monitor)同步持久化状态。 - REST API:如 api/notification_create.py、api/notifications_mark_read.py、api/notifications_clear.py,供前端创建、标记已读、清空通知,前端通过轮询(polling)增量拉取新通知。
- 前端 Store:webui/components/notifications/notification-store.js 中的
notificationStore负责 toast 栈管理、未读计数、历史弹窗,以及"先试后端、失败回退前端本地"的双通道同步逻辑。
后端的数据模型定义在 helpers/notification.py:
class NotificationType(Enum): INFO = "info" SUCCESS = "success" WARNING = "warning" ERROR = "error" PROGRESS = "progress" class NotificationPriority(Enum): NORMAL = 10 HIGH = 20NotificationItem(helpers/notification.py)是单个通知的数据结构,包含no(序号)、id(UUID)、type、priority、title、message、detail(可展开的 HTML)、timestamp、display_time(默认 3 秒)、read、group等字段。
二、后端用法:Python 中的 AgentNotification
在任何 Python 代码中(包括插件、工具、调度任务、API 处理器),都可以直接使用AgentNotification便捷方法,参考 docs/developer/notifications.md:
from helpers.notification import AgentNotification # 基础通知 AgentNotification.info("Operation completed") AgentNotification.success("File saved successfully", "File Manager") AgentNotification.warning("High CPU usage detected", "System Monitor") AgentNotification.error("Connection failed", "Network Error") AgentNotification.progress("Processing files...", "Task Progress") # 带详情与自定义展示时长 AgentNotification.info( message="System backup completed", title="Backup Manager", detail="<p>Backup size: <strong>2.4 GB</strong></p>", display_time=8 # 秒 ) # 分组通知(同组新通知会替换旧通知) AgentNotification.progress("Download: 25%", "File Download", group="download-status") AgentNotification.progress("Download: 75%", "File Download", group="download-status") # 替换上一条 AgentNotification.progress("Download: Complete!", "File Download", group="download-status") # 再次替换底层调用链
AgentNotification便捷方法最终走的是NotificationManager.send_notification→AgentContext.get_notification_manager().add_notification这条链路(见 helpers/notification.py)。add_notification(helpers/notification.py)的核心逻辑是:
- 若传入
id且该 ID 已存在,则原地更新既有通知(类型、优先级、标题、消息、详情、时间戳、展示时长、分组一并刷新,并重置为未读),同时把序号追加到updates增量游标; - 若不存在,则创建新的
NotificationItem并追加,然后通过_enforce_limit裁剪超限的旧通知(默认上限 100 条,见 helpers/notification.py); - 每次变更都会调用
mark_dirty_all触发状态监控持久化,保证 Web UI 快照不丢通知。
仓库内部使用该 API 的实例可参考 helpers/settings.py(设置变更提示)与 helpers/plugins.py(插件事件通知),可作为"在框架代码中接入通知"的真实范本。
后端 REST API
后端同时暴露了notification_create接口(api/notification_create.py),字段与AgentNotification参数一一对应,并带有输入校验:
type:可选,默认info;非法的类型字符串会返回Invalid notification type错误;message:必填,为空时返回Message is required;priority:默认NORMAL(10),可传HIGH(20);title、detail:可选,detail支持 HTML 用于可展开详情;display_time:默认 3,负数或非数字会被重置为 3;group:可选,分组标识;id:可选,传入后用于更新既有通知而非新建。
前端正是通过POST /notification_create走这条路径创建通知(见下文)。
三、前端用法:notificationStore
前端在 Alpine.js 组件中通过$store.notificationStore访问通知 Store(参考 docs/developer/notifications.md):
// 基础通知 $store.notificationStore.info("User logged in") $store.notificationStore.success("Settings saved", "Configuration") $store.notificationStore.warning("Session expiring soon") $store.notificationStore.error("Failed to load data") // 带分组 $store.notificationStore.info("Connecting...", "Status", "", 3, "connection") $store.notificationStore.success("Connected!", "Status", "", 3, "connection") // 替换上一条各便捷方法的完整签名在 webui/components/notifications/notification-store.js:
async info(message, title = "", detail = "", display_time = 3, group = "", priority = defaultPriority) async success(message, title = "", detail = "", display_time = 3, group = "", priority = defaultPriority) async warning(message, title = "", detail = "", display_time = 3, group = "", priority = defaultPriority) async error(message, title = "", detail = "", display_time = 3, group = "", priority = defaultPriority) async progress(message, title = "", detail = "", display_time = 3, group = "", priority = defaultPriority)这些方法统一委托给createNotification(webui/components/notifications/notification-store.js),向notification_create接口发送 JSON 请求并返回notification_id;前端侧同样定义了NotificationType与NotificationPriority(NORMAL=10、HIGH=20)两套常量,与后端保持一致(webui/components/notifications/notification-store.js)。
HTML 中直接使用
在模板中绑定点击事件即可(参考 docs/developer/notifications.md):
<button @click="$store.notificationStore.success('Task completed!')"> Complete Task </button> <button @click="$store.notificationStore.warning('Progress: 50%', 'Upload', '', 5, 'upload-progress')"> Update Progress </button>四、前端通知与后端同步(新特性)
核心机制(见 docs/developer/notifications.md):
- 后端已连接:通知先发到后端,随后通过轮询回到前端,进入持久化历史,跨会话可查;
- 后端断开:自动降级为纯前端 toast(临时展示,不进历史);
- 自动回退:后端不可用时无缝降级,用户无感知。
实现上由addFrontendToast承担(webui/components/notifications/notification-store.js):先调用isConnected()判断轮询连接状态(webui/components/notifications/notification-store.js),连接正常则尝试createNotification走后端;失败或断开则落到addFrontendToastOnly(webui/components/notifications/notification-store.js),后者生成frontend-<时间戳>-<随机串>形式的本地 ID,直接加入 toast 栈。
前端便捷方法(默认标题与展示时长各不同):
$store.notificationStore.frontendError("Database timeout", "Connection Error") $store.notificationStore.frontendWarning("High memory usage", "Performance") $store.notificationStore.frontendInfo("Cache cleared", "System") $store.notificationStore.frontendSuccess("Saved", "Success") $store.notificationStore.frontendProgress("Uploading...", "Progress")签名与默认值(webui/components/notifications/notification-store.js):
| 方法 | 默认 title | 默认 display_time |
|---|---|---|
frontendError | "Connection Error" | 8 |
frontendWarning | "Warning" | 5 |
frontendInfo/frontendSuccess/frontendProgress | 对应类型名 | 3 |
此外还提供了frontendNotification({ type, message, title, displayTime, group, priority, frontendOnly })对象参数形式(webui/components/notifications/notification-store.js),适合参数较多或需要动态拼装场景。
全局函数
为了方便非 Alpine 环境(普通脚本、控制台)调用,Store 在导出时把便捷方法绑定为全局函数,并兼容挂到globalThis(webui/components/notifications/notification-store.js):
toastFrontendError("Server unreachable", "Connection Error") toastFrontendWarning("Slow connection detected") toastFrontendInfo("Reconnected successfully") toastFrontendSuccess("Task finished") toastFrontendProgress("Working...")这类函数同样遵循"先试后端、失败回退前端"的策略。
五、通知分组与替换
分组(group)确保 toast 栈中同一组只保留最新一条(参考 docs/developer/notifications.md):
# 进度更新——每条新通知替换上一条 AgentNotification.info("Starting backup...", group="backup-status") AgentNotification.progress("Backup: 30%", group="backup-status") # 替换 AgentNotification.progress("Backup: 80%", group="backup-status") # 替换 AgentNotification.success("Backup complete!", group="backup-status") # 替换 # 连接状态——只展示当前状态 AgentNotification.warning("Disconnected", group="network") AgentNotification.info("Reconnecting...", group="network") # 替换 AgentNotification.success("Connected", group="network") # 替换分组的替换行为在前端由addToToastStack实现(webui/components/notifications/notification-store.js):当新 toast 携带非空group时,先移除 toast 栈中同组的旧 toast 再加入新 toast;纯前端路径addFrontendToastOnly也有同样的同组清理逻辑。典型使用场景是长任务进度条与连接状态指示,避免连续进度更新刷爆 toast 区域。
六、参数与通知类型速查
所有通知方法统一支持以下参数(docs/developer/notifications.md):
| 参数 | 必填 | 说明 |
|---|---|---|
message | 是 | 通知主体文本 |
title | 否 | 通知标题 |
detail | 否 | 可展开详情的 HTML 内容 |
display_time | 否 | toast 展示时长(秒),默认 3 |
group | 否 | 分组标识,同组通知触发替换 |
五种类型及语义(docs/developer/notifications.md):
| 类型 | 语义 | 前端配色(左侧边框) |
|---|---|---|
info | 一般信息 | 蓝#2196F3 |
success | 操作成功 | 绿#4CAF50 |
warning | 重要告警 | 橙#FF9800 |
error | 错误条件 | 红#F44336 |
progress | 进行中的操作 | 紫#9C27B0 |
类型对应的图标与 CSS 类映射见 webui/components/notifications/notification-store.js,toast 样式(含每种类型的边框色、动画、移动端适配与prefers-reduced-motion无障碍处理)在 webui/components/notifications/notification-toast-stack.html 中定义。
七、行为细节与边界
综合文档与源码,通知系统的完整行为契约如下(参考 docs/developer/notifications.md):
- Toast 展示位置:右下角 toast 栈容器,
position: absolute锚定在零高度容器底部,flex-direction: column-reverse向上堆叠,最大宽度 400px(webui/components/notifications/notification-toast-stack.html)。 - 持久化历史:所有通知(含同步到后端的前端通知)都会进入通知历史,点击铃铛图标打开历史弹窗(webui/components/notifications/notification-modal.html),弹窗打开时通过
openModal清空 toast 栈并标记全部已读(webui/components/notifications/notification-store.js)。 - 自动消失:toast 在
display_time秒后自动移除;鼠标悬停会暂停计时(@mouseenter清除定时器、@mouseleave重启),见 webui/components/notifications/notification-store.js 与 webui/components/notifications/notification-toast-stack.html。 - 持久 toast:
display_time <= 0的通知不会被自动移除(isPersistentToast),需用户手动关闭。 - 栈容量上限:toast 栈最多同时展示 5 条(
maxToasts = 5),超出时移除最旧的;前端历史列表最多保留 100 条(maxNotifications = 100,webui/components/notifications/notification-store.js),与后端NotificationManager的max_notifications = 100默认值一致。 - 已读同步:toast 被用户关闭或普通优先级 toast 超时消失后,会调用
notifications_mark_read同步已读状态;高优先级(priority > NORMAL)toast 超时不会自动标记已读,确保重要告警保留在未读区(webui/components/notifications/notification-store.js)。对应后端 API 支持按 ID 列表标记或一键全标(mark_all),见 api/notifications_mark_read.py。 - 系统重启处理:后端通知管理器持有 GUID(每次
clear_all或进程重启会更换,helpers/notification.py);前端轮询时若发现 GUID 变化,会重置通知列表与 toast 栈,避免展示过期状态(webui/components/notifications/notification-store.js)。 - 增量拉取:后端维护
updates增量游标,output_with_state一次返回(本次新增/变更的通知列表, guid, 游标长度),配合锁机制保证轮询不丢通知(helpers/notification.py)。 - 历史展示策略:
getDisplayNotifications默认展示全部未读通知 + 最近 5 分钟内的已读通知,兼顾信息量与界面整洁(webui/components/notifications/notification-store.js)。
八、与定时任务的组合实践
通知与调度任务(Scheduled Tasks)是官方推荐的组合用法——任务在后台周期性运行,结果通过通知推送到 UI,无需人盯着任务列表。文档提示可参考 Usage 指南的 Tasks And Scheduling 章节 获取完整的任务创建与调度模式。
典型做法:在任务的执行代码中,用AgentNotification.success(...)输出任务完成摘要、用AgentNotification.warning(...)标记需要人工关注的异常,配合group保证同一任务的多次运行只保留最新结果;任务还可以绑定 Project,从而继承项目指令、变量、密钥与记忆(见 docs/guides/usage.md),使通知内容更贴合上下文。
九、最佳实践小结
- 短文本、可读标题:
message是正文、title是摘要,二者分工;detail可承载结构化 HTML 详情(如备份体积、错误堆栈),避免 toast 过长。 - 善用分组防刷屏:凡是会高频更新的状态(下载进度、连接状态、批处理步骤)一律传
group,让 toast 栈只保留最新状态。 - 重要告警用高优先级:
priority=NotificationPriority.HIGH(数值 20)的通知不会随超时自动标记已读,适合宕机、失败、安全事件等必须人工处理的场景。 - 前端通知默认走后端:优先使用
frontendError/frontendWarning/frontendInfo等自动同步方法,只有明确"纯临时提示、无需历史"时才用frontendOnly=true强制本地。 - 校验与容错:后端对
message必填、display_time数值、type合法性均有校验(api/notification_create.py),接入时注意传参规范;前端createNotification失败时会打印错误并返回null,调用方应做好空值处理。
相关源码与测试可进一步阅读:helpers/notification.py、helpers/notification.py.dox.md(模块职责契约)、webui/components/notifications/notification-store.js、api/notification_create.py,以及测试目录下的通知相关回归用例(如 tests/test_download_toast_regressions.py、tests/test_multi_tab_isolation.py)。
【免费下载链接】agent-zeroAgent Zero AI framework项目地址: https://gitcode.com/GitHub_Trending/ag/agent-zero
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考