Spaces:
Runtime error
Runtime error
| import gradio as gr | |
| import requests | |
| import json | |
| import os | |
| from dotenv import load_dotenv | |
| # Load environment variables for API key | |
| load_dotenv() | |
| # Get API key from environment variables - this is now hidden from users | |
| OPENROUTER_API_KEY = os.environ.get("OPENROUTER_API_KEY", "") | |
| if not OPENROUTER_API_KEY: | |
| print("Warning: OPENROUTER_API_KEY not found in environment variables.") | |
| print("Please set it before running the app or the app won't function.") | |
| def answer_bible_question(question, temperature=0.7, max_tokens=1000): | |
| """ | |
| Send a Bible question to the DeepSeek model via OpenRouter API | |
| and return the response. | |
| """ | |
| if not OPENROUTER_API_KEY: | |
| return "Error: API key not configured. Please set the OPENROUTER_API_KEY environment variable." | |
| # Format the prompt to focus on ESV Bible information | |
| prompt = f"""You are a helpful ESV Bible assistant. Please answer the following question | |
| about the ESV Bible, providing relevant verses and explanations when appropriate: {question}""" | |
| try: | |
| response = requests.post( | |
| url="https://openrouter.ai/api/v1/chat/completions", | |
| headers={ | |
| "Authorization": f"Bearer {OPENROUTER_API_KEY}", | |
| "Content-Type": "application/json", | |
| "HTTP-Referer": "https://bible-assistant-app.com", # Replace with your site | |
| "X-Title": "ESV Bible Assistant", | |
| }, | |
| data=json.dumps({ | |
| "model": "tngtech/deepseek-r1t-chimera:free", | |
| "messages": [ | |
| { | |
| "role": "system", | |
| "content": "You are a helpful assistant that specializes in the ESV Bible. Provide accurate information, quote relevant verses when appropriate, and explain biblical concepts clearly." | |
| }, | |
| { | |
| "role": "user", | |
| "content": prompt | |
| } | |
| ], | |
| "temperature": temperature, | |
| "max_tokens": max_tokens | |
| }), | |
| timeout=60 | |
| ) | |
| response_json = response.json() | |
| if "error" in response_json: | |
| return f"Error: {response_json['error']}" | |
| return response_json["choices"][0]["message"]["content"] | |
| except requests.exceptions.RequestException as e: | |
| return f"Network error: {str(e)}" | |
| except json.JSONDecodeError: | |
| return f"Error parsing response: {response.text[:100]}..." | |
| except Exception as e: | |
| return f"Unexpected error: {str(e)}" | |
| # Create custom theme for better aesthetics | |
| custom_theme = gr.themes.Soft().set( | |
| body_background_fill="#f8f9fa", | |
| block_background_fill="#ffffff", | |
| block_label_background_fill="#e9ecef", | |
| button_primary_background_fill="#6c757d", | |
| button_primary_background_fill_hover="#495057", | |
| ) | |
| # Create the Gradio interface with dual-panel layout | |
| with gr.Blocks(title="ESV Bible Assistant", theme=custom_theme) as demo: | |
| gr.Markdown(""" | |
| # ESV Bible Assistant | |
| Ask any question about the ESV Bible, and get answers powered by DeepSeek AI. | |
| """) | |
| with gr.Row(equal_height=True): | |
| # Left panel - Questions | |
| with gr.Column(): | |
| gr.Markdown("### Your Question") | |
| question_input = gr.Textbox( | |
| placeholder="Example: What does John 3:16 say in the ESV?", | |
| lines=8, | |
| label="", | |
| elem_id="question-input" | |
| ) | |
| with gr.Accordion("Settings", open=False): | |
| temperature_slider = gr.Slider( | |
| minimum=0.1, | |
| maximum=1.0, | |
| value=0.7, | |
| step=0.1, | |
| label="Temperature (Higher = more creative)" | |
| ) | |
| max_tokens_slider = gr.Slider( | |
| minimum=100, | |
| maximum=4000, | |
| value=1000, | |
| step=100, | |
| label="Maximum Response Length" | |
| ) | |
| submit_btn = gr.Button("Ask", variant="primary", size="lg") | |
| gr.Markdown("### Example Questions") | |
| # Fixed Examples implementation | |
| examples = gr.Examples( | |
| examples=[ | |
| "What does John 3:16 say in the ESV?", | |
| "Explain the concept of grace in the New Testament.", | |
| "What are the fruits of the Spirit mentioned in Galatians?", | |
| "Compare the creation accounts in Genesis 1 and 2.", | |
| "What does the ESV Bible say about forgiveness?" | |
| ], | |
| inputs=question_input | |
| ) | |
| # Right panel - Answers | |
| with gr.Column(): | |
| gr.Markdown("### Bible Answer") | |
| answer_output = gr.Markdown( | |
| value="Ask a question to receive an answer about the ESV Bible.", | |
| elem_id="answer-output" | |
| ) | |
| # Set up the click event | |
| submit_btn.click( | |
| fn=answer_bible_question, | |
| inputs=[question_input, temperature_slider, max_tokens_slider], | |
| outputs=answer_output | |
| ) | |
| # Add custom CSS for better styling | |
| gr.HTML(""" | |
| <style> | |
| #question-input, #answer-output { | |
| border: 1px solid #dee2e6; | |
| border-radius: 0.375rem; | |
| padding: 1rem; | |
| min-height: 250px; | |
| background-color: white; | |
| } | |
| .gradio-container { | |
| max-width: 1200px !important; | |
| margin-left: auto; | |
| margin-right: auto; | |
| } | |
| footer { | |
| text-align: center; | |
| margin-top: 2rem; | |
| color: #6c757d; | |
| } | |
| </style> | |
| """) | |
| gr.HTML(""" | |
| <footer> | |
| <p>ESV Bible Assistant © 2025 | Powered by DeepSeek through OpenRouter</p> | |
| <p><small>The ESV Bible text is copyrighted, but this application falls under fair use for educational purposes.</small></p> | |
| </footer> | |
| """) | |
| # Launch the app | |
| if __name__ == "__main__": | |
| demo.launch() |