$ python utils/recipe_maintenance.py
Working directory: /app
------------------------------------------------------------
🛠️ Starting recipe maintenance...
==================================================
🔧 Full maintenance mode
📋 Step 1: Processing unparsed recipes...
🔍 Scanning recipes for parsing status...
2026-06-14 18:06:37,213 - mealie_client - INFO - MealieClient initialized in API mode
🔍 Scanning for unparsed recipes...
🔧 Initializing USearch ANN index with dimension 4096
✅ USearch index initialized for cosine similarity search
✅ USearch index loaded with 351 vectors
2026-06-14 18:06:37,225 - recipe_rag - INFO - ✅ ANN index loaded with 351 recipes
📦 Found 100 known unparsed recipes in local index
✅ All recipes have known parsing status
📋 Returning 100 unparsed recipes
🔧 Initializing USearch ANN index with dimension 4096
✅ USearch index initialized for cosine similarity search
✅ USearch index loaded with 351 vectors
2026-06-14 18:06:37,231 - recipe_rag - INFO - ✅ ANN index loaded with 351 recipes
✅ Found 100 recipes needing parsing
🚀 Parsing 100 recipes...
🔍 Validating Mealie connection...
2026-06-14 18:06:37,875 - config - INFO - ✅ Mealie connection successful: https://mealie.geevers.net
2026-06-14 18:06:38,102 - mealie_client - INFO - MealieClient initialized in API mode
🔍 Scanning for unparsed recipes...
🔧 Initializing USearch ANN index with dimension 4096
✅ USearch index initialized for cosine similarity search
✅ USearch index loaded with 351 vectors
2026-06-14 18:06:38,114 - recipe_rag - INFO - ✅ ANN index loaded with 351 recipes
📦 Found 100 known unparsed recipes in local index
✅ All recipes have known parsing status
📋 Returning 100 unparsed recipes
🔍 Scanning for unparsed recipes... found 100
2026-06-14 18:06:38,116 - mealie_client - INFO - MealieClient initialized in API mode
Parsing: 0%| | 0/100 [00:00<?, ?it/s]2026-06-14 18:06:41,803 - mealie_client - INFO - MealieClient initialized in API mode
2026-06-14 18:06:44,027 - __main__ - INFO - Loaded 2784 canonical foods from Mealie
2026-06-14 18:06:44,035 - __main__ - INFO - Direct LLM parsed 10 ingredients, 9 matched to canonical
2026-06-14 18:06:44,035 - mealie_client - INFO - MealieClient initialized in API mode
2026-06-14 18:06:44,124 - __main__ - INFO - Loaded 47 canonical units from Mealie
2026-06-14 18:06:44,124 - mealie_client - INFO - MealieClient initialized in API mode
Parsing: 0%| | 0/100 [00:06<?, ?it/s]
Traceback (most recent call last):
File "/app/mealie_parse.py", line 1847, in <module>
asyncio.run(main(conf_thresh=args.conf,
File "/usr/local/lib/python3.11/asyncio/runners.py", line 190, in run
return runner.run(main)
^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/asyncio/runners.py", line 118, in run
return self._loop.run_until_complete(task)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/asyncio/base_events.py", line 654, in run_until_complete
return future.result()
^^^^^^^^^^^^^^^
File "/app/mealie_parse.py", line 1671, in main
patch_recipe(slug, new_list)
File "/app/mealie_parse.py", line 1274, in patch_recipe
(DATA_DIR / "runtime" / "last_payload.json").write_text(json.dumps(payload, indent=2))
File "/usr/local/lib/python3.11/pathlib.py", line 1078, in write_text
with self.open(mode='w', encoding=encoding, errors=errors, newline=newline) as f:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/pathlib.py", line 1044, in open
return io.open(self, mode, buffering, encoding, errors, newline)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: '/app/data/runtime/last_payload.json'
2026-06-14 18:06:44,339 - __main__ - WARNING - ⚠️ Recipe parsing had issues
⚠️ Recipe parsing had issues
🔄 Step 2: Syncing local database with Mealie...
🔍 Checking RecipeRAG index completeness...
2026-06-14 18:06:44,339 - mealie_client - INFO - MealieClient initialized in API mode
🔧 Initializing USearch ANN index with dimension 4096
✅ USearch index initialized for cosine similarity search
✅ USearch index loaded with 351 vectors
2026-06-14 18:06:44,523 - recipe_rag - INFO - ✅ ANN index loaded with 351 recipes
✅ Mealie: 117 recipes, RecipeRAG: 117 indexed
Mealie has 117, local has 117
🔄 Syncing local database with Mealie...
📡 Fetching recipe summaries from Mealie...
2026-06-14 18:06:44,524 - mealie_client - INFO - MealieClient initialized in API mode
Found 117 recipes in Mealie
🔧 Initializing USearch ANN index with dimension 4096
✅ USearch index initialized for cosine similarity search
✅ USearch index loaded with 351 vectors
2026-06-14 18:06:44,688 - recipe_rag - INFO - ✅ ANN index loaded with 351 recipes
Found 117 recipes in local DB
✅ All 117 recipes are up to date!
✅ All 117 recipes already up to date
🏷️ Step 3: Tagging untagged recipes...
🏷️ Found 117 untagged recipes, running bulk tagger...
🔍 Validating system for bulk tagging...
2026-06-14 18:06:44,877 - __main__ - INFO - Validating system for bulk tagging
2026-06-14 18:06:44,878 - config - INFO - ============================================================
2026-06-14 18:06:44,878 - config - INFO - 🔍 VALIDATING SYSTEM DEPENDENCIES (WITH HTTP FALLBACKS)...
2026-06-14 18:06:44,878 - config - INFO - ============================================================
2026-06-14 18:06:44,954 - config - INFO - ✅ Mealie connection successful: https://mealie.geevers.net
2026-06-14 18:06:45,117 - config - INFO - ✅ OpenRouter connection successful
2026-06-14 18:06:45,117 - config - INFO - ✅ Using model: openai/gpt-4o-mini
2026-06-14 18:06:45,118 - config - INFO - ============================================================
2026-06-14 18:06:45,119 - config - INFO - ✅ ALL DEPENDENCIES VALIDATED - SYSTEM READY!
2026-06-14 18:06:45,119 - config - INFO - ✅ Mealie: Connected and authenticated
2026-06-14 18:06:45,119 - config - INFO - ✅ OpenRouter: Connected with required model
2026-06-14 18:06:45,119 - config - INFO - ✅ Embeddings: Qwen3-Embedding-8B (OpenRouter API)
2026-06-14 18:06:45,119 - config - INFO - ✅ SYSTEM READY FOR PRODUCTION
2026-06-14 18:06:45,119 - config - INFO - ============================================================
2026-06-14 18:06:45,120 - __main__ - INFO - Found 117 recipes needing cuisine classification
📝 Found 117 recipes needing cuisine classification
2026-06-14 18:06:45,121 - __main__ - INFO - Using configuration: batch_size=13, max_concurrent=10, environment=development
⚙️ Using configuration: batch_size=13, max_concurrent=10
Environment: development
🚀 Auto-confirming bulk tagging of 117 recipes
╭───────────────────────────── Operation Started ──────────────────────────────╮
│ 🚀 Bulk Tagging Recipes - Processing in batches of 13 │
│ 📊 Processing 117 items │
╰──────────────────────────────────────────────────────────────────────────────╯
🔄 Processing batch 1/9 (13 recipes)
2026-06-14 18:06:45,371 - mealie_client - INFO - MealieClient initialized in API mode
2026-06-14 18:06:45,371 - mealie_client - INFO - MealieClient initialized in API mode
2026-06-14 18:06:45,489 - automatic_tagger - INFO - 🔍 Analyzing recipe: AARDAPPEL, ARTISJOK & SPLIJTKOOL MET GEBAKKEN EIEREN
2026-06-14 18:06:45,499 - batch_llm_processor - INFO - 📦 Loaded 300 cache entries from persistent storage
2026-06-14 18:06:45,500 - batch_llm_processor - INFO - 🔄 Using OpenRouter API for chat completions
2026-06-14 18:06:45,500 - batch_llm_processor - INFO - 💡 Enhanced caching provides >90% hit rates for repeated analyses
2026-06-14 18:06:45,500 - batch_llm_processor - INFO - ✅ aiohttp available - concurrent processing enabled
2026-06-14 18:06:45,500 - batch_llm_processor - INFO - 🔄 Preloading cache with 1 common queries...
2026-06-14 18:06:45,510 - batch_llm_processor - INFO - ✅ Cache preloading complete
2026-06-14 18:06:45,511 - batch_llm_processor - INFO - 🍱 Preloaded cache with common shopping refinement patterns
2026-06-14 18:06:45,587 - automatic_tagger - INFO - 🔍 Recipe analysis complete: prep=False, cuisine='European', tags=[]
2026-06-14 18:06:45,644 - automatic_tagger - INFO - 🏷️ Recipe 153b5062-3eb5-474b-a111-ba8dc2638c60: existing_tags=['De Groene Bakplaat'], recommended=[], adding=[]
2026-06-14 18:06:45,645 - mealie_client - INFO - MealieClient initialized in API mode
2026-06-14 18:06:45,750 - automatic_tagger - INFO - 🔍 Analyzing recipe: AH Portugese kip piri piri verspakket
2026-06-14 18:06:45,751 - automatic_tagger - INFO - 🔍 Recipe analysis complete: prep=False, cuisine='Portuguese', tags=[]
2026-06-14 18:06:45,786 - automatic_tagger - INFO - 🏷️ Recipe 75ea1416-5b43-4a2e-b77b-4de316c5b023: existing_tags=[], recommended=[], adding=[]
2026-06-14 18:06:45,822 - automatic_tagger - INFO - 📋 Loaded 1 categories from Mealie
2026-06-14 18:06:45,822 - automatic_tagger - WARNING - Category 'European' not found in Mealie cache
2026-06-14 18:06:45,822 - mealie_client - INFO - MealieClient initialized in API mode
2026-06-14 18:06:46,112 - automatic_tagger - INFO - 🔍 Analyzing recipe: AUBERGINE MET TOMATEN, HARISSA & AMANDELEN
2026-06-14 18:06:46,113 - automatic_tagger - INFO - 🔍 Recipe analysis complete: prep=False, cuisine='Mediterranean', tags=[]
2026-06-14 18:06:46,156 - automatic_tagger - INFO - 🏷️ Recipe 293c203d-437b-4345-82e2-676fd0fcabf0: existing_tags=['De Groene Bakplaat'], recommended=[], adding=[]
2026-06-14 18:06:46,157 - mealie_client - INFO - MealieClient initialized in API mode
2026-06-14 18:06:46,267 - automatic_tagger - INFO - 🔍 Analyzing recipe: AVOCADO'S & ASPERGES MET SINAASAPPEL
2026-06-14 18:06:46,268 - automatic_tagger - INFO - 🔍 Recipe analysis complete: prep=False, cuisine='Mediterranean', tags=[]
2026-06-14 18:06:46,316 - automatic_tagger - INFO - 🏷️ Recipe 0f3fd838-4d5d-4a72-87f1-90425963855c: existing_tags=['De Groene Bakplaat'], recommended=[], adding=[]
2026-06-14 18:06:46,317 - mealie_client - INFO - MealieClient initialized in API mode
2026-06-14 18:06:46,420 - automatic_tagger - INFO - 🔍 Analyzing recipe: BIETJESCURRY MET KIKKERERWTEN & KOKOS
2026-06-14 18:06:46,421 - automatic_tagger - INFO - 🔍 Recipe analysis complete: prep=False, cuisine='Indian', tags=[]
2026-06-14 18:06:46,466 - automatic_tagger - INFO - 🏷️ Recipe b0e21886-bdc5-4655-b17a-9678b1ee4aa5: existing_tags=['De Groene Bakplaat'], recommended=[], adding=[]
2026-06-14 18:06:46,467 - automatic_tagger - WARNING - Category 'Asian' not found in Mealie cache
2026-06-14 18:06:46,467 - mealie_client - INFO - MealieClient initialized in API mode
2026-06-14 18:06:46,564 - automatic_tagger - INFO - 🔍 Analyzing recipe: BLOEMKOOL MET KIKKERERWTEN & SPLIJTKOOL
2026-06-14 18:06:46,565 - automatic_tagger - INFO - 🔍 Recipe analysis complete: prep=False, cuisine='Mediterranean', tags=[]
2026-06-14 18:06:46,608 - automatic_tagger - INFO - 🏷️ Recipe 98ab8ff9-f597-401f-bbf8-87d3a5c28e0a: existing_tags=['De Groene Bakplaat'], recommended=[], adding=[]
2026-06-14 18:06:46,609 - mealie_client - INFO - MealieClient initialized in API mode
2026-06-14 18:06:46,807 - automatic_tagger - INFO - 🔍 Analyzing recipe: BOERENKOOL-BORLOTTI-MINESTRONE MET DITALINI
2026-06-14 18:06:46,807 - automatic_tagger - INFO - 🔍 Recipe analysis complete: prep=False, cuisine='Italian', tags=[]
2026-06-14 18:06:46,873 - automatic_tagger - INFO - 🏷️ Recipe 538c52bc-d4fa-4032-a7a2-9d2003fcaa8d: existing_tags=['De Groene Bakplaat'], recommended=[], adding=[]
2026-06-14 18:06:46,873 - automatic_tagger - WARNING - Category 'European' not found in Mealie cache
2026-06-14 18:06:46,873 - mealie_client - INFO - MealieClient initialized in API mode
2026-06-14 18:06:47,069 - automatic_tagger - INFO - 🔍 Analyzing recipe: BONENCHILI MET AVOCADOSALSA
2026-06-14 18:06:47,070 - automatic_tagger - INFO - 🔍 Recipe analysis complete: prep=False, cuisine='Mexican', tags=[]
2026-06-14 18:06:47,121 - automatic_tagger - INFO - 🏷️ Recipe 560c5a65-6665-48da-93c5-161a85fee2db: existing_tags=['De Groene Bakplaat'], recommended=[], adding=[]
2026-06-14 18:06:47,122 - automatic_tagger - WARNING - Category 'Latin American' not found in Mealie cache
2026-06-14 18:06:47,122 - mealie_client - INFO - MealieClient initialized in API mode
2026-06-14 18:06:47,241 - automatic_tagger - INFO - 🔍 Analyzing recipe: Baked 'feta' pasta met burrata
2026-06-14 18:06:47,242 - automatic_tagger - INFO - 🔍 Recipe analysis complete: prep=False, cuisine='Southern Italian', tags=[]
2026-06-14 18:06:47,315 - automatic_tagger - INFO - 🏷️ Recipe bebc4b6b-1d39-4b50-882d-5667354980e9: existing_tags=[], recommended=[], adding=[]
2026-06-14 18:06:47,315 - automatic_tagger - WARNING - Category 'European' not found in Mealie cache
2026-06-14 18:06:47,315 - mealie_client - INFO - MealieClient initialized in API mode
2026-06-14 18:06:47,416 - automatic_tagger - INFO - 🔍 Analyzing recipe: Burrata salade met tomaat – in 10 min. klaar
2026-06-14 18:06:47,417 - automatic_tagger - INFO - 🔍 Recipe analysis complete: prep=False, cuisine='Italian', tags=[]
2026-06-14 18:06:47,459 - automatic_tagger - INFO - 🏷️ Recipe da6b0437-5b06-4029-98df-5949d912f408: existing_tags=[], recommended=[], adding=[]
2026-06-14 18:06:47,459 - automatic_tagger - WARNING - Category 'European' not found in Mealie cache
2026-06-14 18:06:47,459 - mealie_client - INFO - MealieClient initialized in API mode
2026-06-14 18:06:47,611 - automatic_tagger - INFO - 🔍 Analyzing recipe: CANNELLINIBONENFALAFEL MET AARDAPPELPARTJES
2026-06-14 18:06:47,612 - automatic_tagger - INFO - 🔍 Recipe analysis complete: prep=False, cuisine='Mediterranean', tags=[]
2026-06-14 18:06:47,659 - automatic_tagger - INFO - 🏷️ Recipe 31e13e6c-fa7d-40f6-8367-8b3977073a7e: existing_tags=['De Groene Bakplaat'], recommended=[], adding=[]
============================================================
🛑 Cancelling job...
2026-06-14 18:06:47,659 - mealie_client - INFO - MealieClient initialized in API mode
⚠️ Process not responding, forcing kill...
🛑 Job cancelled