Operit-Environment-Context-Injector:让手机上的 AI 知道现在几点、外面什么天

给 Operit 写的环境信息注入插件:每次对话前自动附上时间、农历节假日、天气、地点、电量与纪念日,支持多源容错、坐标感知缓存和按角色卡独立配置。

7 分钟读完 Venuslee
目录

跟手机上的 AI 聊天,模型默认活在真空里:大晚上十一点跟你说早上好,周六催你去上班,外面刮风降温它一无所知。如果玩角色扮演,这种脱节感就更明显——两个人明明聊着日常,却连今天星期几、离生日还有几天都对不上。

之前我给 SillyTavern、Hermes Agent 和 DeepSeek Harness 都写过同类插件,思路很简单:每次发消息之前,先把真实世界的时间、天气和日历查好,拼成一段文本塞进上下文。搬到安卓端的 Operit 上,就是这个 Operit-Environment-Context-Injector,目前更到了 2.2.1 版。

每次对话前塞了什么

插件开启后,会在消息里附上一份结构化的环境附件,空的栏目自动省略,大致长这样:

text
【现实环境信息】

【当前时间】
17:24:34
时区: Asia/Taipei

【当前日期】
2026-11-14
星期: 星期六

日历: 星期六|周末
农历: 十月初六
下个节假日: 元旦 2027-01-01(还有48天)
日历来源: chinese-days

【当前天气】
地点: 武汉 / 湖北 / 中国
天气: 多云
温度: 16.5°C
湿度: 83%
风速: 5.4 km/h 北
来源: MET Norway

【当前位置】
地址: 武汉 / 湖北 / 中国
定位源: manual

【当前电量】
电量: 48%
状态: 未充电

【设备信息】
设备名称: vivo IQOO15
设备型号: V2505A
平台: Android 16

【生日和纪念日】
- 小明的生日,日期03-20,下次2027-03-20(还有126天)
- 相识纪念日,日期05-02,下次2027-05-02(还有169天)

每一项都可以单独开关:

  • 时间与日期:2.1.0 起拆成了两个独立开关,时间管时分秒和时区,日期管年月日和星期,想只留一个也行。
  • 日历与节假日:国内直接打包了离线库 chinese-days(1.5.9),不用联网就能算农历、法定节假日、周末和调休补班;其他国家或地区按两字母代码走 Nager.Date 公共接口。
  • 电量与设备信息:读取当前电量和充电状态。安卓系统读出来的机型经常是 V2505A 这类内部代号,设置里留了自定义设备名称,填上就能覆盖系统默认值。
  • 生日和纪念日:记下生日和自定义纪念日后,会自动算出下一次的日期和剩余天数。纪念日随时能改日期,把日期清空保存就会删掉这一条。

天气和定位:一家超时就换下一家

这类插件最容易出毛病的地方是联网查天气和反向地址解析。免密钥的公共接口在国内网络环境下时好时坏,单绑死一家,隔三差五就会刷出一行超时报错。

所以在天气和自动定位上都做了 Auto 多源容错。

天气默认按 Open-Meteo → MET Norway → wttr.in 的顺序往下试,前一家连不上或超时了,自动换下一家,拿到第一个有效结果就停,顺手在附件里记一笔切源原因(比如 open-meteo: Read timed out; 已使用 MET Norway),方便排查是不是网络问题。

自动定位的反向地理编码按 Nominatim → BigDataCloud → Photon 依次兜底,三家脾气不太一样:

  • Nominatim:OpenStreetMap 官方接口,有简体中文地址,但国内直连经常超时。
  • BigDataCloud:免密钥,直连比较稳,返回的是繁体中文。
  • Photon:同样基于 OpenStreetMap,兜底够稳,但不支持中文地址。

如果平时活动范围固定,或者不想给定位权限,直接切到手动模式填死城市名最省心。另外出于隐私考虑,不管是自动定位还是查天气,最终拼进上下文里的只有城市和地区名称,不会把经纬度坐标发给模型。

缓存和移动感知

要是每发一句话都重新定位、重新拉一次天气接口,聊天的响应速度就没法看了。

插件给天气和定位分别做了本地缓存:天气默认 30 分钟刷新一次(5 到 180 分钟可调),地址默认 10 分钟刷新一次(5 到 60 分钟可调)。整个注入流程还卡了一个默认 10 秒的总超时,就算刚好进电梯没信号、所有接口全挂了,也只是输出一行简短的错误记录,不会阻塞消息发送。设置页里的“更新注入预览”会直接复用缓存,点“手动测试”则会绕过缓存强制重拉一遍。

这里在 1.3.1 版踩过一个实在的坑:最早缓存只按配置项存,没把实时坐标算进缓存键里。结果人揣着手机坐地铁跨了区,缓存还没到期,插件还在拿家里的旧地址往对话里塞。后来改成了每次先读当前坐标,落在同一片坐标区域内才复用旧地址和天气;一旦人挪了地方,缓存键跟着变,自动切到新地点的天气。

按角色卡绑定与独立档案

我平时既拿 Operit 连终端改代码,也拿它挂不同的角色卡聊天。改代码查 bug 的时候,显然不需要每轮都让模型知道今天农历初六、手机还剩百分之四十八的电。

插件支持多选绑定角色卡:勾选之后,只有当前对话匹配选中的角色卡 ID 时才注入;一张都不勾则默认全局生效。

到了 2.2 版本,又进一步把配置拆成了“全局共享环境”和“角色独立档案”两层:

  • 时间、日历、天气、地点、电量这些客观现实环境只有一份,所有角色共用。
  • 每张已绑定的角色卡拥有自己的独立档案(按稳定 ID 存储,卡片改名也不丢数据),可以单独设置这张卡的角色生日、你们之间的专属纪念日,还能单独决定要不要向这个角色公开用户的生日信息。
  • 公共纪念日可以一键移入某个角色变成私有记录;切回没有绑定的普通助手对话时,角色档案完全隔离,不会串戏。

留不留进聊天记录

Operit 提供了两个不同时机的消息钩子,刚好对应两种使用习惯:

  • 打开随消息保存时,插件走 PromptInputHook,环境附件会直接写进这条用户消息里跟着存盘。好处是过几天往回翻聊天记录,还能看见当时是几点钟、窗外什么天气。
  • 关掉这个开关时,改走 PromptFinalizeHook,只在请求发往模型的最后一刻临时拼上去,聊天界面和本地历史记录里干干净净。

日常用的时候不用总去工具箱里翻设置页,输入框旁边的快捷菜单里注册了“环境信息注入”开关,随手点一下就能停用或恢复。

安装

  1. 到 GitHub Releases 下载最新的 .toolpkg 安装包,在 Operit 的包管理页面导入并启用。
  2. 重启一次 Operit(让工具箱 Compose 界面刷新),进入工具箱里的“环境信息注入”,按需配好地点、绑定角色卡,点一下预览确认格式没问题就能用了。

提个醒:Operit 官方自带一个“额外信息注入”插件,里面也有时间等基础项。两边别同时开相同的项目,不然一条消息底下会挂两份重复的环境附件。