gemma-sage / oracle_module.py
neuralworm's picture
fix: Refine Oracle Output (Remove ELS Text, Ensure English)
baca426
import os
import sys
import json
import sqlite3
import math
import logging
from datetime import datetime
logger = logging.getLogger("app.oracle")
# Paths
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
PSALM_DIR = os.path.join(BASE_DIR, "daily_psalms_api")
def get_oracle_data(name: str = "Seeker", topic: str = "humanity", date_str: str = ""):
"""
Consolidated Oracle Tool with Legacy Parity.
date_str: YYYY-MM-DD
"""
# 1. Prepare Environment
original_cwd = os.getcwd()
if PSALM_DIR not in sys.path: sys.path.append(PSALM_DIR)
os.chdir(PSALM_DIR)
try:
from gematria import calculate_gematria
from utils import date_to_words as ps_date_to_words
import torah
import quran
import bible
# 2. Date Handling
if not date_str or date_str.lower() == "today":
date_str = datetime.now().strftime("%Y-%m-%d")
clean_date = date_str.replace("-00-00", "").replace("-00", "")
date_words = ps_date_to_words(clean_date)
# 3. Gematria Key Calculation (Legacy: Name + Date)
search_input = f"{name} {topic}".strip()
combined = f"{search_input} {date_words}".strip()
gematria_sum = calculate_gematria(combined)
# ELS Constant Adjustment
ADJUSTMENT_CONSTANT = 137.035999177
adjusted_sum = math.ceil(gematria_sum + (gematria_sum / ADJUSTMENT_CONSTANT))
results_payload = {
"query_context": {"name": name, "topic": topic, "date": date_str, "signal": adjusted_sum},
"wisdom_nodes": []
}
# --- Helper for formatted nodes ---
def format_node(match, category, els_text="", els_signal=0):
if not match: return None
try:
trans = ""
# Handle different tuple structures
if len(match) == 5:
words, trans, book, ch, vs = match
elif len(match) == 4:
words, book, ch, vs = match
else:
return None
# Dynamic Translation Fallback if 'trans' is missing/empty
if not trans or trans == words:
try:
from deep_translator import GoogleTranslator
trans = GoogleTranslator(source='auto', target='en').translate(words)
except: trans = "..."
return {
"category": category,
"reference": f"{book} {ch}:{vs}",
"original": words,
"english": trans,
"els_signal": els_signal
}
except Exception as e:
logger.error(f"Error formatting node: {e}")
return None
# --- A. PSALM (Torah ELS) ---
# Legacy: Torah ELS -> Psalm
els_results_torah = torah.process_json_files(1, 1, adjusted_sum, "1,-1", 0, "en", True, True, True, True)
if els_results_torah:
t_res = els_results_torah[0]
els_text_heb = t_res.get("result_text", "")
els_text_eng = t_res.get("translated_text", "")
# Fallback Translation
if not els_text_eng or els_text_eng == els_text_heb:
try:
from deep_translator import GoogleTranslator
els_text_eng = GoogleTranslator(source='auto', target='en').translate(els_text_heb)
except: pass
torah_signal = calculate_gematria(els_text_heb)
# Find Psalm
db_path = os.path.join(PSALM_DIR, "gematria.db")
if os.path.exists(db_path):
try:
with sqlite3.connect(db_path) as conn:
c = conn.cursor()
c.execute("SELECT words, translation, book, chapter, verse FROM results WHERE gematria_sum = ? AND book = 'Psalms' ORDER BY LENGTH(words) ASC LIMIT 1", (torah_signal,))
p_row = c.fetchone()
node = format_node(p_row, "Biblical Psalm", els_text_heb, torah_signal)
if node: results_payload["wisdom_nodes"].append(node)
except: pass
# --- B. REVELATION (Matthew ELS) ---
# Legacy: Matthew (Book 40) ELS -> Revelation
matthew_results = bible.process_json_files(40, 40, adjusted_sum, "1,-1", 0, "en", True, True, True)
# Handle list structure and potential error dicts
valid_m_res = [r for r in matthew_results if isinstance(r, dict) and "error" not in r]
if valid_m_res:
m_res = None
# Prefer round 1
r1 = [r for r in valid_m_res if r.get('round') == 1]
if r1: m_res = r1[0]
else: m_res = valid_m_res[0]
if m_res and "result_text" in m_res:
matthew_text = m_res["result_text"]
matthew_signal = calculate_gematria(matthew_text)
# Find Revelation
db_path = os.path.join(PSALM_DIR, "bible.db")
if os.path.exists(db_path):
with sqlite3.connect(db_path) as conn:
c = conn.cursor()
c.execute("SELECT words, book, chapter, verse FROM results WHERE gematria_sum = ? AND book = 'Revelation' ORDER BY LENGTH(words) ASC LIMIT 1", (matthew_signal,))
b_row = c.fetchone()
node = format_node(b_row, "NT Prophecy", matthew_text, matthew_signal)
if node: results_payload["wisdom_nodes"].append(node)
# --- C. SURA (Quran ELS) ---
# Legacy: Quran ELS -> Sura Match
def dummy_cache(func, *args, **kwargs): return func(*args, **kwargs)
q_res = quran.get_first_els_result_quran(adjusted_sum, "en", cached_process_func=dummy_cache)
if q_res and "result_text" in q_res:
q_text = q_res["result_text"]
quran_signal = calculate_gematria(q_text)
# Find Sura
db_path = os.path.join(PSALM_DIR, "abjad.db")
if os.path.exists(db_path):
with sqlite3.connect(db_path) as conn:
c = conn.cursor()
c.execute("SELECT words, book, chapter, verse FROM results WHERE gematria_sum = ? ORDER BY LENGTH(words) ASC LIMIT 1", (quran_signal,))
s_row = c.fetchone()
node = format_node(s_row, "Quranic Sura", q_text, quran_signal)
if node: results_payload["wisdom_nodes"].append(node)
return results_payload
except Exception as e:
logger.error(f"Oracle Error: {e}")
return {"error": str(e)}
finally:
os.chdir(original_cwd)