This repository contains an AI-powered QA platform with:
- A Python/FastAPI backend that orchestrates LLM-guided QA runs and executes QA tools.
- A Next.js frontend that submits scans and renders detailed reports.
- A modular tool + provider architecture with mistral model as core engine.
For architecture details, see architecture.md.
Given a target URL, the system can run an autonomous QA mission that checks:
- Functional behavior (links, forms, button/action patterns, auth/session flows)
- UX and accessibility risk signals
- Performance metrics
- Security headers, SSL, and content risks
- Browser network/console evidence
It returns:
- Structured issues (severity, category, reproducible steps)
- Tool outputs and execution trace
- Screenshots (served by backend)
- Raw model output for auditability
Backend:
- Python 3.11+
- FastAPI + Uvicorn
- Playwright
- Pydantic / pydantic-settings
- LLM providers: Mistral, Hugging Face
Frontend:
- Next.js 15 (App Router)
- React 18
- TypeScript
- Tailwind CSS
- TanStack Query
.
|-- engine/ # Core orchestration, providers, tools, prompts
| |-- core/ # Agent loop + parsing + typed results
| |-- providers/ # LLM provider abstraction + implementations
| |-- prompts/ # System/user prompt builders
| |-- tools/ # QA tool implementations
|-- server/ # FastAPI app, schemas, service wiring
|-- web/ # Next.js frontend
|-- artifacts/screenshots/ # Runtime screenshot artifacts (served by backend)
|-- tests/ # Backend and tool tests
|-- .env.example # Environment template
|-- requirements.txt
|-- pyproject.toml
- Python 3.11+
- Node.js 18+
- npm or yarn
- Playwright browser binaries
Create .env from .env.example:
APP_ENV=local
PROVIDER_NAME=mistral
PROVIDER_MODEL=mistral-large-latest
PROVIDER_API_KEY=your_provider_key
API_AUTH_SECRET=replace_with_long_random_secretBackend reads these via server/config.py.
Frontend environment variables (web/.env):
NEXT_PUBLIC_QA_API_URL=http://localhost:8000/api/qa
NEXT_PUBLIC_QA_API_KEY=replace_with_same_api_auth_secretImportant:
NEXT_PUBLIC_QA_API_KEYmust match backendAPI_AUTH_SECRET.- If
PROVIDER_API_KEYis missing, backend QA execution fails by design.
From repository root:
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txt
python -m playwright install chromium
uvicorn server.main:app --reload --host 0.0.0.0 --port 8000Backend endpoints:
- Root health:
GET / - QA endpoint:
POST /api/qa - Screenshots static path:
/screenshots/* - OpenAPI docs (non-production):
/docs
From repository root:
cd web
npm install
npm run devDefault frontend URL: http://localhost:3000
- User submits a scan from
/qapage (target URL + device/network/tool selections). - Frontend calls backend
POST /api/qawith API key header. - Backend normalizes URL and creates
QATask. Engineinitializes provider + Playwright-backed/static tools.QAOrchestratorruns model-tool loop:- model proposes tool calls
- tools execute and return structured payloads
- tool outputs feed back into model context
- Model emits final JSON issues payload.
- Backend serializes tool outputs and persists base64 screenshots to
artifacts/screenshots. - Backend returns issues + trace + screenshot URLs.
- Frontend adapts backend response into report model and renders
/qa/results.
Backend checks:
ruff check .
mypy .
pytest -qFrontend checks:
cd web
npm run typecheck
npm run lintAdd a new tool:
- Implement class extending
BaseTool. - Register it in
engine/tools/maps.py. - Add request schema key in
server/schemas.py(ToolKeyliteral). - Expose selection in frontend type
web/types/scan.ts. - Add tests under
tests/.
Add a new provider:
- Implement
BaseLLMProvider. - Register in
ProviderRegistry. - Set
PROVIDER_NAMEandPROVIDER_MODELin environment.
- Docker Desktop running
- Docker Compose v2 (
docker compose)
Create/update root .env:
APP_ENV=local
PROVIDER_NAME=mistral
PROVIDER_MODEL=mistral-large-latest
PROVIDER_API_KEY=your_real_provider_key
API_AUTH_SECRET=local-dev-auth-secret-change-me
NEXT_PUBLIC_QA_API_URL=http://localhost:8000/api/qaNotes:
- Frontend API key is auto-wired from
API_AUTH_SECRETindocker-compose.yml. NEXT_PUBLIC_*variables are build-time values for Next.js.
From repository root:
docker compose up --buildServices:
- Frontend:
http://localhost:3000 - Backend:
http://localhost:8000 - API docs:
http://localhost:8000/docs(non-production)
docker compose downdocker compose logs -fIf you change any NEXT_PUBLIC_* values:
docker compose up --buildIf build appears stuck for several minutes on provenance metadata:
$env:BUILDX_NO_DEFAULT_ATTESTATIONS="1"
docker compose build --progress=plain
docker compose upAlso note:
- First backend image pull is large (Playwright base image), so first run can be slow.
- If needed, pre-pull once:
docker pull mcr.microsoft.com/playwright/python:v1.58.0-jammy.