3
This commit is contained in:
1 parent
dd2279c3f1
commit
de6b43aa25
1 file changed
+31
-34
@@ -86,12 +86,15 @@ async def run_browser_task(task_id: str, task: str, max_steps: int, model: str):
|
|||||||
"""Выполнение задачи браузера"""
|
"""Выполнение задачи браузера"""
|
||||||
browser = None
|
browser = None
|
||||||
try:
|
try:
|
||||||
tasks[task_id]["status"] = "running"
|
if task_id in tasks:
|
||||||
|
tasks[task_id]["status"] = "running"
|
||||||
|
|
||||||
# Настройка LLM через OpenRouter
|
# Настройка LLM через OpenRouter
|
||||||
api_key = os.getenv("OPENROUTER_API_KEY", "")
|
api_key = os.getenv("OPENROUTER_API_KEY", "")
|
||||||
if not 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")
|
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
|
||||||
chrome_exe = None
|
chrome_exe = None
|
||||||
possible_paths = [
|
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/google-chrome",
|
||||||
"/usr/bin/chromium",
|
"/usr/bin/chromium",
|
||||||
"/usr/bin/chromium-browser",
|
"/usr/bin/chromium-browser",
|
||||||
|
"/root/.cache/ms-playwright/chromium-*/chrome-linux64/chrome",
|
||||||
|
"/ms-playwright/*/chrome-linux/chrome",
|
||||||
]
|
]
|
||||||
|
|
||||||
for path_pattern in possible_paths:
|
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")
|
chrome_exe = shutil.which("google-chrome") or shutil.which("chromium") or shutil.which("chromium-browser")
|
||||||
|
|
||||||
if not chrome_exe:
|
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}")
|
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}] Executing command: {' '.join(chrome_cmd)}")
|
||||||
|
|
||||||
# Запускаем процесс
|
# Запускаем процесс
|
||||||
print(f"[{task_id}] Starting Chrome process...")
|
|
||||||
log_file = open(f"/tmp/chrome_{task_id}.log", "w")
|
log_file = open(f"/tmp/chrome_{task_id}.log", "w")
|
||||||
process = subprocess.Popen(
|
process = subprocess.Popen(
|
||||||
chrome_cmd,
|
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 секунд
|
for i in range(30): # Ждем до 30 секунд
|
||||||
await asyncio.sleep(1)
|
await asyncio.sleep(1)
|
||||||
|
|
||||||
# Проверяем порты через python (замена netstat)
|
# Проверка порта
|
||||||
import socket
|
import socket
|
||||||
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
|
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 s.connect_ex(('127.0.0.1', REMOTE_DEBUGGING_PORT)) == 0:
|
||||||
if is_open:
|
print(f"[{task_id}] Port {REMOTE_DEBUGGING_PORT} is OPEN internally!")
|
||||||
print(f"[{task_id}] Port {REMOTE_DEBUGGING_PORT} is OPEN!")
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
response = urllib.request.urlopen(f"{cdp_url}/json/version", timeout=2)
|
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
|
cdp_ready = True
|
||||||
print(f"[{task_id}] CDP is ready at {cdp_url}")
|
print(f"[{task_id}] CDP is ready at {cdp_url}")
|
||||||
break
|
break
|
||||||
except Exception as e:
|
except Exception:
|
||||||
if i % 5 == 0:
|
if i % 5 == 0:
|
||||||
print(f"[{task_id}] Waiting for CDP at {cdp_url}... (attempt {i})")
|
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:
|
if not cdp_ready:
|
||||||
# Читаем весь лог при ошибке
|
|
||||||
with open(f"/tmp/chrome_{task_id}.log", "r") as f:
|
with open(f"/tmp/chrome_{task_id}.log", "r") as f:
|
||||||
chrome_logs = f.read()
|
print(f"[{task_id}] Chrome Logs:\n{f.read()}")
|
||||||
raise RuntimeError(f"Failed to start Chrome or CDP not ready. Chrome Logs:\n{chrome_logs}")
|
if task_id != "startup":
|
||||||
|
raise RuntimeError(f"Failed to start Chrome or CDP not ready after 30s at {cdp_url}")
|
||||||
|
|
||||||
# Подключаемся через CDP
|
# Подключаемся через CDP
|
||||||
from browser_use import BrowserConfig
|
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:
|
else:
|
||||||
# Обычный запуск
|
# Обычный запуск
|
||||||
browser_profile = BrowserProfile(
|
browser_profile = BrowserProfile(
|
||||||
user_data_dir="/app/browser-data",
|
user_data_dir="/app/browser-data/main_profile",
|
||||||
profile_directory="Default",
|
profile_directory="Default",
|
||||||
headless=True,
|
headless=True,
|
||||||
keep_alive=True,
|
keep_alive=True,
|
||||||
)
|
)
|
||||||
browser = Browser(browser_profile=browser_profile)
|
browser = Browser(browser_profile=browser_profile)
|
||||||
|
|
||||||
|
# Если это был просто запуск при старте - выходим
|
||||||
|
if task_id == "startup":
|
||||||
|
print("[startup] Chrome started successfully and ready for connections.")
|
||||||
|
return
|
||||||
|
|
||||||
# Создание агента
|
# Создание агента
|
||||||
agent = Agent(
|
agent = Agent(
|
||||||
task=task,
|
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()
|
result = history.final_result()
|
||||||
|
|
||||||
tasks[task_id]["status"] = "completed"
|
if task_id in tasks:
|
||||||
tasks[task_id]["result"] = result
|
tasks[task_id]["status"] = "completed"
|
||||||
|
tasks[task_id]["result"] = result
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
tasks[task_id]["status"] = "failed"
|
print(f"[{task_id}] Error: {e}")
|
||||||
tasks[task_id]["error"] = str(e)
|
if task_id in tasks:
|
||||||
|
tasks[task_id]["status"] = "failed"
|
||||||
|
tasks[task_id]["error"] = str(e)
|
||||||
finally:
|
finally:
|
||||||
# Закрытие браузера (правильный способ)
|
# Не закрываем браузер
|
||||||
if browser:
|
pass
|
||||||
try:
|
|
||||||
# browser_use сам управляет закрытием
|
|
||||||
pass
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
@app.get("/api/tasks/{task_id}", response_model=TaskResponse)
|
@app.get("/api/tasks/{task_id}", response_model=TaskResponse)
|
||||||
async def get_task(task_id: str):
|
async def get_task(task_id: str):
|
||||||
|
|||||||
Reference in new issue
Block a user