"""Gradio app for the QA agent.""" from uuid import uuid4 from functools import partial import gradio as gr from src.agents.qa_agent import QAAgent qa_agent = QAAgent() def generate_user_id() -> str: """Generate a unique user ID.""" return str(uuid4()) def process_response(result: dict) -> str: """Process the response from the QA agent.""" answer, references = result["answer"], result["references"] new_answer = answer # 1. Add links for idx, ref in references.items(): new_answer = new_answer.replace(f"[[{idx}]]", f"[[{idx}]]({ref})") # 2. Add references new_answer += "\n\n---\n### References\n" for idx, ref in references.items(): new_answer += f"- {idx}: [{ref}]({ref})\n" return new_answer def respond(message, history: list[tuple[str, str]], user_id: str = "test", **kwargs): """Respond to a message.""" result: dict = qa_agent.invoke(message, user_id=user_id) response = process_response(result) yield response # Create the app with tabs with gr.Blocks() as app: with gr.Tabs() as tabs: with gr.Tab("기독교 질문 ✝️"): # Use a separate user ID for the first tab bible_user_id = gr.State(value=generate_user_id()) app.load(generate_user_id, outputs=[bible_user_id]) gr.Markdown( """ ### 기독교 질문 ✝️ 기독교 혹은 성경에 대해 많이 궁금해하는 질문들을 모아봤어요. 어떻게 생각하시나요? 🤔 """ ) examples = [ ["성경에서 말하는 구원이란 무엇인가요?"], ["천국과 지옥은 실제로 존재하나요?"], ["하나님은 왜 고통을 허락하시나요?"], ["기독교에서 말하는 삼위일체란 무엇인가요?"], ["예수님은 왜 십자가에 돌아가셨나요?"], ["성경은 어떻게 해석해야 하나요?"], ] respond_ = partial(respond, user_id=bible_user_id.value[0]) gr.ChatInterface( respond_, type="messages", examples=examples, # NOTE: use caching for production # cache_examples=True, ) with gr.Tab("자유 대화 💬"): # Use a separate user ID for the second tab chat_user_id = gr.State(value=generate_user_id()) app.load(generate_user_id, outputs=[chat_user_id]) gr.Markdown( """ ### 자유 대화 💬 기독교 혹은 성경에 대한 질문, 삶의 고민이 있으신가요? 자유롭게 나눠주세요 🤗 """ ) respond_ = partial(respond, user_id=chat_user_id.value[0]) gr.ChatInterface(respond_, type="messages") if __name__ == "__main__": app.launch()