Entwicklung
Voraussetzungen
Abschnitt betitelt âVoraussetzungenâ- Linux x86_64 (die Workspace-Auflösung ist auf
sys_platform == 'linux'beschrĂ€nkt, weiltflite-runtimefĂŒr openWakeWord nur dort existiert â siehe Override inpyproject.toml) - uv â„ 0.5, Python 3.12 (uv installiert es bei Bedarf)
- Node 22 fĂŒr das Frontend
- Docker mit Compose v2 fĂŒr den vollstĂ€ndigen Stack und die E2E-Tests
- ffmpeg (nur fĂŒr lokale LĂ€ufe auĂerhalb von Docker)
uv sync --all-packages # Backend, SDK, Sandbox + Dev-Werkzeuge in .venvcd frontend && npm ci # Frontend-AbhĂ€ngigkeitenModelle fĂŒr lokale Audio-Tests und lokalen Betrieb ohne Docker:
uv run python scripts/fetch_models.py ./.modelsexport JUSTAI_TEST_MODELS_DIR=$PWD/.modelsEntwicklungsmodus mit Docker (empfohlen)
Abschnitt betitelt âEntwicklungsmodus mit Docker (empfohlen)âdocker compose -f docker-compose.yml -f docker-compose.dev.yml up --build- Backend, SDK und Plugins werden read-only in den Container gemountet,
JUSTAI_ENV=developmentaktiviert Uvicorn-Reload. - Vite-Dev-Server auf http://localhost:5173 (Proxy auf den Core).
Core lokal ohne Docker
Abschnitt betitelt âCore lokal ohne DockerâBraucht eine erreichbare PostgreSQL mit pgvector und optional go2rtc:
docker run -d --name j5-db -e POSTGRES_USER=justai -e POSTGRES_PASSWORD=dev \ -e POSTGRES_DB=justai -p 5433:5432 pgvector/pgvector:0.8.1-pg17export JUSTAI_ENV=development JUSTAI_LOG_JSON=false \ JUSTAI_DATABASE_URL=postgresql+asyncpg://justai:dev@localhost:5433/justai \ JUSTAI_DATA_DIR=$PWD/.data JUSTAI_MODELS_DIR=$PWD/.models \ JUSTAI_BUILTIN_PLUGINS_DIR=$PWD/plugins JUSTAI_STATIC_DIR=$PWD/frontend/dist \ JUSTAI_SECRET_KEY_FILE=$PWD/.data/master_key JUSTAI_DATABASE_PASSWORD_FILE=/nonexistent \ JUSTAI_GO2RTC_URL=http://localhost:1984 JUSTAI_GO2RTC_RTSP_URL=rtsp://localhost:8554uv run python -m justai.mainAlle Variablen: backend/src/justai/config.py (PrÀfix JUSTAI_).
CodequalitÀt
Abschnitt betitelt âCodequalitĂ€tâuv run ruff check . # Lint (Regeln in pyproject.toml, ZeilenlĂ€nge 120)uv run ruff format --check .(cd backend && uv run mypy src) # strict, mit Pydantic-Plugin(cd sdk/python && uv run mypy src)(cd sandbox && uv run mypy src)cd frontend && npm run lint && npm run typecheckKonventionen:
- Neue AbhĂ€ngigkeiten nur mit BegrĂŒndung (Lockfile wird committet).
- DomÀnenlogik ohne I/O schreiben, wo möglich (z. B.
ptz/tracking.py,audio/arbitration.py,output/router.py), damit sie ohne Infrastruktur testbar ist. - Hintergrund-Tasks nie mit nacktem
asyncio.create_taskstarten, sondern mitjustai.common.tasks.spawnoder demSupervisor. - Code, Kommentare, Logs, Tool-Beschreibungen, Tool-Ergebnisse und Fehlermeldungen sind englisch; das Sprachmodell antwortet in der Sprache des GesprÀchs.
- Texte, die ohne Modell gesprochen oder gespeichert werden, kommen nach
justai/i18n.py(Englisch, Deutsch, Italienisch). - OberflÀchentexte kommen nach
frontend/src/shared/i18n/en.tsund werden inde.tsundit.tsĂŒbersetzt; fehlt ein SchlĂŒssel, bricht der Build. In Komponentenconst t = useT(), auĂerhalbtg(). - Secrets nie loggen:
justai.common.redactfiltert bekannte SchlĂŒssel. Plugin- Secrets deklariert das Manifest insecret_fields.
Datenbankmigrationen
Abschnitt betitelt âDatenbankmigrationenâcd backenduv run alembic revision -m "beschreibung" # Datei in src/justai/db/migrations/versions/Migrationen laufen beim Start des Core automatisch. Jede Migration muss auf einer bestehenden Datenbank funktionieren (kein Neuanlegen von Daten nötig).
Ein neues Fachmodul anlegen
Abschnitt betitelt âEin neues Fachmodul anlegenâ- Paket unter
backend/src/justai/<modul>/mit Service (Logik) undextension.py(start(),stop(),register_tools(registry)). - In
extensions.pyinstanziieren. - API-Routen in
api/routes/ext_<modul>.py, inapi/app.pyregistrieren. - Event-Typen im Katalog (
events/catalog.py) ergĂ€nzen. - Unit-Tests fĂŒr die reine Logik, ggf. E2E-Test.
Ein neues Plugin
Abschnitt betitelt âEin neues PluginâSiehe PLUGINS.md. Kurz: Ordner unter plugins/ mit plugin.yaml
und plugin.py, Tests mit justai_sdk.testing.FakePluginContext.
Siehe TESTING.md.