Claude Platform Docs
Messages工具

透過 SDK 工具集使用瀏覽器

從 Python 或 TypeScript SDK 執行瀏覽器使用工具。SDK 會執行迴圈以及您設定的 URL、檔案和核准檢查,而瀏覽器則由您提供。

Python 和 TypeScript SDK 包含一個用於瀏覽器使用工具的類別。您可以建立它的子類別,並針對您自己的瀏覽器自動化,為每個「member tool」(成員工具)撰寫一個方法,例如 navigate 或 left_click。SDK 會路由每個呼叫、檢查 URL 和檔案路徑、詢問您的「approval callback」(核准回呼),並建構每個 tool_result。

SDK 不包含瀏覽器、現成的「driver」(驅動程式)或「denylist」(拒絕清單)。適用於 Playwright 和 Chrome DevTools Protocol 的範例驅動程式(提供 Python 和 TypeScript 版本)位於 claude-quickstarts 儲存庫的 browser-toolset 資料夾中。

快速入門

驅動程式是您對 BetaAbstractBrowserToolset20260801 建立的子類別。這個驅動程式實作了 navigate、screenshot 和 left_click,以及 _browser_state(在 TypeScript 中為 browserState),也就是每個驅動程式都需要的「state report」(狀態報告)。在此範例中,backend 代表您自己對瀏覽器自動化函式庫(例如 Playwright)所撰寫的包裝器。

from anthropic import Anthropic
from anthropic.tools.browser import (
    BetaAbstractBrowserToolset20260801,
    BetaBrowserNavigateResult,
    BetaBrowserScreenshotResult,
    BrowserState,
    ToolsetCallContext,
)
from anthropic.types.beta import (
    BetaBrowserLeftClickInput,
    BetaBrowserNavigateInput,
    BetaBrowserScreenshotInput,
    BetaBrowserStateTabEntryParam,
)


class MyBrowser(BetaAbstractBrowserToolset20260801):
    def __init__(self, backend, **options):
        super().__init__(**options)
        self.backend = backend

    def _browser_state(self, context: ToolsetCallContext) -> BrowserState:
        return BrowserState(
            tabs=[
                BetaBrowserStateTabEntryParam(
                    tab_id=tab.id,
                    title=tab.title,
                    url=tab.url,
                    active=tab.id == self.backend.active,
                )
                for tab in self.backend.tabs()
            ],
            state_changes=self.backend.drain_changes(),
        )

    def navigate(
        self, context: ToolsetCallContext, input: BetaBrowserNavigateInput
    ) -> BetaBrowserNavigateResult:
        # input.url 是已通過 URL 政策檢查的 URL,或是 "back"、"forward"、
        # 或 "reload"。若 Claude 省略 scheme,SDK 會自動加上 https://。
        page = self.backend.goto(input.url, input.tab_id)
        return BetaBrowserNavigateResult(
            url=page.url, status=page.status, title=page.title
        )

    def screenshot(
        self, context: ToolsetCallContext, input: BetaBrowserScreenshotInput
    ) -> BetaBrowserScreenshotResult:
        data = self.backend.png_base64(input.tab_id)
        return BetaBrowserScreenshotResult(data=data, media_type="image/png")

    def left_click(
        self, context: ToolsetCallContext, input: BetaBrowserLeftClickInput
    ) -> None:
        # 無需回傳任何內容:Claude 會讀到 "Clicked."
        self.backend.click(input.target, input.tab_id)

    def close(self) -> None:
        super().close()  # first, so no call is still using the browser when it closes
        if not self.backend.closed:
            self.backend.close()


client = Anthropic()
with MyBrowser(backend, allowed_domains=["example.com", "iana.org"]) as browser:
    runner = client.beta.messages.tool_runner(
        model="claude-opus-5-5",
        max_tokens=1024,
        tools=[browser],
        messages=[
            {
                "role": "user",
                "content": "Open example.com and tell me the page heading.",
            }
        ],
    )
    for message in runner:
        print(message)

