Files
HamHam/docs/CHATGPT-PROMPT.md
T

10 KiB
Raw Blame History

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.

{
  "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.