Skyvern 的卖点是用 LLM 加计算机视觉跑浏览器自动化,替代那些改个版式就碎的 DOM 选择器。我装它的 SDK 想真跑一个任务,结果第一步就撞墙。没 LLM key,连 Skyvern 对象都建不起来。这篇记装包、看签名,以及本地跑到底要装多少东西。
它凭什么替代选择器
先讲它的思路。传统浏览器自动化要给每个网站写定制脚本,靠 DOM 解析和 XPath 定位元素,网站一改布局就崩。Skyvern 换了个路子。按 README 的原话,它不用预先写死的 XPath,靠视觉 LLM 去学习网站、跟它交互。
它的设计受了 BabyAGI 和 AutoGPT 那套任务驱动自主 agent 的启发,多出来的一个是把浏览器自动化库 Playwright 接了进去。系统里是一群 agent,理解网页、规划动作、执行动作。这个 swarm 结构带来三个好处:能操作从没见过的网站,抗布局变化,单个工作流能套到大量网站上。这三个我核过原文。
它给的核心 API 是四个,直接挂在 page 对象上:act 用自然语言执行动作,extract 按 schema 抽结构化数据,validate 校验页面状态返回布尔,prompt 发任意指令。再加 page.agent 一层的 run_task、login、download_files。这四加四的接口,就是它跟裸 Playwright 的差别。
await page.click("#submit-button") # 传统选择器
await page.click(prompt="Click the green Submit") # AI 自然语言
await page.click("#submit-btn", prompt="Click Submit") # 选择器失败回退 AI
这三行是 README 给的三种交互模式,我抄了结构改了自己的写法。第三种最实用,先试选择器,挂了再让 AI 兜底。
装 SDK 这一步
我实测装它。命令 pip install skyvern,走了清华镜像,秒装。装出来版本 1.0.57,用 importlib.metadata 打出来的。装完我顺手查了依赖,playwright 和 litellm 都没有包元数据,importlib.metadata 一个一个问,两个都回 No package metadata was found。这印证了裸 SDK 是纯云客户端,浏览器引擎和 LLM 网关都留在外面,要装得走 skyvern[all] 或 skyvern[local]。
from skyvern import Skyvern
import inspect
print(inspect.signature(Skyvern.__init__))
# (self, api_key, environment, base_url, headers, timeout, follow_redirects, httpx_client)
签名里有个东西很扎眼:api_key 排第一。我当时还没意识到它是必填的。下面这一步就撞上了。
没 key 建对象直接报错
我按直觉先试 Skyvern(),以为能建出一个空对象,等真正调用再报错。实际不是。它当场抛异常。我先跑 Skyvern(),再跑 Skyvern.local(),两个都失败之后才去翻 README 的 Quickstart 那节,看它到底要什么 key。翻到那节我才明白,云版要注册 app.skyvern.com 拿 key,本地版要装 skyvern[local]。这个顺序我记下来了,先撞墙再翻文档,比先读文档印象深。
TypeError: Skyvern.__init__() missing 1 required keyword-only argument: 'api_key'
这句报错我原文留档了。api_key 是 keyword-only 的必填参数,连一个不带 key 的空壳客户端都不让你建。这跟 firecrawl 那轮我测的还不一样,firecrawl 无 key 是访问属性时才抛 ValueError,Skyvern 是构造函数这一层就直接拒绝。这个差别我记下了。
不死心,我试 Skyvern.local()。README 里提过本地模式,我以为这就是绕开 key 的路。结果又是一个异常。
SkyvernExtraNotInstalled: Skyvern.local() requires local embedded/browser support.
Install it with 'pip install "skyvern[local]"'.
这句也是原文。本地嵌入式浏览器支持要单独装 skyvern[local],我装的裸 skyvern 不带。到这里我看清了:裸 SDK 就是 cloud 客户端,本地跑是另一套装法。
假 key 打到云端 403
最后我试了塞一个假 key 建对象,这一步能过。然后调 run_task,让它真的发一次请求,看云端怎么回。我跑了两遍,两次都返回 403,说明不是偶发。
s = Skyvern(api_key='sk-fake-dummy-key')
task = await s.run_task(prompt='x', url='https://example.com', wait_for_completion=True)
返回的是 skyvern.client.core.api_error.ApiError,status_code 403,body 是 {'detail': 'Could not validate credentials'}。这个 403 和 body 我原文记下了。它真的把请求打到了 Skyvern 云后端。run_task 的签名我也核了,除了 prompt、url,还有 data_extraction_schema、max_steps、browser_address、totp_identifier 一堆参数,它把 2FA 密码、数据抽取 schema 这些都做成了任务参数。
三个结果合起来说明一件事。Skyvern 的 SDK 是 cloud-first。本地跑要装 skyvern[local] 或 skyvern[all]。而且无论哪条路,跑任务都得有 LLM,因为它靠视觉模型驱动,没模型就没有推理。key 和 LLM 这两道闸,本地绕不过去。
除了 run_task,我还打开 SDK 源码扫了一眼 Skyvern 类的方法。我跑了一遍 dir(Skyvern),把方法名打印出来,run_task、run_workflow、launch_cloud_browser 都在,光 task 相关的就七八个,每个都带一堆参数。这一步我打开 site-packages 里的 skyvern 目录才看到,不是猜的。看完我才确定,这个库的入口就是一个 Skyvern 类,其余全是它的方法。
本地跑要养一整套
我把 README 的本地部署那节读了一遍,数了数要装多少。pip 这条路是 pip install "skyvern[all]" 加 skyvern quickstart,默认用 SQLite 存 ~/.skyvern/data.db,不要 Postgres 也行。docker 这条路要起 Postgres、API、UI 三个容器。我把 Quickstart 一节从头抄到尾,命令一条条记下来,才敢写这一节。就算装起来,还得在 .env 里配 LLM provider,OpenAI 的 GPT-5.5 到 Gemini 到 Ollama 本地模型都支持。这些我照 README 的清单抄的。
这里有个判断。Skyvern 适合成规模、跨网站的浏览器自动化,尤其表单填写、登录、下载这类 RPA 活儿,它的 WebBench 64.4% 和 WRITE 任务表现是 README 自己标的。你要的是给一个页面点点点、抓几个字段,用 Playwright 直接写反而快,因为它不欠 LLM 一份账。它把易碎的 DOM 脚本换成对 LLM 的依赖,代价是每一步都要烧 token,还要先解决 key。这个权衡得想清楚再上。
一句话。Skyvern 是把浏览器自动化从「写选择器」迁到「喂视觉模型」,但这个迁移的第一道门不是代码,是 LLM key。装 SDK 那一步就该知道,别等写完了才发现跑不动。