跳到主要内容

UFO³ — 全景导读:一台电脑的 GUI Agent,到一片设备的编排星系

30 秒导读: UFO 是微软的 GUI Agent——把大模型装上"眼睛(看屏幕控件)+ 手脚(点按键盘鼠标、调 API)",让它像人一样操作 Windows 桌面完成任务。发展到第三代 UFO³,它在单机 agent(UFO²)之上加了一层 Galaxy 编排星系:把一句话请求拆成一张跨设备的任务 DAG(有向无环图),经 AIP 通信协议分发到 Windows / Linux / Android 上各自的 UFO² 去并行执行。本页是入口,只讲"这是什么、大盘怎么转、该怎么读下去",不下钻实现。


1. 这是什么(零基础也能懂)

一句话定义: UFO 是一个操作电脑图形界面的 AI agent——你用自然语言说"帮我把这份表格里的数据画成图并发邮件",它去替你点菜单、填表格、按按钮,把事情做完。

它要解决的问题: 大模型很会"想",但天生没有身体。它读不到你屏幕上有哪些按钮,也点不动鼠标。UFO 补的就是这两样:

  • 眼睛 —— 把当前窗口里的控件(按钮、输入框、列表…)检测出来,喂给模型"你现在能操作什么"。
  • 手脚 —— 把模型的决策("点第 3 个按钮""在搜索框输入 X")翻译成真实的 GUI 操作或 API 调用。

三代演进(README 的 Evolution Timeline,README.md:110-123): 一句话区分它们,别混:

代号时间定位一句话
UFO2024-02第一版:面向 Windows 的 UI-Focused agent(概念验证)
UFO²2025-04Desktop AgentOS:单机、稳定、久经考验的 Windows 桌面 agent(现为 LTS 长期支持)
UFO³2025-11在 UFO² 之上加 Galaxy 多设备编排层,进化成"跨设备星系"

三大子系统(本文档按这三根线组织章节):

子系统是什么代码根目录
UFO²单机 GUI agent:感知-决策-行动的主体ufo/
Galaxy多设备编排:拆 DAG、派活、动态重写galaxy/
AIPAgent Interaction Protocol:设备互联的 WebSocket 通信/容错层aip/

关系一句话:UFO³ = Galaxy(编排) + 一群 UFO²(执行) + AIP(它们之间的电话线)。单独用 UFO² 也完全成立——它既能独立跑,也能当 Galaxy 里的"Windows 执行节点"(README.md:241, README.md:256-260)。

用起来什么样: 两条命令线,对应两种规模——

单机(UFO²),ufo/__main__.pyufo.main():

# 让单台 Windows 上的 agent 干一件事
python -m ufo --task my_task --request "把 report.xlsx 的第二列画成柱状图"

跨设备(UFO³ Galaxy),galaxy/__main__.pygalaxy.main():

# 一句话交给编排层,它自己拆成跨设备 DAG 去并行做
python -m galaxy "Create a data analysis pipeline with parallel processing"
python -m galaxy --interactive # 交互模式

一句话直觉/类比:UFO² 想成一个"会用一台电脑的实习生";把 Galaxy 想成"项目经理"——它把大任务切成小卡片、判断哪些能同时做、派给最合适的那台机器上的实习生,并盯着进度动态调整。AIP 就是经理和实习生之间那条"电话线 + 传真机"。

本节到此不碰实现。下面进入"大盘怎么转"。


2. 顶层全景(它大概怎么转)

2.1 一张全景图

怎么读这张图: 从上往下是一次跨设备请求的生命周期。上半区是 Galaxy 编排层(Layer 1),中间那条虚线是 AIP 通信层,下半区是每台设备内部的 UFO² 两层控制流(Layer 0)。左侧标注了代码落点。

用户一句话请求

┌──────────────────▼──────────────────────┐ galaxy/
│ Galaxy 编排星系 (Layer 1) │
│ │ galaxy.py → GalaxyClient
│ ① ConstellationAgent 把请求拆成 │ agents/constellation_agent.py
│ 一张任务 DAG「星座」(TaskStar 为点, │ constellation/task_constellation.py
│ 依赖为边) │
│ │ │
│ ② Orchestrator 按依赖调度 + 能力匹配 │ constellation/orchestrator/
│ 给每个 TaskStar 挑一台设备,并行派发 │ editor/ 可运行时重写 DAG
└────────────────┬──┬──┬────────────────────┘
│ │ │
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈│┈┈│┈┈│┈┈ AIP:WebSocket 分发 + 容错 aip/messages.py
│ │ │ aip/transport/
┌──────────▼┐┌▼──┐┌▼──────────┐
│ Windows ││Lin││ Android │ 每台设备各跑一个 UFO²(或对应端 agent)
│ UFO² ││ux ││ agent │
└─────┬─────┘└───┘└───────────┘

