开口即响应:macbrow 如何用 System 1 决策与无截图管线重塑 Mac 语音 Agent

开口即响应:macbrow 如何用 System 1 决策与无截图管线重塑 Mac 语音 Agent

在多模态大模型席卷人机交互的今天,“动动嘴皮子让电脑替我干活”一直被奉为下一代操作系统的终极形态。然而,现实中所有尝试过语音控制电脑的用户,几乎无一例外被折磨得失去耐心:从说完一句话,到屏幕截图、上传云端、多模态大模型逐 token 慢速推演、坐标定位计算,往往需要经历 5 到 15 秒令人窒息的漫长死寂。这种“便秘式”的交互延迟,让现有的 Computer-Use 系统大多只能沦为技术演示,难以真正融入高频的日常生产力场景。

近日,开源开发者 Pratim Bhosale 推出的实验性项目 macbrowtimpratim/macbrow)在开源社区引发了强烈反响。该项目打破了传统 Computer-Use“全流程重型视觉自回归”的思维定势,巧妙地将 TypeSafe 刚推出的 Jev(System 1 非自回归决策模型) 与 Gradium 毫秒级流式语音网关、LiveKit Agents 以及去视觉化的 jev-ultrafast 浏览器控制引擎融为一体。作者实测跑出了惊艳的工程数据:1.6 秒内完成指令并开始播放电影预告片、3.7 秒追问修改机票返程日期、11 秒内将亚马逊吸尘器加入购物车。本文将深入源码,彻底剖析 macbrow 的底层架构设计与毫秒级执行秘密。


一、 语音 Computer-Use 的“工程之殇”:为何传统方案奇慢无比?

要理解 macbrow 的突破,首先必须透视传统基于多模态大模型(如 Claude 3.5 Computer Use、GPT-4o)的计算机控制 Agent 所面临的系统级延迟泥潭。

flowchart TD
    subgraph LegacyPipe["传统 Computer-Use 语音控制流水线(耗时 8 ~ 20 秒)"]
        direction LR
        VIn["用户语音输入"] -->|STT 转写 0.5s| Text["指令文本"]
        Text -->|截屏抓取 0.3s| Screen["高分辨率视网膜截图"]
        Screen -->|编码上传 0.5s| VLM["多模态大模型 (System 2 推理)"]
        VLM -->|思维链推演 3~10s| Tokens["自回归生成文本/坐标"]
        Tokens -->|正则解析 0.2s| OSAct["模拟鼠标移动与点击"]
        OSAct -->|等待界面渲染 1s| Loop["进入下一步循环..."]
    end

1. 致命的流水线时延叠加

在传统的 Computer-Use 管线中,Agent 每走一步,都需要经历一次全分辨率截屏 → 图像压缩上传 → 多模态视觉编码 → 大模型自回归输出坐标与 JSON → 本地解析执行的漫长循环。

  • 人类日常对话的舒适沉默窗口仅有 200 ~ 500 毫秒
  • 一旦交互延迟突破 1 秒,用户就会本能地怀疑系统是否假死;
  • 若完成一次多步骤的网页订票或信息检索需要 8 到 10 个轮次,整个任务耗时直接飙升到 1 分钟以上,实用价值大打折扣。

2. 视觉坐标脆弱性与幻觉陷阱

利用视觉模型在屏幕截图像素上“找按钮”,本质上是在用最高维、最嘈杂的信息做低维离散决策:

  • Retina 视网膜缩放与多屏分辨率漂移:常导致计算出的 (x, y) 坐标出现几像素的细微偏差,精准点中空白或误触邻近元素;
  • 动态弹窗与 DOM 重绘:视觉模型生成的坐标可能打在尚未消失的过渡动画层上;
  • 自回归幻觉:通用模型偶尔会脑补出一个页面上根本不存在的输入框,并在 JSON 格式校验中偶发崩塌。

macbrow 给出的一针见血的解法是:治好延迟的关键,绝不是让大模型想得更快,而是尽可能少让它生成!


