import os import gradio as gr import requests import json import logging from datetime import datetime import random # Configure logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) # API configuration api_token = os.getenv("API_TOKEN") if not api_token: raise ValueError("API token not found. Make sure 'API_TOKEN' is set in the Secrets.") API_URL = "https://api-inference.huggingface.co/models/mistralai/Mistral-7B-Instruct-v0.3" HEADERS = {"Authorization": f"Bearer {api_token}"} def get_unique_parameters(): """Generate unique parameters for each request""" return { "temperature": random.uniform(0.7, 0.9), "top_p": random.uniform(0.85, 0.95), "timestamp": datetime.now().strftime("%H%M%S"), "style": random.choice([ "analytical", "theological", "pastoral", "historical", "contextual", "linguistic", "practical" ]) } def make_api_call(prompt, params): """Unified API call handler""" payload = { "inputs": f"{prompt} [ts:{params['timestamp']}]", "parameters": { "temperature": params["temperature"], "top_p": params["top_p"] } } try: response = requests.post(API_URL, headers=HEADERS, json=payload) response.raise_for_status() return response.json() except Exception as e: logger.error(f"API Error: {e}") return None def process_response(result, marker): """Process API response""" if not result or not isinstance(result, list) or len(result) == 0: return "Error: Invalid response from model." text = result[0].get("generated_text", "") if marker in text: return text.split(marker, 1)[1].strip() return text def generate_exegesis(passage): if not passage.strip(): return "Please enter a Bible passage." params = get_unique_parameters() prompt = f"""[INST] You are a professional Bible Scholar. Provide a detailed exegesis of the following biblical verse, including: The original Greek text and transliteration with word-by-word analysis and meanings, historical and cultural context, and theological significance for: {passage} [/INST] Exegesis:""" result = make_api_call(prompt, params) return process_response(result, "Exegesis:") def ask_any_questions(question): if not question.strip(): return "Please enter a question." params = get_unique_parameters() prompt = f"""[INST] As a Bible Scholar taking a {params['style']} perspective, answer: {question} Provide: 1. Clear explanation 2. Biblical references 3. Key insights 4. Application [/INST] Answer:""" result = make_api_call(prompt, params) return process_response(result, "Answer:") def generate_sermon(topic): if not topic.strip(): return "Please enter a topic." params = get_unique_parameters() prompt = f"""[INST] As a Pastor using a {params['style']} approach, create a sermon on: {topic} Include: 1. Main theme 2. Biblical foundation 3. Key points 4. Applications [/INST] Sermon:""" result = make_api_call(prompt, params) return process_response(result, "Sermon:") def keyword_search(keyword): if not keyword.strip(): return "Please enter a keyword." params = get_unique_parameters() prompt = f"""[INST] Using a {params['style']} method, search for passages about: {keyword} For each passage provide: 1. Reference 2. Context 3. Meaning 4. Application [/INST] Search Results:""" result = make_api_call(prompt, params) return process_response(result, "Search Results:") # Interface styling css = """ .gradio-container { font-family: 'Arial', sans-serif !important; max-width: 1200px !important; margin: auto !important; } .gr-button { background-color: #2e5090 !important; color: white !important; } .gr-input { border: 2px solid #ddd !important; border-radius: 8px !important; } """ # Create interface with gr.Blocks(css=css, theme=gr.themes.Default()) as bible_app: gr.Markdown("# JR Study Bible") with gr.Tabs(): with gr.Tab("Exegesis"): gr.Interface( fn=generate_exegesis, inputs=gr.Textbox( label="Enter Bible Passage", placeholder="e.g., John 3:16", lines=2 ), outputs=gr.Textbox( label="Exegesis Commentary", lines=12 ), description="Enter a Bible passage for analysis" ) with gr.Tab("Bible Q&A"): gr.Interface( fn=ask_any_questions, inputs=gr.Textbox( label="Ask Any Bible Question", placeholder="e.g., What does John 3:16 mean?", lines=2 ), outputs=gr.Textbox( label="Answer", lines=12 ), description="Ask any Bible-related question" ) with gr.Tab("Sermon Generator"): gr.Interface( fn=generate_sermon, inputs=gr.Textbox( label="Generate Sermon", placeholder="e.g., Faith, Love, Forgiveness", lines=2 ), outputs=gr.Textbox( label="Sermon Outline", lines=15 ), description="Generate a sermon outline" ) with gr.Tab("Bible Search"): gr.Interface( fn=keyword_search, inputs=gr.Textbox( label="Search the Bible", placeholder="e.g., love, faith, hope", lines=1 ), outputs=gr.Textbox( label="Search Results", lines=12 ), description="Search Bible passages by keyword" ) if __name__ == "__main__": bible_app.launch(share=True)