Add phase 4: AI cleanup and photo/text import via OpenAI
- recipes/ai.py: Chat Completions with strict JSON schema (Structured Outputs), Pydantic re-validation, plausibility clamping, prompt treats input as data only - "Mit KI aufbereiten" on create/edit form returns an editable draft - Import page: photo/screenshot (vision, downscaled JPEG, not stored) and pasted text; drafts pre-fill the recipe form with a preview - Clear UI messages for timeout, rate limit, quota, auth, model and connection errors; without OPENAI_API_KEY AI features show a notice - Optional per-user and global daily AI limits (default unlimited) - Tests for response parsing, schema strictness, error mapping, views Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
9256e94286
commit
1bf8ef8b65
+4
-3
@@ -81,9 +81,10 @@ class RecipeForm(forms.ModelForm):
|
||||
self.fields["servings"].min_value = 1
|
||||
recipe = self.instance
|
||||
if recipe.pk and not self.is_bound:
|
||||
self.initial["ingredients_text"] = parsing.ingredients_to_text(recipe.ingredients.all())
|
||||
self.initial["steps_text"] = parsing.steps_to_text([s.text for s in recipe.steps.all()])
|
||||
self.initial["tags_text"] = ", ".join(t.name for t in recipe.tags.all())
|
||||
# setdefault: an AI draft passed as initial wins over the stored values
|
||||
self.initial.setdefault("ingredients_text", parsing.ingredients_to_text(recipe.ingredients.all()))
|
||||
self.initial.setdefault("steps_text", parsing.steps_to_text([s.text for s in recipe.steps.all()]))
|
||||
self.initial.setdefault("tags_text", ", ".join(t.name for t in recipe.tags.all()))
|
||||
if recipe.pk:
|
||||
remaining = settings.IMAGE_MAX_PER_RECIPE - recipe.images.count()
|
||||
self.fields["photos"].label = "Weitere Fotos"
|
||||
|
||||
Reference in New Issue
Block a user