# Übergabe-API v1 Die API erstellt interne Case-Pakete und veröffentlicht sie atomar in der Inbox. Externe Programme liefern Metadaten und Dateien; sie erzeugen und bearbeiten keine internen Manifeste. Die API führt keine Analyse und keine LLM-Aufrufe aus. Ein dauerhaft laufender [Analyseworker](analysis-worker.md) übernimmt anschließend die Aufnahme und Verarbeitung. Die [Weboberfläche](web-console.md) bietet Übersicht, Auftragsübergabe, Testerantworten und Ergebnisdownloads. ## Lokaler Start ```powershell .\.venv\Scripts\python.exe -m pip install -e '.[api]' Copy-Item config/api.example.toml config/api.local.toml $env:VBA_INTAKE_TOKEN = [Convert]::ToHexString([System.Security.Cryptography.RandomNumberGenerator]::GetBytes(32)) .\.venv\Scripts\python.exe -m viano_bug_analysis.api check --config config/api.local.toml .\.venv\Scripts\python.exe -m viano_bug_analysis.api serve --config config/api.local.toml ``` Der API-Token ist ein eigener Zugangsschlüssel, kein Gemini-Key. Programme erhalten vorzugsweise einen Schlüssel aus der [Web-Schlüsselverwaltung](integration-keys.md). Alternativ bleiben Clients mit Token aus einer serverseitigen Umgebungsvariable unterstützt; der Beispielstart oben zeigt diese Variante. Der Token benötigt 32–256 Zeichen aus `A-Z a-z 0-9 _ -`. Auf älterem Windows PowerShell kann ein solcher Token über einen Passwortmanager erzeugt und als Variable gesetzt werden. Der Beispielstart bindet nur an `127.0.0.1:8080`. Für entfernte Nutzung sind HTTPS und ein passend konfigurierter Reverseproxy erforderlich. Tokens nicht in URLs oder Git-Konfiguration ablegen. Zugriff auf das Workspace-Dateisystem bleibt auf den Dienst und vertrauenswürdige Betreiber beschränkt. `projects` ist die serverseitige Freigabeliste. Jeder Auftrag benennt `project_id` und `profile_id`. Er kann keine Repository-URLs, DB-Zugänge, Budgets oder Konfigurationspfade überschreiben. Optionale `projects.settings` halten die spätere Worker-Konfiguration bereit; die Eingangsschicht verwendet diese Dateien nicht für Analysen. Aktuell ist der Importadapter `vcore` für `wow/vcore` implementiert. Weitere Projekte benötigen passende Adapter/Profile, keine separat gepflegten Forks. ## Endpunkte | Methode/Pfad | Bedeutung | |---|---| | `GET /healthz` | Minimale öffentliche Erreichbarkeitsprüfung | | `GET /v1/profiles` | Für diesen Client freigegebene Projekte/Profile | | `GET /v1/schema` | Öffentliches JSON-Schema der Übergabemetadaten | | `GET /v1/overview` | Projektbezogene Worker-/Fallübersicht und Tokenstatistik | | `POST /v1/submissions` | Multipart-Upload, `201` bei neuer Einreihung, `200` bei Wiederholung | | `GET /v1/submissions/{id}` | Quittung und aktueller verwalteter Zustand | | `GET /v1/submissions/{id}/package` | Abgeschlossene Akte herunterladen; sonst `409` | Alle Endpunkte außer Health benötigen `Authorization: Bearer TOKEN`. POST benötigt zusätzlich `Idempotency-Key: frei-gewaehlte-eindeutige-id` (1–128 Zeichen, Buchstaben/Ziffern sowie Punkt, Unterstrich, Bindestrich; erstes Zeichen alphanumerisch). Derselbe Client/Schlüssel mit denselben Metadaten und Dateiinhalten liefert dieselbe Quittung, auch nach einem Neustart. Abweichender Inhalt ergibt `409 API_IDEMPOTENCY_CONFLICT`. Dateinamen und Multipart-Grenzen zählen nicht als Inhaltsänderung; Rollen und Reihenfolge der Dateien zählen. Ein zweiter neuer Auftrag für dasselbe Projekt und dieselbe Case-ID wird zurückgewiesen. ## Neuer Auftrag `metadata` ist ein UTF-8-JSON-Textfeld, kein Datei-Upload. Dateien: genau einmal `wowdiag`, optional einmal `wowsrc`, optional mehrfach `attachments`. Für Vcore muss die Case-ID dem Bug des Erfassungsarchivs entsprechen (`BUG-000020`). Beide Erfassungsarchive müssen zueinander passen. Beispiel `submission.json`: ```json { "kind": "new_case", "project_id": "viano-core", "profile_id": "vcore", "case_id": "BUG-000020", "report": { "title": "Wolpertinger fehlen", "observations": ["Nach Questannahme waren im untersuchten Gebiet keine Tiere sichtbar."], "expected_behavior": ["Fangbare Tiere sind im Gebiet vorhanden."] }, "versions": { "reported_server": "commit-des-gemeldeten-serverstands", "capture_server": "commit-des-erfassungsstands" } } ``` ```powershell curl.exe --fail-with-body -H "Authorization: Bearer $env:VBA_INTAKE_TOKEN" -H "Idempotency-Key: bug20-capture-001" -F "metadata=