Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| from rag import RAG # Assuming your rag.py is in the same directory | |
| import os | |
| import time | |
| # --- Configuration --- | |
| GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY") | |
| if not GOOGLE_API_KEY: | |
| raise ValueError("GOOGLE_API_KEY environment variable not set. Please set it before running the app.") | |
| COLLECTION_NAME = os.getenv("COLLECTION_NAME", "ca_documents") | |
| # --- Initialize RAG System --- | |
| try: | |
| rag = RAG(GOOGLE_API_KEY, COLLECTION_NAME) | |
| except Exception as e: | |
| print(f"Fatal Error initializing RAG system: {e}") | |
| raise | |
| # --- Initial Chat State --- | |
| welcome_message = { | |
| "role": "assistant", | |
| "content": """ | |
| π **Welcome to your CA Study Assistant!** | |
| """ | |
| } | |
| initial_chat_history = [welcome_message] | |
| # --- Core Functions --- | |
| def upload_file(file): | |
| if file is None: | |
| return """<div class="message-bubble error"> | |
| <p><strong>β οΈ Please select a file.</strong></p> | |
| <p>Supported formats: PDF, DOCX, TXT.</p> | |
| </div>""" | |
| try: | |
| start_time = time.time() | |
| file_path = file.name | |
| success = rag.upload_document(file_path) | |
| duration = time.time() - start_time | |
| if success: | |
| return f"""<div class=\"message-bubble success\"> | |
| <p><strong>β Success!</strong></p> | |
| <p><em>{os.path.basename(file_path)}</em> uploaded.</p> | |
| <p><small>Processed in {duration:.2f}s</small></p> | |
| </div>""" | |
| else: | |
| return f"""<div class=\"message-bubble error\"><p><strong>β Upload Failed.</strong></p><p>Please ensure <em>{os.path.basename(file_path)}</em> is a valid file.</p></div>""" | |
| except Exception as e: | |
| return f"""<div class=\"message-bubble error\"><p><strong>β An Error Occurred</strong></p><p><small>{str(e)}</small></p></div>""" | |
| def chat_with_docs(message: str, history: list): | |
| if not message or not message.strip(): | |
| return "", history | |
| history.append({"role": "user", "content": message}) | |
| answer = rag.ask_question(message) | |
| history.append({"role": "assistant", "content": answer}) | |
| return "", history | |
| def clear_chat(): | |
| return initial_chat_history, "" | |
| # --- Load Custom CSS --- | |
| with open("style.css") as f: | |
| css = f.read() | |
| # --- Gradio App Layout --- | |
| with gr.Blocks(css=css, title="CA Study Assistant", theme=gr.themes.Base(), mode="auto") as app: | |
| with gr.Column(elem_id="app-container"): | |
| gr.HTML(""" | |
| <div id="header"> | |
| <h1>CA Study Assistant</h1> | |
| <p>The smartest way to study your materials.</p> | |
| </div> | |
| """) | |
| with gr.Tabs(elem_classes="tab-nav"): | |
| with gr.TabItem("π¬ Ask Questions", id="chat_tab"): | |
| chatbot = gr.Chatbot( | |
| value=initial_chat_history, | |
| elem_id="chat-history", | |
| show_label=False, | |
| type="messages", | |
| bubble_full_width=False, | |
| ) | |
| with gr.Row(elem_id="chat-input-container"): | |
| with gr.Column(scale=10): | |
| chat_input = gr.Textbox( | |
| placeholder="Ask anything about your documents...", | |
| show_label=False, elem_id="chat-input", lines=1, max_lines=5, | |
| ) | |
| with gr.Column(scale=1, min_width=60): | |
| send_btn = gr.Button('β€', elem_id="send-btn") | |
| clear_btn = gr.Button("ποΈ Clear", elem_id="clear-btn") | |
| clear_btn.click(fn=clear_chat, outputs=[chatbot, chat_input]) | |
| with gr.TabItem("π Upload Documents", id="upload_tab"): | |
| with gr.Column(elem_id="upload-area"): | |
| gr.HTML(""" | |
| <div id="upload-icon"> | |
| <svg xmlns="http://www.w3.org/2000/svg" width="80" height="80" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="17 8 12 3 7 8"></polyline><line x1="12" y1="3" x2="12" y2="15"></line></svg> | |
| </div> | |
| <h3>Upload Your Study Materials</h3> | |
| <p>Drag & drop or click below to select a file.</p> | |
| <div style="margin-top: 0.5rem;"> | |
| <span style="background:#c7d2fe;color:#5046e5;padding:0.3rem 0.75rem;border-radius:999px;margin-right:0.5rem;">PDF</span> | |
| <span style="background:#c7d2fe;color:#5046e5;padding:0.3rem 0.75rem;border-radius:999px;margin-right:0.5rem;">DOCX</span> | |
| <span style="background:#c7d2fe;color:#5046e5;padding:0.3rem 0.75rem;border-radius:999px;">TXT</span> | |
| </div> | |
| """) | |
| upload_input = gr.File( | |
| label="", file_count="single", file_types=[".pdf", ".docx", ".txt"], | |
| type="filepath", | |
| ) | |
| upload_output = gr.HTML(elem_id="upload-output") | |
| upload_input.upload( | |
| fn=upload_file, inputs=[upload_input], outputs=[upload_output], | |
| api_name="upload_document" | |
| ) | |
| send_btn.click( | |
| fn=chat_with_docs, inputs=[chat_input, chatbot], outputs=[chat_input, chatbot], | |
| ) | |
| chat_input.submit( | |
| fn=chat_with_docs, inputs=[chat_input, chatbot], outputs=[chat_input, chatbot], | |
| ) | |
| if __name__ == "__main__": | |
| app.launch(share=True, debug=True) | |