二、 macbrow 系统架构全景:毫秒级多模态闭环

macbrow 的系统由四条彼此解耦、极度收敛的管线构成。它的核心架构思想是:由确定性的原生代码全面掌管业务工作流状态机,将小粒度、强类型的微决策分派给 System 1 模型,仅在需要无中生有撰写文案或生成新代码时才兜底唤醒重型 LLM

flowchart TD
    Mic["麦克风实时音频流"] -->|WebSocket 流式传输| GradiumSTT["Gradium Streaming STT<br/>(端到端流式语音识别 + 语意停顿判定)"]
    GradiumSTT -->|转写文本| JevRouter["JevRouter (macbrow/router.py)<br/>System 1 毫秒级意图与工具投机路由"]

    subgraph DecisionRouting["Jev 核心微决策分发 (~300ms)"]
        JevRouter -->|1. 本地原生控制| AppleScriptEngine["AppleScript 执行引擎<br/>(直接调取系统与已启动应用词典)"]
        JevRouter -->|2. 浏览器复杂任务| BrowserRunner["jev-ultrafast 驱动真实 Chrome<br/>(基于 CDP 控件树,无截图)"]
        JevRouter -->|3. 未知全新意图| Generator["自进化工具生成器 (generator.py)<br/>(LLM 编写 AppleScript + 4重门禁)"]
        JevRouter -->|4. 闲聊与即问即答| SmallTalkLLM["极轻量 LLM<br/>(GPT-5-mini / 本地 Qwen 3.5, 严格1句)"]
    end

    AppleScriptEngine --> ResultPipe["结果状态回传与模版渲染"]
    BrowserRunner --> ResultPipe
    Generator -->|持久化到 tools/learned.json| AppleScriptEngine
    SmallTalkLLM --> SpeakPipe["输出播报文案"]

    ResultPipe --> SpeakPipe
    SpeakPipe --> GradiumTTS["Gradium Streaming TTS<br/>(超低延迟流式语音合成)"]
    GradiumTTS --> Speaker["扬声器即时播报"]

整个系统的技术栈选型极其硬核:

  • 语音进出基座:采用 Gradiumgradium.ai)的流式语音转文本(STT)与流式文本转语音(TTS),通过 LiveKit Agents 插件无缝接入,将端到端语音转写与断句延迟压至极致;
  • 微决策大脑:采用 TypeSafe 研发的非自回归模型 Jev,负责意图分类、参数提取、任务完整度断言与执行结果判定;
  • 无截图网页执行器:采用 Browser Use 与 TypeSafe 联手打造的 jev-ultrafast,通过 Chrome DevTools Protocol(CDP)直接操控真实浏览器;
  • 自愈与演进层:内置多阶段编译校验与安全策略沙箱,允许在遇到未知指令时动态合成新工具并持久化缓存。

三、 核心突破一:System 1 投机式路由 —— 选择而非生成

macbrow/router.py 中,我们可以看到该项目最优雅的工程设计:彻底摒弃自回归生成,全面采用结构化 Choice 与 Noul

sequenceDiagram
    autonumber
    actor User as 用户语音
    participant Voice as Gradium STT
    participant Router as JevRouter (router.py)
    participant Jev as TypeSafe Jev (System 1)
    participant Mac as macOS / Chrome

    User->>Voice: "把音量调高一点"
    Voice->>Router: 转写文本 "turn the volume up a bit"
    Note over Router: 注入当前 Mac 前台应用与运行状态
    Router->>Jev: 单次 System 1 请求(工具 Choice + 所有枚举槽位投机 Choice)
    Note over Jev: 非自回归概率计算 (~300ms)
    Jev-->>Router: 返回: tool="volume_adjust", args={"direction": "up"}
    Router->>Mac: 执行预编译 AppleScript: set volume output volume ...
    Mac-->>Router: 执行成功
    Router->>Voice: 确认播报 "Volume up."

