jev-chat-jarvis-mac README

The project's README from github.com/jev-chat/jev-chat-jarvis-mac. As one markdown file: README.md.

jev-chat-jarvis(macOS)

微信弹出一条消息 → 悬浮窗立刻告诉你这句话的真实意图、风险几级、该怎么回。

纯只读、零封号风险——不注入、不 hook、不解密数据库,只是「看屏幕 + 本地模型判断」。

演示:微信群消息进来 → 面板给出意图、风险分级与候选回复 → 点「填入」直接进微信输入框

反馈与帮助

先自查:常见问题解答(FAQ)——配置文件、日志、模型路径、安装报错、旧版空白面板速查。 交流群、公众号等联系方式见文末「交流反馈」;数据流向与隐私见 PRIVACY.md。

它能做什么

面板读法

面板使用 macOS 原生浅色磨砂材质:顶部是当前聊天、分析状态、正在处理的消息与上下文;中间依次显示意图、识别率、风险等级和行动建议;底部按话术分组展示候选回复。当前风险圆点会轻微呼吸提示。每条候选左侧是本地排序概率,右侧仍只有「复制」和「填入」;候选行会随完整文字自动增高,不截断内容,发送始终由用户在微信里手动完成。

面板默认开三组话术:高情商话术、贴吧老哥 v1.0、阴阳怪气,每个下拉可换成其余语气或「不用」;「不用」的话术槽只保留一行下拉选择,不生成也不占候选行;开启或关闭话术只改变面板高度,不改变判断与轮询流程。黄色窗口按钮收起到聊天名与状态,红色窗口按钮退出。

聊天标题支持单字和较短的联系人名称;识别到聊天标题变化时,即使最后一条消息相同,也会重新分析。

手动校准消息区域(fork 实验分支)

联系人列表可拖动时,固定比例的自动区域可能漏消息或读到列表摘要。本分支提供可选手动模式:

  1. 调整好微信窗口、联系人分栏和输入区,点击悬浮窗右上角齿轮左侧的 校准图标(四角取景框);菜单栏 J → 校准区域… 也可进入同一个界面。
  2. 在同一张截图上编辑两个选区:消息识别区域(绿框) 包含双方头像、昵称和气泡;输入区域(蓝框) 包含完整文字编辑区,排除底部工具栏和发送按钮。顶部切换当前编辑区域,两框始终同时显示;拖动四条边可微调。
  3. 点击 预览识别,同时检查消息识别和输入区位置;确认后 一次保存并启用两个区域。中途取消不会保存任一区域,也不会覆盖原校准。
  4. 菜单栏 恢复自动识别区域 可退出实验模式。校准界面共用主面板/模型设置的磨砂背景、圆角卡片、配色和按钮样式。

消息区和输入区分别保存到现有用户 env 的 JEV_MESSAGE_REGION、JEV_INPUT_REGION,值是窗口宽高及选区 x/y/宽/高(窗口点坐标),保留其他配置和注释、文件权限 600。每次启动在同一界面重新确认保存的两个选区;窗口整体移动无需重画,窗口尺寸或窗口身份改变后暂停并要求重新校准。拖动内部列表、改变输入区高度、切换带公告的聊天后,请主动重新校准;当前不保证自动识别这些内部布局变化。选区上方独立读取聊天标题,标题为空时不分析。

校准模式按气泡表面分组普通文字:同一气泡内合并多行,独立气泡不因距离近而合并;不按字符数或窗口高度删除短句。左右归属基于选区内气泡位置和同侧对齐,无法判定的文字只显示,不进入模型上下文或自动回复目标。对紧凑、均匀且原 OCR 没有文字的灰色气泡,按气泡大小放大到至少 192 像素高,进行一次局部 Apple Vision Accurate 英文识别,仅补充置信度至少 0.5 的纯数字;已有文字不重复处理,不猜数字序列,也不把 I 等字母替换为数字。图片、引用、复杂主题和特殊昵称尚未充分支持,可能仍为「未确认」;这不是通用视觉理解模型。

两个区域尚未确认时不允许填入,可使用复制。 手动输入区仅在明确点击「填入」时使用:检查窗口与会话、读取整个编辑区的草稿(不跳过底部),点击获得焦点后再次检查草稿,再输入并 OCR 读回。不会清空草稿、发送消息或使用剪贴板。手动坐标不走自动输入区定位;用户改变内部布局后必须重新校准,不能保证自动发现分栏/输入区高度变化。现有自动模式维持原行为。手动模式每次重新 OCR,不复用空帧的旧消息,不新增哈希;因此性能与自动模式不同。

