Last active 5 hours ago

Revision 5eaae307e0c1f87720bbcec172676f3047bcb222

parse-recipe-ingredients.txt Raw
1Parse each ingredient string into structured ingredient components.
2
3You will receive a list containing one or more ingredient strings.
4
5You must return exactly one parsed ingredient for every input ingredient, in the same order. Never merge, split, remove, reorder, or add ingredients.
6
7## Core requirements
8
9* Preserve all meaningful information from the original ingredient string.
10* Every part of the input must either be represented in a structured field, included in the note field, or intentionally consumed by a documented normalization or conversion.
11* Do not invent missing quantities, units, foods, preparations, brands, or notes.
12* When part of an ingredient cannot be parsed confidently, preserve the uncertain text in the note field instead of discarding it.
13* If the entire ingredient is too ambiguous to parse reliably, place the complete original string in the note field and leave the other fields empty.
14* Return valid structured output only, with no explanations or commentary.
15
16## Parsing rules
17
18Separate each ingredient into the available components, including:
19
20* quantity
21* unit
22* food or ingredient name
23* note or preparation text
24
25Examples:
26
27* `3 potatoes (roughly chopped)`
28 quantity: `3`
29 food: `potatoes`
30 note: `roughly chopped`
31
32* `2 tbsp olive oil, plus more for frying`
33 quantity: `2`
34 unit: `tablespoon`
35 food: `olive oil`
36 note: `plus more for frying`
37
38* `1 large onion, finely diced`
39 quantity: `1`
40 food: `onion`
41 note: `large; finely diced`
42
43## Quantity rules
44
45* Parse integers, decimals, vulgar fractions, written fractions, and mixed numbers.
46* Normalize equivalent quantities where practical:
47
48 * `½` → `0.5`
49 * `1 1/2` → `1.5`
50 * `one` → `1`
51* For quantity ranges, use the lower value:
52
53 * `3–5` → `3`
54 * `1 to 2` → `1`
55 * `about 4–6` → `4`, with `about` preserved in the note when relevant
56* Preserve approximate wording such as `about`, `approximately`, `roughly`, or `around` in the note field.
57* Convert recognized grouped quantities when the conversion is unambiguous:
58
59 * `2 dozen eggs` → quantity: `24`, food: `eggs`
60* Do not preserve the original grouped unit after it has been fully consumed by a conversion.
61* Do not calculate quantities that require assumptions about package size, ingredient density, or serving size.
62
63## Unit rules
64
65Recognize common unit names, abbreviations, spelling variants, singular forms, plural forms, and multilingual variants.
66
67The parser may recognize many equivalent forms, but it must normalize the final output to the preferred forms below.
68
69### Preferred output forms
70
71For metric units, always use these abbreviations in the final unit field:
72
73- `mg`
74- `g`
75- `kg`
76- `ml`
77- `l`
78
79For common kitchen units, use these abbreviations in the final unit field:
80
81- `tsp`
82- `tbsp`
83
84For other count-based or descriptive units, use a concise singular word:
85
86- `pinch`
87- `dash`
88- `sprig`
89- `clove`
90- `can`
91- `jar`
92- `bottle`
93- `package`
94- `packet`
95- `sachet`
96- `cube`
97- `bunch`
98- `bundle`
99- `slice`
100- `piece`
101- `stick`
102- `unit`
103
104Do not output long metric names such as:
105
106- `millilitre`
107- `millilitres`
108- `milliliter`
109- `gram`
110- `grams`
111- `kilogram`
112- `litre`
113
114Normalize them to their preferred abbreviations instead.
115
116Examples:
117
118- `200 millilitres whipping cream`
119 quantity: `200`
120 unit: `ml`
121 food: `whipping cream`
122
123- `400 grams halloumi`
124 quantity: `400`
125 unit: `g`
126 food: `halloumi`
127
128- `1 kilogram potatoes`
129 quantity: `1`
130 unit: `kg`
131 food: `potatoes`
132
133- `2 tablespoons olive oil`
134 quantity: `2`
135 unit: `tbsp`
136 food: `olive oil`
137
138- `1 teaspoon salt`
139 quantity: `1`
140 unit: `tsp`
141 food: `salt`
142
143### Recognition mappings
144
145Normalize common variants as follows:
146
147- `mg`, `milligram`, `milligrams` → `mg`
148- `g`, `gram`, `grams` → `g`
149- `kg`, `kilogram`, `kilograms` → `kg`
150- `ml`, `millilitre`, `millilitres`, `milliliter`, `milliliters` → `ml`
151- `l`, `litre`, `litres`, `liter`, `liters` → `l`
152- `tsp`, `teaspoon`, `teaspoons` → `tsp`
153- `tbsp`, `tbs`, `tablespoon`, `tablespoons` → `tbsp`
154
155Use lowercase abbreviations exactly as written above.
156Do not add periods to abbreviations.
157Do not pluralize abbreviated units.
158Do not include temperature units such as `°C` in ingredient unit fields unless the ingredient string itself genuinely represents a temperature value.
159Do not mistake ingredient names, package descriptions, or preparation words for units.
160If an unrecognized unit is present, preserve it only when it is clearly a unit. Otherwise place the uncertain text in the note field.
161
162## Notes rules
163
164Place preparation instructions, condition, optionality, alternatives, and extra qualifiers in the note field.
165
166This includes text such as:
167
168* finely chopped
169* roughly chopped
170* divided
171* softened
172* melted
173* at room temperature
174* for serving
175* for garnish
176* plus extra
177* to taste
178* optional
179* drained
180* rinsed
181* peeled
182* seeded
183* crushed
184
185Text in parentheses should normally be placed in the note field unless it is clearly part of the ingredient name.
186
187Examples:
188
189* `400 g tomatoes (drained)` → note: `drained`
190* `1 can coconut milk (400 ml)` → keep `400 ml` in the note unless the schema has a dedicated package-size field
191* `1 tsp salt, or to taste` → note: `or to taste`
192
193Combine multiple note fragments clearly and without duplication.
194
195## Multilingual rules
196
197* Respect the grammar, word order, inflection, singular and plural forms, and unit conventions of the source language.
198* Recognize grammatical variations and common abbreviations in multiple languages.
199* Do not force English grammar onto non-English ingredient strings.
200* Preserve the original language unless translation is explicitly requested.
201* Correct only clear typographical mistakes; do not rewrite wording merely because it is unfamiliar.
202
203## Ambiguity and lossless handling
204
205* Prefer partial, lossless parsing over confident guessing.
206* If quantity is clear but unit is uncertain, preserve the uncertain unit text in notes.
207* If food is clear but preparation wording is ambiguous, keep the food and place the ambiguous remainder in notes.
208* If a token could reasonably belong to more than one field and context does not resolve it, preserve it in notes.
209* Never silently drop words, punctuation that carries meaning, package sizes, alternatives, or preparation details.
210* Never duplicate the same source text across multiple fields unless duplication is required by the output schema.
211
212## Output integrity
213
214* Return the same number of ingredient objects as input strings.
215* Preserve the exact input order.
216* Do not combine repeated ingredients.
217* Do not split one ingredient string into multiple ingredient objects.
218* Do not add ingredients that are implied by instructions or recipe context.
219* Ensure every output object corresponds directly to exactly one input string.
220* Before returning the result, normalize every recognized unit to the exact preferred output form defined in the Unit rules.
221* The final unit field must not contain plural forms or long-form metric unit names when a preferred abbreviation exists.
scrape-recipe.txt Raw
1Extract recipe data from the provided webpage content and return a single JSON object conforming to the schema.org `Recipe` format.
2
3Schema reference: https://schema.org/Recipe
4
5The input may contain HTML, extracted text, metadata, navigation, advertisements, comments, unrelated page content, or duplicated recipe information. Identify and extract only the actual recipe.
6
7Do not invent, infer, or add information that is not supported by the source. If the source does not contain enough information to identify a usable recipe, return an empty JSON object: `{}`.
8
9## Extraction rules
10
11- Prefer the recipe author’s actual content over surrounding page text, SEO text, advertisements, comments, related-recipe links, or other unrelated page content.
12- Remove duplicated content caused by responsive layouts, print views, metadata, repeated page sections, or multiple representations of the same recipe.
13- Do not include navigation labels, button text, subscription prompts, promotional text, advertisements, comments, or unrelated commentary.
14- Do not treat labels such as `Step 1`, `Step 2`, `Method`, or `Instructions` as separate instruction steps when they contain no cooking action.
15- Instruction steps must contain actual instruction text.
16- Remove redundant step-number prefixes such as `Step 1:`, `1.`, `01 —`, or similar because step ordering is already represented by the JSON structure.
17- Preserve the meaning of useful instruction section headings, but never return them as standalone instruction steps.
18- Do not create empty instruction sections or empty instruction steps.
19- Preserve the original ordering of ingredients, ingredient sections, and instructions.
20- Keep ingredient quantities, units, preparation notes, alternatives, package sizes, and optional markers associated with the correct ingredient.
21- Extract preparation time, cooking time, total time, yield, servings, temperatures, ratings, and nutritional information only when explicitly present in the source.
22- Prefer explicit values from the main recipe over values inferred from prose, comments, related content, or calculations.
23- When several representations of the recipe exist, prefer complete structured recipe data and verify it against the visible recipe content.
24
25## Recipe normalization
26
27Normalize the recipe before returning the JSON.
28
29- Convert US customary measurements to sensible metric measurements.
30- Prefer grams, kilograms, millilitres, litres, and degrees Celsius.
31- Preserve practical kitchen units such as teaspoons and tablespoons when they are clearer than very small metric quantities.
32- Preserve count-based quantities where appropriate, such as `2 eggs`, `1 onion`, `3 cloves garlic`, or `1 can tomatoes`.
33- Convert Fahrenheit cooking temperatures to Celsius.
34- Round conversions to sensible cooking values.
35- Avoid false precision such as `236.588 ml`, `28.3495 g`, or similar values that are impractical in a kitchen.
36- Use quantities that are practical to measure using normal kitchen equipment.
37- Do not change quantities that are already expressed using sensible metric or practical kitchen units.
38- Do not convert culturally meaningful, product-specific, package-based, or count-based units when conversion would make the ingredient less clear.
39- Keep all converted quantities internally consistent across ingredients and instructions.
40- When a converted quantity also appears in the instructions, use the same normalized value and unit in both places.
41
42## Ingredient formatting and unit normalization
43
44Normalize every string in `recipeIngredient` before returning the JSON.
45
46Ingredient strings should be concise, natural, and suitable for display in a recipe application.
47
48### Preferred unit output
49
50Use these exact abbreviations for metric units:
51
52- milligram → `mg`
53- gram → `g`
54- kilogram → `kg`
55- millilitre or milliliter → `ml`
56- litre or liter → `l`
57
58Use these exact abbreviations for common kitchen units:
59
60- teaspoon → `tsp`
61- tablespoon → `tbsp`
62
63Use lowercase abbreviations exactly as written.
64
65Do not:
66
67- add periods to unit abbreviations
68- pluralize abbreviated units
69- output long-form metric unit names when a preferred abbreviation exists
70- mix long-form and abbreviated versions of the same unit within one recipe
71
72Examples:
73
74- `200 millilitres whipping cream` → `200 ml whipping cream`
75- `390 grams chopped tomatoes` → `390 g chopped tomatoes`
76- `1 kilogram potatoes` → `1 kg potatoes`
77- `2 tablespoons tomato purée` → `2 tbsp tomato purée`
78- `1 teaspoon salt` → `1 tsp salt`
79- `500 milligrams saffron` → `500 mg saffron`
80
81### Unit recognition
82
83Recognize and normalize common spelling variants, abbreviations, singular forms, plural forms, and regional variants.
84
85Normalize these forms:
86
87- `mg`, `milligram`, `milligrams` → `mg`
88- `g`, `gram`, `grams` → `g`
89- `kg`, `kilogram`, `kilograms` → `kg`
90- `ml`, `millilitre`, `millilitres`, `milliliter`, `milliliters` → `ml`
91- `l`, `litre`, `litres`, `liter`, `liters` → `l`
92- `tsp`, `teaspoon`, `teaspoons` → `tsp`
93- `tbsp`, `tbs`, `tablespoon`, `tablespoons` → `tbsp`
94
95### Count-based and descriptive units
96
97Preserve concise count-based or descriptive units as words when they are appropriate, including:
98
99- egg
100- onion
101- clove
102- can
103- jar
104- bottle
105- package
106- packet
107- sachet
108- cube
109- bunch
110- bundle
111- sprig
112- slice
113- piece
114- stick
115- pinch
116- dash
117
118Use natural singular or plural grammar for these units.
119
120Examples:
121
122- `4 cloves garlic`
123- `2 cans chopped tomatoes`
124- `1 bunch parsley`
125- `3 slices bread`
126- `1 pinch salt`
127
128Do not rewrite natural count-based ingredients into artificial units such as `4 units garlic cloves`.
129
130### Practical conversions
131
132Preserve teaspoons and tablespoons when they remain practical and clear.
133
134Examples:
135
136- `1 tbsp olive oil` should remain `1 tbsp olive oil`
137- `2 tsp paprika` should remain `2 tsp paprika`
138- Do not convert `1 tsp salt` into `5 ml salt`
139- Do not convert `2 tbsp oil` into `30 ml oil` unless the source or recipe context clearly benefits from metric volume
140
141For larger US customary quantities, convert to sensible metric units.
142
143Examples:
144
145- `1 cup water` → approximately `240 ml water`
146- `2 cups flour` → a sensible weight in grams only when the ingredient and conversion are unambiguous
147- `1 lb potatoes` → approximately `450 g potatoes`
148- `8 oz cream cheese` → approximately `225 g cream cheese`
149
150Do not perform weight-to-volume or volume-to-weight conversions when ingredient density is uncertain.
151
152### Fractions and ranges
153
154- Preserve practical fractions for teaspoons and tablespoons when they are clear, such as `½ tsp` or `1½ tbsp`.
155- Decimal quantities may be used when they improve consistency, such as `0.5 kg`.
156- For converted metric values, prefer practical rounded numbers.
157- Preserve quantity ranges when the source gives a meaningful range, such as `2–3 tbsp water`.
158- Do not collapse a meaningful ingredient range unless the target schema requires a single value.
159- Do not create false precision when converting fractions.
160
161### Ingredient text
162
163- Keep ingredient preparation notes associated with the ingredient.
164- Preserve meaningful qualifiers that define the ingredient, such as `smoked paprika`, `dark soy sauce`, `full-fat coconut milk`, or `self-raising flour`.
165- Preserve optional markers and serving notes, such as `optional`, `for garnish`, `for serving`, or `to taste`.
166- Do not move preparation notes into separate ingredients.
167- Do not split one source ingredient into several ingredient strings.
168- Do not merge separate source ingredients.
169- Preserve the original ingredient ordering.
170
171Examples:
172
173- `400 g tomatoes, drained`
174- `2 tbsp olive oil, plus extra for frying`
175- `1 large onion, finely chopped`
176- `½ tsp red pepper flakes, optional`
177- `salt and freshly ground black pepper, to taste`
178
179## Instruction normalization
180
181Normalize `recipeInstructions` before returning the JSON.
182
183### Required behavior
184
185- Every final `HowToStep` must contain at least one concrete action that a cook can perform.
186- Never return a `HowToStep` whose text consists only of a title, label, section heading, phase name, or step number.
187- Standalone headings must not appear as separate instruction entries.
188- Do not create separate steps merely to preserve the source page’s visual structure.
189- Do not preserve heading punctuation such as trailing colons.
190- The final instruction list must contain only meaningful cooking actions.
191- Preserve the original cooking order.
192
193Examples of forbidden heading-only steps include:
194
195- `Season Chicken`
196- `Sear the Chicken`
197- `Sauté Garlic`
198- `Add Lemon and Spices`
199- `Bake the Chicken`
200- `Garnish and Serve`
201- `To serve`
202- `Serving`
203- `For serving`
204- `Make the sauce`
205- `Prepare the filling`
206- `Method`
207- `Instructions`
208- `Step 1`
209
210### Heading handling
211
212When a heading is immediately followed by an instruction:
213
214- Omit the heading if the following instruction is clear without it.
215- Merge the heading naturally into the following instruction if it adds useful context.
216- Never return the heading as its own `HowToStep`.
217
218Examples:
219
220Input:
221
222`Season Chicken:`
223
224`Pat the chicken thighs dry, then season with salt and pepper.`
225
226Output:
227
228`Pat the chicken thighs dry, then season with salt and pepper.`
229
230Input:
231
232`Make the sauce:`
233
234`Add the garlic, lemon juice, and stock to the pan.`
235
236Output:
237
238`To make the sauce, add the garlic, lemon juice, and stock to the pan.`
239
240Input:
241
242`Garnish and Serve:`
243
244`Top with parsley and lemon slices, then serve.`
245
246Output:
247
248`Top with parsley and lemon slices, then serve.`
249
250### Step consolidation
251
252- Merge adjacent fragments when one contains only a heading and the next contains the actual instruction.
253- Merge very short preparatory actions into the following instruction when they are directly related and doing so improves readability.
254- Do not split a coherent cooking action into multiple steps merely because the source uses separate visual blocks.
255- Do not over-merge unrelated cooking actions into excessively long steps.
256- Prefer a concise sequence of meaningful steps over many tiny fragments.
257- The final instruction list should normally contain fewer steps than the raw source when the source separates headings from their instructions.
258
259### Temperature and unit consistency
260
261- Use Celsius in instructions.
262- When the source gives both Fahrenheit and Celsius, retain only the sensible Celsius value unless both are needed for clarity.
263- Use normalized unit abbreviations consistently in instructions when quantities are repeated.
264- Do not use long-form metric unit names in instructions when the preferred abbreviation is clearer.
265
266Examples:
267
268- `Bake at 375°F (190°C)` → `Bake at 190°C`
269- `Add 200 millilitres cream` → `Add 200 ml cream`
270- `Stir in 2 tablespoons olive oil` → `Stir in 2 tbsp olive oil`
271
272### Final instruction validation
273
274Before returning the JSON, inspect every instruction step.
275
276For each step, verify:
277
2781. It contains a concrete action a cook can perform.
2792. It contains more than only a heading, label, phase name, or step number.
2803. It does not duplicate information already represented by another step.
2814. It is not empty or whitespace-only.
2825. It is not merely explanatory text without an actionable instruction.
2836. Its quantities, units, and temperatures use the same normalized forms as the ingredients.
284
285If a step fails these checks, merge it with the appropriate adjacent step or remove it.
286
287## Language rules
288
289- If the source recipe is not in English, translate all recipe text into English.
290- Translate the title, description, ingredient names, ingredient notes, section headings, instructions, yield text, and relevant recipe metadata.
291- Preserve proper nouns, brand names, geographical names, and culturally specific dish names when translating them would make the recipe less precise or less recognizable.
292- Use clear, natural cooking English rather than literal word-for-word translation.
293- After translation, apply all unit normalization and abbreviation rules to the translated recipe.
294- Do not leave untranslated unit names when a preferred English abbreviation exists.
295
296## Image rules
297
298- If the source contains a clear primary image of the finished recipe, include it in the `image` field.
299- Prefer the main recipe hero image or the highest-quality image that clearly depicts the completed dish.
300- Ignore logos, author portraits, advertisements, icons, social media images, decorative backgrounds, unrelated gallery images, and tracking pixels.
301- Prefer image URLs found in recipe structured data, Open Graph metadata, Twitter Card metadata, or the main recipe content.
302- When multiple versions of the same image are available, choose the largest practical image rather than a thumbnail or low-resolution preview.
303- If the source provides an image array, select the best single primary image for the finished dish rather than returning multiple images.
304- The `image` field must contain either:
305 - an absolute URL string, for example: `"https://example.com/images/recipe.jpg"`
306 - or an `ImageObject` containing an absolute `url` property, for example: `{ "@type": "ImageObject", "url": "https://example.com/images/recipe.jpg" }`
307- Use only the `image` field.
308- Do not use `thumbnail`, `thumbnailUrl`, `contentUrl`, or other image fields.
309- Do not use relative URLs unless they can be resolved unambiguously against the webpage URL.
310- Do not use embedded base64 data, data URIs, blob URLs, local file paths, or temporary browser-generated URLs.
311- Do not invent, rewrite, guess, or repair an image URL.
312- If no suitable recipe image is present, omit the `image` field.
313
314## Final validation
315
316Before returning the JSON, verify all of the following:
317
3181. The output is a single valid schema.org `Recipe` JSON object.
3192. Every ingredient from the source is represented once and in the original order.
3203. Every recognized metric or kitchen unit uses the preferred abbreviation.
3214. No ingredient uses long-form metric units such as `grams`, `millilitres`, or `kilograms`.
3225. Ingredient quantities are practical and do not contain false precision.
3236. Instruction quantities and temperatures are consistent with the normalized ingredients.
3247. No instruction step consists only of a heading, label, or step number.
3258. The image, when present, is a valid absolute URL or an `ImageObject` with an absolute `url`.
3269. Unsupported fields are omitted rather than guessed.
32710. No information has been invented.
328
329Correct any violations before returning the final JSON.
330
331## Output rules
332
333- Return only the final JSON object.
334- Do not include Markdown, explanations, comments, warnings, or code fences.
335- Ensure the JSON is valid and syntactically complete.
336- Omit unsupported optional fields rather than guessing their values.
337- Use an empty object only when no usable recipe can be extracted.