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…

What is this?A floating overlay for WeChat on macOS: the moment a message arrives, it shows the sender's likely intent, a 0-9 risk score with a suggested action, and ready-to-use reply candidates.
Is it a WeChat plugin or bot, then?No — it is a standalone screen-watching app: it screenshots the WeChat window, OCRs the chat bubbles and judges them with models. It never injects, hooks or decrypts anything, which the README bills as zero ban risk.
How do I install it on my Mac?Download the .app from GitHub Releases, unzip it into Applications and right-click → Open the first time — it is unsigned, so a double-click gets blocked by Gatekeeper. Then grant Screen Recording permission on first launch; if macOS calls the app 'damaged', a Terminal command clears the quarantine flag.
Do I need my own API key, or can it run fully offline?Both are optional. The judgment layer takes either a cloud key or a local offline model (~3.8 GB, offered on first launch); the reply layer ships with a built-in shared key in the packaged app. Pair the local model with Ollama and nothing leaves your Mac.
What are its weak spots?The overlay only appears and analyzes while WeChat is in the foreground. Images and stickers can't be read, quoted replies are treated as plain text, and a WeChat redesign can break the layout constants until recalibrated. Messages whose sender side is unclear are skipped.
Will it run on any Mac?Only Apple Silicon (M-series) Macs on macOS 13+. Intel is out, and Rosetta will not help either — the local judgment model needs torch, which has no Intel build; the app detects this at startup and tells you.
What do the reply candidates look like?Eleven built-in tones generate candidates in parallel — three are on by default (high-EQ, Tieba veteran, passive-aggressive), each producing one steady and one bold variant, re-ranked by the local model. You copy a candidate or fill it into the input box; sending always stays manual in WeChat. Custom tones can be added via a JEVTONES env line.
How fast does it react to a new message?Intent judgment and candidate generation start at the same time. On an M1 Pro the intent lands in about 1.5 s and candidates in 1.5-2 s; the very first judgment after launch is slower while the local model warms up.
Which model providers are known to work?The README names three tested setups: DeepSeek's deepseek-chat (the fastest), Zhipu glm-4-flash via the Anthropic-compatible settings, and a local Ollama qwen2.5:7b for zero outbound traffic. Avoid 'thinking' models — their reasoning eats the token budget and you end up with zero candidates.
Does it remember earlier messages for context?Only if you turn chat history on in settings (it is off by default). It then keeps the last 100 actually-read messages per chat in a local file, never touching the WeChat database, and you can attach free-form background notes like 'AAA is the group owner' to help the model.
What are similar projects?DigUp, lipflow, Baize, WechatVibe, Kun, SCM, Minke, open-codesign
Creator
jev-chat
Size
7.8 MB
Stars
499
Age
28d
Commits · 90 Days