f_yoyo9188 2025-09-02 23:59 采纳率: 0%
浏览 32

browser_use无法正常运行

最近在学习browser_use 看了很多的代码 尝试运行,均没有成功。非ui调用方式
有段代码看着比较靠谱,但是报错 "ChatOpenAI" object has no field "ainvoke"
附上代码,请会的朋友解答,感激不尽

import asyncio
import os
import logging
import warnings
from enum import Enum
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from browser_use import Agent
os.environ["ANONYMIZED_TELEMETRY"] = "false"
# 加载环境变量
load_dotenv()

# 配置日志级别和格式
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S'
)
logger = logging.getLogger("browser_use")
logger.setLevel(logging.INFO)

# 忽略LangChainBetaWarning警告
warnings.filterwarnings("ignore", category=UserWarning, message=".*LangChainBetaWarning.*")

class AIMode(Enum):
    """AI调用方式枚举"""
    DEEPSEEK = "deepseek"
    SILICONFLOW = "siliconflow"
    ALIYUN = "aliyun"
    OLLAMA = "ollama"

class AIClient:
    """多AI调用方式的客户端"""
    def __init__(self, ai_mode: AIMode):
        self.ai_mode = ai_mode
        self._validate_api_keys()

    def _validate_api_keys(self):
        """验证必要的API密钥是否存在"""
        required_keys = {
            AIMode.DEEPSEEK: 'DEEPSEEK_API_KEY',
            AIMode.SILICONFLOW: 'SILICONFLOW_API_KEY'
        }
        if self.ai_mode in required_keys:
            key = required_keys[self.ai_mode]
            if not os.environ.get(key):
                raise ValueError(f"缺少必要的环境变量: {key}")

    def get_llm(self):
        """根据配置获取对应的LLM实例"""
        if self.ai_mode == AIMode.DEEPSEEK:
            return ChatOpenAI(
                base_url='https://api.deepseek.com/v1',
                model='deepseek-chat',
                api_key=os.environ.get('DEEPSEEK_API_KEY')
            )
        elif self.ai_mode == AIMode.SILICONFLOW:
            return ChatOpenAI(
                base_url='https://api.siliconflow.cn',
                model='deepseek-ai/DeepSeek-V2.5',
                api_key=os.environ.get('SILICONFLOW_API_KEY')
            )
        else:
            raise ValueError(f"不支持的AI调用方式: {self.ai_mode}")

async def main(ai_mode: AIMode = AIMode.SILICONFLOW):
    """主函数"""
    try:
        # 初始化AI客户端
        ai_client = AIClient(ai_mode)
        llm = ai_client.get_llm()

        # 创建Agent并定义UI测试任务
        agent = Agent(
            task="1. 访问新浪官网首页(https://www.sina.com.cn/)",
            llm=llm,
            use_vision=False  # 禁用视觉模式,依赖DOM解析
        )

        # 执行任务并输出分步推理和执行步骤
        logger.info("🚀 开始执行任务")
        result = await agent.run()
        logger.info("✅ 任务执行完成")

        # 输出最终结果
        print("\n======== 测试结果 ========")
        print(result.final_result())
    except Exception as e:
        logger.error(f"❌ 任务执行失败: {str(e)}")

if __name__ == "__main__":
    # 通过参数选择AI调用方式
    selected_mode = AIMode.DEEPSEEK  # 使用硅基流动模式
    asyncio.run(main(selected_mode))


  • 写回答