將驅動程式實例本身作為 tools 項目傳入。您未實作的成員會以停用狀態傳送至 API。如果 Claude 仍然呼叫它,SDK 會傳回錯誤,而執行會繼續進行。覆寫 execute 會改變哪些成員以停用狀態傳送(新增前置與後置 hook)。執行器永遠不會關閉工具集,因此一個實例可以服務多次執行。完成後請將其關閉。

自訂驅動程式

啟用或停用成員

configs 接受設定工具集中所述的各成員設定。只需列出您要變更的成員:

# 同時實作 read_console 的 MyBrowser
browser = MyBrowser(
    backend, configs={"read_console": {"enabled": True}, "navigate": {"enabled": False}}
)

SDK 會在您的程式碼執行之前拒絕對已停用成員的呼叫。啟用您的類別未實作的成員屬於設定錯誤,除非該類別覆寫了 execute。

新增前置與後置 hook

覆寫 execute 並呼叫父類別的 execute。該呼叫之前的程式碼會在 URL 檢查(設定 URL 政策)和 confirm(管控具重大影響的成員)之後執行,並且可以變更輸入。SDK 不會再次檢查變更後的輸入。該呼叫之後的程式碼會收到結果,並且可以變更結果。引發 ToolError(在 TypeScript 中則是拋出它)即可拒絕該呼叫。

覆寫 execute 會改變提供給 Claude 的成員。SDK 會將每個成員都視為已實作,因此 Claude 會獲得所有預設開啟的成員。快速入門中的 MyBrowser 只服務三個成員,因此下列的 TracedBrowser 會向 Claude 提供它無法服務的成員。在使用之前,請先透過 configs 關閉這些成員。

import time


class TracedBrowser(MyBrowser):
    def execute(self, context, name, input):
        started = time.monotonic()
        result = super().execute(context, name, input)
        elapsed_ms = (time.monotonic() - started) * 1000
        call_id = context.tool_use.id if context.tool_use else "-"
        log.info("%s %s %.0fms", call_id, name, elapsed_ms)
        return redact(result) if name == "get_page_text" else result

實作驅動程式

覆寫您的瀏覽器所支援的成員。每個成員都會收到呼叫上下文,以及以具型別物件(例如 BetaBrowserNavigateInput)表示的成員輸入。輸入型別來自 anthropic.types.beta(在 TypeScript 中為 @anthropic-ai/sdk/resources/beta)。成員工具列出了每個輸入的欄位。

在 TypeScript 中,請將成員撰寫為方法,而非箭頭函式欄位,因為 SDK 是在 prototype 上尋找它們。在 TypeScript 中,type 成員要拼寫為 type_。在 Python 中則為 type。

傳回結果

成員傳回的內容決定了 Claude 讀取的內容。成功的結果會以根據您的狀態報告所建構的 browser_state 區塊結尾。錯誤結果則不帶有此區塊。

成員傳回Claude 讀取
screenshot、zoomBetaBrowserScreenshotResult一個圖片區塊
navigateBetaBrowserNavigateResultNavigated to {url} — {title} (HTTP {status})
new_tab、switch_tab、list_tabs、close_tab一個分頁項目(new_tab、switch_tab)、分頁項目清單(list_tabs),或不傳回任何內容(close_tab)僅 browser_state 區塊
read_page、get_page_text、find、read_console、read_network、javascript_exec字串該字串
其他所有成員不傳回任何內容,或一行文字簡短的確認訊息(例如 Clicked.),接著是位於獨立文字區塊中的傳回行

回報瀏覽器狀態

SDK 會在每次呼叫之後呼叫 _browser_state(在 TypeScript 中為 browserState 選項),包括被拒絕和失敗的呼叫。請傳回每個開啟的分頁,以及自上次報告以來的變更:

  • 已開啟的分頁和下載事件。
  • 針對您的請求 hook 所封鎖的每次導覽,提供一個 NavigationRefused。
  • 針對您的驅動程式所關閉的每個原生對話方塊,提供一個 DialogDismissed。

