Spaces:
Sleeping
Sleeping
| import os | |
| import gradio as gr | |
| import tempfile | |
| import json | |
| from agent import MedTranscriptAgent | |
| from dotenv import load_dotenv | |
| import logging | |
| logging.basicConfig( | |
| level=logging.INFO, | |
| format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', | |
| handlers=[ | |
| logging.FileHandler("app.log"), | |
| logging.StreamHandler() | |
| ] | |
| ) | |
| logger = logging.getLogger(__name__) | |
| load_dotenv() | |
| if not os.getenv("ANTHROPIC_API_KEY"): | |
| logger.error("ANTHROPIC_API_KEY not found in environment variables or .env file") | |
| raise ValueError("ANTHROPIC_API_KEY is required. Please add it to your .env file.") | |
| agent = MedTranscriptAgent(debug=True) | |
| conversation_threads = {} | |
| def process_message(message, conversation_id=None, pdf_file=None): | |
| if not conversation_id: | |
| import uuid | |
| conversation_id = str(uuid.uuid4()) | |
| conversation_threads[conversation_id] = True | |
| logger.info(f"Created new conversation with ID: {conversation_id}") | |
| if pdf_file is not None: | |
| temp_dir = tempfile.mkdtemp() | |
| temp_path = os.path.join(temp_dir, "uploaded.pdf") | |
| with open(temp_path, "wb") as f: | |
| f.write(pdf_file) | |
| pdf_id = agent.load_pdf(temp_path) | |
| logger.info(f"Loaded PDF '{pdf_id}' for conversation {conversation_id}") | |
| logger.info(f"Processing message for conversation {conversation_id}: {message}") | |
| response = agent.chat(message, thread_id=conversation_id) | |
| if hasattr(agent, "conversation_threads") and conversation_id in agent.conversation_threads: | |
| thread_msgs = agent.conversation_threads[conversation_id] | |
| logger.info(f"Thread {conversation_id} now has {len(thread_msgs)} messages") | |
| return response, conversation_id | |
| with gr.Blocks(title="Medical Transcript Q&A System") as demo: | |
| gr.Markdown("# Medical Transcript Q&A System") | |
| gr.Markdown("Ask questions about medical procedures, treatments, or general medical information.") | |
| conversation_id = gr.State(None) | |
| with gr.Row(): | |
| with gr.Column(scale=3): | |
| chatbot = gr.Chatbot( | |
| height=500, | |
| type="messages", | |
| avatar_images=("👤", "🩺"), | |
| label="Conversation" | |
| ) | |
| msg = gr.Textbox( | |
| label="Your Question", | |
| placeholder="Ask a medical question...", | |
| lines=3 | |
| ) | |
| with gr.Row(): | |
| submit_btn = gr.Button("Submit", variant="primary", scale=2) | |
| clear_btn = gr.Button("Clear Conversation", scale=1) | |
| with gr.Column(scale=1): | |
| pdf_input = gr.File( | |
| label="Upload PDF Document (Optional)", | |
| file_types=[".pdf"], | |
| type="binary" | |
| ) | |
| debug_info = gr.Textbox( | |
| label="Debug Info", | |
| visible=True, | |
| interactive=False, | |
| lines=5 | |
| ) | |
| def user(message, history, conv_id, pdf): | |
| """Add user message to chat history""" | |
| logger.info(f"User message: {message}") | |
| logger.info(f"Current history length: {len(history) if history else 0}") | |
| logger.info(f"Current conversation ID: {conv_id}") | |
| if history is None: | |
| history = [] | |
| history.append({"role": "user", "content": message}) | |
| return "", history, conv_id, pdf | |
| def bot(history, conv_id, pdf): | |
| """Process user message and add bot response to chat history""" | |
| if not history or len(history) == 0: | |
| return history, conv_id, pdf, "Error: No message to process" | |
| user_message = history[-1]["content"] | |
| logger.info(f"Processing user message: {user_message[:50]}...") | |
| try: | |
| response, new_conv_id = process_message(user_message, conv_id, pdf) | |
| history.append({"role": "assistant", "content": response}) | |
| thread_msg_count = 0 | |
| if hasattr(agent, "conversation_threads") and new_conv_id in agent.conversation_threads: | |
| thread_msg_count = len(agent.conversation_threads[new_conv_id]) | |
| debug_text = f"Conversation ID: {new_conv_id}\n" | |
| debug_text += f"UI Messages: {len(history)}\n" | |
| debug_text += f"Agent Thread Messages: {thread_msg_count}\n" | |
| debug_text += f"PDF Uploaded: {'Yes' if pdf else 'No'}\n" | |
| return history, new_conv_id, None, debug_text | |
| except Exception as e: | |
| error_msg = str(e) | |
| logger.error(f"Error processing message: {error_msg}") | |
| history.append({"role": "assistant", "content": f"Error: {error_msg}"}) | |
| return history, conv_id, None, f"Error occurred: {error_msg}" | |
| def clear_conversation(): | |
| """Clear the current conversation and start a new one""" | |
| logger.info("Clearing conversation history") | |
| import uuid | |
| new_id = str(uuid.uuid4()) | |
| logger.info(f"Created new conversation with ID: {new_id}") | |
| return new_id, gr.update(value=None), [], None, f"Started new conversation with ID: {new_id}" | |
| msg.submit( | |
| user, | |
| [msg, chatbot, conversation_id, pdf_input], | |
| [msg, chatbot, conversation_id, pdf_input] | |
| ).then( | |
| bot, | |
| [chatbot, conversation_id, pdf_input], | |
| [chatbot, conversation_id, pdf_input, debug_info] | |
| ) | |
| submit_btn.click( | |
| user, | |
| [msg, chatbot, conversation_id, pdf_input], | |
| [msg, chatbot, conversation_id, pdf_input] | |
| ).then( | |
| bot, | |
| [chatbot, conversation_id, pdf_input], | |
| [chatbot, conversation_id, pdf_input, debug_info] | |
| ) | |
| clear_btn.click( | |
| clear_conversation, | |
| None, | |
| [conversation_id, msg, chatbot, pdf_input, debug_info] | |
| ) | |
| if __name__ == "__main__": | |
| logger.info("Starting Medical Transcript Q&A System...") | |
| logger.info(f"API Key present: {'Yes' if os.getenv('ANTHROPIC_API_KEY') else 'No'}") | |
| demo.launch() |