#!/usr/bin/env python3 import os import uuid import datetime from typing import Dict, Any, Optional import gradio as gr import weave from pathlib import Path from bhagavad_gita_bot import BhagavadGitaBot class BhagavadGitaWebApp: def __init__(self): # Check for required API keys with user-friendly messages if not os.getenv("OPENROUTER_API_KEY"): raise ValueError( "ā OPENROUTER_API_KEY environment variable is required but not set. " "Please contact the Space owner to configure API keys." ) self.bot = BhagavadGitaBot() self.session_storage = {} # Weave is already initialized in the bot's logger def process_problem(self, problem_text: str, request: gr.Request) -> tuple: """Process user problem and return guidance""" if not problem_text.strip(): return "Please enter your problem or concern.", None, None, None # Generate session ID session_id = str(uuid.uuid4())[:8] try: # Get guidance from bot (with Weave logging built-in) response = self.bot.get_guidance(problem_text, include_verses=True, session_id=session_id) if 'error' in response: error_msg = f"I apologize, but I encountered an error: {response['error']}. Please try rephrasing your concern." return error_msg, None, response.get('session_id', session_id), None # Format the response guidance_text = self._format_response(response) verses_text = self._format_verses(response.get('relevant_verses', [])) # Store session data for feedback correlation session_data = { "session_id": response.get('session_id', session_id), "user_problem": problem_text, "bot_response": response, "guidance_text": guidance_text, "verses_text": verses_text } self.session_storage[response.get('session_id', session_id)] = session_data return guidance_text, verses_text, response.get('session_id', session_id), gr.update(visible=True) except Exception as e: error_msg = f"I apologize, but I encountered an unexpected error. Please try again." print(f"Error processing problem: {e}") return error_msg, None, session_id, None def _format_response(self, response: Dict[str, Any]) -> str: """Format the main response for display""" formatted = "šļø **Guidance from the Bhagavad Gita**\n\n" # Problem analysis analysis = response.get('problem_analysis', {}) if analysis: formatted += "**Understanding your situation:**\n" formatted += f"⢠Key themes: {analysis.get('key_themes', 'N/A')}\n" formatted += f"⢠Emotional state: {analysis.get('emotional_state', 'N/A')}\n" formatted += f"⢠Core question: {analysis.get('core_question', 'N/A')}\n\n" # Main guidance formatted += "**Message for you:**\n" formatted += response.get('main_response', 'No guidance available') + "\n\n" # Closing blessing if response.get('closing_blessing'): formatted += "**Blessing:**\n" formatted += response.get('closing_blessing') + "\n" return formatted def _format_verses(self, verses: list) -> str: """Format verses for display""" if not verses: return "No verses found." formatted = "š **Supporting Verses from the Bhagavad Gita**\n\n" for i, verse in enumerate(verses, 1): formatted += f"**{i}. {verse.get('verse_reference', 'Unknown')}**\n\n" formatted += f"*Sanskrit:* {verse.get('sanskrit_text', 'N/A')}\n\n" formatted += f"*English:* {verse.get('english_translation', 'N/A')}\n\n" if verse.get('contextual_guidance'): formatted += f"**Guidance:** {verse.get('contextual_guidance')}\n\n" if verse.get('practical_application'): formatted += f"**Application:** {verse.get('practical_application')}\n\n" if verse.get('reflection_question'): formatted += f"**Reflection:** {verse.get('reflection_question')}\n\n" if i < len(verses): formatted += "---\n\n" return formatted def submit_feedback(self, session_id: str, feedback: str, additional_comments: str = ""): """Handle feedback submission""" if not session_id or session_id not in self.session_storage: return "ā ļø Session not found. Please try your question again." try: # Log feedback directly to Weave/WandB (if available) self.bot.logger.log_user_feedback( session_id=session_id, feedback_type=feedback, comments=additional_comments ) return f"š Thank you for your feedback! Your {feedback} has been recorded." except Exception as e: print(f"Warning: Could not log feedback: {e}") return f"š Thank you for your {feedback} feedback!" def create_interface(self): """Create the Gradio interface""" with gr.Blocks(title="šļø Bhagavad Gita Wisdom Bot") as demo: gr.HTML("""
Share your concerns and receive guidance from the eternal wisdom of the Bhagavad Gita
Powered by AI and ancient wisdom ⢠All interactions may be logged for service improvement