本仓库只维护当前这一套识别。有能力的人可以 Fork 后自行适配别的聊天窗口,作者不提供这项适配,也不对 Fork 出去的改动负责。
反馈和合作走公众号「恸码奇点」。扫左边的码,或者搜一搜这个名字。
聊天窗口旁挂的回复辅助:本地 OCR 读屏上的对话 → Jev 判断意图/情绪 → 给出 3 条候选回复 → 一键填入输入框。发送永远手动,程序不替你按发送。
判断内核来自安卓版 Finderchangchang/jev-chat-JARVIS, 这里把采集换成了 Windows 端的窗口截图 + 离线 OCR。
普通使用直接下载,不用装 Python、不用碰源码。 后面的「源码运行」是给开发者的。
👉 下载最新版
- 在 Releases 页下载
jev-chat-windows-vX.Y.Z.zip(约 146 MB) - 解压到一个固定目录(整个文件夹一起,exe 要用旁边那堆文件)
- 双击
jev-chat-windows.exe
要求:Windows 10 1903+ / 11,聊天窗口开着,两个 API key(判断一个、起草一个,见下)。
首次启动会弹设置页填这两个 key。key 写进 Windows 用户环境变量(注册表 HKCU\Environment)——
全程只有 JEV_API_KEY 和 LLM_API_KEY 这两个,不落任何文件;其余设置写在 exe 旁边的
config.json,整个文件夹拷走设置也跟着走。
exe 没签名,SmartScreen 会拦一下:「更多信息」→「仍要运行」。介意就往下看「自己打包」,自己打的更踏实。
第一次启动
设置页的「模型」卡片分两节,各填一把 key:
- 判断 · Jev —— 判断意图、紧张度,并给三条候选排序。来源选 OpenRouter(默认,key 在 openrouter.ai 申请)或 TypeSafe 直连(key 在 console.typesafe.ai 申请)。填的是哪家的 key 看你上面选了哪家。
- 起草 · 语言模型 —— 写那三条候选。默认 DeepSeek 官网直连,key 在 platform.deepseek.com 申请(很便宜,起草一次几厘钱)。 换别家见下面的表,OpenAI / Anthropic / Gemini 三种接口都支持。
- 选「你们的关系」(恋人 / 朋友 / 同事 / 家人 / 自定义),保存。可以用了。
两把 key 各管一节,互不相干;同一节里换来源要重填一次 key(只存这一把)。
为什么起草默认 DeepSeek 官网直连
起草是两次网络调用里重的那次。OpenRouter 在国外,从国内过去要等好几秒、还时不时抽风;
DeepSeek 官方 API(api.deepseek.com)国内直连,起草基本就是一次 HTTP 请求的时间,体感差好几倍。
所以起草默认就是它,不用改。
判断那一步比起草轻得多,慢一点无所谓,默认走 OpenRouter 即可;嫌慢就把它也换成 TypeSafe 直连。 两把 key 都只进注册表,不落文件。
日常怎么用
- 聊天窗口开着、别最小化(用别的窗口盖住没事),把要聊的会话点开
- 对方来一条消息 → 悬浮窗几秒后给判断摘要 + 三条候选(带 Jev 给的胜出概率)
- 点「填入」→ 文字进输入框 → 你自己看一眼、改一改、按发送。程序永远不碰发送
- 你切到哪个会话,悬浮窗就跟到哪个;群聊会带上发言人名,想指定回复给谁去设置里开「群聊指定回复对象」
- 暂时不想让它读聊天:标题栏开关拨到「已暂停」
花多少钱
只有对方来新消息才调一次模型:一次起草(DeepSeek Flash)+ 一次 Jev 判断,十分钟没人说话就是十分钟零调用。 思考模式默认关,别开——起草三句话用不上,慢好几倍还贵。
![]() |
![]() |
![]() |
| 回复建议:「当前会话」跟随当前窗口、群聊多一行「回复对象」,3 条候选带 Jev 概率百分比,推荐那条置顶 | 设置:关系背景、说话风格、参考上下文条数、群聊指定回复对象(往下还有「模型」卡片) | 采集暂停:不再读取聊天,已有候选照样能填入、能复制 |
- 跟着当前会话走:会话名从面板头部 OCR 出来,记录、上下文、候选都按会话分开存;也可以自己 在下拉框里选另一个会话,翻它的记录和上次的建议(那会儿只能看不能填)。
- 群聊:每条消息前面的发言人名会一起喂给模型,所以它知道哪句是谁说的;打开「群聊指定回复对象」 还能选回复给谁,三条候选都按 TA 写,填入时可带「@名字 」前缀(纯文本)。
- 3 条候选:每条带 Jev 给的胜出概率百分比,按概率排序,推荐那条置顶并标「推荐回复」; 每条都有「填入」和复制按钮。
- 判断摘要:建议动作、可能意图、对方可能需要、紧张度 0–9。
- 采集开关:标题栏一拨就停,WGC 会话一起停掉(Win10 的黄框跟着消失),已有候选不受影响。
- 实时聊天记录:底部展开,看 OCR 到底读出了什么,认错了一眼就能发现。
- 调试视图(可选):另开一个窗口,实时画出截到的画面和每个识别框——绿 = 我、蓝 = 对方、 灰 = 过滤掉的灰字、橙 = 当成发言人名、红 = 当成图片丢掉、黄 = 小字丢掉,外加消息区和头部的框、 OCR 耗时、这一帧读出来的每一行。识别不对时一眼看出是哪一步的锅。只在内存里画,不存图。
- 两个模型都能换:判断走 OpenRouter 或 TypeSafe 直连;起草有 12 家预设(默认 DeepSeek 官网), OpenAI / Anthropic / Gemini 三种协议都支持,也能填自己的 Base URL。全程只要两把 key。
- 思考模式开关:默认关;开了模型先想再写,更斟酌但慢好几倍、贵一些。
- 参考上下文条数:3~30,默认 10,起草和判断都按它取最近 N 条。
- 说话风格:一句话描述自己的口吻,补在「照着你最近发的消息模仿」之上。
- 响应式悬浮窗:置顶、可拖可缩,最小 320×360,窄于 400 进紧凑模式。
- 新版本提示:启动时(可关)查一次 GitHub 最新版本号,有新版本会在标题栏下面出现一条提示, 点「去下载」跳转 Release 页。
这是个人自用工具,下面几条是硬约束,代码里就是这么写的:
- 只读自己电脑上、自己本来就有权查看的对话。 不代替任何人查看别人的聊天。
- 只截自己的聊天窗口 + 本地离线 OCR(RapidOCR)。 不 hook、不注入、不读对方数据库、不解密、 不碰对方进程内存。
- 截图只在内存里。 捕获到的帧是 numpy 数组,全程不写磁盘、不进日志、不上传;主程序(
app/、core/) 里没有.save()。probe/、tools/下的开发脚本(人工排查、预览界面用的)会把图存成文件,但这些 脚本不在发布包里,普通用户拿到的 exe 不含它们。 - 调试视图也只在内存里画。 那个窗口拿到的是子进程缩小后的同一份内存帧(走进程队列,不落盘), 画完就丢,不存图、不进日志、不上传;关掉开关子进程连帧都不发。
- 绝不自动发送。 只把文字粘进输入框就停手,不发回车、不点发送按钮。发不发、改不改,你来定。
- 不碰钱。 转账、红包、收款相关的界面元素一律不碰,起草的 system prompt 里也禁了这几个话题。
- 只有对方的新消息到来(或你在群里换了回复对象)才调一次模型。 静默期零调用——十分钟没人说话 就是十分钟零 token。
- API key 只进环境变量,而且全程只有两个。
JEV_API_KEY(判断)和LLM_API_KEY(起草), 不管来源选哪家都是这两个槽。都写进注册表HKCU\Environment(跟setx同一个地方),任何文件里 都不出现 key,也绝不进日志(报错文本一律脱敏)。老版本按来源分开存的OPENROUTER_API_KEY/DEEPSEEK_API_KEY仍然能读到,保存一次就迁到新名字上。 - 启动时查一次版本号(可关)。 只向 GitHub Releases API 发一个 GET,带的只有 UA 和当前版本号, 不夹带任何聊天内容;设置里「启动时检查更新」关掉就完全不发这个请求,源码直接跑(没有版本号)也 不会发。
什么会出网:判断(JEV_API_KEY)去你选的 OpenRouter 或 TypeSafe 直连;起草(LLM_API_KEY)发给你
在设置里选的那家接口(DeepSeek 官网、OpenRouter、OpenAI、Moonshot、智谱、通义、硅基流动、
OpenCode Go、Anthropic、Gemini,或者自填的 OpenAI 兼容 / Anthropic 兼容地址),加上启动时(可关)一次到
GitHub 查版本号。本项目没有任何自建服务器,聊天内容只在触发分析的那一刻,发给你自己在设置里
配置的那个接口,本项目不收集、不落盘、不进日志。发出去的内容固定是:最近 N 条对话文本(N =
设置里的「参考上下文」,默认 10;群聊带发言人名)、关系设置、你自己最近 12 条 60 字以内的短
消息(当口吻样本,链接和长段不送)、你填的说话风格,群聊指定了回复对象的话再加一个对象名。
除此之外没有别的。OCR 全程离线。GitHub 版本查询只带 UA 和当前版本号,不夹带任何聊天内容。
会不会因此被封号? 本项目不 hook、不注入、不读对方的数据库或进程内存、不调用对方的任何 私有接口或账号体系——只截自己这一个窗口的画面做 OCR,跟读屏软件、录屏软件是同一类操作。
WGC 截聊天窗口(GPU 合成窗口也能截,被遮挡也能截)
→ 像素锚点定位消息区(认底色和分隔线,不写死坐标,深浅主题通用)
→ OCR 面板头部的会话名当 key(头部像素没变就不重跑),记录、上下文、候选都按会话分开存
→ RapidOCR 只认消息区那一块
→ 按气泡颜色分 me / her,灰字(引用块、时间戳、群里的发言人名、链接卡片)过滤掉,
发言人名摘出来挂到它下面那条消息上
→ 跟上一帧比,滚动翻出来的旧消息不重复上报
→ 冒出新的 her 消息才调 core.engine.analyze():三段式
① Jev 判断(7 道题)→ ② 把判断当小抄喂给起草,写 3 条候选 → ③ Jev 只排序
→ 悬浮窗给判断摘要 + 3 条候选 → 点「填入」
截图和 OCR 跑在独立子进程里(一帧 OCR 250~800ms,放 Qt 主线程界面会僵),父进程只管界面和网络调用。
判断 + 排序(key:JEV_API_KEY)
| 来源 | 地址 | 默认模型 |
|---|---|---|
| OpenRouter(默认) | openrouter.ai/api/alpha/decisions |
typesafe/jev-1.13 |
| TypeSafe 直连 | api.typesafe.ai(官方 typesafe-sdk) |
jev-latest |
起草 3 条候选(key:LLM_API_KEY)
| 来源 | 接口协议 | 地址 | 默认模型 |
|---|---|---|---|
| DeepSeek 官网(默认) | OpenAI | api.deepseek.com |
deepseek-flash |
| OpenRouter | OpenAI | openrouter.ai/api/v1 |
deepseek/deepseek-v4.1-flash |
| OpenAI | OpenAI | api.openai.com/v1 |
自己选 |
| Moonshot (Kimi) | OpenAI | api.moonshot.cn/v1 |
自己选 |
| 智谱 GLM | OpenAI | open.bigmodel.cn/api/paas/v4 |
自己选 |
| 通义千问 | OpenAI | dashscope.aliyuncs.com/compatible-mode/v1 |
自己选 |
| 硅基流动 | OpenAI | api.siliconflow.cn/v1 |
自己选 |
| OpenCode Go | OpenAI | opencode.ai/zen/go/v1 |
deepseek-v4.1-flash |
| Anthropic | Anthropic | api.anthropic.com |
自己选 |
| Google Gemini | Gemini | SDK 自带 | 自己选 |
| 自定义 · OpenAI 兼容 | OpenAI | 自己填 | 自己选 |
| 自定义 · Anthropic 兼容 | Anthropic | 自己填 | 自己选 |
没有默认模型的来源,在设置页点「获取模型」拉一次列表自己挑(也能直接手打模型 id)。
OpenCode Go 的列表只留走 /chat/completions 的模型(DeepSeek、GLM、Kimi、MiMo 等);
MiniMax、Qwen 走 /messages,Grok、GPT 走 /responses,选了会失败,所以不放进下拉框。
三种协议各走自家官方 SDK(openai / anthropic / google-genai),不自己拼 HTTP;
判断那条 OpenRouter 的路是唯一的例外——typesafe-sdk 把路径写死成 /v1/systemone,
打不到 OpenRouter 的 /api/alpha/decisions。
两节各一把 key,都必填。链路是三段式(issue #4):先让 Jev 答 7 道判断题,把
「对方意图 / 对方需要 / 建议动作 / 紧张度」折成一小段中文小抄喂给起草,三条候选都顺着这个判断写;
最后再问 Jev 一次「哪条候选最合适」,概率就是卡片上的百分比。一次分析两次 Jev 调用——
以前是盲起草 + 判断和排序一次问完,起草读错意图时三条会一起跑偏,Jev 只能矮子里拔将军。
判断那次要是挂了(限流、超时),自动退回老路:盲起草 + 一次合问,行为跟以前一样;
排序那次挂了就按第一条推荐,判断照样显示。
温度 1.2,max_tokens 400;思考模式默认关,开了会带上各家自己的思考开关、max_tokens 提到 4000
(思考过程也算进去,400 会把答案截断)。思考开关只有 DeepSeek / OpenRouter / Anthropic / Gemini 认。模型只给出 1~2 条时会带着它的回答追问一次补齐,还不够就按实际
条数走(少于 2 条就不排序)。
目标窗口界面自绘在一块 GPU 合成画布上
(MMUIRenderSubWindowHW)。UIA 树只有 2 个节点、没有控件树——probe/probe_win.py、
probe/probe_win2.py 实测证伪。
所以唯一干净的非侵入采集路 = 截自己的聊天窗口 + 本地 OCR。离线、零 token。
- system prompt 是中文写的反模板规则:不总结不复述、不解释自己为什么这么回、不用「首先/其次/总之」和 「亲/您/加油哦」这类客套、不排比不凑三段式、句尾别习惯性加句号、允许不完整的句子和口头语、 三条不是「温暖版/负责版/行动版」而是同一个人三个心情下随手打的(其中一条可以只有几个字)。
- 喂口吻样本:把你自己最近 12 条短消息原样给它,照着你的用词、句长、标点习惯写;设置里的 「说话风格」再补一句你自己的描述。
- 收尾还做了清洗:剥掉编号、方括号、引号和照抄的「me:」前缀,去掉句尾句号(
?!~留着,那是语气)。
下载 exe 的只看前三条;Python 只有源码运行 / 自己打包才需要。
- Windows 10 1903+ 或 Windows 11(Windows Graphics Capture 的最低要求)
- Python 3.10–3.12(Releases 里的 exe 是 CI 用 3.11 打的;只想用 exe 的话不用装 Python。3.13+ 不行:rapidocr-onnxruntime 1.4.x 官方包 requires_python 封顶 <3.13,pip 会静默改装 1.2.3,启动即 KeyError)
- 聊天窗口
- 两把 API key:判断用
JEV_API_KEY,默认来源 OpenRouter(或 TypeSafe 直连);起草用LLM_API_KEY,默认 DeepSeek 官网。详见下面「使用说明」
Win10 上 WGC 会在目标窗口外画一圈黄框,系统不给关;Win11 才能关掉。 嫌碍眼就把标题栏的采集开关拨到「已暂停」,黄框立刻消失。
普通使用请直接用上面的下载即用。想改代码、调 prompt、自己打包才需要这一节。
git clone https://github.com/jev-chat/jev-chat-windows.git
cd jev-chat-windows
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txt
python main.pyPyCharm / VS Code 里直接 Run main.py 也行。
首次启动会自动弹出设置页:填两把 key(判断 JEV_API_KEY、起草 LLM_API_KEY,见上面「使用说明」),
选你们的关系(恋人 / 朋友 / 同事 / 家人 / 自定义)。key 写进注册表 HKCU\Environment,重启后依然有效,
不落任何文件;其余设置写进项目根的 config.json(已在 .gitignore 里)。
双击 build.bat(没有 .venv 会自己建一个,装依赖、调 PyInstaller,一路到底),或者手动:
pip install -r requirements.txt pyinstaller
pyinstaller --noconfirm --clean jev.spec出来的是 dist\jev-chat-windows\,整个文件夹就是成品(onedir:onefile 有 150MB 要每次启动解压)。
推一个 v* tag,.github/workflows/release.yml 会在 windows-latest 上打好、压成 zip 挂到 Release 上;
手动触发(workflow_dispatch)只出 artifact,方便试打包。
改完点「保存设置」,下一次生成立即生效,不用重启。
| 控件 | 作用 | 存在哪 |
|---|---|---|
| 你们的关系 | 恋人/朋友/同事/家人/自定义,起草和判断都按它把握称呼和分寸 | config.json → relationship(默认 romantic partners) |
| 说话风格(可选) | 一句话描述自己的口吻,只喂给起草;留空就只靠最近消息模仿 | config.json → style |
| 参考上下文 | 起草和判断各看最近多少条消息,3~30 | config.json → context(默认 10) |
| 群聊指定回复对象 | 开了群聊里才有「回复对象」那一行,候选针对 TA 写 | config.json → reply_target(默认关) |
| 启动时检查更新 | 开了才在启动时查一次 GitHub 最新版本号,有新版本就在标题栏下面提示 | config.json → check_update(默认开) |
| 调试视图 | 另开一个窗口实时显示截到的画面和识别框,看识别在哪一步认错。拨一下立刻生效,不用点保存;关掉那个窗口等于关掉开关 | config.json → debug_view(默认关) |
| 判断 · 来源 | OpenRouter 还是 TypeSafe 直连 | config.json → jev_provider(默认 openrouter) |
| 判断 · 密钥 | 上面选哪家就填哪家的 key。已配置时留空 = 保留 | 注册表 HKCU\Environment → JEV_API_KEY |
| 判断 · 模型 | 可手打,也可点「获取模型」拉列表挑 | config.json → jev_model(空 = 该来源默认) |
| 起草 · 来源 | 上面那张表里的任意一家 | config.json → draft_provider(默认 deepseek) |
| 起草 · Base URL | 只有两个「自定义」来源才出现这一行 | config.json → draft_base_url |
| 起草 · 密钥 | 上面选哪家就填哪家的 key。已配置时留空 = 保留 | 注册表 HKCU\Environment → LLM_API_KEY |
| 起草 · 模型 | 可手打,也可点「获取模型」拉列表挑 | config.json → draft_model(空 = 该来源默认) |
| 起草时开启思考模式 | 开了模型先想再写,慢好几倍、贵一些 | config.json → thinking(默认关) |
主界面上那几个(标题栏的采集开关、「当前会话」和「回复对象」下拉、「填入时带 @」勾选框)只在内存里, 不落盘,重启回默认。
- 当前会话:顶部下拉框,自动跟着当前窗口走(右边标「跟随」)。聊天记录、喂给模型的上下文和候选 都按会话分开,切来切去不串味。也可以自己选另一个会话翻它的记录和上次的建议(标「浏览中」)—— 那会儿只能看不能填,当前开着的不是它,填进去就串会话了;一切会话,界面自己跟回去。
- 回复对象(群聊,可选):设置里打开「群聊指定回复对象」,群聊的「当前会话」下面会多一行下拉框, 选回复给谁,三条候选就都按 TA 来写(换一个人会立刻重生成)。旁边的「填入时带 @」默认勾着,填入时会 在开头加「@名字 」——那只是普通文字,不会认成真正的 @(真 @ 得用对方自己的选人面板)。 开关关着就是普通回复,没有这一行,也不加 @。
- 采集开关:标题栏右上角。拨到「已暂停」就完全不读聊天(WGC 会话一起停掉,黄框也没了), 已经生成的候选照样能填入、能复制。
- 填入:点候选卡片上的「填入」,文字进输入框,光标留在那儿,发送你自己按。
- 复制:卡片右上角的复制按钮,想手动粘到别处就用它。
- 聊天记录:底部按钮展开,看 OCR 到底读出了什么,认错了一眼就能发现。
几个注意:
- 聊天窗口别最小化。 Windows 不渲染最小化窗口,什么截图法都拿不到画面。程序发现被最小化会无激活还原 再压到最底下(不抢焦点),但直接用别的窗口盖住它是更省心的做法——被遮挡不影响 WGC。
- 群聊和单聊各算一个会话(群名后面的成员数「(422)」会去掉,只拿名字当 key)。
- 判断题的口径是按一对一写的,群里多人混说时结论会偏。
main.py 入口:父进程只管界面,子进程采集,队列传消息(IDE 直接 Run)
app/ UI + 采集层
capture.py 找聊天窗口 + WGC 盯帧 + 像素锚点定位消息区;帧全程内存
ocr.py RapidOCR 读消息区 → 按颜色分 me/her/灰字 → 滚动去重;另读头部的会话名
worker.py 采集子进程主循环(截图 → 定位 → OCR → 去重 → 丢队列)
fill.py 填入不发送:写剪贴板 → 点输入框 → Ctrl+V,到此为止
overlay.py 置顶悬浮窗:会话/回复对象、判断摘要、3 条候选、聊天记录、设置页(PySide6 + Fluent)
debugwin.py 调试视图:另一个窗口画当前帧 + 每个识别框的分类;只在内存里画,不存图
settings.py 两把 key 只进注册表,其余设置落 config.json
core/ Jev 判断内核,平台无关,跟安卓原版同一套口径
engine.py 唯一入口 analyze(messages, relationship) → 候选 + 排序 + 判断
providers.py 两张来源表(判断 / 起草):协议、地址、默认模型;纯数据,不认 key
llm.py 三种协议的薄适配层,一律走官方 SDK:openai / anthropic / google-genai
jev_client.py Jev 判断客户端:OpenRouter(urllib)/ TypeSafe 直连(typesafe-sdk);脱敏、退避
questions.py 7 道判断题 + build_state() + build_rank_question() + 判断小抄 guidance_text() / 中文标签 CHOICE_LABELS
draft.py 起草 3 条候选:拼提示词、解析、过滤、不足时追问补齐;调用走 llm.py
tools/
demo.py 端到端冒烟:拿一段写死的对话跑完整链(需 key + 联网)
preview_ui.py 用合成数据预览界面(含 --state debug 的调试视图),不采集不联网不碰聊天窗口;可 --screenshot 出图
make_icon.py 生成 docs/icon.ico(打包图标),图标已提交,换颜色才用重跑
probe/ 一次性探针,结论已写进本文,留着是为了可复现
probe_win.py UIA 能不能读聊天文字 → 证伪(树是空的)
probe_win2.py UIA 证伪 v2:分清「树是空的」和「有树没文字」,顺带试 LegacyIAccessible
probe_notify.py 来消息走不走 Windows 通知平台(能监听到就零 OCR)
probe_ocr.py OCR 读不读得准中文气泡、左右说话人分不分得开
probe_ocr_speed.py RapidOCR 一帧多久、裁小能快多少(结论:det_limit_type 必须 'max')
probe_ocr_live.py WGC 持续盯窗口 + 变了就 OCR,新文字实时打控制台
probe_printwindow.py 试 PrintWindow + PW_RENDERFULLCONTENT 能不能绕开 Win10 黄框(未验证)
probe_laya.py Laya(开源本地决策模型)能不能替 Jev:英文题跑 multilingual / typed-decisions → 都接近随机
probe_laya_cn.py 同上,中文题问 multilingual → 更差
probe_laya_en.py 把对话人工译成英文再喂 typed-decisions → 好一点,但生气那段仍判成闲聊
jev.spec PyInstaller 打包定义(onedir),build.bat 和 CI 共用这一份
build.bat 本地一键打包(双击就行)
.github/workflows/release.yml 推 v* tag → windows-latest 上打包 → zip 挂到 Release
requirements.txt 依赖(纯 ASCII 注释:中文 Windows 上 pip 按 GBK 读会炸)
NOTICE 出处、第三方组件许可证与商用约束
docs/KICKOFF.md 最初的需求和硬约束说明
docs/icon.ico 程序图标,tools/make_icon.py 生成
docs/ui_*.png README 里那三张截图,tools/preview_ui.py --screenshot 出的
docs/wechat-mp.png 公众号「恸码奇点」长条横幅,README 标题下和设置页底部共用
config.json 你自己的设置,不进仓库(在 .gitignore 里)
tools/ 和 probe/ 里的脚本都按「项目根在 PYTHONPATH 里」写(PyCharm 默认会把内容根加进去)。
命令行跑 tools/demo.py 得自己带上:set PYTHONPATH=. && python tools/demo.py。
代码里没有 sys.path 补丁。
- Win10 黄框:WGC 的采集提示框,系统不给关,Win11 才行。
probe/probe_printwindow.py是 PrintWindow +PW_RENDERFULLCONTENT的替代方案探针,还没在当前版本上验证过,能出图就能换掉 WGC。 - 输入框拉高超过面板一半会认错消息区:消息区靠「面板 45% 高度以下第一根分隔线」定位, 输入框拉太高就会把它当成消息区底线。
- OCR 的「文字必须落在平底色上」规则只对精确像素的帧成立:框里众数颜色占比低于 45% 就当成图片里的 字扔掉(头像、照片、表情包上的字)。缩放或压缩过的图(比如拿预览窗再截一次)底色会糊成几百种颜色, 整屏都会被当成图片。
- 群聊里名字行被 OCR 漏识,这条消息会挂到上一个人头上;「填入时带 @」加的
@名字也只是纯文本, 不会把它变成真正的 @ 提醒——真 @ 得走对方自己的选人面板,本工具不模拟那套按键。 - 会话靠头部标题认:OCR 抖一个字会按相似度归到已知会话(不然一抖就多出一个会话), 代价是名字只差一个字的两个会话会被并成一个。头部一直认不出就先挂在「当前会话」名下。
- 同一人连发两句一模一样的会吞一条:去重按文本相似度做的。对「要不要触发分析」没影响。
fill靠点击输入框坐标:算的是消息区底线下方 40px、左边界右侧 60px,对方改布局就得跟着调。- 没有托盘:关窗口就是退出(标题栏的「最小化」是收到任务栏,不是后台常驻)。
v0.1.10
- 先判断再起草(issue #4):
analyze()改成三段式 —— Jev 先答 7 道判断题,判断折成中文小抄喂进 起草提示词,最后 Jev 只做排序;一次分析两次 Jev 调用。判断那次失败自动退回老路(盲起草 + 判断和 排序一次问完),排序失败就按第一条推荐 - 设置页可开「识别调试」窗口,实时显示消息区、会话名区域、OCR 分类框、提取出的消息和耗时;默认关闭, 截图只在内存里传递
- 起草来源新增 OpenCode Go;OpenRouter 的 Jev 模型列表改为列出 Decisions API 模型并单独校验密钥, 429 等错误保留服务端返回的原因
- 修:Win10 1909 上采集不再切换不受支持的光标/边框选项;候选被过滤光时明确报错;长会话名和回复对象名 在窄窗口按宽度省略,选项里仍保留完整名称
- 源码安装说明明确 Python 3.10–3.12;README 和设置页加入公众号「恸码奇点」入口
v0.1.9
- 设置页「模型」卡片:判断 · Jev(OpenRouter / TypeSafe 直连)+ 起草 · 语言模型(12 家预设 + 自定义
Base URL),三种协议一律走官方 SDK(
openai/anthropic/google-genai),可点「获取模型」拉 接口的真实列表;key 收敛成两把JEV_API_KEY/LLM_API_KEY,换来源复用同一个槽,老的OPENROUTER_API_KEY/DEEPSEEK_API_KEY仍能读到,保存一次自动迁移 - 修:
settings.save部分保存(某项传 None)会把config.json里那几项清空——写文件前没先把要保留 的值读出来 - 合规:补
NOTICE、LICENSE加上游版权行,README 加「版权与许可」「免责声明」和封号问答,重写 「什么会出网」;发布 zip 带上 LICENSE/NOTICE - probe:Laya 本地决策模型能不能替 Jev 的探针(中英文题、把对话译成英文再试)——结论都不够稳,暂不替换
v0.1.8
- 新版本提示:启动时查一次 GitHub Releases 最新版本号(可在设置里关),有更新在标题栏下出一条横幅带 下载链接
- 页脚显示当前版本号,CI 按 tag 写入
app/version.py
v0.1.7
- fill:64 位下剪贴板 API 补
restype/argtypes,修句柄被截断导致的崩溃(来自 PR #2);剪贴板被占 重试、AttachThreadInput抢前台、粘贴前Ctrl+End追加再填 - 填入失败把真实异常写进聊天记录
requirements.txt钉rapidocr1.4.x(1.2.x 构造参数会KeyError)- README:加「使用说明」放第二节,「下载即用」提到最前标为推荐,「源码运行」改成开发者向
v0.1.6
- 仓库从个人账号转到 jev-chat 组织,改名
jev-chat-windows - README、打包产物名(
build.bat/jev.spec)、CI release 产物名同步改名
v0.1.5
- 防注入硬防线:上下文里疑似注入的对方消息标出来 + 围栏包住对话;候选原样出现在注入消息里的直接丢, 不够再追问补齐
- 候选去重:跟对方最近 5 条消息里任一条一样就丢(纯笑声例外)
v0.1.4
- 起草 prompt 加一道软防线:对话里出现「忽略上面的规则」「你现在是……」之类的话,按聊天内容正常回, 不当指令(v0.1.5 硬防线的前身)
- README 全面刷新:功能、设置说明表、模型/出网内容、项目结构、已知限制、更新记录
v0.1.3
- 起草去 AI 味:中文反模板 system prompt、拿自己最近的消息当口吻样本、可选「说话风格」设置、 温度 1.2、去句尾句号、剥掉照抄的「me:」前缀
- 显式关掉 V4.1 Flash 默认开着的思考模式(
max_tokens400),设置里另给一个「起草时开启思考模式」 开关,开了提到 4000 - OCR:文字必须落在平底色上,头像/照片/表情包里的字直接丢
- 候选解析修复:一行一个
["…"]、逗号连着的多个数组、带编号的 JSON 行都能剥干净
v0.1.2
- 按会话拆分:头部会话名当 key,每个会话独立去重/记录/上下文/候选;悬浮窗「当前会话」跟随当前窗口、 也能浏览其他会话
- 群聊:发言人名进模型上下文;可选「群聊指定回复对象」——选回复给谁、候选针对 TA、填入可带 @
- 悬浮窗响应式:最小 320×360,窄于 400 进紧凑模式
- 起草模型升到 DeepSeek V4.1 Flash;模型只给 1~2 条时追问补齐,仍不足按实际条数走
v0.1.1
- 起草可选 DeepSeek 直连,设置页加「起草模型来源」和 DeepSeek key(同样只进注册表)
- Jev 判断和排序仍旧只走 OpenRouter
v0.1.0
- 首个发布版:窗口截图 + 本地 OCR + Jev 判断 + 悬浮窗 3 条候选 + 填入不发送
- 候选卡片显示 Jev 概率百分比并按概率排序
- 设置里加「参考上下文」条数(3~30,默认 10);key 直接读写注册表
HKCU\Environment - PyInstaller onedir 打包(
jev.spec+build.bat)+ 推v*tag 自动出 Release
- Finderchangchang/jev-chat-JARVIS — 安卓原版, Jev 判断内核和题目口径都来自这里
- RapidOCR — 离线中文 OCR
- windows-capture — Windows Graphics Capture 的 Python 绑定
- PyQt-Fluent-Widgets — 界面组件
Copyright © 2026 rezoch340 与 jev-chat 贡献者。代码以 MIT 协议开源,另见 NOTICE。
- 本项目是 Jev 聊天助手(安卓原版)的 Windows 姊妹项目,Jev 判断内核与题目口径来自上游,版权归 Finderchangchang 与 jev-chat 贡献者所有。
- 分发或商用时须保留 LICENSE 与 NOTICE,并在产品「关于」页、说明文档或发布页写明来源。推荐写法:
基于 JevChat-Windows(https://github.com/jev-chat/jev-chat-windows)二次开发。 - 不要用「JevChat-Windows」「Jev 聊天助手」「jev-chat」名称或 chatjevs.com 域名暗示由原作者出品或背书。
第三方组件与商用:本项目自己的代码是 MIT,但 Windows 发布包(PyInstaller 打的 zip)里打进了 PySide6-Fluent-Widgets,该组件是 GPLv3 协议,非商用免费,商用需要 向作者购买商业授权。因此发布包整体受 GPLv3 约束:想商用的人请自己去买那份商业授权,或者自己把这个 组件换掉,本项目不代为处理。其余依赖(PySide6、RapidOCR、windows-capture、openai / anthropic / google-genai / typesafe-sdk 等)的许可证见 NOTICE。
免责声明:本项目只处理你自己设备上、你自己有权查看的聊天。请在自己设备上自用;装到别人机器上 读别人的聊天记录是另一回事,本项目不为那种用法背书。请遵守对方软件许可协议与当地法律法规,对方 改版可能导致本项目的界面识别失效。使用本项目造成的后果由使用者自行承担,作者不负责。



