Nhughes09 commited on
Commit Β·
189b02a
1
Parent(s): f22fcf7
Smart tiered loop: RSS 5min, AI 30min - efficient, no rate limits
Browse files
app.py
CHANGED
|
@@ -596,31 +596,93 @@ def fetch_ai_update():
|
|
| 596 |
|
| 597 |
|
| 598 |
def background_updater():
|
| 599 |
-
"""
|
| 600 |
logger.info("="*60)
|
| 601 |
-
logger.info("π BACKGROUND UPDATER INITIALIZED")
|
| 602 |
-
logger.info("
|
| 603 |
-
logger.info("
|
|
|
|
|
|
|
| 604 |
logger.info("="*60)
|
| 605 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 606 |
update_count = 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 607 |
while True:
|
|
|
|
|
|
|
| 608 |
try:
|
| 609 |
-
|
| 610 |
-
|
| 611 |
-
|
| 612 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 613 |
|
| 614 |
-
|
| 615 |
-
|
|
|
|
|
|
|
| 616 |
|
| 617 |
-
logger.info(f"\n{'#'*60}")
|
| 618 |
-
logger.info(f"β
UPDATE #{update_count} SAVED - Next update in 1 hour")
|
| 619 |
-
logger.info(f"{'#'*60}\n")
|
| 620 |
except Exception as e:
|
| 621 |
-
logger.error(f"β
|
| 622 |
|
| 623 |
-
|
|
|
|
| 624 |
|
| 625 |
|
| 626 |
# Start background thread
|
|
|
|
| 596 |
|
| 597 |
|
| 598 |
def background_updater():
|
| 599 |
+
"""Smart tiered background updates - efficient and avoids rate limits."""
|
| 600 |
logger.info("="*60)
|
| 601 |
+
logger.info("π SMART BACKGROUND UPDATER INITIALIZED")
|
| 602 |
+
logger.info(" π° RSS Check: Every 5 minutes (FREE)")
|
| 603 |
+
logger.info(" π€ AI Analysis: Every 30 minutes")
|
| 604 |
+
logger.info(" π Slow Data: Once per day")
|
| 605 |
+
logger.info(" π Starting first full update immediately...")
|
| 606 |
logger.info("="*60)
|
| 607 |
|
| 608 |
+
# Timing configuration
|
| 609 |
+
RSS_INTERVAL = 300 # 5 minutes (RSS is free)
|
| 610 |
+
AI_INTERVAL = 1800 # 30 minutes (AI calls)
|
| 611 |
+
SLOW_DATA_INTERVAL = 86400 # 24 hours (unemployment etc)
|
| 612 |
+
|
| 613 |
+
# Track last update times
|
| 614 |
+
last_rss = 0
|
| 615 |
+
last_ai = 0
|
| 616 |
+
last_slow = 0
|
| 617 |
+
|
| 618 |
update_count = 0
|
| 619 |
+
rss_count = 0
|
| 620 |
+
|
| 621 |
+
# First run: do full AI update immediately
|
| 622 |
+
try:
|
| 623 |
+
update_count += 1
|
| 624 |
+
logger.info(f"\n{'#'*60}")
|
| 625 |
+
logger.info(f"π€ INITIAL FULL AI UPDATE #{update_count}")
|
| 626 |
+
logger.info(f"{'#'*60}")
|
| 627 |
+
|
| 628 |
+
data = fetch_ai_update()
|
| 629 |
+
save_cached_data(data)
|
| 630 |
+
last_ai = time.time()
|
| 631 |
+
last_rss = time.time()
|
| 632 |
+
|
| 633 |
+
logger.info(f"β
Initial update complete - entering smart loop")
|
| 634 |
+
except Exception as e:
|
| 635 |
+
logger.error(f"β Initial update failed: {e}")
|
| 636 |
+
|
| 637 |
+
# Smart loop
|
| 638 |
while True:
|
| 639 |
+
now = time.time()
|
| 640 |
+
|
| 641 |
try:
|
| 642 |
+
# Check if RSS update needed (every 5 min)
|
| 643 |
+
if now - last_rss >= RSS_INTERVAL:
|
| 644 |
+
rss_count += 1
|
| 645 |
+
logger.info(f"\n{'='*40}")
|
| 646 |
+
logger.info(f"π° RSS CHECK #{rss_count} (every 5 min)")
|
| 647 |
+
logger.info(f"{'='*40}")
|
| 648 |
+
|
| 649 |
+
# Just fetch RSS, no AI call
|
| 650 |
+
news = fetch_all_news()
|
| 651 |
+
news_context = format_news_for_prompt(news)
|
| 652 |
+
|
| 653 |
+
# Check if there's interesting new content
|
| 654 |
+
if len(news_context) > 500:
|
| 655 |
+
logger.info(f"π° Fresh news available: {len(news_context)} chars")
|
| 656 |
+
else:
|
| 657 |
+
logger.info("π° No significant new content")
|
| 658 |
+
|
| 659 |
+
last_rss = now
|
| 660 |
+
|
| 661 |
+
# Check if AI analysis needed (every 30 min)
|
| 662 |
+
if now - last_ai >= AI_INTERVAL:
|
| 663 |
+
update_count += 1
|
| 664 |
+
logger.info(f"\n{'#'*60}")
|
| 665 |
+
logger.info(f"π€ AI ANALYSIS #{update_count} (every 30 min)")
|
| 666 |
+
logger.info(f"{'#'*60}")
|
| 667 |
+
|
| 668 |
+
data = fetch_ai_update()
|
| 669 |
+
save_cached_data(data)
|
| 670 |
+
last_ai = now
|
| 671 |
+
|
| 672 |
+
# Calculate next update times
|
| 673 |
+
next_ai = AI_INTERVAL // 60
|
| 674 |
+
logger.info(f"β
AI update complete - next in {next_ai} min")
|
| 675 |
|
| 676 |
+
# Log status every loop
|
| 677 |
+
time_to_next_rss = max(0, RSS_INTERVAL - (now - last_rss))
|
| 678 |
+
time_to_next_ai = max(0, AI_INTERVAL - (now - last_ai))
|
| 679 |
+
logger.info(f"β° Next: RSS in {int(time_to_next_rss)}s, AI in {int(time_to_next_ai)}s")
|
| 680 |
|
|
|
|
|
|
|
|
|
|
| 681 |
except Exception as e:
|
| 682 |
+
logger.error(f"β Loop error: {e}")
|
| 683 |
|
| 684 |
+
# Sleep for 60 seconds between checks (efficient)
|
| 685 |
+
time.sleep(60)
|
| 686 |
|
| 687 |
|
| 688 |
# Start background thread
|