morikotikk commited on
Commit
ba098d7
·
verified ·
1 Parent(s): 5dbeb43

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +62 -10
app.py CHANGED
@@ -1,26 +1,78 @@
1
  import os
2
- from fastapi import FastAPI
 
 
 
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
- # Используем Nvidia или OpenRouter (через OpenAI адаптер)
 
 
 
 
 
 
 
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
- @app.post("/run")
20
- async def run_task(task: Task):
21
- # Настройка браузера для работы с виртуальным дисплеем
22
- browser = Browser(config=BrowserConfig(headless=False))
23
- agent = Agent(task=task.instruction, llm=llm, browser=browser)
 
 
 
 
24
 
25
- result = await agent.run()
26
- return {"result": result.final_result()}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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"}