Development
Run the tests, build the UI and contribute.
python -m venv .venv && .venv/bin/pip install --require-hashes --no-deps -r backend/requirements.lock && .venv/bin/pip install -r backend/requirements-dev.txt # test tools (pytest, moto)
docker run -d --name curltale-testdb -e POSTGRES_PASSWORD=dev -p 127.0.0.1:55432:5432 pgvector/pgvector:0.8.7-pg16-bookworm
export TEST_DATABASE_URL=postgresql://postgres:[email protected]:55432/postgres # any PostgreSQL superuser on a server with pgvector
cd backend && ../.venv/bin/python -m pytest -q tests # creates and drops its own throwaway databases; never calls an AI model or the network
cd frontend && npm ci && npx vite build # the UI (React)
CI (.github/workflows/ci.yml) runs the suite at two embedding sizes (768, and 3000 for the halfvec path), builds the UI and both images, and audits the dependencies. See CONTRIBUTING.md and SECURITY.md. The tests run on a fictional model of a subscription business, backend/tests/fixtures/sample_model.py, read through the product's own Excel format; it covers every concept the ontology supports (supertypes, hierarchies, optional and unreliable links, masked and restricted fields, filters, checks, calculated fields, examples). backend/devtools/ has two checks that use it: python -m devtools.evalcli (search quality on tests/retrieval_cases.yaml) and python -m devtools.agenteval (Alfred's answers to multi-entity questions against hand-written SQL; calls the chat model), and devtools/libraryeval.py (run inside a running instance's container: builds two throw-away collections, one public and one internal, from fictional documents, asks Alfred seven questions including a customer reply that must not quote the internal playbook, and deletes them; calls the chat model).
Dependencies: backend/requirements.in lists the direct ones; requirements.lock (exact versions with hashes) is generated with pip-compile --generate-hashes --allow-unsafe -o requirements.lock requirements.in. Run scripts/audit.sh after any change.