<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Desktop Agent on AI博士 万戈</title>
        <link>https://www.yesmiracle.net/tags/desktop-agent/</link>
        <description>AI博士万戈的技术博客，聚焦 Agentic AI、AI Infra 与 Agent Security，分享 AI 基础设施与工程落地实践。</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <managingEditor>admin@yesmiracle.net (万戈)</managingEditor>
        <webMaster>admin@yesmiracle.net (万戈)</webMaster>
        <lastBuildDate>Tue, 28 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.yesmiracle.net/tags/desktop-agent/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Andrew Ng 开源了 OpenWorker！一个交付「成品」的桌面 AI 同事，深入源码拆解</title>
        <link>https://www.yesmiracle.net/post/20260728-openworker-andrew-ng/</link>
        <pubDate>Tue, 28 Jul 2026 00:00:00 +0000</pubDate>
        <author>admin@yesmiracle.net (万戈)</author>
        <guid>https://www.yesmiracle.net/post/20260728-openworker-andrew-ng/</guid>
        <description>&lt;img src="https://www.yesmiracle.net/post/20260728-openworker-andrew-ng/cover.svg" alt="Featured image of post Andrew Ng 开源了 OpenWorker！一个交付「成品」的桌面 AI 同事，深入源码拆解" /&gt;&lt;p&gt;Andrew Ng 最近又搞了个大事情——他开源了一个叫 &lt;strong&gt;OpenWorker&lt;/strong&gt; 的项目，短短时间就冲到 9.8k Star。但这不是又一个「Agent 框架」或「编码 Agent」，而是一个&lt;strong&gt;直接交付成品的桌面 AI 同事&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;什么叫「交付成品」？你说「帮我准备一份客户简报」，它不会回你一段 Markdown 让你自己去整理，而是真的生成一个 &lt;code&gt;.docx&lt;/code&gt; 文件、一封邮件草稿、一条已排好版的 Slack 消息。你说「理一下我的日历」，它真的去改 Google Calendar。你说「查一下发版进度」，它去 Jira 和 GitHub 拉数据，回来给你一条完整的回复。&lt;/p&gt;
