diff --git a/app.py b/app.py index a007288..7abfc6b 100644 --- a/app.py +++ b/app.py @@ -86,12 +86,15 @@ async def run_browser_task(task_id: str, task: str, max_steps: int, model: str): """Выполнение задачи браузера""" browser = None try: - tasks[task_id]["status"] = "running" + if task_id in tasks: + tasks[task_id]["status"] = "running" # Настройка LLM через OpenRouter api_key = os.getenv("OPENROUTER_API_KEY", "") if not api_key: - raise ValueError("OPENROUTER_API_KEY not set") + if task_id != "startup": + raise ValueError("OPENROUTER_API_KEY not set") + api_key = "dummy" # Читаем модель из переменной окружения в момент выполнения actual_model = model if model else os.getenv("LLM_MODEL_NAME", "openai/gpt-4o-mini") @@ -128,12 +131,11 @@ async def run_browser_task(task_id: str, task: str, max_steps: int, model: str): # Список возможных путей к Chrome chrome_exe = None possible_paths = [ - "/root/.cache/ms-playwright/chromium-1208/chrome-linux64/chrome", - "/root/.cache/ms-playwright/chromium-*/chrome-linux64/chrome", - "/ms-playwright/*/chrome-linux/chrome", "/usr/bin/google-chrome", "/usr/bin/chromium", "/usr/bin/chromium-browser", + "/root/.cache/ms-playwright/chromium-*/chrome-linux64/chrome", + "/ms-playwright/*/chrome-linux/chrome", ] for path_pattern in possible_paths: @@ -147,7 +149,8 @@ async def run_browser_task(task_id: str, task: str, max_steps: int, model: str): chrome_exe = shutil.which("google-chrome") or shutil.which("chromium") or shutil.which("chromium-browser") if not chrome_exe: - raise RuntimeError(f"Chrome not found. Please ensure playwright browsers are installed.") + # В образе Playwright путь обычно такой: + chrome_exe = "/usr/bin/google-chrome" print(f"[{task_id}] Using Chrome executable: {chrome_exe}") @@ -175,7 +178,6 @@ async def run_browser_task(task_id: str, task: str, max_steps: int, model: str): print(f"[{task_id}] Executing command: {' '.join(chrome_cmd)}") # Запускаем процесс - print(f"[{task_id}] Starting Chrome process...") log_file = open(f"/tmp/chrome_{task_id}.log", "w") process = subprocess.Popen( chrome_cmd, @@ -189,12 +191,11 @@ async def run_browser_task(task_id: str, task: str, max_steps: int, model: str): for i in range(30): # Ждем до 30 секунд await asyncio.sleep(1) - # Проверяем порты через python (замена netstat) + # Проверка порта import socket with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: - is_open = s.connect_ex(('127.0.0.1', REMOTE_DEBUGGING_PORT)) == 0 - if is_open: - print(f"[{task_id}] Port {REMOTE_DEBUGGING_PORT} is OPEN!") + if s.connect_ex(('127.0.0.1', REMOTE_DEBUGGING_PORT)) == 0: + print(f"[{task_id}] Port {REMOTE_DEBUGGING_PORT} is OPEN internally!") try: response = urllib.request.urlopen(f"{cdp_url}/json/version", timeout=2) @@ -202,22 +203,15 @@ async def run_browser_task(task_id: str, task: str, max_steps: int, model: str): cdp_ready = True print(f"[{task_id}] CDP is ready at {cdp_url}") break - except Exception as e: + except Exception: if i % 5 == 0: print(f"[{task_id}] Waiting for CDP at {cdp_url}... (attempt {i})") - # Читаем последние строки лога Chrome - try: - with open(f"/tmp/chrome_{task_id}.log", "r") as f: - lines = f.readlines()[-5:] - print(f"[{task_id}] Last Chrome logs: {''.join(lines)}") - except: - pass if not cdp_ready: - # Читаем весь лог при ошибке with open(f"/tmp/chrome_{task_id}.log", "r") as f: - chrome_logs = f.read() - raise RuntimeError(f"Failed to start Chrome or CDP not ready. Chrome Logs:\n{chrome_logs}") + print(f"[{task_id}] Chrome Logs:\n{f.read()}") + if task_id != "startup": + raise RuntimeError(f"Failed to start Chrome or CDP not ready after 30s at {cdp_url}") # Подключаемся через CDP from browser_use import BrowserConfig @@ -225,13 +219,18 @@ async def run_browser_task(task_id: str, task: str, max_steps: int, model: str): else: # Обычный запуск browser_profile = BrowserProfile( - user_data_dir="/app/browser-data", + user_data_dir="/app/browser-data/main_profile", profile_directory="Default", headless=True, keep_alive=True, ) browser = Browser(browser_profile=browser_profile) + # Если это был просто запуск при старте - выходим + if task_id == "startup": + print("[startup] Chrome started successfully and ready for connections.") + return + # Создание агента agent = Agent( task=task, @@ -245,20 +244,18 @@ async def run_browser_task(task_id: str, task: str, max_steps: int, model: str): # Получение результата result = history.final_result() - tasks[task_id]["status"] = "completed" - tasks[task_id]["result"] = result + if task_id in tasks: + tasks[task_id]["status"] = "completed" + tasks[task_id]["result"] = result except Exception as e: - tasks[task_id]["status"] = "failed" - tasks[task_id]["error"] = str(e) + print(f"[{task_id}] Error: {e}") + if task_id in tasks: + tasks[task_id]["status"] = "failed" + tasks[task_id]["error"] = str(e) finally: - # Закрытие браузера (правильный способ) - if browser: - try: - # browser_use сам управляет закрытием - pass - except: - pass + # Не закрываем браузер + pass @app.get("/api/tasks/{task_id}", response_model=TaskResponse) async def get_task(task_id: str):