from modules.llm.summarizer.helpers.db_helper import get_scripture_from_db from modules.llm.summarizer.helpers.llm_helper import summarize_scripture_verse from modules.llm.summarizer.models import ScriptureRequest, ScriptureVerseSummary from google.cloud import firestore import os import json from google.oauth2 import service_account # Load Firebase credentials from environment variable service_account_info = os.getenv("FIREBASE_SERVICE_ACCOUNT_JSON") if not service_account_info: raise ValueError("FIREBASE_SERVICE_ACCOUNT_JSON not found in environment variables.") # Parse the JSON (it’s stored as a string in env) credentials_dict = json.loads(service_account_info) credentials = service_account.Credentials.from_service_account_info(credentials_dict) # Initialize Firestore client with these credentials db = firestore.AsyncClient(credentials=credentials, project=credentials.project_id) # or db = firestore.Client(credentials=credentials, project=credentials.project_id) async def svc_summarize_scripture_verse(req: ScriptureRequest) -> ScriptureVerseSummary: """ Summarizes a scripture verse, with Firestore caching per verse and language. Firestore structure: /scripture_summaries/{scripture_name_global_index}/meanings/{target_language} """ # Step 1: Get scripture data scripture_data = await get_scripture_from_db(req) scripture_name = scripture_data.get("scripture_name", "UnknownScripture") global_index = scripture_data.get("_global_index", -1) target_language = req.target_language.lower() # Compose the document path doc_id = f"{scripture_name}_{global_index}".replace(" ", "_") base_ref = db.collection("scripture_summaries").document(doc_id) meaning_ref = base_ref.collection("meanings").document(target_language) # Step 2: Check for cached version cached_doc = await meaning_ref.get() if cached_doc.exists: print(f"✅ Using cached summary for {scripture_name} {global_index} ({target_language})") return ScriptureVerseSummary(**cached_doc.to_dict()) print(f"🧠 Generating new summary for {scripture_name} {global_index} ({target_language})") # Step 3: Generate new summary with LLM summary = summarize_scripture_verse( scripture_data.get("text","--no lyrics available--"), scripture_data.get("translation","--no translation available--"), scripture_data.get("word_by_word_native","--no word-by-word meaning available--"), target_language, ) summary_data = summary.model_dump() # Step 4: Ensure parent document exists await base_ref.set( { "scripture_name": scripture_name, "global_index": global_index, }, merge=True, ) # Step 5: Store meaning under nested language doc await meaning_ref.set(summary_data) print(f"✅ Stored summary for {scripture_name} {global_index} in Firestore") return summary