# app.py from core.pineconeqa import PineconeQA from core.voice_processor import AudioRecorder import streamlit as st from config import get_settings import os def initialize_qa(): """Initialize QA system with API keys from settings""" try: settings = get_settings() return PineconeQA( pinecone_api_key=settings.PINECONE_API_KEY, openai_api_key=settings.OPENAI_API_KEY, index_name=settings.INDEX_NAME ) except Exception as e: st.error(f"Error initializing QA system: {str(e)}") return None def handle_audio_input(): """Handle audio recording, saving, and transcription""" settings = get_settings() if 'audio_recorder' not in st.session_state: st.session_state.audio_recorder = AudioRecorder(settings.OPENAI_API_KEY) if 'transcribed_text' not in st.session_state: st.session_state.transcribed_text = "" col1, col2 = st.columns([1, 1]) with col1: if st.button("🎤 Record", help="Click to start recording", type="primary" if not st.session_state.get('recording', False) else "secondary"): st.session_state.audio_recorder.start_recording() st.session_state.recording = True st.info("Recording... Click 'Stop' when finished.") with col2: if st.button("⏹️ Stop", help="Click to stop recording", disabled=not st.session_state.get('recording', False)): audio_file = st.session_state.audio_recorder.stop_recording() st.session_state.recording = False if audio_file: with st.spinner("Transcribing audio..."): # Transcribe audio transcription = st.session_state.audio_recorder.transcribe_audio(audio_file) if transcription: # Store transcription in session state st.session_state.transcribed_text = transcription st.success("Audio transcribed successfully!") # Play audio for verification st.audio(audio_file) else: st.error("Failed to transcribe audio.") def process_question(question): st.session_state.chat_history = [] with st.spinner("Thinking..."): response = st.session_state.qa_system.ask(question) if "error" in response: st.error(f"Error: {response['error']}") else: # Display answer st.markdown("### Answer:") st.write(response["answer"]) # Display sources with st.expander("View Sources"): for i, doc in enumerate(response["context"], 1): st.markdown(f"**Source {i}:**") st.write(f"Content: {doc.page_content}") st.write(f"Source: {doc.metadata.get('source', 'Unknown')}") st.write(f"Title: {doc.metadata.get('title', 'Unknown')}") st.write(f"Keywords: {doc.metadata.get('keywords', 'N/A')}") st.write(f"Publication Date: {doc.metadata.get('publication_date', 'Unknown')}") st.markdown("---") # Add to chat history # st.session_state.chat_history.append((question, response["answer"])) def main(): st.title("Scientific Paper Q&A System") # Initialize session state variables if 'qa_system' not in st.session_state: st.session_state.qa_system = initialize_qa() if 'chat_history' not in st.session_state: st.session_state.chat_history = [] if 'recording' not in st.session_state: st.session_state.recording = False if 'transcribed_text' not in st.session_state: st.session_state.transcribed_text = "" # Main chat interface if st.session_state.qa_system: # Chat container chat_container = st.container() with chat_container: # Display chat history for i, (question, answer) in enumerate(st.session_state.chat_history): st.markdown(f"**You:** {question}") st.markdown(f"**Assistant:** {answer}") st.markdown("---") # Input container at the bottom with st.container(): st.markdown("### Ask a Question") # Text input area with transcribed text as default question = st.text_area( "Type your question or use voice input:", value=st.session_state.transcribed_text, height=100, key="question_input", label_visibility="collapsed" ) # Audio recording interface handle_audio_input() # Ask button if st.button("Send Question", type="primary"): if question: process_question(question) # Clear transcribed text after sending st.session_state.transcribed_text = "" else: st.warning("Please enter a question or record your voice.") # Clear chat button if st.button("Clear Chat"): st.session_state.chat_history = [] st.session_state.transcribed_text = "" st.rerun() else: st.error("Could not initialize QA system. Please check your environment variables.") if __name__ == "__main__": main()