在哈科特港,停电后房间的变化只需要两秒。风扇停转,路由器熄灭,笔记本切到电池。接着有人喊一声"开发电机"。那段时间通常只能坐着,手机用移动数据,笔记本靠电池撑着,等发电机启动。
这个工具盯上的就是这段空档。当笔记本切换到电池状态超过30秒,它会弹出一个全屏页面,盖住手头正在做的事。页面只给一个方案:60秒伸展计时,站起来、向上够、转肩膀、摸脚趾、走到外面。按钮写着"我站起来了,关掉"。计时结束显示一句"你也算努力了"。下一次断电前,页面不会再出现。
页面背景跟着实际情况走。白天偏暖,并倒数下雨或日落的时间;夜里变暗,建议也留在室内附近。因为路由器已经关了,页面不依赖网络,不使用网络字体,也不从CDN加载任何东西。
这类工具面向的是那些靠笔记本工作、而停电已成常态的人。尼日利亚、南非的限电、印度和巴基斯坦的许多地区,都不需要再解释问题是什么。
检测逻辑很直接。作者家里没有逆变器,所以市电一断,笔记本确实会切到电池。程序每5秒读一次电源状态。短于30秒的波动算闪断。15分钟内第二次断电只记录、不提醒,避免市电反复闪烁时不停打扰。

断网后的天气数据来自提前保存的文件。供电正常时,工具每30分钟保存一次Open-Meteo的逐小时预报。断电后只读这个文件。日落时间由NOAA太阳公式在本地计算。10月7日哈科特港的结果是18:21,Open-Meteo也给18:21,sunrise-sunset.org给18:22。
雨季让一条规则不得不改。最初把降雨概率超过50%的小时算作潮湿,但10月的哈科特港几乎每个小时都超过50%,工具会把所有人整天关在屋里。现在改成概率达到70%,或者预期降雨量达到0.5毫米,才算潮湿。
模型用的是Gemma 4 E2B,通过Ollama跑在CPU上,下载体积4.3 GB。作者的笔记本是i5-1135G7,没有NVIDIA显卡。实测冷启动14秒,热启动3.6到4.0秒,生成速度约每秒15到20个词元。
最让作者在意的部分,是限制模型能做什么。第一版让Gemma根据事实写整条消息。4次测试中,它每次都丢掉了数字,还有两次把意思说反了。有一条写"E be like NEPA light don come Port Harcourt",意思是电来了,而实际情况相反。另一条写"Close your laptop now, before the generator dies",可发电机根本没开。因为这两句都没有数字,只检查数字的校验拦不住它们。
于是任务被拆开。事实行由代码写,说明发生了什么、雨或日落还有多久、剩余分钟数、省下多少奈拉。消息里的每个数字都来自代码。Gemma只写鼓励语,它看到三样东西:地点、情况(现在下雨、干燥白天、天黑以后)和规则选出的活动,看不到任何数字。

还有一道守卫检查鼓励语。如果包含任何数字、超过20个词,或者提到NEPA、电、电力、发电机,就拒绝。Gemma有一次重试机会,并被告知拒绝原因。重试再失败,就用固定句子。最多调用两次模型,不会循环。拆分之后,9次测试全部一次通过,作者没有看到语义错误。
守卫做不到的事也得说清楚。它检查数字和话题,不检查语义。有一次测试中Gemma写出"watch the rain inside the phone",照样通过了。更大的模型会少写这种句子,但跑不动这台笔记本。作者选择了小模型,也接受它偶尔写出奇怪的句子。
真实停电暴露了一个bug。12:23断电,工具捕捉到了,但Gemma超时。作者先测量再改代码,发现模型刚被那次失败的请求加载。Ollama会让闲置模型在5分钟后卸载。预热运行在11:53,到12:23正好撞上冷启动,又是在电池供电下,耗时超过20秒。修复只是一个设置:让Gemma留在内存里,占用15.7 GB中的3.9 GB。下一次12:31断电,Gemma第一次就回答了。后来13:34的断电也超时,但原因不同:笔记本处于睡眠状态(Windows Modern Standby)。作者查了事件日志,才没有错怪那个修复设置。
这意味着默认配置破坏了工具唯一的承诺:断电时能用。这个问题在模拟里发现不了。
页面本身是一个HTML文件,停电数据以JSON形式写在里面。Edge用特定参数打开它,没有地址栏,也没有标签页。模型生成的句子作为数据传入,绝不作为HTML插入。有一个测试会喂给它包含特殊字符的鼓励语,确认页面不会坏掉。

测试共98个,其中一个会屏蔽所有网络套接字,仍然把停电路径跑到结束。作者还故意破坏守卫8次,放宽容差、移除检查,每次都有测试失败。
为什么离线开放很重要?因为网络跟着电一起断。市电没了,路由器要等到发电机启动才恢复。云API恰恰在这个工具需要说话的时刻不可达。本地模型在无信号时4秒内回答。另一个理由没有必要找。
每次断电也不产生费用,这在天天停电的地方很重要。而且因为Ollama和模型是开放的,作者能看清第一次真实调用为什么失败:闲置模型5分钟后卸载,也能改掉这个设置。换成闭源API,超时就只是一个超时。
这个工具目前最好的结果不在日志里。那是一个本该用来等发电机的早晨,作者用来陪表亲的孩子玩了。