1. 为什么AI Agent需要任务完成通知?
在自动化任务处理场景中,AI Agent完成工作后的通知机制往往被开发者忽视。想象一下:你训练了一个能自动处理Excel报表的Agent,它可能在凌晨3点完成任务——难道你要一直盯着屏幕等待吗?这就是为什么我们需要可靠的通知系统。
我最近用Python+Flask+WxPusher搭建的这套方案,已经稳定运行了半年多。相比邮件/SMS通知,微信推送有三大不可替代的优势:
- 到达率99%:微信的常驻进程特性,比邮箱的垃圾过滤和短信的通道延迟更可靠
- 零成本接入:不需要企业资质或付费接口,个人开发者也能用
- 多端同步:手机/电脑/平板实时同步提醒,避免漏看
重要提示:2023年起微信官方对消息推送类服务加强管控,直接调用微信API需要企业资质。我们采用的WxPusher是合规的第三方方案,通过公众号模板消息实现。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心架构设计
2.1 技术选型对比
我调研过五种主流方案,最终技术栈如下:
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| WxPusher | 免备案,API简单 | 每日限额500条 | 个人/小规模应用 |
| 企业微信API | 官方支持 | 需要企业认证 | 企业级应用 |
| Server酱 | 历史久 | 付费墙高 | 预算充足项目 |
| Bark(iOS专属) | 极简 | 仅支持苹果设备 | iOS生态 |
| Telegram Bot | 无限制 | 国内需特殊网络 | 国际项目 |
2.2 系统流程图解
python复制AI Agent工作流示例:
def agent_workflow():
task_result = process_task() # 核心业务逻辑
if task_complete:
send_wxpush(
uid="USER_ID",
title="报表生成完成",
content=task_summary
)
配套的推送服务采用分层设计:
- 接入层:Flask提供RESTful API
- 路由层:根据任务类型选择模板
- 发送层:异步队列处理消息投递
- 监控层:失败重试+报警机制
3. 手把手实现步骤
3.1 准备工作
先注册WxPusher(这一步需要扫码关注其公众号):
- 访问官网
- 获取APP_TOKEN(在应用管理-应用详情中)
- 记录你的UID(用户管理-用户列表)
安装依赖:
bash复制pip install flask requests python-dotenv
3.2 核心代码实现
创建.env文件存储密钥:
ini复制WXPUSHER_APP_TOKEN=AT_xxxx
WXPUSHER_TOPIC_ID=12345
推送服务核心代码:
python复制import os
import requests
from dotenv import load_dotenv
load_dotenv()
def send_wxpush(uid, title, content):
url = "http://wxpusher.zjiecode.com/api/send/message"
headers = {"Content-Type": "application/json"}
payload = {
"appToken": os.getenv("WXPUSHER_APP_TOKEN"),
"content": f"<b>{title}</b>\n{content}",
"contentType": 2, # 1文本 2HTML
"uids": [uid],
"topicIds": [os.getenv("WXPUSHER_TOPIC_ID")]
}
response = requests.post(url, json=payload, headers=headers)
return response.json()
3.3 与AI Agent集成示例
假设有个自动爬虫Agent:
python复制def run_spider():
try:
data = scrape_website()
save_to_db(data)
send_wxpush(
uid="your_uid",
title="爬虫任务完成",
content=f"成功抓取{len(data)}条数据"
)
except Exception as e:
send_wxpush(
uid="your_uid",
title="爬虫任务失败",
content=str(e)[:100] # 截取前100字符防超长
)
4. 实战中的六个关键问题
4.1 消息模板设计
好的通知应该包含:
- 任务标识:用emoji前缀区分类型
- 时间戳:显示服务端时间而非客户端时间
- 关键指标:如处理时长/数据量
- 快捷操作:HTML链接跳转管理后台
示例模板:
html复制🛠️ [数据清洗任务] 已完成
⏱️ 2023-08-20 14:30:21
📊 处理记录: 成功235条 | 失败12条
🔗 <a href="https://your.domain/log/123">查看详情</a>
4.2 频率限制规避
WxPusher的免费版限制:
- 单个用户每日最多50条
- 全应用每日500条
我的应对方案:
- 分级通知:重要任务立即推,次要任务攒批推
- 本地缓存:相同内容5分钟内不重复发送
- 备用通道:超过限额自动切到邮件通知
4.3 用户管理技巧
通过Topic实现分组推送:
- 创建不同Topic(如:运维组、产品组)
- 用户扫码关注时选择所属分组
- 发送时指定topicIds替代uids
python复制# 发送给整个运维组
send_wxpush(
topic_ids=[123],
title="服务器告警",
content="CPU负载超过90%"
)
5. 性能优化方案
5.1 异步发送改造
原始同步发送存在阻塞问题,改用Celery优化:
python复制from celery import Celery
celery = Celery('tasks', broker='redis://localhost:6379/0')
@celery.task
def async_send_wxpush(uid, title, content):
# 原发送逻辑...
5.2 智能合并策略
对于高频任务(如每分钟的监控心跳),实现:
- 内存队列积累消息
- 定时器每5分钟触发一次
- 合并相似内容为摘要报告
python复制from collections import defaultdict
message_queue = defaultdict(list)
def add_to_queue(task_type, content):
message_queue[task_type].append(content)
def flush_queue():
for task_type, items in message_queue.items():
summary = f"共{len(items)}条{task_type}通知"
send_wxpush(uid="admin", title=summary, content="\n".join(items[:3]))
message_queue.clear()
5.3 监控看板搭建
用Prometheus+Grafana监控:
- 记录发送成功/失败次数
- 统计各类型任务占比
- 绘制24小时趋势图
关键指标示例:
code复制wxpusher_send_total{status="success"} 1423
wxpusher_send_total{status="failure"} 17
wxpusher_message_length_bytes 81542
6. 扩展应用场景
6.1 结合LLM生成智能摘要
对于复杂任务结果,先用GPT提炼关键点:
python复制def generate_summary(raw_data):
prompt = f"用20字总结这段数据:{raw_data[:1000]}..."
return ask_gpt(prompt)
# 通知内容升级为:
"AI摘要:{generate_summary(report)}"
6.2 自动化运维通知
在CI/CD流程中嵌入:
yaml复制# GitHub Actions示例
- name: 通知部署结果
if: always()
run: |
python notify.py \
--title "${{ job.status }}" \
--content "耗时${{ job.steps.time.outputs.duration }}"
6.3 硬件设备联动
树莓派温度监控案例:
python复制while True:
temp = get_cpu_temp()
if temp > 80:
send_wxpush(
uid="admin",
title="高温告警",
content=f"当前温度:{temp}℃"
)
time.sleep(300)
这套系统经过多次迭代,现在每天处理300+条通知,平均延迟<2秒。最让我意外的是,通过分析通知日志,还发现了几个Agent任务的隐性bug——这算是意外收获。如果你要接入复杂业务,建议先从简单的"任务完成"通知开始,逐步增加智能摘要、交互按钮等高级功能。
