BrowserUse_and_ComputerUse_.../api
2026-04-07 22:49:06 +03:00
..
clients change architecture and swap from httpx to aiohttp 2026-04-07 22:49:06 +03:00
contracts change architecture and swap from httpx to aiohttp 2026-04-07 22:49:06 +03:00
core change architecture and swap from httpx to aiohttp 2026-04-07 22:49:06 +03:00
domain change architecture and swap from httpx to aiohttp 2026-04-07 22:49:06 +03:00
repositories change architecture and swap from httpx to aiohttp 2026-04-07 22:49:06 +03:00
routes change architecture and swap from httpx to aiohttp 2026-04-07 22:49:06 +03:00
services change architecture and swap from httpx to aiohttp 2026-04-07 22:49:06 +03:00
Dockerfile add api for post browser-use tasks 2026-04-07 22:01:53 +03:00
main.py add api for post browser-use tasks 2026-04-07 22:01:53 +03:00
README.md change architecture and swap from httpx to aiohttp 2026-04-07 22:49:06 +03:00
requirements.txt change architecture and swap from httpx to aiohttp 2026-04-07 22:49:06 +03:00

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)

Локальный запуск

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

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.

Пример ответа:

{"ok": true}

POST /api/browser/tasks

Создать задачу.

Request:

{
  "task": "Открой example.com и верни title",
  "timeout": 300,
  "metadata": {"source": "manual"}
}

Response 202:

{
  "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 пример

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"