2025, Oct 04 23:16

Как исправить ошибку Expected type 'BaseChatModel' при связке Browser Use Agent с Gemini

Как исправить ошибку Expected type 'BaseChatModel' при подключении Gemini к Browser Use Agent: используйте ChatGoogle вместо ChatGoogleGenerativeAI в Python.

Исправляем ошибку «Expected type 'BaseChatModel'» при подключении Browser Use Agent к Gemini

Создать агента для автоматизации UI‑тестов на базе ИИ должно быть несложно, однако из‑за небольшой несовместимости библиотек настройка часто срывается. Типичная проблема — попытка передать в Browser Use Agent клиент Google Gemini из экосистемы LangChain, что заканчивается ошибкой типов. Ниже — минимальный пример и понятное решение, которое приводит конфигурацию в рабочее состояние.

Исходные условия

Среда: Python 3.1x c PyCharm; установлены browser-use, pydantic, langchain и google-generative-ai. Агент инициализируется экземпляром LLM на базе Gemini:

from browser_use.agent.service import Agent
from langchain_google_genai import ChatGoogleGenerativeAI

async def run_ui_check():
    scenario = (
        'I am a UI automation UI tester validating this task'
        'Open the website https://www.google.com'
    )
    genai_client = ChatGoogleGenerativeAI(model='', api_key='')
    Agent(scenario, genai_client)

Это приводит к исключению:

Expected type 'BaseChatModel', got 'ChatGoogleGenerativeAI' instead

Почему так происходит

Browser Use поставляется с собственным интерфейсом для LLM и набором поддерживаемых моделей. Agent ожидает объект, соответствующий его внутреннему контракту BaseChatModel. Адаптер LangChain ChatGoogleGenerativeAI не относится к типам, которые агент умеет принимать, поэтому во время выполнения возникает ошибка несоответствия типов. Проще говоря, вы передаёте агенту клиент из другой абстракции, чем та, с которой он работает.

Решение

Для Google Gemini используйте интеграцию LLM, которую предоставляет сам Browser Use. В библиотеке есть класс ChatGoogle, полностью соответствующий ожиданиям агента. Замените клиент из LangChain на этот адаптер и передайте его агенту. Выбор модели выполняйте так, как описано в документации Browser Use для поддержки Gemini.

from browser_use.agent.service import Agent
from browser_use.llm import ChatGoogle

async def run_ui_check():
    scenario = (
        'I am a UI automation UI tester validating this task'
        'Open the website https://www.google.com'
    )
    llm_adapter = ChatGoogle(model='gemini-2.0-flash-exp')
    Agent(scenario, llm_adapter)

Так агент получает совместимую реализацию LLM, и ошибка типов исчезает.

Зачем это важно

Экосистемы инструментов ИИ быстро меняются, и разные фреймворки оборачивают модели своими интерфейсами. Смешивание адаптеров из разных экосистем может выглядеть корректно на уровне импортов, но падать во время выполнения из‑за различий в ожиданиях. Понимание, какой LLM‑обёртке фреймворк даёт родную поддержку, экономит время, избавляет от хрупкого «клеевого» кода и делает поведение предсказуемым.

Выводы

При работе с Browser Use связывайте агент с тем классом LLM, который библиотека поддерживает напрямую. Для Google Gemini создавайте экземпляр ChatGoogle из Browser Use и задавайте нужную модель. Если сталкиваетесь с несоответствием типов, проверьте, что объект LLM взят из интеграции Browser Use, а не из другого SDK. Последовательность в абстракциях — самый простой способ получить стабильного агента автоматизации.

Статья основана на вопросе со StackOverflow от user12730187 и ответе Selcuk.