From 3963fe5f6b49393e6142516d8db1873ac57c0451 Mon Sep 17 00:00:00 2001 From: QinRui Date: Tue, 9 Jun 2026 18:44:51 +0800 Subject: [PATCH] fix(agentbay): use Pydantic RootModel[Any] for browser extract schema to resolve SDK type object dict has no attribute model_json_schema --- backend/app/services/agentbay_client.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/backend/app/services/agentbay_client.py b/backend/app/services/agentbay_client.py index dc66dabb9..fdfcd76f2 100644 --- a/backend/app/services/agentbay_client.py +++ b/backend/app/services/agentbay_client.py @@ -8,8 +8,14 @@ import uuid from dataclasses import dataclass from datetime import datetime, timedelta -from typing import Optional +from typing import Any, Optional from loguru import logger +from pydantic import RootModel + + +class GenericExtractSchema(RootModel[Any]): + pass + from agentbay import AgentBay, CreateSessionParams from app.core.logging_config import _disable_agentbay_logger_override, configure_logging @@ -268,15 +274,18 @@ async def browser_extract(self, instruction: str, selector: str = "") -> dict: await asyncio.sleep(3) from agentbay._common.models.browser_operator import ExtractOptions - # Use a generic dict schema since we cannot define a Pydantic model at runtime + # Use a generic RootModel schema since we cannot define a custom Pydantic model at runtime options = ExtractOptions( instruction=instruction, - schema=dict, + schema=GenericExtractSchema, selector=selector or None, ) success, data = await asyncio.to_thread( self._session.browser.operator.extract, options ) + if success and data: + if hasattr(data, "model_dump"): + data = data.model_dump() return {"success": success, "data": data} async def browser_observe(self, instruction: str, selector: str = "") -> dict: