sgl-project/sglang · error · ValueError
Unknown browser action: {recipient}
Error message
Unknown browser action: {recipient} What it means
SGLang's browser tool dispatcher received a recipient starting with 'browser.' that is not one of the supported actions (browser.search, browser.open, browser.find). This indicates an unrecognized or misspelled browser action name.
Source
Thrown at python/sglang/srt/entrypoints/tool.py:87
if recipient == "browser.search":
query = args.get("query")
if not query:
raise ValueError("browser.search requires a query")
data = await self.exa_client.search(query)
return self._format_search_results(context, query, data)
if recipient == "browser.open":
url = self._resolve_url(context, args)
data = await self.exa_client.contents([url])
return self._format_page_contents(context, url, data)
if recipient == "browser.find":
pattern = args.get("pattern")
if not pattern:
raise ValueError("browser.find requires a pattern")
return await self._find_pattern(context, args, pattern)
raise ValueError(f"Unknown browser action: {recipient}")
def _browser_state(self, context: "ConversationContext") -> dict[str, Any]:
state = getattr(context, "_sglang_exa_browser_state", None)
if state is None:
state = {"pages": {}, "page_text": {}}
setattr(context, "_sglang_exa_browser_state", state)
return state
def _format_search_results(
self, context: "ConversationContext", query: str, data: dict[str, Any]
) -> str:
state = self._browser_state(context)
state["pages"] = {}
state["page_text"] = {}
results = data.get("results") or []
request_id = data.get("requestId")
if request_id:View on GitHub (pinned to 0132848349)
Solutions
- Check the exact recipient string against the supported set: browser.search/browser.open/browser.find
- Upgrade SGLang if a newer browser action is required and supported in a later release
- Re-prompt the model to use one of the supported actions
Example fix
# before
recipient = "browser.navigate"
# after
recipient = "browser.open" # with {"url": "..."} Defensive patterns
Strategy: fallback
Validate before calling
SUPPORTED = {"browser.search", "browser.open", "browser.find"}
recipient = last_msg.recipient
assert recipient in SUPPORTED, f"unsupported browser action: {recipient}" Type guard
def is_supported_browser_action(recipient: str) -> bool:
return recipient in {"browser.search", "browser.open", "browser.find"} Try / catch
try:
out = await tool._dispatch_browser_call(context, recipient, args)
except ValueError as e:
if str(e).startswith("Unknown browser action"):
out = await tool._dispatch_browser_call(context, "browser.search", {"query": str(args)}) Prevention
- Keep the model-visible tool list in sync with the dispatcher's supported actions
- Log unknown recipients to detect schema drift early
When it happens
Trigger: Dispatching e.g. 'browser.navigate', 'browser.click', or 'browser.Search' (wrong case) through get_result or run_tool_flow.
Common situations: Model hallucinating an unlisted browser action, a typo in a manually crafted tool call, or newer model tool schemas advertising actions this SGLang version does not implement (version mismatch after upgrade).
Related errors
- No browser tool call found
- browser.search requires a query
- browser.find requires a pattern
- browser.open requires a cursor or url
- Unknown browser cursor: {cursor}
AI-assisted analysis of sgl-project/sglang@0132848349 (2026-08-28).
Data as JSON: /api/errors/92a240b48c8bfa96.
Report an issue: GitHub.