┌───────────▼───────────────────────────┐ ufo/
│ UFO² 单机两层控制流 (Layer 0) │
│ │ ufo.py → SessionFactory/SessionPool
│ ③ HostAgent:选哪个应用、拆子任务 │ agents/agent/host_agent.py
│ │ │
│ ▼ (每个应用一个) │
│ ④ AppAgent:感知控件→决策动作→执行 │ agents/agent/app_agent.py
│ └ 眼睛(UIA+视觉) 手脚(GUI+API) │ automator/ ; 详见 03/04 章
└────────────────────────────────────────┘

结果回传 ──(AIP)──▶ Orchestrator 汇总 ──▶ 最终报告

2.2 部件一句话职责

部件职责文件
GalaxyClientGalaxy 对外入口:初始化、process_request 跑一次编排galaxy/galaxy_client.py:40(initialize:107process_request:150)
ConstellationAgent把用户请求拆成任务 DAG;同时消费执行结果驱动重写galaxy/agents/constellation_agent.py:45
TaskConstellationDAG 本体:管理 TaskStar 节点、依赖边、环检测、找可运行任务galaxy/constellation/task_constellation.py:31(add_task:156get_ready_tasks:279validate_dag:483)
TaskStarDAG 的一个"星"= 一个待办子任务(带状态、依赖、能力需求)galaxy/constellation/task_star.py:28
TaskConstellationOrchestrator执行引擎:校验→分设备→循环调度就绪任务→并行执行→汇总galaxy/constellation/orchestrator/orchestrator.py:31(orchestrate_constellation:143)
constellation_editor运行时动态重写 DAG(命令模式,可回滚)galaxy/constellation/editor/constellation_editor.py
AIP 消息层设备通信的消息协议:ClientMessage / ServerMessage / Commandaip/messages.py:343 / :299 / :149
SessionFactory / SessionPoolUFO² 入口:造 Session、并发跑完所有 Sessionufo/module/session_pool.py:72 / :29
HostAgentUFO² 单机第一层:选应用、拆应用级子任务、调度 AppAgentufo/agents/agent/host_agent.py:143
AppAgentUFO² 单机第二层:在某个应用内感知→决策→执行一步步动作ufo/agents/agent/app_agent.py:43

2.3 主线走一遍(高层,不进代码)

一次跨设备请求端到端是这样流动的:

  1. 入口。 python -m galaxy "…"galaxy/__main__.pygalaxy.py:main() 造一个 GalaxyClient,initialize()process_request()(galaxy/__main__.py:15galaxy/galaxy.py:245)。
  2. 拆星座。 ConstellationAgent 把这句话分解成一张 TaskConstellation DAG:每个 TaskStar 是一个可独立执行的子任务,边表示"谁依赖谁"。
  3. 调度派发。 Orchestrator 校验 DAG(无环)、给每个 TaskStar 按能力匹配一台设备,然后循环:把当前"就绪"(依赖已满足)的任务并行派出去(get_ready_tasks_schedule_ready_tasks)。
  4. 过 AIP 到设备。 每个任务经 AIP(WebSocket)发到目标设备上的 UFO²(或对应端 agent)。
  5. 单机执行。 设备内 HostAgent 选定应用并拆子任务,交给一个个 AppAgent;AppAgent 用"眼睛"看控件、"手脚"执行——这套感知-决策-行动细节见 01–04 章。
  6. 回传与演化。 结果沿 AIP 回到 Orchestrator 汇总;ConstellationAgent 可据结果动态重写 DAG(加/删任务、改依赖),再进入下一轮,直到全部完成、输出最终报告。

单机场景就是跳过第 1–4 步:python -m ufo 直接从第 5 步开始(SessionFactory().create_sessionSessionPool(sessions).run_all(),ufo/ufo.py:66,73-74)。


3. 阅读地图(建议顺序与依赖)

本组共 6 章 + 本页。先看 01–02 建立单机 agent 的心智模型,再按兴趣分叉:想懂"看/做"读 03–04,想懂"跨设备"读 05–06。

本页 index.md(你在这)
│ 建立三代/三子系统认知

┌─────────── 01 主循环与 Agent ───────────┐ ← 必读地基
│ Session/Round + HostAgent→AppAgent │
└────────────────┬────────────────────────┘

02 一步怎么走(Processor + 策略 + 记忆)

┌────────────────┼────────────────────────┐
▼(眼睛) ▼(手脚) ▼(放大到多机)
03 感知/grounding 04 混合 GUI+API 自动化 05 Galaxy 星座 DAG
│ 依赖 05

06 AIP 通信协议
讲什么什么时候读
01UFO² 主循环:Session/Round 生命周期,HostAgent→AppAgent 两层状态机想理解单机 agent 骨架,先读这章
02单步内部:Processor 模板方法 + 可插拔策略流水线 + 记忆黑板想知道"一步"是怎么组装出来的
03眼睛:UIA 控件检测 + 视觉定位的混合 grounding关心 agent"怎么看见"屏幕
04手脚:GUI 点击与 API 调用混合、命令模式(Puppeteer)关心决策"怎么落成真实操作"
05UFO³ Galaxy:请求→跨设备 DAG 星座、能力调度、动态重写想理解多设备编排
06AIP:WebSocket 消息协议、分发与容错重连想理解设备之间怎么通信

