import os from datetime import datetime import streamlit as st from src.qna import ConversationalQA from src.youtube_audio_loader import youtube_transcriber if "store" not in st.session_state: st.session_state.store = {} if "docs" not in st.session_state: st.session_state.docs = None if "messages" not in st.session_state: st.session_state.messages = {} st.set_page_config(page_title="YouTube Transcriber & Chatbot") st.sidebar.title("Configuration") openai_api_key = st.sidebar.text_input("OpenAI API Key", type="password") os.environ["OPENAI_API_KEY"] = openai_api_key model = st.sidebar.selectbox( "Model", options=["gpt-4o", "gpt-4o-mini"], index=0 ) use_whisper_api = st.sidebar.checkbox( "Use Whisper API for Transcription", value=False ) if use_whisper_api: st.sidebar.warning("Using OpenAI Whisper API may incur costs.") local = False else: local = True st.title("YouTube Video Transcriber & Chatbot") youtube_link = st.text_input("Enter YouTube Video Link") if youtube_link: st.video(youtube_link) # Transcription if st.button("Transcribe"): if openai_api_key: st.session_state.docs = youtube_transcriber(youtube_link, local=local) st.session_state.messages = [] st.success("Transcription completed!") else: st.error("Please enter your OpenAI API key.") if st.session_state.docs: qa_system = ConversationalQA(docs=st.session_state.docs) st.write("### Ask me anything!") def display_message(role, content, timestamp): with st.chat_message(role): st.markdown(f"**{role.capitalize()}:** {content}") st.markdown( f"{timestamp}", unsafe_allow_html=True ) if st.session_state.messages: for message in st.session_state.messages: display_message( message["role"], message["content"], message["timestamp"] ) if prompt := st.chat_input("Your question here..."): timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") display_message("user", prompt, timestamp) st.session_state.messages.append( {"role": "user", "content": prompt, "timestamp": timestamp} ) with st.spinner("Thinking..."): response = qa_system.invoke_chain( session_id="1", user_input=prompt ) bot_response = response timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") display_message("bot", bot_response, timestamp) st.session_state.messages.append( {"role": "bot", "content": bot_response, "timestamp": timestamp} )