抖音深扒 · Ai_Flow:一个快捷键把「截图 → 问 AI」压成一步的开源悬浮窗助手

原图文:Jacklzb · Ai-Flow 开源项目(写代码 / 做 PPT / 刷课都能用)

作者:Jacklzb(GitHub zebinlu7-a11y)|形式:抖音图文作品|项目:Ai_Flow — 截图解析悬浮窗

开源地址:github.com/zebinlu7-a11y/screen-flow-ai-agent(MIT · Python · 2026-06-09 建库)

拆解材料:抖音配文 + 项目 README + 通读源码(agent/ gui/ utils/ 全模块)


一句话定性

这不是又一个「套壳 ChatGPT」的小工具,而是一个把「截图 → 复制 → 切窗口 → 粘贴给 AI → 等回答」整条摩擦链压成一个快捷键的桌面悬浮窗助手。

它真正值得看的,不是「能问 AI」这件事本身——而是底下三个有教学价值的工程决策:用自定义 LangChain ChatModel 把国产豆包 VL 接进 LangGraph 生态仿 QQ 的静态截图法绕开高分屏错位、以及让 AI 把对话嚼成「用户事实」做长期记忆。一个 8 天、62 星的个人项目,麻雀虽小,但每个零件都摆得明明白白,适合照着抄。

这是抖音深扒栏目里第一条**「开源项目拆解」**——和之前的带货视频拆解不同,这条拆的是「一个能跑的软件怎么搭起来的」。看点从「话术」换成了「架构」。


【0】这条抖音在安利什么

作者 Jacklzb 用一张「README 首屏截图 + 一段配文」安利自己做的 Ai_Flow。配文的卖点很直白:

  • ✅ 连续多张截图,一键发给 AI 解析
  • ✅ 截图秒 OCR 识别,文字直接复制
  • ✅ 纯文本对话 + 悬浮窗流式回复,不打断工作流
  • ✅ Python + PyQt6 跨平台,Win / Mac / Linux 都能用
  • 🙏 「孩子的项目真的很需要支持,求 Star」

拆原理:这是典型的「作品即广告」式开源推广——不讲参数堆砌,直接亮使用场景(写代码 / 做 PPT / 刷课 / 啃学习资料),再用「求 Star」做情感钩子。对个人开发者,抖音图文是比技术博客更短平快的获客口。这条本身就是一个「用内容平台给 GitHub 项目导流」的小样本,值得做工具的人留意。


【1】Ai_Flow 到底是什么 / 解决什么痛点

一句话:启动后桌面常驻一个半透明悬浮窗,底部输入框随时打字,按快捷键截屏任意区域,多模态大模型解析或 OCR 识别后,结果逐字流式显示在悬浮窗里。作者管它叫「行走的智能 AI」。

它瞄准的痛点非常具体——跨窗口问 AI 的摩擦

老流程(痛)Ai_Flow(解)
看到报错 → 截图 → 存文件 → 打开网页版 AI → 上传 → 打字 → 等Ctrl+D 框选 → Enter → 悬浮窗里出答案
一次只能贴一张图,多张要来回传连续框选多张,缩略图累积,一次性提交
想复制图里的文字,得手敲或找 OCR 网站Ctrl+R 截图 → 腾讯云 OCR → 文字可直接复制
问 AI 要切走当前窗口,打断手头活悬浮窗常驻置顶,不抢焦点、不切窗口

拆原理:它的产品内核是「把多步操作折叠成一个快捷键」。AI 能力早就不稀缺,稀缺的是调用 AI 的摩擦足够低——低到你「随手就用」而不是「特地打开」。Ai_Flow 把价值压在「随手」二字上:常驻、置顶、快捷键、不切窗口。这套「降摩擦」思路,比它用了什么模型更重要。


【2】能干嘛——功能全景

通读 README 和源码后,完整能力清单(含快捷键):