將這些全部放入 state_changes。在 Python 中,NavigationRefused(url=...) 和 DialogDismissed(kind=..., message=...) 來自 anthropic.tools.browser。在 TypeScript 中,它們是 { type: "navigation_refused", url } 和 { type: "dialog_dismissed", kind, message }。

後兩者並非 API 狀態變更。SDK 會以 browser_state 區塊之外的文字將它們回報給 Claude:所有被拒絕的導覽合併為一行(不會指明 URL),前三個被關閉的對話方塊各一行,其餘的則以數量表示。

當有任何分頁開啟時,必須恰好有一個分頁處於作用中狀態。每個接受 tab_id 的成員都必須對其指定的分頁執行動作。SDK 會使用該報告來判斷結果來自哪個頁面。API 對報告的限制列於使用 browser_state 追蹤分頁。

處理錯誤

由成員或 SDK 引發Claude 讀取執行
ToolError其訊息,作為錯誤結果繼續
任何其他例外其文字,作為錯誤結果繼續
ToolsetUsageError,用於設定錯誤、在呼叫期間誤用 SDK,或在 close 之後進行呼叫無停止

在 Claude 讀取成員的錯誤文字、left_click 等動作傳回的行、失敗下載的錯誤,或被關閉對話方塊的訊息之前,SDK 會將政策拒絕的每個 URL 替換為 (blocked)。它會將檔案政策未公開的每個本機路徑替換為 (path hidden)。此檢查可能會遺漏某些 URL 和路徑。來自您的 URL 政策、檔案政策或 confirm「callable」(可呼叫物件)的 ToolError 會原封不動地傳達給 Claude,因此請勿在其文字中包含被拒絕的 URL 和本機路徑。請在您的成員中捕捉例外,並以您自己的文字引發 ToolError(在 TypeScript 中則是拋出它)。

不使用工具執行器執行

在 tools 中傳入實例(在 TypeScript 中為 browser.toJSON()),並以 tool_result(在 TypeScript 中為 toolResult)回應每個成員呼叫。瀏覽器使用工具要求您在第一個失敗的呼叫處停止(批次動作)。在呼叫失敗之後,此迴圈會回應該回合中後續的呼叫,但不會執行它們:

from anthropic.types.beta import BetaToolResultBlockParam

NOT_EXECUTED = "Not executed: an earlier action in this turn failed."
MAX_TURNS = 10

with MyBrowser(backend, allowed_domains=["example.com"]) as browser:
    messages = [{"role": "user", "content": "Open example.com"}]
    for _ in range(MAX_TURNS):
        response = client.beta.messages.create(
            model="claude-opus-5-5",
            max_tokens=1024,
            tools=[browser],
            messages=messages,
        )
        messages.append({"role": "assistant", "content": response.content})
        calls = [
            block
            for block in response.content
            if block.type == "tool_use" and block.toolset_name == browser.toolset_name
        ]
        if not calls:
            break
        results: list[BetaToolResultBlockParam] = []
        failed = False
        for call in calls:
            if failed:
                # 呼叫失敗後,該輪其餘部分只會直接回覆,不會實際執行。
                results.append(
                    {
                        "type": "tool_result",
                        "tool_use_id": call.id,
                        "toolset_name": call.toolset_name,
                        "content": NOT_EXECUTED,
                        "is_error": True,
                    }
                )
                continue
            result = browser.tool_result(call)
            failed = bool(result.get("is_error"))
            results.append(result)
        messages.append({"role": "user", "content": results})

對每個被略過呼叫的回應都帶有 is_error、該呼叫的 toolset_name,以及批次動作所要求的確切文字。工具執行器也會傳送相同的回應。

安全地執行工具集

