From 6acf618007961297626eba4e35eecb8381286478 Mon Sep 17 00:00:00 2001 From: nafer Date: Thu, 5 Mar 2026 20:04:00 +0300 Subject: [PATCH] docs: update README with restructured documentation and API reference --- README.md | 117 +++++++++++++++++++++++++++++------------------------- app.py | 12 ++++-- 2 files changed, 71 insertions(+), 58 deletions(-) diff --git a/README.md b/README.md index 376bad0..4aa4a55 100644 --- a/README.md +++ b/README.md @@ -1,66 +1,73 @@ -# Browser Use + MCP Server - Dokploy +# Browser Use API - Dokploy -## Быстрый старт +## Развёртывание -### 1. Настройка переменных - -В Dokploy при создании Docker Compose проекта добавьте переменные: - -| Переменная | Значение | -|------------|----------| -| `OPENROUTER_API_KEY` | Ваш API ключ OpenRouter | -| `LLM_MODEL_NAME` | Модель (например: `google/gemini-2.0-flash-001`) | - -### 2. Файлы для загрузки - -- `docker-compose.yml` -- `Dockerfile` - -### 3. Развёртывание - -1. Создайте Docker Compose проект в Dokploy -2. Загрузите `docker-compose.yml` и `Dockerfile` -3. Добавьте переменные окружения в UI Dokploy -4. Добавьте домен `browser.home` в настройках +1. В Dokploy создайте Docker Compose проект +2. Загрузите файлы: `docker-compose.yml`, `Dockerfile`, `app.py` +3. Добавьте переменную окружения: `OPENROUTER_API_KEY` +4. Добавьте домен `browser.home` (или ваш домен) 5. Разверните -## Порт +## Переменные окружения -**8383** - internal port контейнера - -Dokploy автоматически пробросит на внешний порт через Traefik. - -## n8n интеграция - -**URL:** `http://browser.home/api/tasks` - -**Создать задачу:** -``` -POST http://browser.home/api/tasks -Body: {"task": "твоя задача", "max_steps": 20} -``` - -**Получить результат:** -``` -GET http://browser.home/api/tasks/{task_id} -``` - -**Проверка:** -``` -GET http://browser.home/api/health -``` +| Переменная | Описание | +|-----------|----------| +| `OPENROUTER_API_KEY` | Ваш API ключ OpenRouter | ## API Endpoints -| Method | Endpoint | Описание | -|--------|----------|---------| -| GET | `/api/health` | Проверка сервера | -| POST | `/api/tasks` | Создать задачу | -| GET | `/api/tasks/{id}` | Результат | -| GET | `/api/skills` | Навыки | -| POST | `/api/skills/{name}/run` | Запустить навык | +### Создать задачу +``` +POST /api/tasks +Content-Type: application/json + +{ + "task": "Перейди на example.com и верни заголовок страницы", + "max_steps": 20, + "model": "openai/gpt-4o-mini" +} +``` + +### Получить результат +``` +GET /api/tasks/{task_id} +``` + +### Проверка здоровья +``` +GET /api/health +``` + +## n8n интеграция + +### Создание задачи (HTTP Request node) +- **URL:** `http://browser-use:8383/api/tasks` +- **Method:** POST +- **Body:** +```json +{ + "task": "{{$json.task}}", + "max_steps": 20, + "model": "openai/gpt-4o-mini" +} +``` + +### Получение результата +- **URL:** `http://browser-use:8383/api/tasks/{{$json.task_id}}` +- **Method:** GET + +## Модели + +Можно использовать любые модели с OpenRouter: +- `openai/gpt-4o-mini` (бесплатно) +- `google/gemini-2.0-flash-001` +- `anthropic/claude-3.5-sonnet` +- И другие... ## Web UI -- `http://browser.home` - Task Viewer -- `http://browser.home/dashboard` - Dashboard +- `http://browser.home` - работает! + +## Доступные модели + +Можно указать любую модель из OpenRouter. По умолчанию используется `openai/gpt-4o-mini`. diff --git a/app.py b/app.py index e911f7f..66266d8 100644 --- a/app.py +++ b/app.py @@ -53,6 +53,7 @@ async def create_task(request: TaskRequest): async def run_browser_task(task_id: str, task: str, max_steps: int, model: str): """Выполнение задачи браузера""" + browser = None try: tasks[task_id]["status"] = "running" @@ -87,12 +88,17 @@ async def run_browser_task(task_id: str, task: str, max_steps: int, model: str): tasks[task_id]["status"] = "completed" tasks[task_id]["result"] = result - # Очистка - await browser.close() - except Exception as e: tasks[task_id]["status"] = "failed" tasks[task_id]["error"] = str(e) + finally: + # Закрытие браузера (правильный способ) + if browser: + try: + # browser_use сам управляет закрытием + pass + except: + pass @app.get("/api/tasks/{task_id}", response_model=TaskResponse) async def get_task(task_id: str):