功能怎么用底层
纯文本对话悬浮窗底部打字,Enter 发送豆包 VL 流式
截图提问Ctrl+D 连续框选,缩略图累积,统一发送多模态(多图 + 文字混合)
OCR 文字识别Ctrl+R 截图,返回可复制文字腾讯云 GeneralBasicOCR
隐藏 / 显示Ctrl+F 一键收起全局热键(pynput)
撤销框选截图时 Ctrl+Z 撤销上一框
流式输出回答逐 token 显示,Markdown 渲染Ark responses 流式事件
多轮对话上下文自动管理,最近 5 轮LangGraph + 裁剪
长期记忆跨会话记住你是谁、在做啥AI 提取事实 + 检索注入
模型切换mini / lite / pro 三档随时切豆包 doubao-seed-2-0 系列
悬浮窗交互拖拽移动、四角缩放、半透明置顶PyQt6 无边框窗口
系统托盘最小化到托盘,右键菜单QSystemTrayIcon
即时设置悬浮窗底部按钮配 API Key / OCR 凭证本地 JSON 持久化

拆原理:功能不多但「闭环」——对话、看图、识字三件事覆盖了「桌面问 AI」90% 的场景,再用快捷键 + 悬浮窗把交互摩擦降到最低。这是个克制的功能集:没有贪大求全,每个功能都服务「随手问」这一个核心动作。


【3】技术架构深扒(这部分最值钱)

技术栈一栏:Python 3.9+ / PyQt6(GUI)/ LangGraph(编排)/ 豆包 VL(火山引擎方舟 Ark SDK)/ 腾讯云 OCR / pynput(全局热键)/ Pillow(图片)

源码分四层:agent/(大模型调用)、gui/(界面)、utils/(工具)、assets/(图标)。下面挑五个有教学价值的零件拆开看。

3.1 LangGraph 状态机——「轻用」但用对了地方

核心状态机只有两个节点,线性走完即结束:

trim_history(裁剪历史,只留最近 N 轮)

call_vlm(调豆包 VL)

     END

状态定义极简——一个 AgentState(TypedDict),核心就是 messages 字段,挂了 LangGraph 的 add_messages reducer 自动拼接新消息;编译时用 MemorySaver checkpointer 按 thread_id 持久化对话。

拆原理:这里有个值得说的判断——它其实「轻用」了 LangGraph。LangGraph 的看家本领是分支、工具调用、循环(agent loop),而 Ai_Flow 的图是一条直线,没用上任何分支。那为什么还要上 LangGraph?两个真实收益:① 现成的流式管道stream() 逐 token 吐)、② 现成的 checkpointer(多轮上下文持久化不用自己写)。

这是个好提醒:选框架别被它的「上限能力」唬住,看你实际要它的哪一块。 作者要的只是「流式 + 记忆持久化」,LangGraph 顺手给了,于是用——这比硬凑一个复杂 agent 图要诚实。当然反过来也成立:一旦后续要加「截图→判断类型→走不同处理」的分支,这套图天然能长出来,算是给扩展留了地基。

3.2 自定义 ChatModel——把国产豆包 VL 焊进 LangChain 生态(最有复用价值)

这是整个项目工程含金量最高的一块。豆包 VL 走的是火山引擎方舟的 Ark responses.create API,格式和 LangChain 默认认的 OpenAI 风格不一样。作者写了个 ChatDoubaoVL(BaseChatModel),核心是一层消息格式转换

LangChain(OpenAI 风格)          →   Ark(responses 风格)
{"type": "text", ...}            →   {"type": "input_text", "text": ...}
{"type": "image_url", ...}       →   {"type": "input_image", "image_url": ...}

流式则是订阅 Ark 的 response.output_text.delta 事件,逐 token yield 成 LangChain 的 AIMessageChunk。API Key 还支持运行时热更新(改完不用重启,reload_api_key() 重建客户端)。

