
本文来自 thinkingloop 的 k,一个手搓过实时翻译语音智能体的投资人。
Caddy — 用你的声音控制所有工作应用
Caddy 号称是:下一代计算界面,由语音和屏幕上下文驱动。Caddy 通过让知识工作者直接与电脑对话,消除了点击和复制粘贴的混乱。当今的知识工作者已经生活在以语音为先的世界中——他们在 WhatsApp、iMessage 和 Discord 上说话。现在也是我们的工具倾听的时候了。
创始人: Caddy 由 Connor Waslo 和 Rajiv Sancheti 联合创立。两位创始人在创办 Caddy 前共同在视频通信独角兽 Loom 工作了四年,分别领导 Loom 的 AI 套件产品和设计团队。Rajiv 曾担任 Loom AI 功能的设计负责人,此前也在 Airbnb 及 Kleiner Perkins (KP) 孵化器参与产品设计项目。Connor 是 Loom AI 套件的产品负责人,并带领过 Loom 的定价与营收团队,对企业软件的商业化和用户需求有深入理解。这样强强组合的背景使他们深刻认识到语音交互在办公场景的潜力。
产品: Caddy 打造 “工作版 Siri”,让用户用语音完成跨应用的复杂工作流程。简单来说,Caddy 将用户的声音变成计算机的新型输入接口。它能够 “读懂” 用户屏幕上的内容和当前意图,从而在用户持续专注时自动替用户执行操作。例如,当用户说出 “创建一个 Linear 工单并分享给 Slack” 这样的指令后,Caddy 会理解上下文并在后台立即于 Linear 中创建工单,再将链接发到 Slack 指定频道,无需用户手动切换应用来回操作。
Caddy 提供两种模式:
操作模式(Action mode): 用户口述意图,Caddy 即可跨应用执行相应任务(如发送 Slack 消息、在日历安排会议等),因为 Caddy 能看到当前屏幕内容并连接相关应用,所以用户可以免除频繁在各工具间切换。
听写模式(Dictation mode): 用户可以在任意文本输入框直接用语音输入文字(邮件、即时消息、评论等),完全替代键盘打字且适用于全局,不论当前聚焦在哪个应用窗口。
Caddy 本质上是「桌面代理 + 语音前端 + LLM 编排 + App Connectors」,挂在 OS 最底层,把 “说话 → 操作多应用” 的链路打通。
我按工程链路拆一遍,从你按下说话键,到 Linear 里真的多了一条 ticket。
可以粗暴分成 5 层:
客户端/OS 集成层:桌面 App、快捷键、麦克风、屏幕上下文抓取、输入注入
语音管线层:VAD、流式 ASR、命令式文本后处理
上下文与状态层:屏幕内容解析、当前应用/选中对象、用户会话状态
LLM/Agent 编排层:意图理解、工具调用规划、多步 Workflow
Connectors 执行层:Slack / Linear / Calendar 等 API + 必要的 UI 自动化
目标:抢占「入口」,掌握输入/屏幕/部分输出。
关键组件:
桌面常驻进程
全局唤起方式
麦克风采集 + 本地 VAD
屏幕上下文采集
输入注入(用于 Dictation 模式)
这层 80% 是 OS & 桌面工程,AI 只是上游/下游。
目标:低延迟、高准确、偏命令语气的 ASR。
链路:
把长语音切成合适 chunk,减少 RTT
可先丢给 ASR 做 “热启动”,边听边转
典型:WebSocket/gRPC 发送音频帧,返回增量 transcript
要支持:中途修正(partial result replace)/实时显示给用户,做 “我听懂了” 的反馈
命令场景的特殊优化:
Dictation 模式里,很多时候 ASR + 轻后处理 = 可直接注入;
Action 模式则将文本交给下一层 LLM/Agent。
Caddy 卖点之一就是 “看得见你的屏幕”,否则 “share this to Slack” 这样的应用程序交互会懵。
可以设计一个 Context Service(大部分逻辑在客户端,本地优先):
active_app: Slack / Chrome / Linear …
active_url: 当前 tab URL
selection: 文本内容 / DOM node path
clipboard: 最近复制的内容(选配)
浏览器里:
原生 App:
“只知道这是一个截图里的 Figma 图层” 时:
{
"active_app": "Linear",
"active_url": "https://linear.app/...",
"selection_text": "Bug report: ...",
"screen_summary": "User is viewing a bug report in Linear tagged 'P1 - Production'.",
"entities": [
{"type": "ticket", "id": "LIN-123", "title": "Login fails on Safari", "url": "..."}
]
}
隐私友好做法:
尽可能在本地做提取 + 摘要,只把 “压缩后的语义信息” 发给服务器,而不是裸截图/全文。
这里是整套系统的大脑。
5.1 模式识别(Action vs Dictation)
客户端已经大致知道你按的是哪个键(模式),但仍然可以:
有冲突时,提示用户短确认,例如弹个 Toast:“我理解为执行操作,而不是输入文字”。
5.2 意图解析 + Workflow 规划
在 Action 模式下:
你是谁:“你是一个桌面工作流助手,可以调用以下工具…”
你能做什么:列出工具(SlackTool / LinearTool / CalendarTool / GmailTool…)的 function schema
屏幕上下文:把上面那份 Context JSON 裁剪后塞进来
用户语音转写文本
LLM 生成一组工具调用:
对多步流程可:
比如用户说 “发到产品群”,渠道名模糊:
在 Dictation 模式下,LLM 主要是做 “润色/格式化”,而不是 orchestrator。
目标:让 Agent 的工具调用变成真实世界的 side-effect。
6.1 API Connectors
每个 SaaS app 就是一套小 SDK + 工具定义:
认证 & 授权
统一的 Tool Schema
错误处理 & 重试 & 速率限制
6.2 UI 自动化 fallback(无 API / 用户本地状态)
有些事情需要直接 “动鼠标键盘”:
比如往一个非标准应用里粘贴文本、点击按钮。
方案:
在客户端实现一层 UI Automation:
Orchestrator 发给客户端一个执行计划:
{
"actions": [
{"type": "key", "combo": "Cmd+L"},
{"type": "text", "value": "https://linear.app/..."},
{"type": "key", "combo": "Enter"}
]
}
这块做深了就是 “桌面 RPA + LLM planner” 的组合。
相对简单但对 “体验细节” 要求极高:
开始录音 → 流式 ASR
实时显示文本(overlay or inline)
ASR → 轻量 LLM(可选)做:
根据光标位置持续插入文本
支持用户打断、撤销、重说
一些语音指令要拦截:“撤销刚刚那句”→ 不要当普通文本打进去,要当命令
一个硬指标:端到端延迟最好控制在 < 200ms 级别,才有 “说一句话字就跟着出来” 的错觉。
这层是 “产品力”,但背后也有技术栈:
用户账户 & 设备绑定
个性化指令记忆
历史记录 & 可审计
后端大致可以拆成:
API Gateway(面向客户端)
Realtime Service(WebSocket / gRPC,处理音频流 & 实时事件)
ASR Service(可托管 or 自研)
Orchestrator Service(LLM 调度 & tool calling)
Connectors Service(与外部 SaaS 对接)
Auth & User Service(账户、OAuth、权限)
Telemetry & Metrics(日志、trace、指标:ASR 延迟、LLM 延迟、成功率…)
链路是典型的 event-driven:
用户说话 → 音频帧事件
ASR 输出 → Transcript 事件
Orchestrator 输出 → ToolCall 事件
Connector 执行完 → Result 事件 → 推回客户端/日志
这类产品非常敏感,安全/隐私几乎是技术架构的一等公民:
最小权限:
本地优先处理:
清晰可见的权限边界:
“创建一个 Linear 工单并分享给 Slack”
从工程链路看就是:
客户端捕获语音 + 当前屏幕(可能正在浏览一个 bug 描述页面)。
语音 → VAD → 流式 ASR → 文本:“创建一个 Linear 工单并分享给 Slack”。
Context Service 提供:
active_app: Chrome
active_url: 某 bug 报告文档
selection_text: 用户选中的 bug 描述
LinearTool.create_issue(title=…, description=selection_text, project=…)
SlackTool.post_message(channel=”#eng-bugs”, text=“New bug created: ”)
调用 Linear API 创建 issue → 得到 issue_url
调用 Slack API 发消息
* 弹个 Toast:“已创建 LIN-123 并发到 #eng-bugs”,并提供撤销/跳转按钮。
整条链路跑顺了,就是 “语音 + 屏幕上下文” 变成 “真正的多 app 自动化”。为了这个愿景和 Dafdef/AI Key、Voice In + RPA、或浏览器侧 Copilot 做对比时,可以直接按这几个层级做差异分析:入口(OS vs 浏览器)、上下文深度、Agent 编排能力、Connector 丰富度、以及安全/隐私策略。


阅读更多 Voice Agent 学习笔记:了解最懂 AI 语音的头脑都在思考什么