&lt;p&gt;这个定位和我之前分析过的几个项目很不一样。&lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/post/20260728-openhands-agent-canvas/&#34; &gt;OpenHands&lt;/a&gt; 是编码 Agent 的控制中心，&lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/post/20260728-opentag-copilotkit-slack-agent/&#34; &gt;OpenTag&lt;/a&gt; 是聊天平台的 Agent 机器人，&lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/post/20260719-nanobot-architecture/&#34; &gt;Nanobot&lt;/a&gt; 是轻量级 Agent 框架——而 OpenWorker 是一个 &lt;strong&gt;桌面 App&lt;/strong&gt;，一个真正坐在你电脑上替你干活的「同事」。&lt;/p&gt;
&lt;p&gt;这篇文章从源码出发，拆解 OpenWorker 的架构设计。它的代码质量很高——毕竟是 Andrew Ng 团队的作品——很多设计思路值得做 Agent 基础设施的人认真看。&lt;/p&gt;
&lt;h2 id=&#34;turnengine一个精心设计的异步-agent-循环&#34;&gt;TurnEngine：一个精心设计的异步 Agent 循环&lt;/h2&gt;
&lt;p&gt;OpenWorker 的核心是 &lt;code&gt;coworker/engine.py&lt;/code&gt; 里的 &lt;strong&gt;TurnEngine&lt;/strong&gt;。它不是普通的「LLM 循环」，而是从实际桌面 Agent 的需求出发设计的一个异步循环引擎。&lt;/p&gt;
&lt;p&gt;核心设计决策有几个：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 并发工具执行&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;当模型在一次 turn 里请求多个工具调用时，低风险的（读文件、搜索）&lt;strong&gt;并发执行&lt;/strong&gt;，高风险的（写文件、Shell 命令）&lt;strong&gt;严格串行&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 低风险工具：并发&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;asyncio&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;gather(&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;[safe_tool(t) &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; t &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; tool_calls])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 高风险工具：串行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; t &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; write_tool_calls:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; execute_with_approval(t)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这和 &lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/post/20260728-opentag-copilotkit-slack-agent/&#34; &gt;OpenTag&lt;/a&gt; 的 MCP 容错设计（独立连接 + 超时泄漏防护）思路一致——都认识到 Agent 不是「调用一次」就完事的，而是需要精细的并发控制。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 审批门（Approval Gate）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;每次写操作前，PermissionEngine 检查是否需要用户批准。需要时，引擎发射 &lt;code&gt;PERMISSION_REQUIRED&lt;/code&gt; 事件并等待 approver 的结果：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ApprovalOutcome&lt;/span&gt;(str, Enum):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ONCE &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;once&amp;#34;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 只允许这一次&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ALWAYS_TOOL &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;always_tool&amp;#34;&lt;/span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 以后这个工具自动允许&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ALWAYS_COMMAND &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;always_command&amp;#34;&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# 以后这个命令自动允许&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    DENY &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;deny&amp;#34;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 拒绝&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个设计的巧妙之处在于，审批结果可以「升级」——用户从「这次允许」升级到「以后这个工具都允许」，减少重复审批。对比 &lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/post/20260728-opentag-copilotkit-slack-agent/&#34; &gt;OpenTag&lt;/a&gt; 的 &lt;code&gt;confirm_write&lt;/code&gt;（只有一次/取消），OpenWorker 的 approver 更灵活。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Steering（方向盘）机制&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;TurnEngine 支持用户在执行过程中「插话」干预——通过 &lt;code&gt;_steering&lt;/code&gt; 列表：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 用户可以在 Agent 执行中间发来新的指令&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;_steering: list[tuple[str, Optional[dict[str, Any]]]] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这意味着你不需要等 Agent 执行完一轮才能纠正它——你可以随时说「等等，换这个方向」。这和 &lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/post/20260719-pi-agent-architecture/&#34; &gt;Pi Agent&lt;/a&gt; 的「Steering + Follow-up 双队列」设计理念一致，但 Pi Agent 的 steering 是架构层面的队列，OpenWorker 的是用户交互层面的插话。&lt;/p&gt;
&lt;h2 id=&#34;25-连接器从工具到-connector-的抽象&#34;&gt;25+ 连接器：从工具到 Connector 的抽象&lt;/h2&gt;
&lt;p&gt;OpenWorker 最亮眼的功能是 &lt;strong&gt;25+ 连接器&lt;/strong&gt;（connectors）——Slack、GitHub、Jira、Notion、Linear、HubSpot、Outlook、Gmail、Google Calendar……几乎覆盖了日常工作需要的所有工具。&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;coworker/connectors/&lt;/code&gt; 下，每个连接器是一个独立的模块。架构很有意思：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;┌────────────────────────────────────────────────────────┐
│                    TurnEngine                           │
├────────────────────────────────────────────────────────┤
│  ToolRegistry                                           │
│   ├── 内置工具 (shell, files, web_search, ...)          │
│   └── Connector 工具 (动态注册)                          │
│        ├── slack_send_message                           │
│        ├── github_list_issues                           │
│        ├── jira_get_ticket                              │
│        ├── notion_search_pages                          │
│        ├── linear_create_issue                          │
│        ├── gmail_search_threads                         │
│        ├── google_calendar_list_events                  │
│        └── ...                                          │
├────────────────────────────────────────────────────────┤
│  PermissionEngine                                       │
│  所有写操作 → Approval Gate                             │
└────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;连接器通过 &lt;code&gt;connector_list()&lt;/code&gt; + &lt;code&gt;load_settings()&lt;/code&gt; 发现哪些连接器已配置，然后 &lt;code&gt;make_integration_tools()&lt;/code&gt; 动态生成工具。每个连接器可以声明多个工具（比如 Slack 连接器有 &lt;code&gt;send_message&lt;/code&gt;、&lt;code&gt;list_channels&lt;/code&gt;、&lt;code&gt;read_thread&lt;/code&gt;），但只有 &lt;code&gt;enabled=True&lt;/code&gt; 的才被注册到 ToolRegistry。&lt;/p&gt;
&lt;p&gt;这和 &lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/post/20260719-nanobot-architecture/&#34; &gt;Nanobot&lt;/a&gt; 的多平台 Channel 抽象类似——Nanobot 有 15+ 聊天平台适配器，OpenWorker 有 25+ 工具连接器。但 Nanobot 的 Channel 是「把 Agent 放进聊天平台」，OpenWorker 的 Connector 是「让 Agent 操作你的工具」。&lt;/p&gt;
&lt;h2 id=&#34;桌面-app-三层架构&#34;&gt;桌面 App 三层架构&lt;/h2&gt;
&lt;p&gt;OpenWorker 的部署架构是&lt;strong&gt;三层分离&lt;/strong&gt;的：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;┌────────────────────────────────────────────┐
│  GUI (surfaces/gui/)                       │
│  React UI + Tauri 桌面 Shell               │
│  · 会话管理                                 │
│  · 审批面板                                 │
│  · 文件浏览                                 │
│  · 自动更新                                 │
├────────────────────────────────────────────┤
│  Agent 服务器 (Python)                     │
│  · TurnEngine                              │
│  · ProviderRouter                          │
│  · ToolRegistry                            │
│  · PermissionEngine                        │
│  · MemoryStore                             │
│  · Automation                              │
├────────────────────────────────────────────┤
│  STT 侧车 (Rust)                          │
│  · 语音输入处理                             │
└────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这个三层分离和 &lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/post/20260728-openhands-agent-canvas/&#34; &gt;OpenHands Agent Canvas&lt;/a&gt; 的架构如出一辙——前端 (React) + Agent Server (Python) + 辅助服务。但 OpenHands 用 Tauri 打包成桌面 App 还是最近的事，OpenWorker 从一开始就是桌面 App 设计。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;技术栈对比：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;组件&lt;/th&gt;
          &lt;th&gt;OpenWorker&lt;/th&gt;
          &lt;th&gt;OpenHands&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;前端&lt;/td&gt;
          &lt;td&gt;React + Tauri&lt;/td&gt;
          &lt;td&gt;React + Vite&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Agent 运行时&lt;/td&gt;
          &lt;td&gt;Python (aisuite)&lt;/td&gt;
          &lt;td&gt;Python (Agent Server)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;桌面壳&lt;/td&gt;
          &lt;td&gt;Tauri (Rust)&lt;/td&gt;
          &lt;td&gt;Electron (可选)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;外部 Agent&lt;/td&gt;
          &lt;td&gt;❌ (自带引擎)&lt;/td&gt;
          &lt;td&gt;✅ ACP (Claude Code/Codex)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;模型提供&lt;/td&gt;
          &lt;td&gt;14+ Provider&lt;/td&gt;
          &lt;td&gt;OpenHands / ACP 自带&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;安装方式&lt;/td&gt;
          &lt;td&gt;DMG 下载&lt;/td&gt;
          &lt;td&gt;npm install / Docker&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;OpenWorker 走的是「自己做 Agent 引擎」的路线，不依赖 ACP 协议。这有利有弊——好处是完全掌控体验，坏处是不能直接用生态里的其他 Agent（比如用 Claude Code 写代码、用 OpenWorker 做文档）。&lt;/p&gt;
