File size: 2,960 Bytes
a4577de
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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