Add mealie-recipe-import skill
This commit is contained in:
@@ -0,0 +1,152 @@
|
||||
---
|
||||
name: mealie-recipe-import
|
||||
description: Importiert ein Rezept aus einer URL in Mealie (per MCP) und bereinigt es direkt danach - setzt passende Kategorien und Tags, normalisiert Mengenangaben/Einheiten, bereinigt Zutatennamen und glättet die Zubereitungsschritte sprachlich (auf Deutsch, auch wenn das Original in einer anderen Sprache ist). Nutze diesen Skill immer, wenn der User eine Rezept-URL schickt und sie "in Mealie speichern/importieren/hinzufügen" möchte, wenn er sagt "importier das mal", "füg das Rezept hinzu", "mach das Rezept in Mealie sauber", oder allgemein ein rohes/unsortiertes Mealie-Rezept nachträglich korrigiert haben möchte (auch ohne neue URL, per Slug oder Namen). Trigger auch bei Formulierungen wie "korrigier das Rezept", "setz die Kategorien", "räum die Zutaten auf" im Mealie-Kontext.
|
||||
---
|
||||
|
||||
# Mealie Rezept-Import & Korrektur
|
||||
|
||||
Importiert Rezepte aus einer URL nach Mealie und bringt sie danach in einen sauberen,
|
||||
konsistenten Zustand: richtige Kategorien, richtige Tags, saubere Mengen/Einheiten,
|
||||
bereinigte Zutatennamen und flüssig lesbare, deutsche Zubereitungsschritte.
|
||||
|
||||
Nutzer-Präferenzen (aus der Einrichtung dieses Skills):
|
||||
- Sprache: **Deutsch** — fremdsprachige Rezepte werden beim Bereinigen ins Deutsche übersetzt (Zutaten, Schritte, Beschreibung, Name).
|
||||
- Kategorien/Tags: Bevorzugt bestehende aus Mealie verwenden, bei Bedarf aber **neue anlegen** (kein Nachfragen nötig — `mealie_recipes_update` legt beim Update automatisch neue Kategorie-/Tag-Namen an, falls sie noch nicht existieren).
|
||||
- Umfang der Korrektur: Kategorien, Tags, Mengen/Einheiten normalisieren, Zutatennamen bereinigen, Zubereitungsschritte glätten.
|
||||
|
||||
## Ablauf
|
||||
|
||||
### 1. Rezept importieren (nur wenn eine neue URL gegeben wurde)
|
||||
|
||||
```
|
||||
mealie_recipes_create_from_url(url=<URL>, include_tags=false)
|
||||
```
|
||||
|
||||
`include_tags=false`, weil die vom Scraper übernommenen Tags/Kategorien meist unpassend
|
||||
oder inkonsistent mit der bestehenden Mealie-Taxonomie sind — wir setzen sie im nächsten
|
||||
Schritt bewusst selbst. Das Ergebnis liefert u.a. `slug`, `name`, Rohtext von
|
||||
Zutaten/Anleitung.
|
||||
|
||||
Wenn der User stattdessen ein bereits vorhandenes Rezept nennt (Name oder Slug), das
|
||||
Rezept stattdessen über `mealie_recipes_search(query=<Name>)` finden und den `slug`
|
||||
daraus verwenden.
|
||||
|
||||
### 2. Bestehende Taxonomie abrufen
|
||||
|
||||
Vor dem Setzen von Kategorien/Tags immer erst die bestehenden Listen holen, damit
|
||||
bereits vorhandene Begriffe wiederverwendet werden statt Dubletten anzulegen
|
||||
(z.B. nicht "Dessert" und "Desserts" parallel):
|
||||
|
||||
```
|
||||
mealie_categories_list()
|
||||
mealie_tags_list()
|
||||
```
|
||||
|
||||
Wähle aus dieser Liste passende Kategorien/Tags. Nur wenn wirklich nichts passt, einen
|
||||
neuen, prägnanten deutschen Begriff vergeben (Titelcase, Singular bei Kategorien wie
|
||||
"Hauptgericht", "Beilage", "Dessert", "Frühstück"; bei Tags eher granular wie
|
||||
"vegetarisch", "vegan", "schnell", "Ofengericht", "Meal-Prep", "glutenfrei").
|
||||
|
||||
Faustregeln für die Zuordnung:
|
||||
- **Kategorien** = grobe Einordnung (max. 1-3): Gang (Hauptgericht/Vorspeise/Dessert/
|
||||
Frühstück/Beilage), ggf. Küche (Italienisch, Asiatisch) wenn eindeutig.
|
||||
- **Tags** = Eigenschaften/Filter (beliebig viele, aber sparsam): Ernährungsform
|
||||
(vegetarisch/vegan/glutenfrei/low-carb), Aufwand (schnell, meal-prep), Methode
|
||||
(Ofengericht, One-Pot, Grillen), Anlass (Sommer, Party, Kinderfreundlich).
|
||||
- Keine Kategorie/Tag doppelt in leicht anderer Schreibweise anlegen — bei Unsicherheit
|
||||
lieber den bestehenden, ähnlichsten Begriff aus der Liste nehmen.
|
||||
|
||||
### 3. Zutaten bereinigen und normalisieren
|
||||
|
||||
Rohe Zutatenzeilen (z.B. `"1 Bund glatte Petersilie, fein gehackt"`,
|
||||
`"200g Mehl Type 405"`) glätten:
|
||||
- Einheiten auf gängige deutsche Kurzformen normalisieren: g, kg, ml, l, TL, EL, Prise,
|
||||
Stück, Bund, Dose, Zehe(n) etc. Keine Mischformen wie "gr" oder "Gramm" ausgeschrieben.
|
||||
- Zutatennamen vereinheitlichen (z.B. immer "Zwiebel" statt mal "Zwiebeln" mal "Zwiebel(n)"
|
||||
innerhalb desselben Rezepts; Tippfehler korrigieren; Duplikate zusammenführen, wenn eine
|
||||
Zutat mehrfach mit leicht anderem Namen auftaucht).
|
||||
- Fremdsprachige Zutaten ins Deutsche übersetzen (z.B. "all-purpose flour" → "Weizenmehl
|
||||
Type 405", "kosher salt" → "Salz").
|
||||
|
||||
Für eine wirklich strukturierte Bereinigung (getrennte Felder für Menge/Einheit/Zutat,
|
||||
nützlich für Einkaufslisten) optional den Mealie-Parser nutzen:
|
||||
|
||||
```
|
||||
mealie_parser_ingredients_batch(ingredients=[<bereinigte Zeilen als Strings>])
|
||||
mealie_recipes_update_structured_ingredients(slug=<slug>, parsed_ingredients=<Ergebnis>)
|
||||
```
|
||||
|
||||
Das lohnt sich vor allem, wenn der User Wert auf saubere Einkaufslisten legt. Für die
|
||||
reine Text-Bereinigung reicht es, die geglätteten Zutatenzeilen direkt in
|
||||
`mealie_recipes_update(ingredients=[...])` zu schreiben (siehe Schritt 5).
|
||||
|
||||
### 4. Zubereitungsschritte glätten
|
||||
|
||||
- In flüssiges, klar formuliertes Deutsch bringen (kurze, aktive Sätze, ein Arbeitsschritt
|
||||
pro Listeneintrag).
|
||||
- Fremdsprachige Anleitungen vollständig übersetzen, nicht nur einzelne Wörter.
|
||||
- Inhalt dabei nicht verändern — keine Zutaten/Mengen/Reihenfolge erfinden oder weglassen,
|
||||
nur sprachlich glätten und Redundanzen straffen.
|
||||
- Falls Schritte vom Scraper unsauber zusammengefasst wurden (z.B. ein Riesenblock Text
|
||||
statt einzelner Schritte), sinnvoll in einzelne, in sich abgeschlossene Schritte
|
||||
aufteilen.
|
||||
|
||||
### 5. Alles zusammen in Mealie speichern
|
||||
|
||||
Ein einziger Update-Call mit allen bereinigten Feldern (spart Round-Trips):
|
||||
|
||||
```
|
||||
mealie_recipes_update(
|
||||
slug=<slug>,
|
||||
name=<bereinigter, ggf. übersetzter Name>,
|
||||
description=<bereinigte Beschreibung>,
|
||||
ingredients=[<bereinigte Zutatenzeilen>],
|
||||
instructions=[<geglättete Schritte>],
|
||||
categories=[<gewählte Kategorien>],
|
||||
tags=[<gewählte Tags>],
|
||||
recipe_yield=<Portionen, falls unsauber>,
|
||||
prep_time=<falls sinnvoll normalisierbar>,
|
||||
cook_time=<falls sinnvoll normalisierbar>,
|
||||
)
|
||||
```
|
||||
|
||||
Wichtig: `mealie_recipes_update` **ersetzt** Zutaten/Anleitung/Tags/Kategorien komplett —
|
||||
immer die vollständige, bereinigte Liste mitschicken, nicht nur die Änderungen.
|
||||
|
||||
**Achtung Slug-Falle:** Wird im selben Aufruf auch `name` geändert, ändert Mealie
|
||||
automatisch den `slug` des Rezepts (z.B. `gemusewaffeln` → `gemusewaffeln-mit-krauterquark`).
|
||||
Folgeaufrufe mit dem alten Slug schlagen dann mit `404 No Entry Found` fehl. Wenn `name`
|
||||
mitgeschickt wird: den Aufruf **einzeln** machen (nicht mit weiteren Updates kombinieren,
|
||||
die noch den alten Slug referenzieren), und danach den neuen Slug per
|
||||
`mealie_recipes_search(query=<neuer Name>)` ermitteln, bevor mit diesem Rezept
|
||||
weitergearbeitet wird.
|
||||
|
||||
### 6. Kurze Zusammenfassung an den User
|
||||
|
||||
Nach dem Speichern knapp berichten, was gemacht wurde — insbesondere:
|
||||
- welche Kategorien/Tags gesetzt wurden (und ob welche neu angelegt wurden),
|
||||
- ob/was übersetzt wurde,
|
||||
- ob Zutaten zusammengeführt oder korrigiert wurden.
|
||||
|
||||
Keine komplette Rezept-Abschrift im Chat — Mealie zeigt das Ergebnis, ein Link/Slug-Verweis
|
||||
reicht.
|
||||
|
||||
## Mehrere URLs auf einmal
|
||||
|
||||
Wenn der User mehrere URLs gleichzeitig schickt, jede einzeln importieren
|
||||
(`mealie_recipes_create_from_url` pro URL oder `mealie_recipes_create_from_urls_bulk` für
|
||||
den Import-Schritt) und danach **jedes Rezept einzeln** durch Schritt 2-5 laufen lassen —
|
||||
nicht pauschal dieselben Kategorien/Tags auf alle anwenden, jedes Rezept bekommt seine
|
||||
eigene, passende Einordnung.
|
||||
|
||||
## Edge Cases
|
||||
|
||||
- **Scraper konnte URL nicht lesen / Import schlägt fehl**: Seite selbst per web_fetch
|
||||
holen, Rezeptdaten manuell extrahieren und mit `mealie_recipes_create(...)` anlegen
|
||||
(inkl. bereits bereinigter Felder), statt den fehlgeschlagenen Import zu wiederholen.
|
||||
- **Rezept existiert schon (Duplikat)**: Vor dem Import kurz mit
|
||||
`mealie_recipes_search(query=<Name>)` prüfen. Bei Treffer nachfragen, ob überschrieben/
|
||||
aktualisiert oder als neues Rezept angelegt werden soll — nicht stillschweigend doppelt
|
||||
anlegen.
|
||||
- **Sehr lange/unklare Zutatenliste**: Lieber in Batches mit
|
||||
`mealie_parser_ingredients_batch` arbeiten statt einzeln zu parsen.
|
||||
Reference in New Issue
Block a user