import gradio as gr
from langchain_core.messages import HumanMessage
import src.passage_finder as pf
import src.srf_bot as sb
import src.generic_bot as gb
import prompts.system_prompts as sp
import os
# Initialize PassageFinder, SRFChatbot, and GenericChatbot
passage_finder = pf.PassageFinder()
chatbot = sb.SRFChatbot()
generic_chatbot = gb.GenericChatbot()
# Passage Finder functions
def respond_passage_finder(message):
config = passage_finder.get_configurable()
results = passage_finder.graph.invoke({"messages": [HumanMessage(content=message)]}, config)
documents = results.get('documents', [])
output = []
for doc in documents:
quotes = doc.metadata.get('matched_quotes', [])
publication = doc.metadata.get('publication_name', 'Unknown Publication')
chapter = doc.metadata.get('chapter_name', 'Unknown Chapter')
full_passage = doc.metadata.get('highlighted_content', '')
quote_text = "\n".join([f"• \"{q.quote}\"" for q in quotes])
output.append({
"quotes": quote_text,
"reference": f"{publication}: {chapter}",
"full_passage": full_passage
})
return output
def process_input_passage_finder(message):
results = respond_passage_finder(message)
html_output = "
"
for result in results:
html_output += f"""
{result['reference']}
{result['quotes'].replace("• ", "
• ")}
Show full passage
{result['full_passage']}
"""
html_output += "
"
return html_output
# Chatbot functions
def respond_chatbot(query, history):
formatted_query = [HumanMessage(content=query)]
result = chatbot.graph.invoke({"messages": formatted_query}, chatbot.config)
state = chatbot.graph.get_state(config=chatbot.config).values
documents = state.get("documents")
passages = ''
if documents and len(documents) > 0:
for d in documents:
passages += f'{d.metadata["publication_name"]} - {d.metadata["chapter_name"]}\n{d.page_content}\n\n'
history.append((f'Passages: {query}', passages))
response = result["messages"][-1].content
system_message_dropdown = state.get("system_message_dropdown")
history.append((query, f"[{system_message_dropdown}]\n" + response))
return history
# Generic Chatbot function
def respond_genericchatbot(query, history):
formatted_query = [HumanMessage(content=query)]
result = generic_chatbot.graph.invoke({"messages": formatted_query}, generic_chatbot.config)
state = generic_chatbot.graph.get_state(config=generic_chatbot.config).values
documents = state.get("documents")
passages = ''
if documents and len(documents) > 0:
for d in documents:
passages += f'{d.metadata["publication_name"]} - {d.metadata["chapter_name"]}\n{d.page_content}\n\n'
history.append((f'Passages: {query}', passages))
response = result["messages"][-1].content
history.append((query, response))
return history
# Define the CSS
css = """
body { background-color: #f0f0f0; }
.gradio-container { background-color: #ffffff; }
.response-container { border: 1px solid #e0e0e0; border-radius: 8px; padding: 20px; background-color: #f9f9f9; }
.result-item { margin-bottom: 20px; background-color: white; padding: 15px; border-radius: 5px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); }
.reference { color: #2c3e50; margin-bottom: 10px; }
.quotes { font-style: italic; margin-bottom: 10px; }
.full-passage { margin-top: 10px; padding: 10px; background-color: #f0f0f0; border-radius: 5px; }
details summary { cursor: pointer; color: #3498db; font-weight: bold; }
details summary:hover { text-decoration: underline; }
/* Chatbot specific styles */
.gr-button { background-color: #333333; color: white; font-size: 18px; padding: 10px; }
.gr-textbox textarea { font-size: 18px; color: black; }
.gr-dropdown { font-size: 18px; color: black; }
.source-box { background-color: white; padding: 10px; border-radius: 8px; margin-top: 20px; color: black; border: 1px solid #D0D0D0; }
/* Dark mode and responsive styles */
@media (prefers-color-scheme: dark) {
.gradio-container { background-color: #1e1e1e; color: white; }
h1, h2, p { color: white; }
.gr-textbox textarea { background-color: #333333; color: white; }
.gr-button { background-color: #555555; color: white; }
.gr-dropdown { background-color: #333333; color: white; }
.source-box { background-color: #333333; color: white; border: 1px solid #555555; }
}
@media (max-width: 600px) {
.gr-row { flex-direction: column !important; }
.gr-column { width: 100% !important; }
}
"""
with gr.Blocks(css=css) as demo:
gr.Markdown("# SRF Teachings App")
with gr.Tabs():
with gr.TabItem("Passage Finder"):
gr.Markdown("Ask questions about Self-Realization Fellowship teachings and receive responses with relevant quotes.")
with gr.Row():
input_text_pf = gr.Textbox(
placeholder="Ask about the meaning of life, spirituality, or any other topic...",
label="Your Question"
)
submit_btn_pf = gr.Button("Submit", variant="primary")
output_area_pf = gr.HTML()
gr.Markdown("### Sources")
gr.Textbox(value="Journey to Self Realization, Second Coming of Christ, and Autobiography of a Yogi",
label="Available Sources", interactive=False)
submit_btn_pf.click(process_input_passage_finder, inputs=input_text_pf, outputs=output_area_pf)
gr.Examples(
examples=[
"What is the meaning of life?",
"Importance of good posture",
"How can I find inner peace?",
"What does Paramahansa Yogananda say about meditation?",
],
inputs=input_text_pf,
)
with gr.TabItem("Custom Chatbots"):
with gr.Row():
with gr.Column(scale=4):
chatbot_output = gr.Chatbot(height=600)
user_input_cb = gr.Textbox(placeholder="Type your question here...", label="Your Question", value="What is the meaning of life?")
submit_button_cb = gr.Button("Submit")
with gr.Column(scale=1):
system_prompt_dropdown = gr.Dropdown(
choices=list(sp.system_prompt_templates.keys()),
label="Select Chatbot",
value=list(sp.system_prompt_templates.keys())[0],
)
chatbot_description = gr.Textbox(
value=sp.chatbot_descriptions[list(sp.system_prompt_templates.keys())[0]],
label="Chatbot Description",
lines=3,
interactive=False
)
system_prompt_display = gr.Textbox(
value=sp.system_prompt_templates[list(sp.system_prompt_templates.keys())[0]],
label="Chatbot Instructions",
lines=5,
interactive=False
)
gr.Markdown("""
Available sources:
- Journey to Self-Realization
- The Second Coming of Christ
- Autobiography of a Yogi
""")
# system_prompt_dropdown.change(
# fn=lambda x: (sp.chatbot_descriptions[x], sp.system_prompt_templates[x]),
# inputs=[system_prompt_dropdown],
# outputs=[chatbot_description, system_prompt_display]
# )
def update_chatbot_info(selected_prompt):
chatbot.reset_system_prompt(selected_prompt)
return sp.chatbot_descriptions[selected_prompt], sp.system_prompt_templates[selected_prompt]
system_prompt_dropdown.change(
fn=update_chatbot_info,
inputs=[system_prompt_dropdown],
outputs=[chatbot_description, system_prompt_display]
)
submit_button_cb.click(
fn=respond_chatbot,
inputs=[user_input_cb, chatbot_output],
outputs=[chatbot_output]
)
gr.Examples(
examples=[
"importance of meditation",
"How can I develop unconditional love?",
"concept of karma",
"What are some techniques for spiritual growth?",
],
inputs=user_input_cb,
)
with gr.TabItem("Generic Chatbot"):
with gr.Row():
with gr.Column(scale=4):
generic_chatbot_output = gr.Chatbot(height=600)
user_input_gc = gr.Textbox(placeholder="Type your question here...", label="Your Question", value="Loaves and fishes")
submit_button_gc = gr.Button("Submit")
# ... (existing code for the column with markdown)
def respond_and_clear(query, history):
updated_history = respond_genericchatbot(query, history)
return updated_history, "" # Return updated history and empty string for input
submit_button_gc.click(
fn=respond_and_clear,
inputs=[user_input_gc, generic_chatbot_output],
outputs=[generic_chatbot_output, user_input_gc]
)
gr.Examples(
examples=[
"Tell me about Paramahansa Yogananda's life",
"What are the main teachings of Self-Realization Fellowship?",
"Explain the concept of Kriya Yoga",
"Can you provide quotes about the importance of meditation?",
],
inputs=user_input_gc,
)
# Access the secrets
username = os.getenv("USERNAME")
password = os.getenv("PASSWORD")
# Launch the interface
demo.launch(share=True, auth=(username, password), debug=True)