Files
HamHam/docs/CHATGPT-PROMPT.md

147 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Wiederverwendbarer ChatGPT-Prompt
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.
---
Erstelle ein kulinarisch plausibles, vollständig nachkochbares Rezept für meine selbst gehostete Rezept-App **HamHam**.
**Mein Wunsch:** [z. B. Serbische Pljeskavica für 4 Personen]
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.
## Verbindliche Struktur und Datentypen
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`, `images`, `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 `[]`.
- `images` ist eine Liste von bis zu 10 Bildadressen für genau diesen Schritt, sonst `[]`.
- Gliedere `text` in kurze Absätze mit `\n\n`. Bei mehreren Teilaufgaben verwende eine eigene Zeile pro Aufgabe mit `- ` oder `1. `, `2. ` usw. Schreibe keinen langen Textblock. Kein HTML oder Markdown für Überschriften, Fettdruck oder eingebettete Bilder; Bilder gehören in `images`.
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. Bilder sind über lokale HamHam-Pfade (`/media/<uuid>.webp`, mitgelieferte `/images/<name>.jpg|webp|svg`) oder vollständige **HTTPS-Bildadressen** möglich (höchstens 2048 Zeichen, ohne Zugangsdaten in der URL). `image` ist das Titelbild, `images` auf Rezeptebene die Galerie (bis zu 20 Bilder), `images` innerhalb eines Schritts dessen Bilder (bis zu 10). Verwende nur von mir bereitgestellte oder tatsächlich überprüfte direkte Bildadressen, keine Webseiten-Links oder erfundenen URLs. Keine `http:`, `data:`- oder Base64-Bilder. Ohne geeignete Bilder setze `"image": ""` und alle `"images": []`. Setze `"published": false`.
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.
## 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"],
"images": [],
"timers": []
},
{
"id": "s_marinieren",
"title": "Marinieren und ziehen lassen",
"text": "- Die Gurkenscheiben mit {{z_essig}} und {{z_salz}} vermengen.\n- Im Kühlschrank 10 Minuten ziehen lassen.\n- Danach nochmals abschmecken und servieren.",
"ingredients": ["z_essig", "z_salz"],
"images": [],
"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.
- Schrittanleitungen sind in kurze Absätze oder Listen gegliedert. Bildfelder enthalten nur geeignete lokale Pfade oder HTTPS-Bildadressen, sonst bleiben sie leer.
- Die gesamte Antwort ist syntaktisch gültiges JSON und enthält keinen Begleittext.