Zum Hauptinhalt springen

Assistent einrichten

Der Assistent (Speisekarte importieren, Icon-Vorschläge) ist im Einzelbetrieb optional und standardmäßig aus. Er braucht einen externen Anbieter, der die Speisekarten auswertet — dafür hinterlegst du beim Server einen eigenen Schlüssel. Ohne Anbieter zeigt die Oberfläche unter Einstellungen → Organisation → Assistent den Hinweis Nicht eingerichtet, und alles andere funktioniert unverändert.

Daten verlassen den Server

Mit eingerichtetem Assistenten werden hochgeladene Speisekarten und Produktnamen an den gewählten Anbieter übertragen. Was dieser damit tut, regelt dein Vertrag mit ihm — prüfe seine Datenschutzbedingungen und informiere deine Nutzer:innen, bevor ein Admin die Funktionen einschaltet.

Anbieter wählen​

Die Betriebsart bestimmt AI_PROVIDER in der Umgebung von openeos-api:

WertBedeutung
noneAus (Standard). Alle Assistent-Endpunkte antworten mit 404.
anthropicClaude über die Anthropic-API. Liest Bilder und PDFs.
openaiEine OpenAI-kompatible Chat-Completions-API — OpenAI selbst oder ein anderer Dienst mit eigener OPENAI_BASE_URL. Liest Bilder und Text, keine PDFs.

Anthropic​

api:
environment:
# … bestehende Variablen …
AI_PROVIDER: anthropic
ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:?ANTHROPIC_API_KEY fehlt}

Den Schlüssel in die .env neben die anderen Geheimnisse:

ANTHROPIC_API_KEY=sk-ant-…

OpenAI und kompatible Dienste​

api:
environment:
# … bestehende Variablen …
AI_PROVIDER: openai
OPENAI_API_KEY: ${OPENAI_API_KEY:?OPENAI_API_KEY fehlt}
# Nur für andere Anbieter nötig; Standard ist https://api.openai.com/v1
OPENAI_BASE_URL: https://api.openai.com/v1

Mit OPENAI_BASE_URL sprichst du jeden Dienst an, der die Chat-Completions-API von OpenAI nachbildet — etwa einen europäischen Anbieter oder ein lokal laufendes Modell. Der Dienst muss zwei Dinge können: Bilder als Eingabe und strukturierte Ausgabe nach JSON-Schema (response_format mit json_schema, strict: true). Fehlt eines davon, scheitert jeder Import mit „Der Assistent ist gerade nicht erreichbar“ — die Details stehen dann im Log von openeos-api.

PDF nur mit Anthropic

Beim OpenAI-kompatiblen Anbieter lehnt der Server PDF-Uploads ab („PDF wird vom eingerichteten Anbieter nicht unterstützt — bitte lade Fotos der Seiten hoch“). Fotos und eingefügter Text gehen immer.

Modelle​

Welche Modelle der Server verwendet, steht in der Konfiguration, nicht im Code. Leer gelassen gelten die Standardwerte je Anbieter:

VariableZweckStandard anthropicStandard openai
AI_MODEL_EXTRACTliest die Speisekarte (Bilder, PDF, Text)claude-sonnet-5-5gpt-5
AI_MODEL_CLASSIFYordnet unklare Produktnamen einem Icon zuclaude-haiku-4-5-20251001gpt-5-mini

Beim OpenAI-kompatiblen Anbieter setzt du beide Werte auf die Modellnamen, die dein Dienst kennt. Das Extraktionsmodell muss Bilder verstehen; das Klassifikationsmodell braucht nur Text und darf klein sein.

Kontingente und Grenzen​

VariableBedeutungStandard
AI_MENU_IMPORTS_PER_DAYSpeisekarten-Importe je Organisation und Kalendertag (Europe/Berlin)5
AI_CLASSIFY_PER_DAYIcon-Zuordnungen per Modell je Organisation und Tag500
AI_MENU_PAGES_PER_IMPORTBilder je Import (1–20)6
AI_MAX_UPLOAD_MBHöchstgröße je Datei in MB (1–50)10

Die Kontingente schützen im gehosteten Angebot die Kosten. Mit eigenem Schlüssel zahlst du den Anbieter selbst und setzt sie so hoch, wie du möchtest; 0 schaltet die jeweilige Funktion aus. Ein Aufruf, der beim Anbieter scheitert, wird nicht angerechnet. Die meisten Icon-Vorschläge kommen ohne Modellaufruf aus (Abgleich mit den Namen und Suchbegriffen der Produkt-Icons); nur unklare Namen gehen gebündelt an das Klassifikationsmodell.

Jeder Modellaufruf steht mit Organisation, Funktion, Modell, Token-Zahlen und Dauer in der Tabelle ai_usage — daran siehst du, was der Assistent bei deinem Anbieter kostet.

Einschalten​

Nach dem Neustart (sudo docker compose up -d --force-recreate api) zeigt Einstellungen → Organisation → Assistent statt „Nicht eingerichtet“ den Schalter Assistent-Funktionen. Erst wenn ein Admin ihn einschaltet, stehen Import und Icon-Vorschlag in der Oberfläche; das Ein- und Ausschalten landet im Audit-Protokoll.

Dateien und Aufbewahrung​

Hochgeladene Speisekarten liegen unter <UPLOAD_DIR>/menu-imports/<id>/ (in der Compose-Anleitung ist das das Volume uploads). Sie sind nicht öffentlich erreichbar — anders als Produktbilder liefert der Server diesen Pfad nicht aus.

Gelöscht werden sie, sobald der Vorschlag übernommen oder verworfen wird, spätestens aber 24 Stunden nach dem Hochladen; der gespeicherte Vorschlag (die erkannte Liste in der Tabelle menu_imports) nach 30 Tagen. Beides erledigt ein stündlicher Hintergrundjob des Servers. Importe, die länger als 15 Minuten in Bearbeitung hängen, markiert ein Minuten-Job als fehlgeschlagen; sie kosten kein Kontingent.

Beim Anbieter selbst verbleiben die Inhalte nur für die Dauer der Verarbeitung — was darüber hinaus gilt, bestimmt dein Vertrag mit ihm.

Fehlersuche​

sudo docker compose logs -f api | grep -i 'assistant\|menu-import\|ai-provider'
Meldung in der OberflächeUrsache
Nicht eingerichtetAI_PROVIDER ist none oder fehlt, oder der Server wurde nach der Änderung nicht neu gestartet.
Die Assistent-Funktionen sind für deine Organisation ausgeschaltet.Anbieter ist da, aber der Schalter in den Einstellungen ist aus.
Der Assistent ist gerade nicht erreichbarSchlüssel ungültig, Modellname unbekannt oder der Dienst kann keine Bilder bzw. kein JSON-Schema — Details im Log.
Das Tageskontingent … ist aufgebrauchtAI_MENU_IMPORTS_PER_DAY bzw. AI_CLASSIFY_PER_DAY erreicht; ab Mitternacht (Europe/Berlin) wieder frei.
PDF wird vom eingerichteten Anbieter nicht unterstütztAI_PROVIDER=openai — Fotos der Seiten hochladen oder auf anthropic wechseln.