Claude 的下一個動作取決於它所讀取的頁面。頁面或注入其中的文字可能會嘗試存取內部服務,或從主機取出檔案。它也可能嘗試觸發具有實際影響的動作。在您對一次性瀏覽器以外的任何瀏覽器執行驅動程式之前,請採取以下六個步驟:

  1. 設定 URL 政策:allowed_domains、blocked_domains,或您自己的 url_policy。
  2. 在驅動程式中攔截請求,並向工具集請求判定結果。
  3. 在容器上設定出口政策,讓網路封鎖驅動程式看不到的內容。
  4. 限制上傳和下載,或保持上傳關閉。
  5. 使用 confirm 管控具重大影響的成員。
  6. 為每個工作階段在專用的容器或 VM 中隔離瀏覽器主機。

SDK 會依照您的設定強制執行步驟 1、4 和 5。步驟 2、3 和 6 則取決於您的驅動程式和部署。安全性考量中的預防措施同樣適用。

設定 URL 政策

將 allowed_domains(在 TypeScript 中為 allowedDomains)設定為任務所需的網站。任一清單中的項目可以是網域(也涵蓋其子網域)、IP 位址或 CIDR 網路。設定 allowed_domains 後,工具集會拒絕所有其他主機。

browser = MyBrowser(backend, allowed_domains=["example.com", "iana.org"])

如果任務需要開放網路,請改為設定 blocked_domains(blockedDomains)。這些清單會比對主機名稱,而不會解析它們。拒絕清單中的 127.0.0.0/8 項目不會封鎖 localhost,因此除了網路之外,也請列出主機名稱。當您同時設定兩個清單時,以 blocked_domains 為準。

拒絕清單無法攔截解析為私有位址的公開名稱。因此在使用 blocked_domains 時,是由容器出口政策來阻止此類名稱存取私有位址。

# 列出瀏覽器可連線、但 Claude 不得存取的主機與網路:
# IPv4 與 IPv6 中的 loopback(迴路)、link-local(鏈路本機)及私有位址範圍、0.0.0.0/8、您的
# 雲端中繼資料位址與名稱(例如 metadata.google.internal)、
# localhost,以及您的內部主機名稱。
browser = MyBrowser(backend, blocked_domains=internal_networks)

url_policy(urlPolicy)會取代這兩個清單,將它與任一清單一起傳入屬於設定錯誤。您的政策不傳回任何內容即表示允許該 URL,引發(拋出)ToolError 則表示拒絕。若要保留預設規則,請使用 default_url_policy(defaultURLPolicy)建構預設政策,並在您自己的政策中先呼叫它:

from urllib.parse import urlsplit

from anthropic.tools.browser import ToolError, URLContext, default_url_policy

listed = default_url_policy(allowed_domains=["example.com"])


def url_policy(context: URLContext, url: str) -> None:
    listed(context, url)  # the default rules first
    if context.phase == "request" and urlsplit(url).scheme != "https":
        raise ToolError("Only https navigation is allowed.")


browser = MyBrowser(backend, url_policy=url_policy)

此政策會在您的程式碼之前對每個 navigate URL 執行,也會對結果所回報的 URL,以及狀態報告中的每個分頁和下載 URL 執行。在結果和狀態報告中,它會略過未指明遠端主機的位址:空白分頁、about:blank、瀏覽器的 chrome-error: 頁面,以及 data: 文件。

在任何政策下,工具集都會拒絕導覽至 http 或 https 以外 scheme 的 navigate,但 about:blank 除外。url_policy="allow_all"(urlPolicy: "allow_all")會關閉政策,但不會關閉此 scheme 規則。

傳入 url_policy=None(urlPolicy: null)會使建構函式引發設定錯誤,因此從您的設定中讀取到的 None(null)無法關閉檢查。在 TypeScript 中,undefined 會讓該選項保持未設定,與不傳入它相同。

當頁面落在被拒絕的位址時,Claude 會讀到其內容已被保留不予顯示,且該分頁會被列為 (blocked)。在該分頁再次位於允許的位址之前,工具集會拒絕對其進行的呼叫。例外情況為 navigate(但不包括 "reload")、new_tab、list_tabs、switch_tab 和 close_tab。