&lt;h2 id=&#34;基于-aisuite-的-provider-抽象&#34;&gt;基于 aisuite 的 Provider 抽象&lt;/h2&gt;
&lt;p&gt;OpenWorker 的 Provider 层基于 Andrew Ng 的另一开源项目 &lt;strong&gt;aisuite&lt;/strong&gt;。&lt;code&gt;coworker/providers/&lt;/code&gt; 下的 ProviderClient 用 aisuite 作为统一接口：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 支持 14 个 Provider，统一接口&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;provider &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ProviderClient(model&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gpt-5.6-sol&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 或&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;provider &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ProviderClient(model&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;claude-sonnet-4-20260514&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 或本地&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;provider &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ProviderClient(model&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ollama/llama-4&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;配置通过 &lt;code&gt;config.toml&lt;/code&gt; 管理：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;model&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gpt-5.5&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;mode&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;interactive&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;max_iterations&lt;/span&gt; = &lt;span style=&#34;color:#ae81ff&#34;&gt;12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;allowed_commands&lt;/span&gt; = [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ls&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;cat&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;grep&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;git status&amp;#34;&lt;/span&gt;, ...]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;host&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;127.0.0.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;port&lt;/span&gt; = &lt;span style=&#34;color:#ae81ff&#34;&gt;8765&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;特别值得注意 &lt;code&gt;allowed_commands&lt;/code&gt; 配置——用户可以精确控制 Agent 能执行哪些 Shell 命令，不在列表里的命令需要审批。这和 &lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/post/20260728-opentag-copilotkit-slack-agent/&#34; &gt;OpenTag&lt;/a&gt; 的 Intelligence Gateway 模式（不持有平台 Token）都是「最小权限」原则的具体实现，但 OpenWorker 的粒度更细——命令级别的白名单。&lt;/p&gt;
&lt;h2 id=&#34;三方横向对比&#34;&gt;三方横向对比&lt;/h2&gt;
&lt;p&gt;OpenWorker 的定位——桌面 AI 同事——在之前的项目中还没有完全对标的：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;维度&lt;/th&gt;
          &lt;th&gt;OpenWorker&lt;/th&gt;
          &lt;th&gt;OpenHands (Agent Canvas)&lt;/th&gt;
          &lt;th&gt;OpenTag&lt;/th&gt;
          &lt;th&gt;Nanobot&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;定位&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;桌面 AI 同事&lt;/td&gt;
          &lt;td&gt;编码 Agent 控制中心&lt;/td&gt;
          &lt;td&gt;聊天 Agent 平台&lt;/td&gt;
          &lt;td&gt;轻量 Agent 框架&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;安装方式&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Desktop App (DMG)&lt;/td&gt;
          &lt;td&gt;Web UI (npm/Docker)&lt;/td&gt;
          &lt;td&gt;CLI + Chat 集成&lt;/td&gt;
          &lt;td&gt;CLI&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;核心引擎&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;TurnEngine (asyncio)&lt;/td&gt;
          &lt;td&gt;Agent Server (Python)&lt;/td&gt;
          &lt;td&gt;BuiltInAgent (TS)&lt;/td&gt;
          &lt;td&gt;AgentLoop (asyncio)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;工具系统&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;25+ Connectors + MCP&lt;/td&gt;
          &lt;td&gt;ACP 子进程&lt;/td&gt;
          &lt;td&gt;MCP (Streamable HTTP)&lt;/td&gt;
          &lt;td&gt;Python Tool 类&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;审批模型&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;4 级 (Once/Always/Deny)&lt;/td&gt;
          &lt;td&gt;confirm_write (阻塞)&lt;/td&gt;
          &lt;td&gt;confirm_write (阻塞)&lt;/td&gt;
          &lt;td&gt;无内置 HITL&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;模型支持&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;14+ Provider (aisuite)&lt;/td&gt;
          &lt;td&gt;ACP Agent 自带&lt;/td&gt;
          &lt;td&gt;OpenAI-only&lt;/td&gt;
          &lt;td&gt;30+ Provider&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;桌面 UI&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;✅ Tauri (Rust)&lt;/td&gt;
          &lt;td&gt;⚠️ Electron (可选)&lt;/td&gt;
          &lt;td&gt;❌ 纯 Chat&lt;/td&gt;
          &lt;td&gt;❌ 纯 Chat&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Slack 集成&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;✅ @OpenWorker&lt;/td&gt;
          &lt;td&gt;✅ Automations&lt;/td&gt;
          &lt;td&gt;✅ 原生&lt;/td&gt;
          &lt;td&gt;✅ 原生&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;MCP&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;✅ MCP client&lt;/td&gt;
          &lt;td&gt;✅ MCP (Linear/Notion)&lt;/td&gt;
          &lt;td&gt;✅ MCP client&lt;/td&gt;
          &lt;td&gt;❌&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;记忆系统&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;✅ MemoryStore&lt;/td&gt;
          &lt;td&gt;❌ 对话级&lt;/td&gt;
          &lt;td&gt;❌ 对话级&lt;/td&gt;
          &lt;td&gt;✅ Dream 记忆&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;自动化&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;✅ 定时任务&lt;/td&gt;
          &lt;td&gt;✅ 定时+事件&lt;/td&gt;
          &lt;td&gt;✅ Intelligence Gateway&lt;/td&gt;
          &lt;td&gt;❌&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;核心差异点：&lt;strong&gt;OpenWorker 的定位是「取代桌面工作流」&lt;/strong&gt;，而其他几个项目都是「给开发者用的工具」。OpenWorker 的目标用户是「任何需要日常办公的人」——做简报、理日历、回邮件、查 Jira——而不仅是写代码的开发者。&lt;/p&gt;
&lt;h2 id=&#34;安全隐患&#34;&gt;安全隐患&lt;/h2&gt;
&lt;p&gt;OpenWorker 的 25+ 连接器意味着它持有大量第三方的 OAuth Token 和 API Key。虽然 README 强调「local-first，everything on your machine」，但有几个风险点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;OAuth 代理服务&lt;/strong&gt;：README 提到 &amp;ldquo;a small service that brokers OAuth handshakes for connectors&amp;rdquo;——这个代理服务如果是云端托管的，它理论上可以看到哪些连接器被授权了（但看不到 Token 本身）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;连接器权限放大&lt;/strong&gt;：一个连接器的 Token 通常有全部读写权限。比如 Gmail 连接器可以读所有邮件、Google Calendar 可以改所有事件。Agent 只要调用了对应的工具，就可以做连接器 Token 允许的任何事——审批门是唯一的防线。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;审批疲劳&lt;/strong&gt;：虽然审批门可以升级到 &lt;code&gt;ALWAYS_TOOL&lt;/code&gt;，但如果用户不小心点了「以后都允许」，一个有恶意 prompt 的任务就可以绕过审批执行任意写操作。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Shell 访问&lt;/strong&gt;：&lt;code&gt;allowed_commands&lt;/code&gt; 白名单可以限制 Shell 命令，但白名单中的命令如果被参数注入（比如 &lt;code&gt;git&lt;/code&gt; 命令后跟恶意参数），仍然有风险。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;相比之下，&lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/post/20260728-openhands-agent-canvas/&#34; &gt;OpenHands&lt;/a&gt; 的 ACP 模式更安全——ACP Agent 运行在独立的子进程中，凭证不暴露给前端。OpenWorker 的把所有连接器 Token 放在本地密钥存储中，虽然「本地」减少了泄露面，但一旦进程被攻破，所有 Token 都可能被盗。&lt;/p&gt;
&lt;h2 id=&#34;写在最后&#34;&gt;写在最后&lt;/h2&gt;
&lt;p&gt;OpenWorker 是 Andrew Ng 团队在 Agent 领域的最新尝试。和之前的 aisuite（统一 Provider 接口）不同，OpenWorker 是一个完整的端到端产品——从桌面 App 到 25+ 连接器到自动化调度，覆盖了日常办公的完整工作流。&lt;/p&gt;
&lt;p&gt;它的架构设计——TurnEngine 的并发执行 + 审批升级 + Steering 插话——代表了「Agent 作为真正的同事」这一理念的工程实践。不再是把 Agent 当成聊天机器人，而是当成一个坐在你旁边的、能替你干活的人。&lt;/p&gt;
&lt;p&gt;对于做 Agent 基础设施的人来说，OpenWorker 有几点值得参考：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TurnEngine 的并发控制&lt;/strong&gt;：低风险工具并发、高风险串行，比「全串行」和「全并发」都更合理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;连接器动态注册&lt;/strong&gt;：&lt;code&gt;make_integration_tools()&lt;/code&gt; 模式比硬编码工具列表更优雅&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;审批升级&lt;/strong&gt;：从「一次允许」到「永久允许」的递进式授权&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当然，OpenWorker 还很新（72 个 commit），很多功能还在快速迭代中。但它的方向和定位非常清晰——不是又一个 Agent 框架，而是一个你真正可以交给他干活的「同事」。&lt;/p&gt;
&lt;p&gt;GitHub: &lt;a class=&#34;link&#34; href=&#34;https://github.com/andrewyng/openworker&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/andrewyng/openworker&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;延伸阅读：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/post/20260728-openhands-agent-canvas/&#34; &gt;OpenHands 变成了 Agent Canvas！一个自托管的编码 Agent 控制中心&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/post/20260728-opentag-copilotkit-slack-agent/&#34; &gt;OpenTag 源码架构拆解：AG-UI 协议驱动的跨平台聊天 Agent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/post/20260719-nanobot-architecture/&#34; &gt;Nanobot 源码深度拆解：Python 异步消息总线构建的轻量级 AI Agent 框架&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/post/20260719-pi-agent-architecture/&#34; &gt;Pi Agent 深度拆解：TypeScript 多包架构下的 Steering + Follow-up 双队列设计&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;
</description>
        </item>
        
    </channel>
</rss>