验证:离线回归覆盖短句、相邻气泡、多行文本、宽列表下的左右归属、深色合成气泡、选区边界、配置权限及空帧不复用。原生窗口已验证消息区及输入区预览/保存/取消与恢复入口;截图复测覆盖宽窄列表和私聊,单独数字 1/2/3/4 在原始与 1 倍采样下均保留。填入保护通过模拟事件测试验证,未向真实微信输入框写入测试文字。尚未完成真实微信消息到在线模型候选的全流程验收,也未验证所有微信版本及主题。个人截图不随代码提交。

用法

仅支持 Apple Silicon(M 系列)Mac,macOS 13+。不支持 Intel Mac,也不要通过 Rosetta 运行(本地判断模型依赖的 torch 没有 Intel 版本,#19);启动时会检测并以中文提示原因。

只想用:Releases 下载 .app,解压拖进「应用程序」,第一次右键 → 打开(没做公证,双击会被 Gatekeeper 拦)。

「已损坏,无法打开」的报错弹窗

弹窗若显示「已损坏,无法打开,你应该将它移到废纸篓」(浏览器下载的 zip 常见,右键打开也绕不过),别删——在终端清掉隔离属性即可:

sudo xattr -r -d com.apple.quarantine /Applications/jev-jarvis.app

.app 若改过名(如「jev-jarvis 2.app」),把命令里的目录名换成实际路径。

首次启动按提示授予「屏幕录制」权限(系统设置 › 隐私与安全性 › 录屏与系统录音,给 jev-jarvis 打开),退出重开生效;「填入」另需「辅助功能」权限,第一次点会弹系统授权框。v0.3.1 及更早的旧版本还需把 python3.12 那条一并打开。

缺少可用的 uv 时,两种启动入口都先完整下载并执行官方安装脚本(下载含超时和重试),失败后尝试已有的 Homebrew。失败提示区分网络、证书、磁盘和安装器错误,详细输出见 ~/Library/Logs/jev-jarvis.log。官方脚本安装到 ~/.local/bin,不修改 shell 配置。

从源码跑(微信在运行、终端已授予屏幕录制):./start.command。分层自测:

uv run python src/perception.py                  # 感知层:识别到的消息 + 耗时
uv run python src/judge.py "这个需求你今天跟一下"  # 单条消息出判断
uv run python src/judge_zh_test.py               # 22 条中文意图回归
uv run python src/generate.py --check            # 生成层凭据解析
uv run python -B -m unittest discover -s tests   # 发出消息/异步结果回归(合成 OCR,不读屏)
uv run python probe/bootstrap_regression.py      # 两种启动入口的离线回归;不联网、不实际安装

配置

两层、两个 key、都可以不填:判断层不填时首次启动会引导选择——配置 key 在线判断,或下载离线模型(约 3.8 GB);也可以稍后再说,面板会持续提示。生成层打包版内置共享 key,不配也能出候选,数据流向见 PRIVACY.md。全部配置在一个 env 文件(不提供第二种格式):

可视化配置(#18)

点击悬浮窗右上角 齿轮图标(模型设置),或菜单栏 J → 模型设置…,可编辑 Jev、OpenAI 兼容、Anthropic 兼容三组密钥、服务地址与模型。 设置窗口显示在悬浮窗上方,不会被面板遮挡。各页统一使用底部「保存配置」:模型配置保存后必须退出并重新打开应用;「会话记录与背景」页的修改保存后立即生效。

也可继续手动编辑:

mkdir -p ~/.config/jev-jarvis
cat > ~/.config/jev-jarvis/env <<'ENV'
# 判断层(可选):TypeSafe Jev,不填用本地 decider-2b
export TYPESAFE_API_KEY=""

# 生成层:任意 OpenAI 兼容端点
export OPENAI_API_KEY="sk-你的key"
export OPENAI_BASE_URL="https://api.deepseek.com"
export OPENAI_MODEL="deepseek-chat"
# 端点的思考模式要靠额外字段关时填(Qwen3 这类不关会慢几十倍)
# export OPENAI_EXTRA_BODY='{"enable_thinking":false}'
ENV
chmod 600 ~/.config/jev-jarvis/env

会话历史与背景

在设置的「会话记录与背景」页开启 记录聊天历史(默认关闭)。应用只累计实际读到的已发送消息,包含本人和其他成员;每个聊天固定保留最近 100 条,不自动翻页、不读取微信数据库。重复读屏按消息序列衔接,相同文字的不同消息可以分别保留;无法可靠衔接时会少记;后续连续读屏确认的新消息作为独立片段保存,模型不会跨未知断层拼接上下文。

「聊天背景」可写相关背景信息,例如「AAA 是群主,BBB 是公司老板」。「保存配置」统一保存这些背景、记录开关及条数。保存后,仍有效的当前目标会重新分析。背景不占消息条数,清空编辑框后保存即可删除。

历史和背景保存在 ~/Library/Application Support/jev-jarvis/conversations.json,源码运行与打包 .app 使用同一位置,不随启动时的工作目录变化。

历史和背景仅保存在本机,但推理时会发给当前选择的模型服务及配置的中转;服务地址可在对应模型设置页配置,修改后需重启生效,服务方的留存政策由其决定。应用不增加历史云同步或项目后台存档,详见 隐私说明。

磁盘占用与清理

内容 位置 大小 清理
判断层本地模型 decider-2b(首次启动引导选择后才下载,判断+排序共用) ~/.cache/huggingface/hub/models--Mapika--decider-2b ~3.8 GB 模型设置 →「判断 · Jev」页「删除模型…」;或 rm -rf ~/.cache/huggingface/hub/models--Mapika--decider-2b;之后走本地判断会重新下载
会话历史与背景 ~/Library/Application Support/jev-jarvis/conversations.json(权限 600) 每会话最多 100 条,背景独立 设置 → 会话记录与背景 → 管理记录;背景清空后保存。删除应用不会自动删除此数据文件
Python 运行环境(venv) ~/Library/Application Support/jev-jarvis/venv ~0.7 GB 删除 .app 不会连带删它,需手动删

生成层配 Ollama 的话模型在 Ollama 自己的目录(~/.ollama),非本项目下载。

已知限制

输入区检测框与填入

菜单栏「YOLO 检测框」同时显示消息框和输入目标,约每秒刷新:蓝色实线表示辅助功能接口定位到的输入控件,橙色虚线表示从截图边界推测的输入区;无法定位时显示原因。虚线不代表已取得可写控件,也不修复 #17 的聊天区域固定比例问题。

聊天识别会在同一张截图上检测输入区边界,并将输入区排除在消息、上下文和画面变化判断之外;视觉边界不可用时尝试辅助功能定位,仍无法确认则暂停分析。输入草稿不会作为待回复消息。左侧列表的固定比例限制仍未解决。

悬浮窗跟随 macOS「降低透明度」设置:关闭时保留原版磨砂;开启时使用浅灰绿底、白色卡片与灰绿边线,增强区域区分。切换设置后自动更新,无需重启。

顶部消息区将昵称与正文分开,正文默认显示两行;长消息可点击「展开」查看,超长内容在区域内滚动。「收起」恢复两行,展开操作不会重新请求 AI。

「填入」优先通过辅助功能接口写入并读回确认。部分微信版本不提供输入控件时,显式点击「填入」会尝试视觉兼容路径:复核窗口、输入区和标题,激活微信、点击输入区、输入文字,再用 OCR 核对。该路径需要屏幕录制及辅助功能权限,会移动鼠标;填入期间请勿操作键鼠或切换聊天。不会自动按发送键,也不使用剪贴板或 Cmd+V;换行和制表符转换为空格。

兼容路径读到已有草稿时停止,提示使用「复制」手动插入;辅助功能路径仍追加原有文字。窗口、焦点或会话变化时停止,画面无法确认时提示检查草稿,不自动重试。视觉边界及 OCR 都可能误判,标题检查也不是会话 ID,不能消除用户同时操作时的竞争;深色主题、多显示器与其他微信版本仍需更多验证。

下一步(按优先级)

  1. 攒标注数据:把误判的(尤其「催进度 vs 问进度」)记下来,微调冲 95%+
  2. 区分聊天消息和分享的文章卡片:保守过滤,风险是误杀正常消息

开发者

版权与许可

Copyright © 2026 eatmoreduck 与 jev-chat 贡献者。代码以 MIT 协议开源,另见 NOTICE。

交流反馈

用着有问题、想提需求、想一起改,扫码进群(1 群已满,从 2 群开始扫,满了顺序换下一个);有新版本发布会在群里和公众号通知,建议关注;群二维码 7 天失效,过期了在 issue 说一声:

扫码加入微信交流群 2 群
2 群
扫码加入微信交流群 3 群
3 群
扫码加入微信交流群 4 群
4 群
扫码加入微信交流群 5 群
5 群

都满了或者不想进群,直接找我:加个人微信(备注来意),或关注公众号后台私信(新版本发布同样在公众号通知):

扫码加个人微信
个人微信
扫码关注公众号
公众号

☕ 请我喝杯咖啡

如果你觉得我写的这玩意儿对你有点帮助,欢迎请我喝杯咖啡。咖啡因一到位,脑子就开始冒泡,源源不断地驱动我往前跑;哪天我更新得特别勤,说明这杯续上了 😄

微信赞赏码

隐私与数据流向详见 PRIVACY.md:聊天内容只发给模型服务商——推荐自配 API key 或本地 Ollama;内置免费通道经作者中转,承诺与提醒见该页。

jev-chat-jarvis-mac (jev-chat/jev-chat-jarvis-mac)

Searching Database…

这是什么东西?一个 macOS 上的微信悬浮窗工具:消息一到,它就会显示对方发这条消息的可能意图、一个 0-9 的风险评分和对应建议,以及几条可以直接用的回复候选。
那它是微信插件或者机器人吗?不是——它是一个独立的截屏应用:对微信窗口截图,用 OCR 识别聊天气泡,再交给模型判断。它不注入、不挂钩、不解密任何东西,README 把这一点宣传为零封号风险。
怎么把它装到我的 Mac 上?从 GitHub Releases 下载 .app,解压到 Applications,第一次右键点击 → 打开——它没有签名,所以直接双击会被 Gatekeeper 拦下。首次启动时要授予屏幕录制权限;如果 macOS 提示应用“已损坏”,用一条 Terminal 命令清除隔离标记即可。
我需要自己的 API 密钥吗,还是可以完全离线运行?两种都可以。判断层可以用云端密钥,也可以用本地离线模型(约 3.8 GB,首次启动时会提示下载);回复层在打包好的应用里自带一个内置共享密钥。如果本地模型搭配 Ollama 使用,就不会有任何数据离开你的 Mac。
它有哪些不足?只有微信处于前台时,悬浮窗才会出现并进行分析。图片和表情包读不了,引用回复会被当作普通文本处理,而且微信一旦改版,界面布局参数就可能失效,需要重新校准。无法判断发送者身份的消息会被跳过。
任何 Mac 都能运行吗?只支持 macOS 13 及以上版本的 Apple Silicon(M 系列)Mac。Intel 机型不行,Rosetta 也帮不上忙——本地判断模型依赖 torch,而 torch 没有 Intel 版本;应用启动时会检测到这种情况并提示你。
回复候选是什么样的?十一种内置语气会并行生成候选——默认开启三种(高情商、贴吧老哥、阴阳怪气),每种生成一条稳重版和一条大胆版,再由本地模型重新排序。你可以复制某条候选,或者直接填进输入框;发送始终由你在微信里手动完成。可以通过 JEVTONES 环境变量添加自定义语气。
来新消息后它的反应有多快?意图判断和候选生成是同时开始的。在 M1 Pro 上,意图结果大约 1.5 秒出来,候选在 1.5-2 秒;刚启动后的第一次判断会慢一些,因为本地模型需要预热。
哪些模型服务商确认可以用?README 列出了三种经过测试的配置:DeepSeek 的 deepseek-chat(速度最快)、通过 Anthropic 兼容设置使用智谱的 glm-4-flash,以及本地 Ollama 的 qwen2.5:7b(完全不出网)。避免用“思考”类模型——它们的推理过程会吃掉 token 预算,最后一条候选都生成不出来。
它会记住之前的消息作为上下文吗?只有你在设置里开启聊天记录才会(默认关闭)。开启后,它会把每个聊天中最近 100 条实际读取到的消息保存在本地文件里,完全不碰微信数据库;你还可以附加自由格式的背景备注,比如“AAA 是群主”,来帮助模型理解。
What are similar projects?DigUp, lipflow, Baize, WechatVibe, Kun, SCM, Minke, open-codesign
Creator
jev-chat
Size
7.8 MB
Stars
498
Age
26d
Commits · 90 Days