拆原理:这套「适配层」模式是可以直接抄走的财富。任何一个非标准的大模型 API,只要照着「① 继承 BaseChatModel ② 写 _generate/_stream ③ 在里面做请求/响应格式转换」这三步封一层,就能无缝接进整个 LangChain / LangGraph 生态,复用现成的流式、记忆、工具链。接新模型不该改全身,只该加一个转换层——这是这个项目教给所有「想接国产模型」的人的标准动作。

3.3 仿 QQ 的静态截图法——一个具体的工程坑解法

截图模块(gui/capture_window.py)没有「实时在屏幕上画框」,而是:

  1. 用户按快捷键 → 先把全屏截成一张静态图
  2. 弹一个铺满屏幕的窗口,把这张静态图当背景绘制
  3. 用户在静态背景图上拖拽画框(支持多框、四角锚点调整、Ctrl+Z 撤销)
  4. 确认后从原始截图里按坐标裁剪

拆原理:为什么不直接在实时屏幕上画框?因为高分屏 / 多显示器 / 系统缩放(DPI)会让「屏幕坐标」和「实际像素」对不上,直接截会错位、模糊。先冻结成一张静态图、所有操作都在这张确定分辨率的图上做,就彻底绕开了坐标换算地狱。这是个小而精的工程技巧——以后谁做截图功能,这招直接用。

3.4 长期记忆——让 AI 把对话嚼成「用户事实」

utils/memory_store.py 做的不是「把聊天记录全存下来」,而是更聪明的一层:对话结束后调 mini 模型,把对话提炼成结构化「用户事实」,存进 profile.json

identity:   用户叫张三
project:    正在开发 Ai_Flow 截图工具,用 PyQt6 + LangGraph
preference: 喜欢简洁的代码,不要过多注释
problem:    在 Windows 高分屏上截图模糊

新消息来时,按关键词检索相关事实,注入 System Prompt。还带 60 秒缓存,避免每轮都读盘 + 调 API。

拆原理:这和「存全部历史塞进上下文」是两种哲学。存全部 = 又贵又稀释重点;提取事实 = 把信息嚼成判断再用。它把人按 identity / preference / project / problem / knowledge 分类记忆——这套结构,和我们自己的记忆纪律「存判断、不存搬运」几乎是同一个思想(详见后面启发)。一个个人小项目能想到这一层,是有水平的。

3.5 上下文与图片处理——省钱的细节

  • 上下文:最近 3 轮完整保留,最多 5 轮(MAX_TURNS=5),超了就裁。
  • 图片不进历史MAX_IMAGE_BASE64_KEEP_TURNS=0——序列化对话时只存文本、不存图片 base64,避免 JSON 越滚越肥。
  • 图片压缩:喂模型前压到 1920×1080、JPEG 质量 85 再转 base64,省 token 省带宽。

拆原理:这些是「成本意识」的体现。多模态最烧钱的就是图片 token,把图压一压、历史里只留文本不留图,单这两手就能显著压低每轮调用成本。做 AI 工具,省钱的细节往往藏在这种不起眼的地方。


【4】怎么装、怎么用

源码跑(开发者)

git clone https://github.com/zebinlu7-a11y/screen-flow-ai-agent.git
cd screen-flow-ai-agent
pip install -r requirements.txt
pip install volcenginesdkarkruntime   # 火山引擎 SDK 需单独装
python main.py

配置(启动后在悬浮窗底部「设置」里填)