在驅動程式中攔截請求

URL 政策只會判定工具集看得到的位址:導覽、結果和狀態報告。它看不到子資源、fetch() 呼叫、WebSocket,或主機名稱解析到的位置。

工具集只有在呼叫結束時,才會在該呼叫的結果或狀態報告中偵測到新位址。因此在那之前,呼叫仍可能對被拒絕的頁面執行動作,而 SDK 最多只能保留該呼叫的結果不予傳回。除非您的驅動程式判定每個請求(包括每一次重新導向跳轉),否則重新導向至被拒絕位址的頁面仍會載入。

在您驅動程式的請求 hook(您的自動化函式庫在每個請求之前呼叫的函式)中,呼叫 check_url(checkURL)。它會套用工具集本身的政策,因此您不必重複撰寫規則:

from anthropic.tools.browser import URLContext


class MyBrowser(BetaAbstractBrowserToolset20260801):
    ...

    # 透過 context.route("**/*", self._guard) 註冊於 Playwright 瀏覽器 context 上
    def _guard(self, route):
        url_context = URLContext(
            member="navigate", phase="request", tab_id=self.backend.active
        )
        if not self.check_url(url_context, route.request.url).allowed:
            return route.abort("blockedbyclient")
        route.continue_()

check_url 套用與 navigate 相同的 scheme 規則和政策。像這樣的請求 hook 看不到 WebSocket 交握、service worker 請求或重新導向跳轉。請封鎖 service worker。使用看得到 WebSocket 交握和重新導向跳轉的 hook 來判定它們。

在請求階段,check_url 只允許 http、https 和 about:blank URL。因此對於 WebSocket,請在呼叫它之前將 ws:// 改為 http://,並將 wss:// 改為 https://。

在容器上設定出口政策

攔截無法看到瀏覽器發出的每個請求,而 URL 政策也看不到名稱解析到的位置。由容器網路強制執行的「egress policy」(出口政策)可以同時涵蓋這兩者:

  • 封鎖 IPv4 和 IPv6 中的 loopback、link-local 和私有位址範圍,以及 0.0.0.0/8。這包括雲端中繼資料位址 169.254.169.254。
  • 只允許對任務所需主機的對外連線。如果您的規則比對的是 IP 位址,請在容器啟動時解析您允許的主機名稱。
  • 只允許對容器解析器的 DNS。
  • 如果您的驅動程式透過本機 DevTools 連接埠存取瀏覽器,請只允許該連接埠上的 loopback。適用於所有 loopback 的規則會讓頁面能夠存取每個本機服務。

限制上傳和下載

file_upload 預設為關閉。在沒有 file_policy 的情況下,SDK 會拒絕每個指定路徑或文件 ID 的上傳。若要啟用上傳,請傳入一個 LocalFilePolicy(在 TypeScript 中為 NodeFilePolicy),並指定一個只存放任務檔案的上傳目錄:

from anthropic.tools.browser import LocalFilePolicy

# 同時實作 file_upload 的 MyBrowser
browser = MyBrowser(
    backend,
    configs={"file_upload": {"enabled": True}},
    confirm=make_confirm(),  # required for file_upload; see Gate consequential members
    file_policy=LocalFilePolicy(
        upload_roots=["/task/uploads"],
        download_dir="/task/downloads",
        expose_download_paths=False,
    ),
)

SDK 會解析每個上傳路徑(會追蹤符號連結),並拒絕上傳根目錄以外的任何路徑。檔案政策會拒絕位於上傳根目錄內的下載目錄。只有當 expose_download_paths(exposeDownloadPaths)為 true 且檔案位於下載目錄內時,下載的路徑才會傳達給 Claude。

內建的路徑檢查會在執行 SDK 的程序所在的檔案系統上解析路徑。它們只能保護共用該檔案系統的瀏覽器。對於遠端瀏覽器,請改為遵循遠端與託管瀏覽器。

