当 AI Agent 需要操作没有 API 的老旧桌面软件,AWS WorkSpaces 给了一条路

2026-05-13 29 预计阅读时间:1 分钟
来源:infoq.com AI 摘要 原文链接

免责声明:本文为 AI 摘要整理,建议结合原文阅读。摘要可能省略上下文、版本差异或边界条件,不作为官方说明。

预计阅读时间:10 分钟

大量企业核心系统至今仍运行在缺乏 API 的桌面客户端上——ERP、老旧 CRM、内部财务工具,它们是自动化最难啃的骨头。AWS 近期发布的公开预览功能让这件事有了新解法:Amazon WorkSpaces 现在可以作为 AI Agent 的托管虚拟桌面,Agent 通过 IAM 认证登录,再用计算机视觉识别界面、模拟键盘鼠标输入来完成操作,绕开了"没有 API 就没法自动化"的死结。

Agent 怎么"看见"并"操作"桌面

整个链路并不复杂,但每一步都有工程细节:

认证层——Agent 不再需要人类账号密码,而是通过 IAM 角色获取 WorkSpaces 访问权限。这意味着权限管理、审计日志都可以走 AWS 原生的 IAM 体系,和现有合规流程对接。

视觉感知层——Agent 连接到 WorkSpaces 后,拿到的是桌面像素流。它用计算机视觉模型(典型如 GPT-4V、Claude Vision 等)识别窗口、按钮、菜单、表格内容,把像素翻译成结构化理解。

动作执行层——识别出"点击 Submit 按钮"后,Agent 通过输入模拟(键盘敲击、鼠标移动与点击)把意图投射到桌面坐标上,完成实际操作。

整条链路的核心假设是:桌面应用的 UI 本身就是最通用的"API"——只要人能看懂、能操作,Agent 也能。

45 倍 Token 消耗:视觉路径的真实代价

AWS 引用了 Reflex 基准测试的数据:视觉 Agent 相比 API Agent,Token 消耗高出 45 倍。这个数字值得拆开看:

  • API 调用一次返回的是结构化 JSON,几十到几百 Token 就够了。
  • 视觉 Agent 每一步操作都需要先"看屏幕"——一张截图编码进多模态模型,轻松消耗数千 Token;再叠加多轮对话推理,单次任务的总消耗迅速膨胀。
  • 如果任务涉及 10 步界面操作,每步都要截图→识别→决策→执行→再截图验证,Token 累积是线性的。

这意味着视觉路径不是 API 的廉价替代,而是昂贵但通用的兜底方案。 在有 API 的场景下,永远应该优先走 API;视觉路径的价值在于覆盖那些"别无他法"的遗留系统。

实际搭建:从 IAM 到 Agent 代码

下面给出一个最小可运行的搭建流程,展示如何让 Agent 通过 IAM 认证连接 WorkSpaces 并用视觉方式操作桌面。部分配置(如 WorkSpaces 目录 ID)需替换为你自己的环境。

1. 创建 IAM 角色,授权 Agent 访问 WorkSpaces

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "WorkSpacesAccess",
      "Effect": "Allow",
      "Action": [
        "workspaces:StartWorkspaces",
        "workspaces:StopWorkspaces",
        "workspaces:DescribeWorkspaces",
        "workspaces:DescribeConnectionStatus"
      ],
      "Resource": "*"
    },
    {
      "Sid": "StreamAccess",
      "Effect": "Allow",
      "Action": [
        "workspaces-streaming:Connect"
      ],
      "Resource": "arn:aws:workspaces:${REGION}:${ACCOUNT_ID}:workspace/${WORKSPACE_ID}"
    }
  ]
}

${REGION}${ACCOUNT_ID}${WORKSPACE_ID} 替换为实际值。通过 IAM 条件键还可以进一步限制 Agent 只能访问指定 Workspace,避免越权。

2. 用 CLI 启动目标 Workspace 并检查连接状态

# 启动 Workspace
aws workspaces start-workspaces \
  --region us-east-1 \
  --start-workspace-requests '[{"WorkspaceId":"ws-xxxxxxxxx"}]'

# 等待几秒后检查连接状态
aws workspaces describe-connection-status \
  --region us-east-1 \
  --workspace-ids '["ws-xxxxxxxxx"]'

