Computer Use、登录态与回放
正在读取学习记录…
Computer Use 让 Agent 通过屏幕、鼠标和键盘操作桌面应用。它像接手同事正在使用的电脑:先看当前是谁登录、哪扇窗口在前面,再决定点哪里。浏览器能读到按钮名称,桌面操作则经常只有一张截图与坐标。截图是某一时刻的界面记录,坐标的含义随窗口、缩放和弹窗改变。
假设账号 account-A 正在确认导出报表,确认按钮矩形横向覆盖 100 到 180 像素、纵向覆盖 40 到 80 像素。点击中心 (140,60) 后,界面应从“确认导出”变成“导出完成”。保存这次观察与动作,再按同样前提执行,叫回放。回放需要恢复观察前提,否则旧坐标可能点到另一账号的按钮。
从输入到可核对结果
下面用人工定义的界面状态与按钮矩形重放一次确认动作。Screen 中的 account 对应登录身份,revision 对应截图版本,dialog 对应窗口内容。真正截图包含像素,示例把影响动作的字段单独列出,方便逐项检查。
replay 先比较账号,再比较截图版本,随后判断坐标是否落在按钮内,最后确认当前窗口名称。四项都满足才返回新状态。replace 创建新的 Screen,原对象保留,因而能对照动作前后。下一次动作必须使用新版本 2;继续拿版本 1 操作会被拒绝。Anthropic 的官方计算机工具实现可以看到坐标缩放与范围检查。
| 回放条件 | 本例保存值 | 条件变化后的处理 |
|---|---|---|
| 登录账号 | account-A | 账号变化时停止 |
| 截图版本 | 1 | 界面改变后重新观察 |
| 按钮区域 | 100..180 × 40..80 | 缩放后重算坐标 |
| 窗口标题 | 确认导出 | 切换弹窗后重新定位 |
保存并运行这两个文件
在 PowerShell 创建练习目录:
New-Item -ItemType Directory -Force l9-computer
cd l9-computermacOS 终端:
mkdir -p l9-computer
cd l9-computer把下面第一段完整代码保存为 desktop_replay.py,第二段保存为 test_desktop_replay.py,两份文件放在这个目录。
from dataclasses import dataclass, replace
SESSION = "account-A"
@dataclass
class Screen:
account: str
revision: int = 1
dialog: str = "确认导出"
exported: bool = False
def replay(screen, session, observed_revision, point):
# 回放动作绑定账号和截图版本;同一坐标在另一张屏幕可能有别的含义。
if screen.account != session:
raise ValueError("登录账号不匹配")
if screen.revision != observed_revision:
raise ValueError("截图已过期")
x, y = point
if not (100 <= x <= 180 and 40 <= y <= 80):
raise ValueError("未点中确认按钮")
if screen.dialog != "确认导出":
raise ValueError("当前窗口无法确认")
return replace(screen, revision=screen.revision + 1,
dialog="导出完成", exported=True)
if __name__ == "__main__":
screen = Screen("account-A")
print("动作前:账号=" + screen.account + ",版本=" + str(screen.revision))
try:
screen = replay(screen, SESSION, 1, (140, 60))
print("动作后:" + screen.dialog + ",版本=" + str(screen.revision))
except ValueError as error:
print("停止:" + str(error))import unittest
import desktop_replay as lab
class MechanismTests(unittest.TestCase):
# 正常、边界和失败输入都由这里提供,直接运行即可。
def test_normal(self):
original = lab.Screen("account-A")
result = lab.replay(original, "account-A", 1, (140, 60))
self.assertTrue(result.exported)
self.assertFalse(original.exported)
def test_boundary_button_edge(self):
self.assertTrue(lab.replay(lab.Screen("a"), "a", 1, (100, 40)).exported)
def test_failure_session_and_stale(self):
for session, rev in [("b", 1), ("a", 0)]:
with self.assertRaises(ValueError):
lab.replay(lab.Screen("a"), session, rev, (140, 60))
if __name__ == "__main__":
unittest.main()打开 PowerShell,逐行输入下列命令。cd 是进入文件夹,dir 是列出文件;确认列表里有刚保存的两个 .py 文件,再运行 Python。
# 在刚才创建的练习目录检查文件,再运行程序。
ls
python -X utf8 desktop_replay.py
python -X utf8 -m unittest -v test_desktop_replay.py程序输出:
动作前:账号=account-A,版本=1
动作后:导出完成,版本=2测试末尾应显示 Ran 3 tests 与 OK。若找不到文件,检查当前目录与扩展名;若导入失败,确认测试和主程序在同一文件夹。测试描述的三组材料就在上方代码,不需要另外准备输入。
改一处,再看结果
正常输出显示版本从 1 变成 2。测试还确认原状态的 exported 仍为 False,这使我们可以比较前后,而不会把旧观察悄悄改掉。矩形边缘 (100,40) 也允许点击,显示条件使用闭区间。
把 SESSION = "account-A" 改成 SESSION = "account-B",再次运行。输出会变成“停止:登录账号不匹配”,导出状态没有推进。恢复为 account-A 后重跑。真实应用接入时,登录恢复文件可能包含 Cookie 或令牌,应限制保存位置与读取权限;回放前应从应用读到账号标识,不能凭文件名认定身份。
重复导出、付款和删除等动作有自己的业务副作用。重放要核对是否已经完成,使用可查询的业务ID;仅靠截图版本能防止旧观察复用,却不足以阻止网络重试导致重复提交。
改动后仍在刚才的 PowerShell 目录运行:
python -X utf8 desktop_replay.py确认上述变化后,把参数恢复成原值,保存并再次执行这条命令。
把机制接回 Agent
桌面工具接入时,先采集当前截图并记录屏幕尺寸、账号和版本,把这些观察交给模型。模型返回动作与坐标后,执行器转换坐标、验证当前窗口、执行鼠标键盘操作,再截取新画面。需要桌面控制权限、可隔离的测试账号与截图存储位置;每轮动作都要留有重新观察的入口。
课后练习展开习题收起习题
正在读取本地记录…
不调用模型,不执行代码。简答、代码和场景题仅保存答案并展示自查标准,不生成评分、徽章或认证。输入内容不会自动保存,请点击提交;不要填写个人信息或密钥。
选择题 · 先判断边界
关于“Computer Use、登录态与回放”,哪种做法更稳妥?
对应知识点:L9-computer
简答题 · 解释失败
写出一个失败输入并说明记录字段。
对应知识点:L9-computer
代码题 · 边界测试
补充正常、边界、失败三组输入和预期结果。
对应知识点:L9-computer
场景题 · 结果未知
证据不足时如何设计状态和人工接管?
对应知识点:L9-computer
描述会发送给本站维护者,用于修订文章,保存90天。请只填写文章问题,省略个人信息、密钥和内部资料。