在原有只读抓取 (browser_fetch_page) 基础上,新增 observe→act 循环, 让 Agent 能在用户的 Chrome 中实际操作网页:点击/输入/滚动/等待/页内跳转。 后端: - 新工具 browser_act,按 session 复用标签页,返回带编号的可交互元素清单+正文 - browser_context 任务队列扩展 kind/session_id/action 与 observation 结果 - /api/browser-context 路由下发 act 任务、接收 observation - BrowserContextConfig 增加 actions_enabled 等开关,tools.py 两级门控 - 接线 app.py 路由挂载、app_config.py 配置字段、config.yaml 工具注册 前端: - ChatPage 处理「发送当前页」回跳的 browser_context query 参数并自动提交 扩展 (browser-extension/deer-web-clipper): - shared.js 自包含注入函数 deerObservePage / deerPerformAction - background.js 按 kind 分发任务,session→tab 映射存 chrome.storage.session 测试:tests/test_browser_act.py(队列往返 + 工具校验 + 模拟扩展成功路径,8 passed) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
75 lines
2.6 KiB
Python
75 lines
2.6 KiB
Python
"""Configuration for browser page context capture."""
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class BrowserContextConfig(BaseModel):
|
|
"""Controls the optional Chrome-extension page capture integration."""
|
|
|
|
enabled: bool = Field(
|
|
default=False,
|
|
description="Enable /api/browser-context endpoints for Chrome extension page capture.",
|
|
)
|
|
max_content_chars: int = Field(
|
|
default=200_000,
|
|
ge=1_000,
|
|
description="Maximum captured page text stored per request. Longer content is truncated.",
|
|
)
|
|
max_title_chars: int = Field(
|
|
default=300,
|
|
ge=20,
|
|
description="Maximum title length accepted from the browser extension.",
|
|
)
|
|
max_url_chars: int = Field(
|
|
default=2_048,
|
|
ge=100,
|
|
description="Maximum source URL length accepted from the browser extension.",
|
|
)
|
|
filename_prefix: str = Field(
|
|
default="webpage",
|
|
description="Prefix used for Markdown files created from captured pages.",
|
|
)
|
|
route_base: str = Field(
|
|
default="/page/workspace",
|
|
description="Frontend route base used when returning chat paths to the extension.",
|
|
)
|
|
task_result_timeout_seconds: int = Field(
|
|
default=60,
|
|
ge=5,
|
|
description="Maximum time the browser_fetch_page tool waits for the extension result.",
|
|
)
|
|
task_poll_interval_seconds: float = Field(
|
|
default=1.0,
|
|
ge=0.25,
|
|
description="How often the backend tool checks for a returned browser task result.",
|
|
)
|
|
task_lease_seconds: int = Field(
|
|
default=120,
|
|
ge=10,
|
|
description="How long a claimed browser task is reserved before another extension may retry it.",
|
|
)
|
|
tool_result_max_chars: int = Field(
|
|
default=60_000,
|
|
ge=1_000,
|
|
description="Maximum page characters returned from browser_fetch_page into the model context.",
|
|
)
|
|
actions_enabled: bool = Field(
|
|
default=True,
|
|
description="Enable the interactive browser_act tool (click/type/scroll/wait/navigate on the user's page).",
|
|
)
|
|
action_result_timeout_seconds: int = Field(
|
|
default=45,
|
|
ge=5,
|
|
description="Maximum time the browser_act tool waits for the extension to perform one step and return an observation.",
|
|
)
|
|
max_observed_elements: int = Field(
|
|
default=150,
|
|
ge=10,
|
|
description="Maximum number of interactive elements returned in a browser_act observation.",
|
|
)
|
|
observation_text_max_chars: int = Field(
|
|
default=12_000,
|
|
ge=500,
|
|
description="Maximum page text characters returned alongside a browser_act observation.",
|
|
)
|