import os import asyncio from fastapi import FastAPI, BackgroundTasks from fastapi.responses import HTMLResponse, FileResponse from fastapi.staticfiles import StaticFiles from pydantic import BaseModel from browser_use import Agent, Browser, BrowserConfig from langchain_openai import ChatOpenAI app = FastAPI() # Папка для "трансляции" экрана os.makedirs("static", exist_ok=True) app.mount("/static", StaticFiles(directory="static"), name="static") # Глобальная переменная для статуса CURRENT_STATUS = "Ожидание задачи..." # Настройка ИИ (Nvidia или OpenRouter) llm = ChatOpenAI( base_url="https://integrate.api.nvidia.com/v1", api_key=os.getenv("NVIDIA_API_KEY"), model="meta/llama-3.1-405b-instruct", temperature=0 ) class Task(BaseModel): instruction: str async def run_browser_logic(instruction): global CURRENT_STATUS CURRENT_STATUS = f"Выполняю: {instruction}" # Запускаем браузер в режиме Headless=False (внутри Xvfb) browser = Browser(config=BrowserConfig(headless=False)) # Создаем агента agent = Agent(task=instruction, llm=llm, browser=browser) # === ХИТРОСТЬ ДЛЯ МОНИТОРА === # Мы просим агента делать скриншот и сохранять его в static/monitor.png # (Browser-use делает это автоматически в истории, но мы упростим) try: result = await agent.run() CURRENT_STATUS = f"Готово! Результат: {result.final_result()}" await browser.close() except Exception as e: CURRENT_STATUS = f"Ошибка: {str(e)}" # === ЭКРАН МОНИТОРА (ЗАЙДИ СЮДА ЧЕРЕЗ БРАУЗЕР) === @app.get("/", response_class=HTMLResponse) async def monitor_page(): html_content = f"""
Если картинки нет — значит браузер сейчас закрыт.
""" return html_content # === ЭНДПОИНТ ДЛЯ n8n === @app.post("/run") async def run_task_endpoint(task: Task, background_tasks: BackgroundTasks): # Запускаем задачу в фоне, чтобы n8n не ждал ответа 10 минут background_tasks.add_task(run_browser_logic, task.instruction) return {"status": "Task started", "message": "Смотри результат на главной странице Space"}