配置项哪来必填?
API Key火山引擎方舟控制台(console.volcengine.com/ark必填(对话 / 看图)
代理http://127.0.0.1:7897,不用留空视网络环境
OCR 凭证腾讯云 CAM(console.cloud.tencent.com/cam/capi可选(只有用 OCR 才要)

开箱即用(Windows 小白)

作者也放了打包好的 Ai_Flow.zip(75MB),解压双击 Ai_Flow.exe 即可,不用装 Python。

提醒:豆包 VL 和腾讯云 OCR 都是国产云服务、有免费额度(OCR 1000 次/月),但都得自己去注册拿 Key。这是「自带钥匙」式工具——软件白送,算力你付(额度内免费)。


【5】亮点——最值得学的三件事

  1. 「降摩擦」是真正的产品力。AI 能力同质化,谁把「调用 AI 的步数」砍得最狠,谁就赢。一个快捷键替代「截图→存→开网页→上传→打字」五步,这就是它的护城河。

  2. 适配层模式可直接复用ChatDoubaoVL 把非标准的豆包 API 焊进 LangChain,是「接任何新模型」的标准范式——加一层转换,而不是改全身。

  3. 国产全栈、低门槛。豆包 VL + 腾讯云 OCR,免翻墙、有免费额度、对国内用户友好。做面向国内的工具,这套技术选型省心又省钱。


【6】局限与坑(诚实评估,别只夸)

  • 强依赖云 + Key:对话走火山引擎、OCR 走腾讯云,离线完全不可用,且要自己配 API Key(还常要配代理)。开箱体验有门槛。
  • 隐私顾虑:截图会上传到云端模型——涉密 / 敏感屏幕内容慎用。
  • volcenginesdkarkruntime 要单独装:它没进 requirements.txt(被注释了),新手容易卡在「装完依赖还是跑不起来」。
  • LangGraph 偏「轻用」:目前只是线性两节点,框架的分支 / 工具能力没用上——不是缺点,但别被「基于 LangGraph」唬成「很复杂的 agent」。
  • 很新、很小:建库 8 天、62 星、个人作品,稳定性和长期维护要观望。
  • 打包体积大:PyQt6 + 依赖,exe 75MB 起步。

一句话:它是一个「思路漂亮、工程扎实、但还很早期」的个人项目——拿来学架构、抄思路一流;拿来当生产力主力,得接受它的云依赖和早期不稳定。


给老大的可迁移启发

  1. 「把多步压成一步」正是橙子该追的方向。Ai_Flow 用一个快捷键吃掉五步操作;我们的发送链路(写 outbox → adb_send → 发微信)也该往「一个动作触发整条链、中间不用人盯」收口。降摩擦 > 加功能

  2. 适配层模式,照抄进我们接模型的流程。它用一层「消息格式转换」把豆包接进 LangChain。我们以后接任何新模型 / 新 API(豆包、SenseVoice、新出图引擎),都该是「加一个转换层」而不是改主干——接口隔离,主干不动。

  3. 它的长期记忆 = 我们记忆纪律的同构验证。它让 AI 把对话嚼成 identity / preference / project / problem 事实卡再注入——这和我们「存判断、不存搬运」「feedback / reference / project / user 四类型」几乎是同一套思想。可借鉴的是它「对话结束自动提取事实」的触发时机:不靠当下硬记,靠一个固定的「学完就沉淀」动作。

  4. 框架选型看「实际用到哪一块」,别被名字唬住。它「基于 LangGraph」但只用了流式 + checkpointer 两块,没用分支。这印证了我们的架构理念——能不堆复杂度就别堆(橙子用 Claude Code 当脑、不写 if/regex 也是同理)。选工具问自己:「我到底要它的哪个能力?」

  5. 静态截图法是个能直接落袋的工程技巧。任何要做「框选截图」的功能(比如以后橙子做识屏 / 截图发群),都先「截一张静态图再画框」,绕开高分屏 / 缩放错位——这招记下来,省一次踩坑。

  6. 国产全栈 + 免费额度,是做国内工具的默认选型。豆包 VL + 腾讯云 OCR 这套,免翻墙、成本低。我们做面向国内的能力时,优先考虑国产 API 的免费额度路线。


一句话总结

Ai_Flow 的价值不在「能问 AI」,而在它把「问 AI 这件事的摩擦」降到了一个快捷键。一个 8 天的个人小项目,却把「适配层、静态截图、事实化记忆」三个有教学价值的零件摆得清清楚楚——麻雀虽小,五脏的摆法值得抄