1. 为什么“选择”比“生成”快几十倍?

传统大模型路由需要先思考一段文字,再吐出 {"tool": "volume_adjust", "args": {"direction": "up"}}。自回归模型需要串行采样数十个 token,耗时 1 到 2 秒,还必须防范 JSON 键名拼写错误。

而在 Jev 的体系下,路由是一个确定性的选项集合。macbrow 收集当前前台应用(active_app)以及所有运行中的应用上下文,将适用的工具名单送入 Jev 的 Choice 原语。Jev 直接输出各个选项的概率分布,耗时仅约 300 毫秒

2. 投机式枚举参数填充(Speculative Arguments Extraction)

通常的 Agent 在选出工具后,还需要发第二个请求去填参数。macbrow 采用了极具创意的 投机预填(Speculative Pre-filling) 机制:

# macbrow/router.py 核心逻辑精析
async def route(self, utterance: str, ctx: MacContext, ...) -> Route:
    # 1. 收集适用于当前 Mac 活跃上下文的工具
    tools = self.registry.available(ctx)
    criteria = {t.name: t.choice_description() for t in tools}
    criteria[CHAT] = {"what": "用户闲聊或问答,非具体 Mac 操作指令"}
    criteria[NEW_ACTION] = {"what": "现有工具均不支持的未知全新操作"}

    questions = {"tool": Choice(instructions="用户想在 Mac 上执行哪个工具?", criteria=criteria)}

    # 2. 关键创新:并发投机!把所有候选工具的所有枚举参数问题一并打包送入同一个请求
    for t in tools:
        for spec in t.args:
            if spec.kind == "enum":
                questions[_arg_qid(t, spec.name)] = Choice(
                    instructions=spec.instructions,
                    criteria={v: c for v, c in spec.criteria.items()},
                )

    # 3. 单次网络往返,同时拿到工具选择与全部潜在参数的概率计算结果
    resp = await self.client.system_one(state=_state(utterance, ctx), questions=questions)

只读胜出者的答案:请求返回后,系统只读取最终选中的那个 Tool 对应的参数答案,其余落选工具的投机计算结果直接丢弃。整个过程 0 额外 RTT,一次往返搞定工具与所有参数!

3. 提取而非生成的自由文本切片(Select-not-generate)

如果工具需要自由文本槽位(例如“发短信给李雷说晚上八点开会”中的收件人和内容),macbrow 依然坚决不让模型凭空生成文本,以杜绝幻觉。

它的做法在 _span_candidates 函数中展露无遗:基于分词算法,从用户的原始发音文本中提取出所有以词为边界的连续子串切片(如 李雷晚上八点开会),然后让 Jev 从这些真实存在的文本切片中执行 Choice 选择。模型输出的每一个字,都是用户自己亲口说出的原始子串,从物理层面根除了 Prompt 注入与生成胡言乱语的风险


四、 核心突破二:jev-ultrafast 抛弃截图,真实 Chrome 的极速穿梭

当意图判定为网页任务(如查机票、电商搜索、填写表单)时,系统转交至 macbrow/browser_task.py。这是业界首次在真实生产力环境中跑通无截图浏览器 Agent。

flowchart LR
    subgraph TraditionalBrowser["传统视觉 Browser Agent"]
        direction TB
        T1["高分辨率整页截图"] --> T2["VLM 识别视觉区块"]
        T2 --> T3["自回归生成鼠标坐标 (x,y)"]
        T3 --> T4["模拟位移点击"]
        Note1["单步耗时:5 ~ 15 秒<br/>受制于分辨率与视网膜缩放"]
    end

    subgraph UltrafastBrowser["jev-ultrafast 架构 (macbrow)"]
        direction TB
        U1["CDP 抓取活跃 DOM"] --> U2["映射为扁平编号控件表<br/>[#12 搜索框, #15 提交按钮]"]
        U2 --> U3["Jev 单次选择原语 (~300ms)<br/>(CLICK, #15)"]
        U3 --> U4["CDP 原生事件直发"]
        Note2["单步耗时:0.4 ~ 0.8 秒<br/>零图片传输,100% 精准元素命中"]
    end

