docs: clarify ChatGPT recipe import format with validated JSON template
This commit is contained in:
1 parent
3abccf0999
commit
361862ad0b
1 file changed
+129
-15
+129
-15
@@ -1,6 +1,6 @@
|
||||
# Wiederverwendbarer ChatGPT-Prompt
|
||||
|
||||
Kopiere den folgenden Text zusammen mit `public/examples/hamham.schema.json` in ChatGPT. Hänge idealerweise auch `pljeskavica.json` als Beispiel an.
|
||||
Kopiere den gesamten Text unterhalb der Trennlinie in ChatGPT und ersetze **Mein Wunsch**. Der Prompt enthält eine vollständige Formatvorlage und funktioniert auch ohne Anhänge. Für zusätzliche Orientierung kannst du `public/examples/hamham.schema.json` und `public/examples/pljeskavica.json` beifügen.
|
||||
|
||||
---
|
||||
|
||||
@@ -8,20 +8,134 @@ Erstelle ein kulinarisch plausibles, vollständig nachkochbares Rezept für mein
|
||||
|
||||
**Mein Wunsch:** [z. B. Serbische Pljeskavica für 4 Personen]
|
||||
|
||||
Antworte ausschließlich mit gültigem JSON, ohne Markdown und ohne Begleittext. Halte dich exakt an das beigefügte JSON Schema. Die Hülle lautet `{"version":1,"recipes":[…]}`.
|
||||
Antworte ausschließlich mit einem vollständigen JSON-Objekt, ohne Markdown-Codeblock, Einleitung oder Begleittext. Die Ausgabe soll direkt als UTF-8-Datei mit Endung `.json` in HamHam importierbar sein. Verwende das unten definierte HamHam-Format, kein Schema.org-/Recipe-Format und keine selbst erfundenen Feldnamen. Falls das HamHam-JSON-Schema beigefügt ist, halte dich auch daran.
|
||||
|
||||
Regeln:
|
||||
## Verbindliche Struktur und Datentypen
|
||||
|
||||
1. Deutsch, bevorzugt in Österreich übliche Zutatenbezeichnungen. Konkrete, sichere und nachvollziehbare Zubereitung.
|
||||
2. `title`, `subtitle`, `description`, `cuisine`, `categories`, `tags`, `difficulty`, `prepMinutes`, `cookMinutes`, `restMinutes`, `servings`, `ingredients`, `steps`, `tips`, `storage` ausfüllen.
|
||||
3. Mengen ausschließlich als positive JSON-Zahlen mit Dezimalpunkt. Keine Bruchstrings, keine Einheiten im Mengenfeld. „Nach Geschmack“ als `amount: null`, `unit: ""`, `note: "nach Geschmack"`.
|
||||
4. Einheiten ausschließlich `g`, `kg`, `ml`, `l`, `Stück`, `TL`, `EL`, `Prise`, `Bund`, `""`.
|
||||
5. Jede Zutat hat eine eindeutige lesbare `id`, einen `name`, `amount`, `unit`, `section`, `note`, `optional`.
|
||||
6. Jeder Schritt hat eine eindeutige `id`, `title`, `text`, `ingredients` (Zutaten-IDs) und `timers` (ggf. leeres Array).
|
||||
7. Mengen in Anleitungen ausschließlich mit `{{zutaten_id}}` referenzieren: `"{{fleisch}} in Würfel schneiden."`. Die App ersetzt die Referenz mit Menge, Einheit, Zutatenname und Hinweis. Nicht nochmals den Namen oder die Menge dahinter schreiben. Referenzen müssen existieren.
|
||||
8. Für Warte-, Gar- und Ruhezeiten passende Timer angeben: `{"id":"eindeutige_id","label":"Nudeln kochen","seconds":600}`. IDs im gesamten Rezept eindeutig. Zeiten und Temperaturen nicht in Zutatenreferenzen umwandeln.
|
||||
9. `image: ""`, `images: []`, `published: false`. Keine erfundenen Bild-URLs. Rezept-ID und Zeitstempel weglassen; die App erzeugt sie.
|
||||
10. `nutrition: null`, sofern keine verlässlichen Nährwerte pro Portion verfügbar sind. Keine scheinpräzisen Werte erfinden.
|
||||
11. Kein HTML, keine Kommentare, keine zusätzlichen Felder. Alle Pflichtfelder und mindestens eine Zutat und ein Schritt müssen vorhanden sein.
|
||||
1. Die oberste Ebene enthält **nur** `"version": 1` und `"recipes": [...]`. Erstelle genau ein Rezept, sofern ich nicht ausdrücklich mehrere wünsche. Kein `format`, `schemaVersion` oder zusätzliches `recipe`-Objekt.
|
||||
2. Jedes Rezept enthält alle in der Vorlage gezeigten Felder. Rezept-`id`, `createdAt` und `updatedAt` weglassen; die App erzeugt sie. Zutaten, Schritte und Timer benötigen dagegen jeweils eine eigene `id`.
|
||||
3. `title`, `subtitle`, `description` und `cuisine` sind Texte. `categories` und `tags` sind Listen von Texten. Herkunft bei Bedarf in `cuisine` oder `description` angeben, nicht in einem zusätzlichen `country`-Feld.
|
||||
4. `difficulty` ist exakt einer dieser Texte: `"Einfach"`, `"Mittel"`, `"Anspruchsvoll"`. Keine englischen Werte wie `"easy"`, `"medium"` oder `"hard"`.
|
||||
5. `prepMinutes`, `cookMinutes` und `restMinutes` sind ganze JSON-Zahlen zwischen 0 und 10080, jeweils in **Minuten**. `servings` ist eine positive JSON-Zahl, höchstens 10000. Keine Zahlen als Strings und keine Zeitangaben wie `"12 Stunden"` in diesen Feldern.
|
||||
6. Jede Zutat enthält exakt `id`, `name`, `amount`, `unit`, `section`, `note`, `optional`:
|
||||
- `amount`: positive JSON-Zahl bis 1000000 oder `null`; Dezimalpunkt statt Dezimalkomma. Keine Bruchstrings und keine Einheit im Mengenfeld.
|
||||
- `unit`: ausschließlich `"g"`, `"kg"`, `"ml"`, `"l"`, `"Stück"`, `"TL"`, `"EL"`, `"Prise"`, `"Bund"` oder `""`.
|
||||
- `section`: Text für den Abschnitt, etwa `"Für die Sauce"`, sonst `""`.
|
||||
- `note`: Text für einen Hinweis, sonst `""`.
|
||||
- `optional`: JSON-Boolean `true` oder `false`, kein Text.
|
||||
- „Nach Geschmack“ als `"amount": null, "unit": "", "note": "nach Geschmack"`.
|
||||
- **Niemals `quantity` statt `amount` oder `group` statt `section` verwenden.** Diese Felder werden nicht als Mengen bzw. Abschnitte übernommen.
|
||||
7. Jeder Schritt enthält exakt `id`, `title`, `text`, `ingredients`, `timers`:
|
||||
- `text` enthält die vollständige Anleitung, niemals `description` auf Schrittebene.
|
||||
- `ingredients` ist eine Liste vorhandener Zutaten-IDs, etwa `["fleisch", "salz"]`, sonst `[]`. Nicht `ingredientIds` verwenden und hier keine Zutatenobjekte einsetzen.
|
||||
- Die Reihenfolge ergibt sich aus der Position im `steps`-Array. Kein `order`-Feld.
|
||||
- `timers` ist eine Liste von Timerobjekten oder `[]`.
|
||||
8. Jeder Timer enthält exakt `id`, `label`, `seconds`. `seconds` ist eine ganze JSON-Zahl von 1 bis 172800 in **Sekunden**, etwa `{"id":"timer_ruhen","label":"Ruhen lassen","seconds":600}`. Die `id` darf auch bei nur einem Timer nicht fehlen.
|
||||
9. IDs für Zutaten, Schritte und Timer bestehen aus 1–80 Zeichen: ausschließlich `a–z`, `A–Z`, `0–9`, `_` und `-`. Keine Leerzeichen oder Umlaute. Verwende eindeutige lesbare IDs, beispielsweise `z_fleisch`, `s_mischen`, `t_ruhen`; wiederhole keine ID innerhalb eines Rezepts.
|
||||
10. `tips` und `storage` sind jeweils **ein einzelner Text**, niemals Listen oder Objekte. Mehrere Hinweise durch `\n\n` innerhalb des JSON-Strings trennen. Verwende `storage`, niemals `storageNotes`.
|
||||
11. Setze `"image": ""`, `"images": []` und `"published": false`. Keine erfundenen Bild-URLs.
|
||||
12. Setze `"nutrition": null`, sofern keine verlässlichen Nährwerte **pro Portion** verfügbar sind. Andernfalls exakt `{"kcal": 0, "protein": 0, "carbs": 0, "fat": 0}` mit den tatsächlichen nicht negativen Zahlen ausfüllen; Makronährstoffe in Gramm. Keine scheinpräzisen Werte erfinden.
|
||||
|
||||
Prüfe vor der Ausgabe die Mengenverhältnisse, die Gesamtzeit, die Referenzen und die JSON-Syntax.
|
||||
## Inhalt und Grenzen
|
||||
|
||||
- Deutsch, bevorzugt in Österreich übliche Zutatenbezeichnungen. Konkrete, sichere und nachvollziehbare Zubereitung.
|
||||
- Zutatenmengen in Schrittanleitungen ausschließlich mit `{{zutaten_id}}` referenzieren: `"{{z_fleisch}} in Würfel schneiden."`. Die App ersetzt die Referenz mit Menge, Einheit, Zutatenname und Hinweis. Nicht nochmals den Namen oder die Menge dahinter schreiben. Jede Referenz muss zu einer vorhandenen Zutaten-ID gehören. Zeiten und Temperaturen als normalen Text schreiben.
|
||||
- Für Warte-, Gar- und Ruhezeiten passende Timer angeben. Minutenfelder und Timer-Sekunden korrekt umrechnen, etwa 12 Stunden = 720 Minuten = 43200 Sekunden. Die Gesamtzeit ergibt sich aus Vorbereitung, Garzeit und Ruhezeit; dieselbe Zeit nicht doppelt zählen.
|
||||
- Mindestens eine Zutat und ein Schritt pro Rezept. Höchstens 200 Zutaten, 100 Schritte, 100 Zutatenreferenzen pro Schritt und 10 Timer pro Schritt. Höchstens 100 Rezepte pro Datei.
|
||||
- Textlängen: Titel 2–180 Zeichen, Untertitel höchstens 200, Beschreibung 4000, Küche 80, Zutatenname 1–160, Abschnitt 80, Zutatenhinweis 200, Schritttitel 160, Schrittanleitung 1–6000, Timerbeschriftung 1–100, Tipps 6000, Aufbewahrung 3000. Höchstens 20 Kategorien und 30 Tags mit jeweils 1–60 Zeichen.
|
||||
- Kein HTML, keine Kommentare, keine zusätzlichen Felder, keine Auslassungszeichen oder Platzhalter in der Ausgabe. JSON mit doppelten Anführungszeichen, korrekt maskierten Anführungszeichen innerhalb von Texten und ohne abschließende Kommas.
|
||||
|
||||
## Vollständige Formatvorlage
|
||||
|
||||
Dieses kleine Beispiel zeigt die verbindliche Struktur. Ersetze den Inhalt vollständig durch das gewünschte Rezept und ergänze so viele Zutaten, Schritte und Timer wie nötig. Die Codeblock-Markierung gehört nur zu dieser Erklärung; deine Antwort enthält ausschließlich das JSON-Objekt.
|
||||
|
||||
```json
|
||||
{
|
||||
"version": 1,
|
||||
"recipes": [
|
||||
{
|
||||
"title": "Einfacher Gurkensalat",
|
||||
"subtitle": "Frisch und leicht mit Essig",
|
||||
"description": "Ein schneller Gurkensalat als Beilage.",
|
||||
"image": "",
|
||||
"images": [],
|
||||
"categories": ["Beilage"],
|
||||
"tags": ["Vegetarisch"],
|
||||
"cuisine": "Österreich",
|
||||
"difficulty": "Einfach",
|
||||
"prepMinutes": 10,
|
||||
"cookMinutes": 0,
|
||||
"restMinutes": 10,
|
||||
"servings": 2,
|
||||
"ingredients": [
|
||||
{
|
||||
"id": "z_gurke",
|
||||
"name": "Salatgurke",
|
||||
"amount": 1,
|
||||
"unit": "Stück",
|
||||
"section": "Salat",
|
||||
"note": "",
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"id": "z_essig",
|
||||
"name": "Apfelessig",
|
||||
"amount": 1.5,
|
||||
"unit": "EL",
|
||||
"section": "Marinade",
|
||||
"note": "",
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"id": "z_salz",
|
||||
"name": "Salz",
|
||||
"amount": null,
|
||||
"unit": "",
|
||||
"section": "Marinade",
|
||||
"note": "nach Geschmack",
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"steps": [
|
||||
{
|
||||
"id": "s_schneiden",
|
||||
"title": "Gurke vorbereiten",
|
||||
"text": "{{z_gurke}} waschen, die Enden entfernen und die Gurke fein hobeln.",
|
||||
"ingredients": ["z_gurke"],
|
||||
"timers": []
|
||||
},
|
||||
{
|
||||
"id": "s_marinieren",
|
||||
"title": "Marinieren und ziehen lassen",
|
||||
"text": "Die Gurkenscheiben mit {{z_essig}} und {{z_salz}} vermengen. Im Kühlschrank 10 Minuten ziehen lassen, danach nochmals abschmecken und servieren.",
|
||||
"ingredients": ["z_essig", "z_salz"],
|
||||
"timers": [
|
||||
{
|
||||
"id": "t_ziehen",
|
||||
"label": "Salat ziehen lassen",
|
||||
"seconds": 600
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"tips": "Für dünne Scheiben einen Gemüsehobel verwenden.\n\nDen Essig nach persönlichem Geschmack dosieren.",
|
||||
"storage": "Abgedeckt im Kühlschrank aufbewahren und innerhalb eines Tages verbrauchen.",
|
||||
"nutrition": null,
|
||||
"published": false
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## Stille Abschlussprüfung vor deiner Antwort
|
||||
|
||||
Prüfe und korrigiere die Ausgabe vor dem Antworten. Gib diese Prüfliste nicht mit aus:
|
||||
|
||||
- Oberste Ebene nur `version` und `recipes`; `version` ist die Zahl `1`.
|
||||
- Alle Felder entsprechen der Vorlage und haben den richtigen Datentyp.
|
||||
- `difficulty` ist `Einfach`, `Mittel` oder `Anspruchsvoll`.
|
||||
- Zutaten verwenden `amount` und `section`; Schritte verwenden `text` und `ingredients`.
|
||||
- Jede Zutat, jeder Schritt und jeder Timer hat eine gültige, eindeutige `id`. Alle Zutatenreferenzen existieren.
|
||||
- `tips` und `storage` sind Texte; `quantity`, `group`, `ingredientIds`, `order`, `storageNotes`, `country`, `format` und `schemaVersion` kommen als Feldnamen nicht vor.
|
||||
- Mengenverhältnisse, Portionszahl, Zeiten und Timer sind plausibel; alle Grenzen sind eingehalten.
|
||||
- Die gesamte Antwort ist syntaktisch gültiges JSON und enthält keinen Begleittext.
|
||||
Reference in new issue
Block a user