請以下列方式設定下載:

  • 自行建立模式為 0700 的下載目錄,並以 noexec,nosuid,nodev 掛載。
  • 讓該目錄無法被 Claude 可呼叫的其他工具(例如 shell 或檔案工具)存取。
  • 在 download_failed 狀態變更中,將 error 寫成固定的措辭。例外的文字可能包含路徑或 URL。
  • 在有人做出決定之前,不要將下載的檔案讀入對話中,也不要執行它。

管控具重大影響的成員

javascript_exec 和 file_upload 預設為關閉。如果您在沒有 confirm 可呼叫物件的情況下啟用其中任一個,建構函式會引發設定錯誤。有 confirm 可呼叫物件時,SDK 會在每個即將執行的呼叫之前呼叫它。沒有的話,則不會詢問任何事。

傳回 True 以執行呼叫,或傳回 False 以拒絕呼叫(在 TypeScript 中為 true 和 false)。當您的可呼叫物件詢問某人時,請向對方顯示成員、頁面的 URL 和呼叫的輸入。首先,請跳脫輸入中所有可列印 ASCII 範圍以外的字元,因為輸入可能帶有來自頁面的文字。

此範例透過您自己的 ask_user 函式(在 TypeScript 中為 askUser)詢問這兩個受管控的成員,並核准其餘成員:

import json
from collections.abc import Callable

from anthropic.tools.browser import ConfirmContext

GATED = {"javascript_exec", "file_upload"}


def shown(context: ConfirmContext) -> str:
    """The call's input as JSON, with every character outside printable
    ASCII escaped."""
    return json.dumps(context.input.to_dict(), ensure_ascii=True, indent=2)


def make_confirm() -> Callable[[ConfirmContext], bool]:
    granted: set[tuple[str, str, str]] = set()

    def confirm(context: ConfirmContext) -> bool:
        name = context.member
        if name not in GATED:
            return True
        detail = shown(context)
        page = context.tab_url
        origin = context.origin
        if page is None or origin is None or origin.startswith("chrome-error:"):
            # 沒有來源,或為錯誤頁面:每次都要詢問。
            return ask_user(
                f"Allow {name} on {page or 'a page with no origin'}?\n{detail}"
            )
        # 一次核准僅適用於此頁面上這個完全相同的輸入。
        key = (name, page, detail)
        if key not in granted and ask_user(f"Allow {name} on {page}?\n{detail}"):
            granted.add(key)
        return key in granted

    return confirm


# 同時實作 javascript_exec 與 file_upload 的 MyBrowser
browser = MyBrowser(
    backend,
    configs={"javascript_exec": {"enabled": True}, "file_upload": {"enabled": True}},
    confirm=make_confirm(),
)

每次呼叫 make_confirm()(在 TypeScript 中為 makeConfirm())都會傳回一個沒有任何核准紀錄的可呼叫物件。請為每個工具集呼叫一次,並為每位使用者提供各自的工具集。

核准涵蓋的是上次狀態報告所顯示的頁面,而頁面可能在呼叫執行之前發生變化。購買、傳送訊息和接受條款都是透過 left_click 和 type 等一般成員進行的,因此 confirm 無法依名稱將它們挑出。若要讓某人核准這些動作,也請針對這些成員進行詢問。

請勿在不攔截請求的驅動程式上啟用 javascript_exec。在被拒絕頁面上執行的指令碼可能會將其內容複製到某個位置,讓之後的讀取將其傳回。

隔離瀏覽器主機

為每個工作階段在專用、最低權限的容器或 VM 中執行瀏覽器:

  • 以非 root 使用者身分執行,並在瀏覽器允許的情況下使用唯讀的根檔案系統。
  • 除了您所設定的上傳和下載目錄(如果有的話)之外,不要從主機掛載任何內容。
  • 讓環境中不含憑證,並從全新的瀏覽器設定檔開始。
  • 不與 Claude 可呼叫的其他工具共用任何檔案系統。

