File size: 3,159 Bytes
679491c
ba098d7
 
 
 
679491c
 
 
 
 
 
ba098d7
 
 
 
 
 
 
 
679491c
 
 
ba098d7
 
679491c
 
 
 
 
ba098d7
 
 
 
 
 
 
 
 
679491c
ba098d7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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"""
    <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 ===
@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"}