1. 保持真实 Profile 与会话常驻

传统的自动化往往拉起一个干净隔离的测试用 Chrome 实例,用户需要重新扫码登录、处理双重验证。macbrow 则通过 chrome.py 精准锁定用户正在使用的主力 Chrome Profile,利用 open -na 'Google Chrome' --args --remote-debugging-port=... 挂载 CDP。用户已登录的亚马逊、Google 账号、Cookies 完全就绪,开箱即用。

2. 扁平编号控件表替代图片渲染

jev-ultrafast 将网页当前视口的 DOM 元素提取为一个紧凑、扁平的结构化表格:

  • 每个可交互元素都有一个唯一数字索引(#12 input[type=text] "搜索框"#15 button "加入购物车");
  • Jev 接收到的不是几兆字节的图像,而是一个纯粹的离散状态表;
  • Jev 在 300 毫秒内做出决策:从预设动作(CLICKTYPE_TEXTSELECT_OPTIONSCROLLWAITDONEBLOCKED)中选出操作原语,并附带目标索引;
  • 只有在执行 TYPE_TEXT 时,才会让轻量 LLM 辅助整理一句话输入文案。

实测在 Amazon 上搜索吸尘器并加入购物车,全流程 4 个步骤仅耗时 11 秒;而在订票页面将返程日期改为 11 月 4 日,由于是在已加载页面上追加交互,6 个轮次的推演与联动在 3.7 秒内全部跑通


五、 核心突破三:自进化工具合成与四重守门员验证

如果用户说了一个现有词典里完全没有的冷门操作(例如“把前台窗口左移半个屏幕”或“在 Slack 里给某频道发送特定格式摘要”),macbrow 并不会两手一摊报错,而是启动了它的自进化流水线(macbrow/generator.py)。

flowchart TD
    Utterance["未知新意图输入"] --> GenPrompt["LLM 编写 AppleScript 原型代码"]
    
    subgraph MultiStageGates["四重质量与安全守门员 (Multi-Gate Verification)"]
        direction TB
        Gate1{"1. osacompile<br/>语法静态编译检验?"}
        Gate2{"2. _has_effect 正则分析<br/>是否包含真实执行副作用?"}
        Gate3{"3. policy.py 安全扫描<br/>是否触碰沙箱红线?"}
        Gate4{"4. Jev 语义真实性审核<br/>p(script achieves goal) >= 0.4?"}
    end

    GenPrompt --> Gate1
    Gate1 -->|失败| Repair["编译器报错注入上下文<br/>触发最多 3 轮定向修复"]
    Repair --> GenPrompt
    Gate1 -->|通过| Gate2
    Gate2 -->|无副作用代码| Repair
    Gate2 -->|通过| Gate3
    Gate3 -->|违规触发 PolicyError| Block["终止并直接拒绝执行"]
    Gate3 -->|通过| Gate4
    Gate4 -->|置信度不足| Repair
    Gate4 -->|审核达标| Save["持久化注册到 tools/learned.json"]
    Save --> Run["执行新工具并语音确认"]

1. 为什么不能直接 eval LLM 生成的脚本?

在没有强力约束的自动化代理中,直接执行大模型编写的代码无异于引狼入室。此外,很多小型代码模型在面临复杂任务时,倾向于写出“伪执行代码”——例如写一段空赋值然后直接 return "done",看似语法正确,实则什么都没做。

2. 四重严苛验证门禁

  1. 静态语法编译(Compiler Gate):直接调用 macOS 系统底层的 osacompile 对生成的 AppleScript 进行二进制语法树静态检查。如果编译失败,系统捕获其错误日志,在后台自动开启最多 3 轮的自我修复(Self-repair);
  2. 副作用模式校验(Effect Pattern Check):通过 EFFECT_PATTERNS 正则扫描代码,确保脚本必须包含至少一个实质性动作指令(如 clickkeystrokeset volumedo shell script 等),彻底拦截“假装执行完成”的模型幻觉;
  3. 本地安全策略沙箱(Policy Gate):经过 policy.py 扫描,严禁包含越权命令;
  4. Jev 语义真实性裁决(Jev Verification Gate)
    在脚本执行前,系统将用户原始诉求与编译后的脚本再次提交给 Jev 评估概率:
    p(script really performs the request)
    经过大量基准实测,伪造或写偏的脚本得分通常在 0.05 ~ 0.37,而真正符合预期的脚本得分稳定在 0.49 ~ 0.83。因此系统将门槛设定在 0.4

一旦四重门禁全数放行,该工具就会被自动命名并持久化写入 tools/learned.json当下一次用户再说出相同或相似指令时,Jev 就会直接在 150 毫秒内命中该工具,不再耗费任何大模型 Token!


六、 核心突破四:纵深防御的本地安全策略系统

在早期测试阶段,作者曾遇到过一次惨痛的意外:当对着早期原型随口说了一句“帮我清理一下桌面”时,Agent 竟忠实地编写了一条脚本,把桌面上的所有文件一股脑移动到了同一个杂乱的文件夹中。正是这次惨痛教训,催生了 macbrow/policy.py 中堪称典范的纵深防御架构。

flowchart TD
    subgraph SafeZone["严禁触碰的应用黑名单 (BLOCKED_APPS)"]
        B1["终端与开发工具: Terminal, iTerm2, Ghostty, Warp, Xcode"]
        B2["系统与运维工具: System Settings, Activity Monitor, Disk Utility"]
        B3["虚拟化与容器: Docker, Docker Desktop, OrbStack, UTM"]
        B4["凭据管理: Keychain Access, 1Password, Bitwarden"]
    end

    subgraph ShellZone["Shell 命令极简白名单 (ALLOWED_SHELL_HEADS)"]
        S1["严格仅限: open, screencapture, date, pmset -g, pbcopy, pbpaste, say, afplay"]
        S2["绝对封禁: sudo, rm, mv, cp, curl, wget, kill, git, pip, npm, uv, brew..."]
        S3["语法截断: 严禁任何管道符号 (; | &&) 或重定向符 (反引号, 重定向符等)"]
    end

    subgraph PathZone["敏感路径物理封锁 (BLOCKED_PATHS)"]
        P1["系统根与类库: /System, /usr, /etc, ~/Library"]
        P2["用户配置与密钥: .zshrc, .ssh, .aws, .gnupg, .config, .env"]
        P3["依赖与项目配置: node_modules, site-packages, pyproject.toml"]
    end

1. 三阶段全程防御

macbrow 的安全策略并非事后补救,而是在全生命周期进行三次拦截:

  • 加载期过滤:任何违反策略的工具,在启动阶段就直接被剔除,绝不会呈现在 Jev 的选项列表里;
  • 生成期阻断:LLM 动态合成的脚本若命中黑名单规则,立即抛出 PolicyError 并丢弃;
  • 执行期终审:在参数完全代入、即将调用 osascript 运行的最后一刻,对最终完整字符串执行最后一次防注入扫描。

2. 网页高危动作的人在回路(Human-in-the-Loop)

对于网页操作,系统通过语义与关键词双重隔离:

  • 绝对禁区:涉及信用卡号、CVV、密码、双因子验证码(2FA)、注销账户等任务,无论置信度多高,直接判定违规并拒绝;
  • 状态变更确认:对于“加入购物车”、“发送邮件”、“提交表单”、“预订航班”等不可逆的状态改变,系统会自动切换到 AWAITING_CONFIRM 状态,必须在听到用户亲口说出“Yes”或“确认”后方可继续执行。

七、 动手实操:搭建你的专属本地语音 Mac 控制台

macbrow 的设计非常工程化,支持完全在本地(Local LLM via LM Studio)或云端混合运行。

1. 基础环境准备

确保本地安装了 Python 3.12+ 与现代包管理工具 uv

# 克隆仓库
git clone https://github.com/timpratim/macbrow.git
cd macbrow

# 一键同步所有依赖
uv sync

# 复制环境变量配置文件
cp .env.example .env.local

.env.local 中配置必要的密钥:

# Gradium 流式语音识别与合成密钥(可在 gradium.ai 获取)
GRADIUM_API_KEY=your_gradium_key

# TypeSafe Jev 决策模型密钥(可在 typesafe.ai 获取)
TYPESAFE_API_KEY=your_typesafe_key

# LiveKit 推理环境(或者配置本地 LM Studio)
LIVEKIT_URL=your_livekit_url
LIVEKIT_API_KEY=your_livekit_api_key
LIVEKIT_API_SECRET=your_livekit_api_secret

# 若使用本地开源模型,可一键切换为 LM Studio
# MACBROW_LLM_PROVIDER=lmstudio
# LMSTUDIO_BASE_URL=http://localhost:1234/v1

2. 授权 macOS 自动化与 Chrome 调试

  • 系统设置授权:首次运行时,macOS 会弹出权限申请窗口。前往 系统设置 ▸ 隐私与安全性 ▸ 自动化,允许终端或 Python 控制目标应用;
  • Chrome 远程调试挂载:在 Chrome 地址栏打开 chrome://inspect/#remote-debugging,勾选 Allow remote debugging for this browser instance。在首次连接时,在 Chrome 弹出的授权窗中点击允许。

3. 控制台启动与调试

# 1. 启动全功能语音控制台(激活本地麦克风与扬声器)
./console.sh start

# 2. 查看后台实时意图路由与时延日志
./console.sh log

# 3. 离线快速干跑测试(不启动音频硬件,直接验证路由)
uv run python -m macbrow.cli --dry "open github dot com"

# 4. 安全策略自检(列出全量已注册工具及其合规审计状态)
uv run python -m macbrow.cli --policy

八、 结语:从“全量生成”到“双系统协同”的范式跃迁

macbrow 的出现,不仅是一个令人兴奋的开源玩具,更代表着 Agent 架构演进的一次重要范式转移:

flowchart TD
    subgraph OldMindset["旧范式:单体大模型包打天下 (All-in-One LLM)"]
        direction TB
        M1["语音转文本"] --> M2["通识推理"]
        M2 --> M3["视觉图像解析"]
        M3 --> M4["离散系统控制"]
        M4 --> M5["代码与文案生成"]
        M5 --> NoteOld["后果:单步高昂成本、数秒延迟、脆弱易崩"]
    end

    subgraph NewMindset["新范式:System 1 与 System 2 架构解耦分工"]
        direction TB
        S1["System 1 专用引擎 (Jev / Gradium / CDP)<br/>- 毫秒级非自回归分类与概率打分<br/>- 零截图直接消费 DOM 控件树<br/>- 投机式参数槽位填充<br/>- 承担 95% 以上的高频微决策"]
        S2["System 2 通用大语言模型 (GPT / Claude / Qwen)<br/>- 仅在遇到新意图时编写代码<br/>- 仅在需要长文组织时生成对话<br/>- 仅在复杂表单填写时润色文案<br/>- 充当低频的创造与自进化兜底"]
        S1 <-->|分层协同| S2
    end

在过去两年中,业界在“给大模型喂更多参数”、“造更复杂的 CoT 提示词”的道路上一路狂奔,却往往忽视了软件系统工程中最底层的性能与确定性规律。

把高频的归高频,把直觉的归直觉,把创造的归创造。

当 System 1 能够把离散决策压至 300 毫秒以内,当无截图 DOM 管线能够让浏览器在 0.5 秒内响应原子操作,原本笨重、迟钝的 Computer-Use 才能真正褪去概念外衣,化作我们桌面上那声“开口即响应”的日常生产力利器。