Built-ins

web Plugin

通过可替换 provider 提供结构化搜索、网页读取和 Playwright/CDP 浏览器能力

web Plugin

web 是真实的联网能力插件。构造函数只接收 profile,Plugin 会在内部创建选中的浏览器 provider;搜索和文档能力从 Agent Plugin context 读取。

使用 Playwright/CDP

import { WebPlugin } from "@downcity/plugins/web";

const web = new WebPlugin({
  browser: "playwright",
  cdp_url: "http://127.0.0.1:9222",
});

PlaywrightBrowserProvider 连接已经启动的 Chrome/Chromium CDP 端点,不负责下载浏览器或执行安装命令。云端 Browserbase、Browserless、Kitesurf 等只要提供 CDP,也可以实现同一个 BrowserProvider 协议。

Provider 在 CDP 浏览器已有的默认 context 中为每个 session 创建独立页面,不创建隔离 context,也不接管浏览器中已经打开的页面。关闭 session 只会关闭该 session 创建的页面。

连接默认启用 Playwright 的 noDefaults 模式,兼容不支持 Browser Context 管理、但允许在默认 context 创建页面的 CDP 端点。该模式保留浏览器已有的下载、焦点和媒体模拟设置;Provider 不会覆盖 acceptDownloads、focus emulation、colorSchemereducedMotionforcedColorscontrast

目标 CDP 端点仍需支持发现默认 context 和创建新页面。连接、默认 context 解析、页面创建或页面初始化失败时,Provider 会返回带阶段标识的脱敏错误,不会在错误中暴露 endpoint 的认证信息、查询参数或 browser id。

Actions

Action用途
search委托配置的搜索 provider
open委托配置的已知 URL 文档 provider
browser_create_session创建浏览器 session
browser_observe读取 URL、标题、可见文本和可选截图
browser_act执行 gotoclickfillpressscrollwait
browser_semantic_act通过 Stagehand、Computer Use 或其他语义 adapter 执行自然语言动作
browser_extract按 CSS selector 或 body 抽取文本
browser_semantic_extract通过语义 adapter 按自然语言要求抽取内容
browser_close_session关闭 session 并释放页面

浏览器示例:

const created = await web.actions.browser_create_session.execute({
  context,
  input: { url: "https://example.com" },
});

const session_id = created.data.session_id;
await web.actions.browser_observe.execute({
  context,
  input: { session_id },
});

await web.actions.browser_close_session.execute({
  context,
  input: { session_id },
});

Provider 组合

WebPlugin 可以只配置其中一种能力:

const web = new WebPlugin({ browser: "playwright", cdp_url: "http://127.0.0.1:9222" });

语义能力通过 adapter 注入,不直接绑定模型厂商:

import {
  SemanticBrowserProviderAdapter,
} from "@downcity/plugins/web";

const browser = new SemanticBrowserProviderAdapter({
  name: "stagehand",
  browser: playwright_browser,
  semantic_act: (input) => stagehand_service.act(input),
  semantic_extract: (input) => stagehand_service.extract(input),
});

Computer Use 可以使用 ComputerUseBrowserProviderAdapter,它会先取得带截图的当前观察,再将目标交给宿主的 OpenAI、Anthropic、Gemini 或自建模型循环。模型不接触 Playwright 对象。

推荐路由:先用搜索或 HTTP 读取解决静态任务;页面需要动态渲染、登录态或交互时再创建浏览器;自然语言动作可在 provider 内接入 Stagehand,视觉页面可在动作失败后回退到 Computer Use。

生命周期与安全

  • WebPlugin 至少需要注入一种 provider;没有真实能力时不会被构造。
  • 浏览器 session 由 provider 持有,Agent 销毁或 Plugin 卸载时自动调用 dispose()
  • browser_act 只提供确定性的浏览器动作;提交、发送、购买、上传、删除等副作用必须由宿主审批。
  • 不要把 Playwright BrowserPageBuffer 直接返回给 Agent;Action 结果始终是 JSON 数据。
  • 安装 Skill、发现 Skill 和读取 SKILL.md 仍由 SkillPlugin 负责。

相关文档