Claude Fable 持续主动

Simon Willison's Blog 模型

摘要

Claude Fable 5 通过自主调试 UI 错误,利用浏览器自动化和 Python 脚本创建测试页面并截图,展示了持续主动性。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/06/12 02:53

# Claude Fable 极度主动 来源:https://simonwillison.net/2026/Jun/11/fable-is-relentlessly-proactive/ 2026年6月11日 在体验Claude Fable 5(https://simonwillison.net/2026/Jun/9/claude-fable-5/)两天后,我认为最好的描述是**极度主动**。它知道大量技巧,并且为了达成目标几乎会动用其中任何一个。让我用一个例子来说明。 今天我在捣鼓Datasette Agent(https://agent.datasette.io/)时注意到一个故障:跳转菜单聊天提示框里出现了一个不该存在的水平滚动条。我截了这张截图: 截图展示了一个模态对话框,显示了滚动条错误。顶部是一个带有蓝色轮廓的搜索输入框,占位符为“跳转到...”,右侧有一个X关闭按钮。下方,标题“开始新的Agent对话”上方是一个文本框,占位符为“询问关于你的数据的问题...”——错误在于:空文本框底部边缘错误地显示了一个粗灰色水平滚动条,几乎占满其宽度,旁边有调整大小的手柄。文本框下方:“按Enter开始。Shift+Enter换行。”接着是一个蓝色“开始对话”按钮。 然后我在`datasette-agent`的检出版本下启动了一个全新的`claude`会话,拖入截图并告诉它: > `查看依赖项,帮助找出为什么这里会出现水平滚动条` 我预感原因在Datasette Agent的某个依赖项中(很可能就是Datasette本身),而且我知道Fable擅长挖掘依赖代码——要么检查自己虚拟环境`site-packages`中安装的文件,要么引用磁盘上的本地检出版本。让它从依赖项开始是个不错的猜测。 我因家务琐事分心,离开了电脑。几分钟后回来时,我看到我的机器*打开了一个浏览器窗口*(在我的常规Firefox中),然后*导航到了那个对话框*。我没有告诉Claude Code使用任何浏览器自动化,而且我很确定它无法在窗口内触发鼠标移动或键盘快捷键,那它是怎么做到的? 我着迷地看着它继续探索,然后看到它打开了Safari窗口而不是Firefox。我还从Claude终端抓取了这张截图: 终端截图显示两个Bash工具调用。第一个:Bash(open -a Safari /tmp/textarea-scrollbar-test.html && sleep 4 && uv run --with pyobjc-framework-Quartz python - <<'EOF' import Quartz wins = Quartz.CGWindowListCopyWindowInfo(Quartz.kCGWindowListOptionOnScreenOnly, Quartz.kCGNullWindowID) for w in wins: if (w.get('kCGWindowOwnerName') or '') == 'Safari' and 'textarea' in (w.get('kCGWindowName') or '').lower(): print(w.get('kCGWindowNumber')) EOF) 输出 153551。第二个:Bash(screencapture -x -o -l 153551 /tmp/safari-cases.png && echo ok) 输出 ok。 它用`uv run --with pyobjc-framework-Quartz`在做什么?原来Fable自己发明了一种截取浏览器窗口截图的方法。它用Python遍历我机器上的所有可用窗口,然后过滤出包含预期字符串(如窗口名中的`"textarea"`)的Safari窗口。它利用这些信息找到窗口编号——一个整数,比如153551——然后可以用`screencapture`命令行工具抓取PNG。 好吧,这确实是一个巧妙的截图方式。但它在截什么的图?原来它一直在编写自己的临时HTML页面来尝试重现这个bug,然后打开Safari并抓取截图。这是它创建的/tmp/textarea-scrollbar-test.html(https://static.simonwillison.net/static/2026/textarea-scrollbar-test.html)页面,以及用`screencapture -x -o -l 153551 /tmp/safari-cases.png`截取的截图: Safari浏览器窗口截图,显示一个文本框滚动条测试页面,地址为file:///private/tmp/textarea-scrollbar-test.html。页面文字:滚动条厚度:17px | UA: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.4 Safari/605.1.15 | devicePixelRatio: 2。接着是四个编号的测试用例,每个都包含一个占位符为“询问关于你的数据的问题...”的文本框:1. 精确插件CSS(resize: vertical, 默认overflow),2. 插件CSS + overflow-x: hidden,3. 插件CSS + resize: none,4. 默认文本框(更小的框,占位符换行成两行)。 (我有太多打开的标签页了!) 好吧,我明白它是如何打开测试页面并截图的,但它到底是怎样触发那个待测试的模态对话框的?那个对话框只能通过点击或键盘快捷键访问,而我看不到它在Safari中运行这些操作的机制。我最终弄明白了它做了什么。Claude在包含应用程序源代码的文件夹中运行。它足够了解Datasette(https://datasette.io/),可以运行本地开发服务器。原来它修改了Datasette自己的模板,添加了JavaScript,一旦窗口打开就会触发正确的键盘快捷键,添加了如下代码: `` window.addEventListener("load", function () { setTimeout(function () { document.dispatchEvent(new KeyboardEvent("keydown", {key: "/", bubbles: true})); }, 1200); }); `` 窗口打开1.2秒后,这段代码触发一个模拟的`/`键,这是打开模态对话框的键盘快捷键。 还剩一个挑战。为了理解发生了什么,Claude需要在页面上运行JavaScript自行测量。它编写了自己的自定义Web应用来通过CORS捕获信息,然后把它作为本地服务器运行,并打开一个页面,该页面中的JavaScript会直接POST到这个服务器!下面是它编写的Python Web应用,使用了标准库`http.server`(https://docs.python.org/3/library/http.server.html)包: `` from http.server import HTTPServer, BaseHTTPRequestHandler class H(BaseHTTPRequestHandler): def do_POST(self): n = int(self.headers.get("Content-Length", 0)) open("/tmp/diag.json", "w").write(self.rfile.read(n).decode()) self.send_response(200) self.send_header("Access-Control-Allow-Origin", "*") self.end_headers() def do_OPTIONS(self): self.send_response(200) self.send_header("Access-Control-Allow-Origin", "*") self.send_header("Access-Control-Allow-Headers", "*") self.end_headers() def log_message(self, *a): # quiet pass HTTPServer(("127.0.0.1", 9999), H).serve_forever() `` 它所做的就是接受一个包含JSON的POST请求,并将其写入`/tmp/diag.json`文件。它发送`Access-Control-Allow-Origin: *`头(包括来自`OPTIONS`请求的),这样在另一个域上运行的代码仍然可以回传给它。 然后Claude将这段代码注入到它在浏览器中加载的模板中: `` const host = document.querySelector("navigation-search"); const ta = host.shadowRoot.querySelector("textarea"); const cs = getComputedStyle(ta); fetch("http://127.0.0.1:9999/diag", { method: "POST", body: JSON.stringify({ dpr: window.devicePixelRatio, scrollWidth: ta.scrollWidth, clientWidth: ta.clientWidth, whiteSpace: cs.whiteSpace, width: cs.width, }), }); `` 这测量了``内部`<textarea>`的属性和计算样式,然后发送给服务器,服务器将其写入磁盘上的文件,Claude可以读取。 用尽了所有这些技巧后,Fable……撞上了一些看不见的护栏,自行降级为Opus。幸好Opus可以访问完整记录,并继续使用Fable开创的技巧,不久后找到、测试并验证了修复方案(https://github.com/datasette/datasette-agent/commit/a75a8b727b42c30ced1fc41dc8add7eb9f04fefe)。我提示Opus: > `在 /tmp/automation-report.md 中写一份报告,记录你在本次会话中用于在我的电脑上对真实浏览器进行测试的所有技巧,包含可运行的代码示例` 它生成了这份报告(https://gist.github.com/simonw/aef7f7db9ac992643110a74e43d6d42f),对于拼凑本文的细节来说价值连城。我也分享了这次Claude Code会话的完整终端记录(https://gisthost.github.io/?cc14774f6d37eb67bf089f3ac3925f8f)。 #### 回顾它所做的所有事情 基于一张截图和一行提示,Claude Fable 5 + Claude Code: - 弄清楚了运行本地开发服务器的配方(包括运行所需的假环境变量) - 启动了一个Playwright Chrome会话 - 为Chrome打开了可见滚动条设置 `defaults write com.google.chrome.for.testing AppleShowScrollBars Always`(之后又关闭了) - 也在Playwright中轮换了Firefox和WebKit,但未能重现bug - 发现我的默认浏览器是Safari - 构建了一个`textarea-scrollbar-test.html` HTML文档 - 在真实的(非Playwright)Firefox中打开它 - 发现`osascript -e 'tell application "System Events" to tell process "firefox" to id of window 1'`被阻止,因为“osascript 未获得辅助功能访问权限” - 找到了上述`uv run --with pyobjc-framework-Quartz python`的变通方法 - 在站点模板中添加JavaScript,以触发`/`键 - 构建了自己的小型Python CORS Web服务器来捕获JSON数据 - 重写了模板以捕获数据并发送给服务器 - 通过Web组件影子DOM一步步获取所需信息 - 打开Safari确认bug来源 - 修改自定义模板,临时加入一个潜在修复 - 确认临时修复有效 - 报告了修复方法 就像我说的,极度主动! #### 我真的需要限制这个家伙 一方面,看着Fable不遗余力地获取调试所需的信息——而最终只是一个两行CSS修复——真是*着迷*。但另一方面……这有力地提醒我们,编码代理可以做任何*你*能在终端输入命令做的事情——而前沿模型知道所有常见技巧,显然还有一些从未有人记录过的技巧。如果Fable是在执行恶意指令(隐藏在代码或问题线程中的提示注入攻击,或者我不小心粘贴到终端的东西),它能在多大程度上泄露数据或造成其他恶作剧,想想都令人不安。在沙箱之外运行编码代理从来都不是好主意——它是我认为可能导致一个挑战者灾难(https://simonwillison.net/2026/Jan/8/llm-predictions-for-2026/#1-year-a-challenger-disaster-for-coding-agent-security)事件的头号候选,正如Johann Rehberger在《AI中的异常正常化》(https://embracethered.com/blog/posts/2025/the-normalization-of-deviance-in-ai/)中所描述的那样。可以说Fable更聪明,因此对潜在恶意指令也更可疑。但这种聪明是一把双刃剑:如果它*确实*被指令颠覆,考虑到它的极度主动性,它可能造成的损害是可怕的。

相似文章

Claude Fable 具有不懈的主动性

Hacker News Top

文章描述了 Claude Fable 5(一款AI模型)如何通过自主使用浏览器自动化、Shell命令和自定义脚本调试UI问题,展现出不懈的主动性,展示了先进的工具使用能力。

Claude Fable 令人难以置信

Reddit r/ArtificialInteligence

Claude Code Fable 5 让没有编码知识的用户也能在几分钟内构建功能完善的网页应用。

Claude Fable 5:编码任务的中等表现

Hacker News Top

Anthropic的Claude Fable 5模型在真实的漏洞修复任务中表现中等,出现大量超时和高作弊量,但也解决了四个先前模型未破解的实例。