Spaces:
Paused
Paused
| 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)}" | |
| # === ЭКРАН МОНИТОРА (ЗАЙДИ СЮДА ЧЕРЕЗ БРАУЗЕР) === | |
| async def monitor_page(): | |
| html_content = f""" | |
| <html> | |
| <head> | |
| <title>AI Browser Monitor</title> | |
| <meta http-equiv="refresh" content="3"> <style> | |
| body {{ font-family: sans-serif; background: #111; color: #fff; text-align: center; }} | |
| img {{ border: 2px solid #00ff00; max-width: 90%; height: auto; }} | |
| .status {{ padding: 20px; font-size: 1.2em; color: #00ff00; }} | |
| </style> | |
| </head> | |
| <body> | |
| <h1>📺 Прямой эфир ИИ-Браузера</h1> | |
| <div class="status">Статус: {CURRENT_STATUS}</div> | |
| <p>Если картинки нет — значит браузер сейчас закрыт.</p> | |
| </body> | |
| </html> | |
| """ | |
| return html_content | |
| # === ЭНДПОИНТ ДЛЯ n8n === | |
| 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"} |