120 lines
3.9 KiB
Markdown
120 lines
3.9 KiB
Markdown
# Browser REST API
|
||
|
||
REST API-обертка над `browser-use` RPC (`POST /run` в контейнере браузера).
|
||
|
||
Сервис принимает задачу, ставит ее в in-memory очередь, выполняет через `browser-use` и отдает статус/результат по `task_id`.
|
||
|
||
## Актуальный статус
|
||
|
||
Проверено smoke-тестом:
|
||
- `GET /health` отвечает `200` с `{"ok": true}`
|
||
- `POST /api/browser/tasks` возвращает `202` и `task_id`
|
||
- `GET /api/browser/tasks/{task_id}` возвращает `queued/running/...`
|
||
- `GET /api/browser/tasks/{task_id}/result` возвращает `202`, пока задача не завершена
|
||
|
||
## Архитектура
|
||
|
||
Слои сейчас разделены и выглядят нормально для MVP:
|
||
|
||
- `api/main.py` — точка входа ASGI (`uvicorn api.main:app`), сборка `FastAPI` и lifespan
|
||
- `api/routes/tasks.py` — HTTP-слой (валидация входа/выхода, status codes)
|
||
- `api/services/task_service.py` — orchestration (фоновые задачи, timeout, обработка ошибок)
|
||
- `api/repositories/task_store.py` — in-memory хранилище задач
|
||
- `api/clients/browser_rpc_client.py` — aiohttp-клиент к browser RPC
|
||
- `api/clients/browser_rpc_contracts.py` — protocol + исключения RPC-слоя
|
||
- `api/contracts/task_schemas.py` — Pydantic request/response DTO
|
||
- `api/domain/task_status.py` — доменный enum статусов
|
||
- `api/core/settings.py` — конфигурация из env
|
||
|
||
## Ограничения текущей реализации
|
||
|
||
- хранилище in-memory: после рестарта контейнера задачи теряются
|
||
- нет ретраев RPC при транспортных ошибках
|
||
- нет отмены задач через API
|
||
- один инстанс процесса хранит задачи только локально (без shared state)
|
||
|
||
## Переменные окружения
|
||
|
||
- `BROWSER_API_HOST` (default: `0.0.0.0`)
|
||
- `BROWSER_API_PORT` (default: `8080`)
|
||
- `BROWSER_USE_RPC_URL` (default: `http://browser:8787/run`)
|
||
- `BROWSER_USE_RPC_TIMEOUT` (default: `900`)
|
||
- `BROWSER_API_MAX_CONCURRENCY` (default: `2`)
|
||
|
||
## Локальный запуск
|
||
|
||
```zsh
|
||
cd "/Users/fedorkobylkevic/PycharmProjects/BrowserUse_and_ComputerUse_skills"
|
||
source .venv/bin/activate
|
||
uvicorn api.main:app --host 0.0.0.0 --port 8088
|
||
```
|
||
|
||
## Запуск через Docker Compose
|
||
|
||
```zsh
|
||
cd "/Users/fedorkobylkevic/PycharmProjects/BrowserUse_and_ComputerUse_skills"
|
||
docker compose build browser-api
|
||
docker compose up -d browser browser-api
|
||
docker compose logs -f browser-api
|
||
```
|
||
|
||
## REST API
|
||
|
||
### `GET /health`
|
||
|
||
Проверка доступности API.
|
||
|
||
Пример ответа:
|
||
|
||
```json
|
||
{"ok": true}
|
||
```
|
||
|
||
### `POST /api/browser/tasks`
|
||
|
||
Создать задачу.
|
||
|
||
Request:
|
||
|
||
```json
|
||
{
|
||
"task": "Открой example.com и верни title",
|
||
"timeout": 300,
|
||
"metadata": {"source": "manual"}
|
||
}
|
||
```
|
||
|
||
Response `202`:
|
||
|
||
```json
|
||
{
|
||
"task_id": "53f54fa4c1f24219b3949d56b0457875",
|
||
"status": "queued"
|
||
}
|
||
```
|
||
|
||
### `GET /api/browser/tasks/{task_id}`
|
||
|
||
Текущий статус и таймстемпы.
|
||
|
||
### `GET /api/browser/tasks/{task_id}/result`
|
||
|
||
- `202` если задача еще `queued/running`
|
||
- `200` с финальным payload после завершения
|
||
|
||
## Быстрый end-to-end пример
|
||
|
||
```zsh
|
||
curl -sS http://localhost:8088/health
|
||
|
||
RESP=$(curl -sS -X POST http://localhost:8088/api/browser/tasks \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"task":"Открой example.com и верни title","timeout":30}')
|
||
|
||
echo "$RESP"
|
||
|
||
TASK_ID=$(python -c "import json,sys;print(json.loads(sys.argv[1])['task_id'])" "$RESP")
|
||
|
||
curl -sS "http://localhost:8088/api/browser/tasks/$TASK_ID"
|
||
curl -sS "http://localhost:8088/api/browser/tasks/$TASK_ID/result"
|
||
```
|