{"record":{"id":"30e721a0cc4fe7c1","repo":"sgl-project/sglang","slug":"unknown-browser-action-recipient","errorCode":null,"errorMessage":"Unknown browser action: {recipient}","messagePattern":"Unknown browser action: (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/entrypoints/harmony_utils.py","lineNumber":277,"sourceCode":"        content = message.content[0]\n        browser_call = orjson.loads(content.text)\n        # TODO: translate to url properly!\n        if recipient == \"browser.search\":\n            action = ActionSearch(\n                query=f\"cursor:{browser_call.get('query', '')}\", type=\"search\"\n            )\n        elif recipient == \"browser.open\":\n            action = ActionOpenPage(\n                url=f\"cursor:{browser_call.get('url', '')}\", type=\"open_page\"\n            )\n        elif recipient == \"browser.find\":\n            action = ActionFind(\n                pattern=browser_call[\"pattern\"],\n                url=f\"cursor:{browser_call.get('url', '')}\",\n                type=\"find\",\n            )\n        else:\n            raise ValueError(f\"Unknown browser action: {recipient}\")\n        web_search_item = ResponseFunctionWebSearch(\n            id=f\"ws_{random_uuid()}\",\n            action=action,\n            status=\"completed\",\n            type=\"web_search_call\",\n        )\n        output_items.append(web_search_item)\n    elif message.channel == \"analysis\":\n        for content in message.content:\n            reasoning_item = ResponseReasoningItem(\n                id=f\"rs_{random_uuid()}\",\n                type=\"reasoning\",\n                summary=[],\n                content=[\n                    ResponseReasoningTextContent(\n                        text=content.text, type=\"reasoning_text\"\n                    )\n                ],","sourceCodeStart":259,"sourceCodeEnd":295,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/entrypoints/harmony_utils.py#L259-L295","documentation":"The recipient string starts with 'browser.' but is not one of the recognized browser actions (browser.search, browser.find/open as handled above), so parse_output_message cannot map it to an ActionSearch/ActionFind and rejects it.","triggerScenarios":"A message with recipient 'browser.click', 'browser.navigate', or any 'browser.<anything>' outside the supported action set reaching the parsing stage.","commonSituations":"Prompting the model to use browser tools the runtime doesn't implement; a new browser action added to the tool schema without a corresponding parser branch; model hallucinating tool names.","solutions":["Restrict the advertised browser tools to browser.search/browser.find so the model only emits supported recipients","Add a parser branch in harmony_utils.py for the new browser action if you genuinely need it","Sanitize/normalize unknown browser.* recipients to a supported action or drop the message before parsing"],"exampleFix":"# before\nmsg.with_recipient(\"browser.click\")\n# after\nmsg.with_recipient(\"browser.search\")  # only supported browser actions","handlingStrategy":"validation","validationCode":"SUPPORTED_BROWSER_ACTIONS = {\"browser.search\", \"browser.find\", \"browser.open\"}\nif message.recipient in {None} | SUPPORTED_BROWSER_ACTIONS or not message.recipient.startswith(\"browser.\"):\n    ...  # proceed","typeGuard":"def is_supported_browser_action(recipient: str) -> bool:\n    return not recipient.startswith(\"browser.\") or recipient in {\"browser.search\", \"browser.find\", \"browser.open\"}","tryCatchPattern":"try:\n    items = parse_output_message(message)\nexcept ValueError as e:\n    if \"Unknown browser action\" in str(e):\n        return []  # ignore unsupported action\n    raise","preventionTips":["Only advertise browser.search/browser.find in tool definitions","Keep tool schema and parser branches in sync when adding browser actions"],"tags":["harmony","browser-tool","unknown-action","sglang"],"backgroundTag":"unknown-tool-action","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}