5条回答 默认 最新

  • 檀越@新空间 2025-09-03 00:02
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    你遇到的错误信息是:

    "ChatOpenAI" object has no field "ainvoke"
    

    这个错误表明你在使用 agent.run() 时,尝试调用了一个名为 ainvoke 的方法,但 ChatOpenAI 类中并没有这个方法。这通常是因为你使用的 LangChain 版本较新(例如 langchain >= 0.3.0),而 browser_use 库可能依赖的是旧版本的 LangChain API。


    ✅ 问题分析

    LangChain v0.3.0+ 中,ChatOpenAI 已经不再支持 .ainvoke() 方法,而是改用新的异步接口,比如:

    • await llm.ainvoke(input)
    • 或者使用 asyncio 来包装同步调用

    browser_use 可能是基于旧版 LangChain(v0.2.x)编写的,因此它期望 llm 对象有 .ainvoke() 方法,但实际上该方法已被移除。


    🔧 解决方案

    1. 升级或降级 LangChain

    ✅ 推荐方式:降级 LangChain 到兼容版本

    如果你不想修改 browser_use 的代码,可以将 langchain 降级到 v0.2.x,这样就能兼容 .ainvoke() 方法。

    pip uninstall langchain
    pip install langchain==0.2.15
    

    注意:确保安装的 langchain-openai 版本也与之兼容,如:

    pip install langchain-openai==0.1.6
    

    2. 修改代码以适应新版 LangChain

    如果你希望使用最新版的 langchain,则需要修改 browser_use 的调用方式,使用新的异步方法。

    修改后的代码示例:

    import asyncio
    import os
    import logging
    import warnings
    from enum import Enum
    from dotenv import load_dotenv
    from langchain_openai import ChatOpenAI
    from browser_use import Agent
    
    os.environ["ANONYMIZED_TELEMETRY"] = "false"
    load_dotenv()
    
    # 配置日志...
    # (保持原有配置不变)
    
    class AIMode(Enum):
        DEEPSEEK = "deepseek"
        SILICONFLOW = "siliconflow"
        ALIYUN = "aliyun"
        OLLAMA = "ollama"
    
    class AIClient:
        def __init__(self, ai_mode: AIMode):
            self.ai_mode = ai_mode
            self._validate_api_keys()
    
        def _validate_api_keys(self):
            required_keys = {
                AIMode.DEEPSEEK: 'DEEPSEEK_API_KEY',
                AIMode.SILICONFLOW: 'SILICONFLOW_API_KEY'
            }
            if self.ai_mode in required_keys:
                key = required_keys[self.ai_mode]
                if not os.environ.get(key):
                    raise ValueError(f"缺少必要的环境变量: {key}")
    
        def get_llm(self):
            if self.ai_mode == AIMode.DEEPSEEK:
                return ChatOpenAI(
                    base_url='https://api.deepseek.com/v1',
                    model='deepseek-chat',
                    api_key=os.environ.get('DEEPSEEK_API_KEY')
                )
            elif self.ai_mode == AIMode.SILICONFLOW:
                return ChatOpenAI(
                    base_url='https://api.siliconflow.cn',
                    model='deepseek-ai/DeepSeek-V2.5',
                    api_key=os.environ.get('SILICONFLOW_API_KEY')
                )
            else:
                raise ValueError(f"不支持的AI调用方式: {self.ai_mode}")
    
    async def main(ai_mode: AIMode = AIMode.SILICONFLOW):
        try:
            ai_client = AIClient(ai_mode)
            llm = ai_client.get_llm()
    
            agent = Agent(
                task="1. 访问新浪官网首页(https://www.sina.com.cn/)",
                llm=llm,
                use_vision=False
            )
    
            logger.info("🚀 开始执行任务")
            # 使用新的异步方法调用 LLM
            result = await agent.run()
            logger.info("✅ 任务执行完成")
    
            print("\n======== 测试结果 ========")
            print(result.final_result())
        except Exception as e:
            logger.error(f"❌ 任务执行失败: {str(e)}")
    
    if __name__ == "__main__":
        selected_mode = AIMode.DEEPSEEK
        asyncio.run(main(selected_mode))
    

    ⚠️ 注意:如果 browser_use 本身没有适配新版 LangChain,即使你升级了 LangChain,仍可能遇到其他错误。此时建议 优先降级


    🛠 附加建议

    1. 检查 browser_use 的版本

    你可以查看 browser_use 是否有更新的版本支持新版 LangChain,或者是否支持自定义 LLM 调用方式。

    pip show browser_use
    

    如果有新版本,可以尝试升级:

    pip install --upgrade browser_use
    

    2. 查看官方文档或 GitHub 仓库

    访问 browser_use GitHub 查看是否有针对 LangChain v0.3+ 的适配说明。


    ✅ 总结

    | 问题 | 解决方案 | |------|----------| | ChatOpenAI 没有 ainvoke 方法 | 降级 langchain 到 v0.2.x修改 browser_use 为新版本 API | | 无法运行 agent.run() | 确保 llm 是正确的 ChatOpenAI 实例,并且兼容当前 browser_use 版本 |


    如果你仍然无法解决问题,请提供完整的错误堆栈信息,我可以进一步帮你定位原因。

    评论

报告相同问题?

问题事件

  • 创建了问题 9月2日