From c064784c9f96b5a15e355348f895e668843d7841 Mon Sep 17 00:00:00 2001 From: Artem Timoshenko Date: Wed, 22 Apr 2026 00:31:19 +0300 Subject: [PATCH] fix: merged with develop and resolved conflicts --- hermes_code/tools/browser_use_tool.py | 96 +++++++++++++-------------- 1 file changed, 45 insertions(+), 51 deletions(-) diff --git a/hermes_code/tools/browser_use_tool.py b/hermes_code/tools/browser_use_tool.py index 143f0ddb..9a4a8885 100644 --- a/hermes_code/tools/browser_use_tool.py +++ b/hermes_code/tools/browser_use_tool.py @@ -1,14 +1,8 @@ import json import os -import asyncio -import socket -import logging -from telegram import Bot -from telegram.constants import ParseMode -from browser_use import Agent, Browser, ChatOpenAI +from urllib import error, request from tools.registry import registry - logger = logging.getLogger("hermes.browser_use_tool") @@ -17,9 +11,9 @@ def get_chat_id(honcho_session_key: str) -> str: logger.warning("нет honcho_session_key") return None - if ':' in honcho_session_key: + if ":" in honcho_session_key: logger.info("получен honcho_session_key") - return honcho_session_key.split(':')[-1] + return honcho_session_key.split(":")[-1] logger.warning("нет honcho_session_key") return None @@ -52,7 +46,10 @@ async def notify_user_vnc(honcho_session_key: str, vnc_url: str): logger.warning(f"Ошибка при отправке уведомления в Telegram: {str(e)}") -async def run_browser_task(task: str, honcho_session_key: str): +async def run_browser_task(task: str, honcho_session_key: str = None): + if not task or not str(task).strip(): + return json.dumps({"success": False, "error": "Task is required"}, ensure_ascii=False) + browser_host = "browser" browser_port = 9222 vnc_url = os.getenv("BROWSER_VIEW_URL", "") @@ -66,50 +63,47 @@ async def run_browser_task(task: str, honcho_session_key: str): except Exception: cdp_url = f"http://{browser_host}:{browser_port}" - browser = Browser(cdp_url=cdp_url) - - # Для подключения к Chrome на виртуальной машине раскомментируй - # browser = Browser( - # executable_path="/usr/bin/google-chrome", # Linux - # # Windows: "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe" - # # macOS: "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" - # ) - # или - # browser = Browser.from_system_chrome() для автоопределения - - llm = ChatOpenAI( - model=os.getenv("MODEL_DEFAULT", "qwen3.5-122b"), - api_key=os.getenv("OPENAI_API_KEY"), - base_url=os.getenv("OPENAI_BASE_URL"), - temperature=0.0, - ) - - agent = Agent( - task=task, - llm=llm, - browser=browser, - use_vision=False - ) + rpc_url = os.getenv("BROWSER_USE_RPC_URL", "http://browser:8787/run") + timeout_sec = int(os.getenv("BROWSER_USE_RPC_TIMEOUT", "900")) + payload = json.dumps({"task": task}).encode("utf-8") + req = request.Request(rpc_url, data=payload, headers={"Content-Type": "application/json"}, method="POST") try: - history = await agent.run() - final_result = history.final_result() + def _do_rpc(): + with request.urlopen(req, timeout=timeout_sec) as resp: + return resp.read().decode("utf-8") + + body = await asyncio.to_thread(_do_rpc) + + try: + resp_json = json.loads(body) + if isinstance(resp_json, dict): + if "vnc_url" not in resp_json: + resp_json["vnc_url"] = vnc_url + return json.dumps(resp_json, ensure_ascii=False) + except: + pass + + return body - return json.dumps({ - "success": True, - "result": final_result, - "vnc_url": vnc_url - }, ensure_ascii=False) - - except Exception as e: - return json.dumps({ - "success": False, - "error": f"Browser automation failed: {str(e)}" - }, ensure_ascii=False) - - finally: - if browser: - await browser.stop() + except error.HTTPError as http_err: + body = http_err.read().decode("utf-8", errors="replace") + return json.dumps( + { + "success": False, + "error": f"browser-use RPC returned HTTP {http_err.code}", + "details": body, + }, + ensure_ascii=False, + ) + except Exception as err: + return json.dumps( + { + "success": False, + "error": f"browser-use RPC request failed: {err}", + }, + ensure_ascii=False, + ) registry.register(