在上一篇文章 《0 外部依赖!我用 Python 打造了一个高颜值的多银行信用卡账单自动解析与对账工具》 中,我分享了如何坚持“0 外部依赖”的极客哲学,纯用 Python 标准库撸出一个稳定、干净的账单解析引擎。
今天,这套极简哲学迎来了一次重要的升维 —— 我给它装上了“嘴巴和耳朵”,将这台单机的解析引擎,进化成了一个随时随地听我调遣的私人极简 Agent。
为什么要拒绝主流的 Agent 框架?
目前市面上有大量的通用 Agent 框架(比如 OpenClaw, Hermes, AutoGen 等等)。为了做到所谓的“通用”和“全能”,它们往往不可避免地走向了臃肿:
- 动辄要求 Docker 部署、配置几百行的 YAML 文件。
- 依赖几十上百个第三方包,甚至各种向量数据库。
- 占用的内存对小内存 VPS 极不友好,出 Bug 时的黑盒排查更是让人头大。
但退一步想,个人日常需要的 Agent 到底是什么?
无非是一个能听懂我指令的网关(Connector),加上一个能执行代码的**执行器(Executor)**而已。
与其引入庞然大物,不如返璞归真。
极简架构:WebSocket + 纯原生脚本
我的架构只有三块积木,极其轻量、透明、且无需暴露任何公网端口:
-
统一入口:飞书 WebSocket 长连接
抛弃了传统的 Webhook(需要公网 IP、HTTPS 证书、反向代理配置),直接引入飞书官方的极简依赖lark-oapi建立 WebSocket 长连接。一个几十 MB 内存的后台 Python 进程 (feishu_bot.py),就能稳定接管来自手机飞书的全部指令。 -
路由与执行:万物皆可
/run和/sh
不搞复杂的 Skill 定义和意图槽位解析。Bot 就是一个无情的指令路由器:- 账单管理?发送
/report、/due,直接拉起我的mail_client.py引擎。 - 临时查状态?发送
/sys查看内存,发/sh df -h查看磁盘。 - 复杂的巡检?写一个
/vps/path/check_cert_expiry.sh,然后在飞书里发一句/run /vps/path/check_cert_expiry.sh,证书巡检报告就会以富文本卡片(Markdown)形式弹到手机上。
- 账单管理?发送
-
双向互动与定时推送
我额外封装了一个 10 行代码的feishu_push.sh。这样一来,VPS 上的任何crontab任务,只需要用管道符|把输出塞给这个脚本,它就能精准地推送交互卡片到我的飞书上。
(比如:0 9 * * * /vps/path/check_cert_expiry.sh | feishu_push.sh "🔒 证书过期巡检")
“踩坑”与进化:魔鬼在细节中
打造这个极简架构并非一帆风顺,在“打通全链路”的过程中,我解决了一些非常有意思的工程细节:
1. 终端与 IM 的碰撞:被吃掉的“星号”
当我用 /cron 指令在飞书查看服务器定时任务时,发现原本长这样的任务:
*/5 * * * * bash start.sh
在手机上竟然显示成了:/5 bash start.sh!
原因:飞书的 Markdown 引擎把连续的 * 识别成了斜体排版符,直接吃掉了。
解决:在推送消息前,拦截所有 Shell 命令的纯文本输出,强制包裹在 ``` 代码块中。不仅解决了字符丢失,还完美保留了等宽字体的终端排版美感。
2. 标准错误流 (stderr) 的噪音
当执行含有 curl 抓取的脚本时,飞书界面里突然蹦出一大段丑陋的 curl 进度条日志。
原因:curl 会默认将下载进度输出到 stderr。而我的 execute_shell 函数为了不遗漏报错,会老老实实把 stderr 全抓下来拼接在正文后。
解决:在 Python 端加了一层轻量过滤正则,无情干掉所有只包含进度条特征的无用信息。同时规范了 Shell 脚本的编写习惯 —— 把不想看的重定向进 /dev/null,把想看的才 echo 出来。
3. Webhook 的经典陷阱:被重放的指令
一开始,当我让 Bot 执行一个耗时 10 秒的复杂脚本时,惊悚的一幕出现了:脚本执行完一次后,过了一会儿,居然又自己执行了第二次、第三次!
原因:这是典型的 WebSocket/Webhook 消息重试机制。飞书要求 Bot 收到消息后必须在 3 秒内确认(ACK)。如果代码是同步阻塞等待脚本跑完的,飞书就会判定“超时未达”,进而触发重传。
解决:引入 threading 异步并发执行耗时命令,主线程瞬间返回确认;同时在内存里加了一个 deque(maxlen=1000) 作为防重放的 LRU 缓存,彻底杜绝指令重复执行。
结语:让 AI 成为真正的“外脑”
这套轻量级的 Agent 架构搭建完毕后,我感觉自己的效率工具链发生了质变。
我不再需要去学习任何第三方 Agent 框架的配置语法。由于架构足够透明(只有 Python 原生和 Shell),当我有新需求时,我只需要在 IDE 里唤起我的大模型编程助手(AI),把这套轻量级上下文喂给它。
它能瞬间写好一段 0 依赖的监控脚本,帮我用 scp 传到 VPS,配好 crontab。
工具应该顺应人的直觉,而不是让人去适应工具的臃肿。 用几十行代码连接飞书,用原生脚本包办一切,这或许才是个人开发者效率工具链的最优解。

