Files
2026-07-24 21:37:03 +02:00

5.2 KiB

Tandoor AI Web Import 1.1

Lokale Weboberfläche für den kontrollierten Import von Rezeptseiten:

URL
  → sichere Webseitenextraktion
  → OpenAI Structured Output
  → Vorschau und bearbeitbares JSON
  → intelligente Tandoor-Zuordnung
  → bewusster API-Import
  → Nachprüfung oder Rollback

Funktionen

  • vollständige URLs sowie Eingaben ohne https://
  • .html, .php, Query-Parameter und normale Unterpfade
  • bevorzugte Auswertung von JSON-LD/Schema.org-Rezeptdaten
  • Vereinheitlichung im Stil der bereits überarbeiteten Tandoor-Rezepte
  • Komponenten als eigene Schritte, ohne unnötige Zerstückelung
  • bearbeitbares JSON und Live-Vorschau
  • jedes Food erhält immer ein Zuordnungs-Dropdown
  • Tandoor-Foods werden einmal geladen und lokal bewertet
  • exakte Treffer, Singular/Plural, Teilwörter und ähnliche Schreibweisen
  • Kartoffeln findet beispielsweise Kartoffel
  • Treffer werden nach Qualität sortiert und vorausgewählt
  • alternative Suche über ein Eingabefeld je Food und Unit
  • bewusstes Anlegen eines neuen Foods oder einer neuen Unit
  • Dublettenprüfung vor dem Rezeptimport
  • Verifikation nach dem Import
  • Rollback des Rezepts und der in diesem Lauf neu angelegten Stammdaten
  • optionaler HTTP-Basic-Schutz
  • Schutz vor SSRF über localhost und private Quelladressen

OpenAI erhält ausschließlich extrahierte Rezeptdaten und die Quell-URL. Der Tandoor-Token bleibt vollständig im lokalen Backend.

Installation mit Docker

unzip tandoor-ai-web-import-v1.1.zip
cd tandoor-ai-web-import-v1.1

cp .env.example .env
nano .env

Mindestens eintragen:

OPENAI_API_KEY=sk-...
OPENAI_MODEL=gpt-5.5

TANDOOR_URL=https://kitchen.d-razz.de
TANDOOR_TOKEN=DEIN_TANDOOR_TOKEN
TANDOOR_AUTH_SCHEME=Bearer

APP_USERNAME=michael
APP_PASSWORD=EIN_STARKES_PASSWORT

Start:

docker compose up -d --build

Weboberfläche:

http://DEIN-SERVER:8091

Lokaler Start ohne Docker

Unter Debian oder Ubuntu gegebenenfalls zuerst:

sudo apt update
sudo apt install python3-venv

Dann:

python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements.txt

cp .env.example .env
nano .env

uvicorn app.main:app \
  --env-file .env \
  --host 127.0.0.1 \
  --port 8091

Für den lokalen Betrieb wird DATA_DIR=./data relativ zum Projektordner aufgelöst. Ohne gesetzte Variable fällt die Anwendung ebenfalls automatisch auf <Projekt>/data zurück.

Bedienung

  1. Rezept-URL eintragen und URL analysieren drücken.
  2. Vorschau und Warnungen prüfen.
  3. Im Tab Zuordnungen jedes vorausgewählte Food kontrollieren.
  4. Im Dropdown bei Bedarf einen anderen vorhandenen Eintrag wählen.
  5. Alternativ einen anderen Suchbegriff eintragen und Suchen drücken.
  6. Existiert nichts Passendes, im Dropdown Neu anlegen auswählen.
  7. Änderungen prüfen drücken.
  8. Erst bei freiem Importstatus In Tandoor importieren drücken.

Zuordnungslogik

Die Anwendung lädt die verfügbaren Foods und Units aus Tandoor und bewertet jeden Eintrag. Dabei werden berücksichtigt:

exakter Name
Pluralname
Singular-/Pluralvarianten
Teilworttreffer
allgemeine Zeichenähnlichkeit
vorhandene Properties als kleiner Tie-Breaker

Eine ähnliche Zuordnung wird nicht unsichtbar entschieden. Sie erscheint immer als sichtbare Vorauswahl im Dropdown und zusätzlich als Warnung.

Neue Foods und Units

Die Analyse und Validierung schreiben nichts nach Tandoor. Erst beim finalen Import werden ausdrücklich mit Neu anlegen markierte Objekte über folgende API-Endpunkte erstellt:

POST /api/food/
POST /api/unit/

Danach werden die zurückgegebenen IDs in den Rezept-Payload eingesetzt. Schlägt der Rezeptimport oder die Nachprüfung fehl, versucht die Anwendung das neue Rezept und die in diesem Lauf neu erstellten Stammdaten wieder zu entfernen.

Verzeichnis data/runs

Jeder Durchlauf wird nachvollziehbar gespeichert:

data/runs/<RUN-ID>/
├── 01-source.json
├── 02-openai-metadata.json
├── 03-ai-recipe.json
├── 04-resolution.json
├── 05-edited-recipe.json
├── 06-edited-resolution.json
├── 07-import-validation.json
└── 08-import-result.json

Die Dateien enthalten keine API-Token.

Sicherheitsoptionen

Private und lokale Rezeptquellen sind standardmäßig blockiert:

ALLOW_PRIVATE_SOURCE_URLS=false

TLS-Prüfungen sollten aktiviert bleiben:

SOURCE_VERIFY_TLS=true
TANDOOR_VERIFY_TLS=true

Ohne APP_PASSWORD ist die Oberfläche ungeschützt. Für einen über das lokale Gerät hinaus erreichbaren Dienst sollte ein Passwort oder ein Reverse Proxy mit Authentifizierung verwendet werden.

Test

python tests/selftest.py
python tests/integration_mock.py

Grenzen

  • Stark JavaScript-basierte Seiten ohne serverseitiges HTML können zu wenig Inhalt liefern.
  • Paywalls, Login-Seiten und Bot-Schutz werden nicht umgangen.
  • Neu erzeugte Foods enthalten zunächst die für den Rezeptimport nötigen Stammdaten wie Name und optionalen Pluralnamen, aber keine erfundenen Nährwerte oder Properties.
  • Die KI erzeugt nur das Zwischenformat. Ausschließlich das lokale Backend besitzt Tandoor-Schreibrechte.