AutoGPT 中的通知系统负责向用户发送关于其代理活动的各种通知,包括代理运行、错误和摘要。它利用 RabbitMQ 进行消息排队,并使用 Postmark 进行电子邮件传递,同时为不同的通知类型配置了可配置的批处理策略。
有关凭证系统的信息,请参阅API 密钥管理。
通知系统由多个组件组成,它们协同工作,根据用户配置的首选项收集、批处理和传递通知。该系统支持不同类型的通知(例如代理运行、错误、使用摘要)和多种传递策略(即时、批量或计划)。
来源
系统支持多种通知类型,每种类型都有其特定的数据模型
| 通知类型 | 描述 | 发送策略 | 数据模型 |
|---|---|---|---|
| AGENT_RUN | 通知已完成的代理运行 | 批处理 | AgentRunData |
| ZERO_BALANCE | 用户信用余额为零时发出警报 | 退避 | ZeroBalanceData |
| LOW_BALANCE | 低信用余额时发出警告 | 即时 | LowBalanceData |
| BLOCK_EXECUTION_FAILED | 报告块执行失败 | 退避 | BlockExecutionFailedData |
| CONTINUOUS_AGENT_ERROR | 连续代理错误时发出警报 | 退避 | ContinuousAgentErrorData |
| DAILY_SUMMARY | 每日活动摘要 | 总结 | DailySummaryData |
| WEEKLY_SUMMARY | 每周活动摘要 | 总结 | WeeklySummaryData |
| MONTHLY_SUMMARY | 每月活动摘要 | 总结 | MonthlySummaryData |
| REFUND_REQUEST | 通知管理员退款请求 | 管理员 | RefundRequestData |
| REFUND_PROCESSED | 通知已处理的退款 | 管理员 | RefundRequestData |
每种通知类型都有一个相应的数据模型,该模型定义了通知内容的结构。例如,AgentRunData 包含代理名称、使用的信用点、执行时间和输出等信息。
来源
系统根据通知类型使用不同的策略发送通知
即时 (QueueType.IMMEDIATE):通知会立即发送,例如低余额警告。
批量 (QueueType.BATCH):相同类型的多条通知会被收集起来,并在延迟后或达到阈值时通过一封电子邮件发送。代理运行通知使用此策略。
摘要 (QueueType.SUMMARY):数据会在一个周期(每日、每周、每月)内收集,并在单次通知中进行汇总。
退避 (QueueType.BACKOFF):通知会以递增的延迟间隔发送,以避免过度发送相似通知。这用于错误通知。
管理员 (QueueType.ADMIN):发送给系统管理员的特殊通知,例如退款请求。
来源
通知系统使用 RabbitMQ 进行消息队列,具有以下交换器和队列配置
每种通知类型都会根据其发送策略路由到相应的队列。例如,代理运行通知会路由到批量队列,路由键为notification.batch.AGENT_RUN。
来源
NotificationManager 是处理通知系统所有方面的核心服务。它负责:
EmailSender发送电子邮件NotificationManager 被实现为一个AppService,这允许它作为独立服务或作为主 AutoGPT 平台的一部分运行。
来源
EmailSender 类使用 Postmark API 处理实际的电子邮件发送。它使用 Jinja2 模板进行电子邮件格式化,并支持 HTML 电子邮件。
该系统包含用于不同通知类型的各种电子邮件模板,例如代理运行报告、错误通知和摘要报告。模板以 Jinja2 格式存储在templates 目录中。
来源
用户可以配置他们的通知偏好设置,包括他们想要接收的通知类型以及每日电子邮件限制。系统在发送通知前会检查这些偏好设置。
用户通知偏好设置存储在数据库中,包括:
用户还可以使用包含安全令牌的特殊取消订阅链接来取消所有通知。
来源
通知系统为不同的通知类型实现了复杂的批处理和处理逻辑
即时处理(_process_immediate)
批量处理(_process_batch)
_should_batch 方法决定何时处理批次摘要处理(_process_summary)
_gather_summary_data 方法会汇总摘要的统计信息管理员处理(_process_admin_message)
批处理机制使用 RabbitMQ 进行消息排队,并使用数据库存储批次。
来源
通知系统通过环境变量和 AutoGPT 配置中的设置进行配置
| 设置 | 描述 | 默认 |
|---|---|---|
notification_service_port | 通知服务的端口 | 8007 |
postmark_server_api_token | Postmark 的 API 令牌 | (无) |
postmark_sender_email | 用于发送通知的电子邮件地址 | "invalid@invalid.com" |
postmark_webhook_token | Postmark Webhook 的令牌 | (无) |
unsubscribe_secret_key | 生成取消订阅令牌的密钥 | (无) |
rabbitmq_host | RabbitMQ 主机 | "localhost" |
rabbitmq_port | RabbitMQ 端口 | 5672 |
rabbitmq_vhost | RabbitMQ 虚拟主机 | "/" |
rabbitmq_default_user | RabbitMQ 默认用户 | (无) |
rabbitmq_default_pass | RabbitMQ 默认密码 | (无) |
这些设置可以在 .env 文件或通过环境变量进行配置。
来源
通知系统已集成到AutoGPT平台中,并由各个组件使用,以向用户发送通知。
通知系统在 app.py 中的主AutoGPT应用程序启动时启动,并且也包含在 rest.py 中的REST API服务器中。
来源
为了说明通知通过系统的完整流程,请考虑一个代理运行通知。
此流程展示了通知是如何创建、排队、批量处理并最终传递给用户的。
来源