3. Python Agent 示例:截图→视觉识别→输入模拟

以下代码展示一个极简的视觉 Agent 循环。它从 WorkSpaces 桌面截图,调用多模态模型识别界面元素,再通过 PyAutoGUI 模拟操作。这段代码需要在 WorkSpaces 客户端所在的主机上运行(或通过远程桌面流获取截图)。

import base64
import pyautogui
import time
from openai import OpenAI

client = OpenAI()  # 确保已设置 OPENAI_API_KEY

def capture_screenshot(path="/tmp/workspace_screen.png"):
    """截取当前桌面屏幕"""
    screenshot = pyautogui.screenshot()
    screenshot.save(path)
    return path

def vision_decide(screenshot_path, task_prompt):
    """将截图发送给视觉模型,获取下一步操作指令"""
    with open(screenshot_path, "rb") as f:
        img_b64 = base64.b64encode(f.read()).decode()

    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {
                "role": "system",
                "content": "你是一个桌面操作Agent。根据截图和任务,输出下一步操作,"
                           "格式为 JSON: {\"action\":\"click/input/wait\","
                           "\"x\":坐标,\"y\":坐标,\"text\":输入内容,\"reason\":理由}"
            },
            {
                "role": "user",
                "content": [
                    {"type": "text", "text": task_prompt},
                    {"type": "image_url",
                     "image_url": {"url": f"data:image/png;base64,{img_b64}"}}
                ]
            }
        ],
        max_tokens=300,
    )
    return response.choices[0].message.content

def execute_action(action_json):
    """根据模型返回的 JSON 执行桌面操作"""
    import json
    act = json.loads(action_json)

    if act["action"] == "click":
        pyautogui.click(act["x"], act["y"])
    elif act["action"] == "input":
        pyautogui.click(act["x"], act["y"])
        time.sleep(0.3)
        pyautogui.write(act["text"], interval=0.05)
    elif act["action"] == "wait":
        time.sleep(2)

    print(f"[执行] {act['action']}{act.get('reason','')}")

# --- 主循环:在老旧 ERP 中提交一笔订单 ---
task = "在当前ERP界面中,找到'新建订单'按钮并点击,然后在客户名称字段输入'Acme Corp',最后点击Submit"

for step in range(8):  # 最多8步,防止无限循环
    path = capture_screenshot()
    decision = vision_decide(path, task)
    execute_action(decision)
    time.sleep(1.5)  # 等待界面响应

    # 简单终止条件:模型说任务完成
    if "完成" in decision or "done" in decision.lower():
        print("任务已完成")
        break

运行前需安装依赖:pip install openai pyautogui Pillow。这段代码是骨架——生产环境中需要加入错误重试、坐标校验、截图对比确认等容错逻辑。

什么时候该用,什么时候不该用

适合走视觉路径的场景:

  • 目标系统确实没有 API,且短期内不会开发(供应商已停维、内部无开发资源)。
  • 操作频率低(每天几十次而非几万次),45 倍 Token 成本在可接受范围内。
  • 需要跨多个异构桌面系统串联流程,统一用视觉方式反而降低集成复杂度。

不该用的场景:

  • 目标系统有 API——哪怕 API 不完美,也比视觉路径便宜且稳定得多。
  • 高频批量操作——Token 成本和延迟都会成为瓶颈。
  • 对操作精度要求极高——视觉识别有误判风险,模拟点击坐标偏差几像素就可能点错按钮。

落地前的检查清单:

  1. 确认目标系统是否真的没有 API 或 CLI 接口,避免走弯路。
  2. 估算单次任务的步骤数和截图频率,乘以 45 倍系数测算 Token 成本。
  3. 为 Agent 配置最小权限 IAM 角色,限制可访问的 Workspace 范围。
  4. 设计容错机制:操作后截图验证结果,失败时回退或重试。
  5. 在 WorkSpaces 中设置自动休眠策略,避免 Agent 离开后桌面持续计费。

AWS 这条路本质上是在承认一个现实:企业 IT 环境里,老旧桌面软件不会很快消失。视觉 Agent 不是最优解,但它是目前能让这些系统进入自动化流水线的最短路径。关键在于别把它当万能方案——能用 API 的地方,永远走 API;只有走不通时,再打开这扇视觉的窗。


相关推荐