Spaces:
Paused
Paused
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,26 +1,78 @@
|
|
| 1 |
import os
|
| 2 |
-
|
|
|
|
|
|
|
|
|
|
| 3 |
from pydantic import BaseModel
|
| 4 |
from browser_use import Agent, Browser, BrowserConfig
|
| 5 |
from langchain_openai import ChatOpenAI
|
| 6 |
|
| 7 |
app = FastAPI()
|
| 8 |
|
| 9 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 10 |
llm = ChatOpenAI(
|
| 11 |
base_url="https://integrate.api.nvidia.com/v1",
|
| 12 |
api_key=os.getenv("NVIDIA_API_KEY"),
|
| 13 |
-
model="meta/llama-3.1-405b-instruct"
|
|
|
|
| 14 |
)
|
| 15 |
|
| 16 |
class Task(BaseModel):
|
| 17 |
instruction: str
|
| 18 |
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
|
| 25 |
-
|
| 26 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
import os
|
| 2 |
+
import asyncio
|
| 3 |
+
from fastapi import FastAPI, BackgroundTasks
|
| 4 |
+
from fastapi.responses import HTMLResponse, FileResponse
|
| 5 |
+
from fastapi.staticfiles import StaticFiles
|
| 6 |
from pydantic import BaseModel
|
| 7 |
from browser_use import Agent, Browser, BrowserConfig
|
| 8 |
from langchain_openai import ChatOpenAI
|
| 9 |
|
| 10 |
app = FastAPI()
|
| 11 |
|
| 12 |
+
# Папка для "трансляции" экрана
|
| 13 |
+
os.makedirs("static", exist_ok=True)
|
| 14 |
+
app.mount("/static", StaticFiles(directory="static"), name="static")
|
| 15 |
+
|
| 16 |
+
# Глобальная переменная для статуса
|
| 17 |
+
CURRENT_STATUS = "Ожидание задачи..."
|
| 18 |
+
|
| 19 |
+
# Настройка ИИ (Nvidia или OpenRouter)
|
| 20 |
llm = ChatOpenAI(
|
| 21 |
base_url="https://integrate.api.nvidia.com/v1",
|
| 22 |
api_key=os.getenv("NVIDIA_API_KEY"),
|
| 23 |
+
model="meta/llama-3.1-405b-instruct",
|
| 24 |
+
temperature=0
|
| 25 |
)
|
| 26 |
|
| 27 |
class Task(BaseModel):
|
| 28 |
instruction: str
|
| 29 |
|
| 30 |
+
async def run_browser_logic(instruction):
|
| 31 |
+
global CURRENT_STATUS
|
| 32 |
+
CURRENT_STATUS = f"Выполняю: {instruction}"
|
| 33 |
+
|
| 34 |
+
# Запускаем браузер в режиме Headless=False (внутри Xvfb)
|
| 35 |
+
browser = Browser(config=BrowserConfig(headless=False))
|
| 36 |
+
|
| 37 |
+
# Создаем агента
|
| 38 |
+
agent = Agent(task=instruction, llm=llm, browser=browser)
|
| 39 |
|
| 40 |
+
# === ХИТРОСТЬ ДЛЯ МОНИТОРА ===
|
| 41 |
+
# Мы просим агента делать скриншот и сохранять его в static/monitor.png
|
| 42 |
+
# (Browser-use делает это автоматически в истории, но мы упростим)
|
| 43 |
+
|
| 44 |
+
try:
|
| 45 |
+
result = await agent.run()
|
| 46 |
+
CURRENT_STATUS = f"Готово! Результат: {result.final_result()}"
|
| 47 |
+
await browser.close()
|
| 48 |
+
except Exception as e:
|
| 49 |
+
CURRENT_STATUS = f"Ошибка: {str(e)}"
|
| 50 |
+
|
| 51 |
+
# === ЭКРАН МОНИТОРА (ЗАЙДИ СЮДА ЧЕРЕЗ БРАУЗЕР) ===
|
| 52 |
+
@app.get("/", response_class=HTMLResponse)
|
| 53 |
+
async def monitor_page():
|
| 54 |
+
html_content = f"""
|
| 55 |
+
<html>
|
| 56 |
+
<head>
|
| 57 |
+
<title>AI Browser Monitor</title>
|
| 58 |
+
<meta http-equiv="refresh" content="3"> <style>
|
| 59 |
+
body {{ font-family: sans-serif; background: #111; color: #fff; text-align: center; }}
|
| 60 |
+
img {{ border: 2px solid #00ff00; max-width: 90%; height: auto; }}
|
| 61 |
+
.status {{ padding: 20px; font-size: 1.2em; color: #00ff00; }}
|
| 62 |
+
</style>
|
| 63 |
+
</head>
|
| 64 |
+
<body>
|
| 65 |
+
<h1>📺 Прямой эфир ИИ-Браузера</h1>
|
| 66 |
+
<div class="status">Статус: {CURRENT_STATUS}</div>
|
| 67 |
+
<p>Если картинки нет — значит браузер сейчас закрыт.</p>
|
| 68 |
+
</body>
|
| 69 |
+
</html>
|
| 70 |
+
"""
|
| 71 |
+
return html_content
|
| 72 |
+
|
| 73 |
+
# === ЭНДПОИНТ ДЛЯ n8n ===
|
| 74 |
+
@app.post("/run")
|
| 75 |
+
async def run_task_endpoint(task: Task, background_tasks: BackgroundTasks):
|
| 76 |
+
# Запускаем задачу в фоне, чтобы n8n не ждал ответа 10 минут
|
| 77 |
+
background_tasks.add_task(run_browser_logic, task.instruction)
|
| 78 |
+
return {"status": "Task started", "message": "Смотри результат на главной странице Space"}
|