4. 巧妙之处速览

这里只点名"妙在哪",细节留给对应章节。它们是读完这套文档该带走的"精华":

  • 两层状态机 + 策略流水线(01/02 章)。 UFO² 把"选应用"和"用应用"分成 HostAgent/AppAgent 两层状态机(ufo/agents/states/),每一步又走统一的 Processor 模板 + 可插拔策略(ufo/agents/processors/, .../strategies/),把"流程骨架"和"具体策略"解耦——换感知/决策策略不动主循环。

  • 混合 GUI + API 自动化(04 章)。 能调 API 就不去点像素:同一个动作既可走 GUI 点击、也可走应用原生 API(ufo/automator/),README 称此类优化带来 51% 更少的 LLM 调用(README.md:249)。这是稳定性和成本的关键。

  • DAG 动态重写(05 章)。 星座不是"拆完就定死":constellation_editor命令模式(galaxy/constellation/editor/,含 command_history.py)在运行时按执行结果加/删任务、改依赖并可回滚——README 叫它 "living constellation"(README.md:131)。

  • 能力匹配调度(05 章)。 Orchestrator 不是随便派活,而是按"平台/资源/任务需求"给每个 TaskStar 挑设备(_assign_devices_to_tasks,galaxy/constellation/orchestrator/orchestrator.py:269),再并行跑就绪任务(_schedule_ready_tasks:468)。

  • 协议化的设备互联(06 章)。 设备通信被抽象成一套强类型消息(aip/messages.pyClientMessage/ServerMessage/Command/MCPToolCall),配 transport/resilience/ 做传输与容错——让"多设备"从工程细节升级为可复用协议。


5. 边界与范围说明

  • 本页是 Layer 0 + Layer 1 入口,只从 README.md / README_ZH.md 与四个入口文件(ufo/__main__.pyufo/ufo.pygalaxy/__main__.pygalaxy/galaxy.py)取事实,不下钻实现;所有机制细节都在 01–06 章展开。
  • 平台现实: UFO² 的深度自动化面向 Windows(UIA/Win32/WinCOM);Galaxy 已支持把 Linux / Android 端 agent 纳入编排(README.md:145),但设备侧能力随平台而异。
  • 外围子系统在此一句话点名、不单独成章,详见下方代码地图:ufo/rag/(知识增强)、ufo/experience/(经验记忆)、learner/(离线学习)、dataflow/(数据流水线)、record_processor/(轨迹录制)、ufo/server/galaxy/webui/(服务/可视化)。它们是增强件,不在主线控制流上。

6. 代码地图(导航索引)

一张跳转表:ufo/(单机)、galaxy/(编排)、aip/(通信)三根线的关键入口。行号 as-of 提交 b28183fd;行号漂移时用符号名 grep 定位更稳。

主题文件关键符号
UFO² 命令行入口ufo/__main__.py / ufo/ufo.py:51ufo.main
UFO² Session 装配与并发跑ufo/module/session_pool.py:72 / :29SessionFactory.create_session / SessionPool.run_all
UFO² 第一层:选应用/拆子任务ufo/agents/agent/host_agent.py:143HostAgent
UFO² 第二层:应用内感知-决策-行动ufo/agents/agent/app_agent.py:43AppAgent
两层状态机(01 章)ufo/agents/states/host_agent_state.py, .../app_agent_state.py*State
单步 Processor + 策略(02 章)ufo/agents/processors/host_agent_processor.py, .../app_agent_processor.py, .../strategies/*Processor
眼睛:控件检测/grounding(03 章)ufo/automator/, ufo/rag/见 03 章
手脚:混合 GUI+API(04 章)ufo/automator/见 04 章
Galaxy 命令行入口galaxy/__main__.py / galaxy/galaxy.py:191galaxy.main
Galaxy 对外客户端galaxy/galaxy_client.py:40GalaxyClient.initialize / .process_request
拆 DAG 的 agentgalaxy/agents/constellation_agent.py:45ConstellationAgent
DAG 本体(节点/边/环检测)galaxy/constellation/task_constellation.py:31TaskConstellation.add_task / .get_ready_tasks / .validate_dag
DAG 的一个任务节点galaxy/constellation/task_star.py:28TaskStar
执行编排引擎galaxy/constellation/orchestrator/orchestrator.py:31TaskConstellationOrchestrator.orchestrate_constellation
能力匹配调度galaxy/constellation/orchestrator/orchestrator.py:269_assign_devices_to_tasks / _schedule_ready_tasks
DAG 运行时重写(命令模式)galaxy/constellation/editor/constellation_editor.pyconstellation_editor / command_history
AIP 消息协议aip/messages.py:343 / :299 / :149 / :109ClientMessage / ServerMessage / Command / MCPToolCall
AIP 传输与容错aip/transport/, aip/resilience/, aip/protocol/见 06 章
外围(增强件,非主线)ufo/rag/, ufo/experience/, learner/, dataflow/, record_processor/RAG / 经验 / 学习 / 数据流 / 录制