請在瀏覽器的容器之外執行呼叫 API 的程式碼,因為該程式碼持有您的 API 金鑰和對話內容。工具執行器和 tool_result 都會在該程式碼的程序中執行工具集,因此瀏覽器不會與工具集共用檔案系統。請將瀏覽器視為遠端:遠端與託管瀏覽器適用於此情況。

請將頁面傳回的所有內容視為不受信任,包括頁面文字、螢幕截圖、主控台和網路項目、分頁標題以及下載名稱。

遠端與託管瀏覽器

有些瀏覽器不會與執行 SDK 的程序共用檔案系統。例如位於另一個容器中的瀏覽器、您透過 DevTools URL 存取的瀏覽器,以及來自託管瀏覽器服務的瀏覽器。對於這些瀏覽器,URL 政策、請求攔截和 confirm 仍會在您的程序中執行。

使用託管瀏覽器時,由供應商控制出口和主機隔離。您自己的出口政策在那裡並不適用,因此驅動程式的請求 hook 是您對瀏覽器請求的唯一檢查。請了解瀏覽器的網路可以存取哪些位置。

內建的路徑檢查無法保護遠端瀏覽器。LocalFilePolicy(在 TypeScript 中為 NodeFilePolicy)會在執行 SDK 的程序所在的檔案系統上檢查路徑,而瀏覽器讀寫的是它自己的檔案系統。

SDK 無法偵測瀏覽器是否為遠端。因此對於遠端瀏覽器,請保持 file_upload 關閉,除非您的驅動程式使用自己的 FilePolicy,在瀏覽器執行的位置檢查上傳路徑。FilePolicy 會審查每個上傳的路徑和文件 ID,並決定 Claude 是否能看到下載的路徑。

請讓遠端瀏覽器拒絕下載,除非其本身的主機具備限制上傳和下載中的下載設定。

範例驅動程式遵循此規則。在遠端瀏覽器上,它們會針對 file_policy(filePolicy)或已啟用的 file_upload 引發設定錯誤,並將瀏覽器設定為拒絕下載。

請勿讓供應商的 API 金鑰和工作階段的連線 URL(其中可能包含金鑰)出現在日誌、工具結果和錯誤文字中。如果供應商會錄製工作階段,該錄製內容就是 Claude 所看到和輸入的所有內容的另一份副本,且供應商的保留條款適用於它。

參考

建構函式選項在兩個 SDK 中具有相同的意義:

PythonTypeScript設定內容
configsconfigs啟用哪些成員
confirmconfirm核准或拒絕每個呼叫的可呼叫物件
allowed_domains、blocked_domainsallowedDomains、blockedDomains預設 URL 政策的清單
url_policyurlPolicy您自己的 URL 政策
file_policyfilePolicy上傳根目錄和下載路徑公開
tool_configstoolConfigstools 項目的欄位,例如 cache_control
_browser_state 方法browserState狀態報告

建構之後無法變更選項。預設值、錯誤、上下文欄位以及非同步 Python 類別(BetaAsyncAbstractBrowserToolset20260801)的說明,請參閱 Python SDK 和 TypeScript SDK。

限制

  • URL 政策檢查的是導覽,而非每個請求: 請參閱在驅動程式中攔截請求。
  • 核准是根據上次的狀態報告: 頁面可能在該報告之後發生變化。SDK 不會在呼叫執行之前再次檢查頁面。
  • 同一個工具集上的呼叫一次執行一個: 您無法關閉此行為。
  • SDK 不會檢查分頁 ID 是否唯一、是否只有一個分頁處於作用中,或分頁的數量: API 會拒絕違反這些規則的報告。

後續步驟

成員工具、browser_state 區塊,以及該工具的安全性考量。

SDK 如何執行迴圈,以及如何變更它傳送的訊息。

適用於任何讀取不受信任內容之應用程式的防護措施。

Was this page helpful?