Spaces:
Sleeping
Sleeping
File size: 5,239 Bytes
3774cbd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
import streamlit as st
from st_pages import Page, show_pages
from openai import OpenAI
from whisper_stt import whisper_stt
# Set page configuration
st.set_page_config(layout="wide")
show_pages([Page("app.py", "Home", "🏠")])
# Initialize session state variables
if 'paused' not in st.session_state:
st.session_state.paused = False
if 'question_text' not in st.session_state:
st.session_state.question_text = ""
if 'submitted' not in st.session_state:
st.session_state.submitted = False
if 'response_content' not in st.session_state:
st.session_state.response_content = ""
if 'stopped' not in st.session_state:
st.session_state.stopped = False
if 'function_call_count' not in st.session_state:
st.session_state.function_call_count = 0
if 'transcribed_text' not in st.session_state:
st.session_state.transcribed_text = ""
if 'last_processed_text' not in st.session_state:
st.session_state.last_processed_text = ""
if 'headers' not in st.session_state:
st.session_state.headers = []
def create_anchor_link(text):
if text is None:
return ""
return f"<a href='#{text.strip().lower().replace(' ', '-').replace(',', '').replace('.', '').replace(chr(39), '-')}'>{text}</a>"
def on_stop():
st.session_state.stopped = True
expander = st.expander("Answer", expanded=True)
with expander:
col0 = st.columns(1)[0]
placeholder = col0.empty() # Define the placeholder
def handle_enter(key):
if key == "ctrl+enter":
new_question = st.session_state.question_input
print(f"handle_enter called. new_question: '{new_question}'")
print(f"session state: {st.session_state}")
with st.sidebar:
api_key = st.text_input("API Key", key="chatbot_api_key", type="password")
col1, col2 = st.columns(2)
with col1:
# Call whisper_stt without a callback
transcribed_text = whisper_stt(
openai_api_key=api_key,
language='en'
)
if transcribed_text:
st.session_state.question_text = transcribed_text
expander.header = transcribed_text
# Check if new transcription is available
if transcribed_text and transcribed_text != st.session_state.transcribed_text:
st.session_state.transcribed_text = transcribed_text
st.session_state.question_text = transcribed_text
st.session_state.submitted = True
if st.session_state.question_text:
st.markdown(create_anchor_link(st.session_state.question_text), unsafe_allow_html=True)
if 'question_input' in st.session_state and st.session_state.question_input:
st.markdown(create_anchor_link(st.session_state.question_input), unsafe_allow_html=True)
with col2:
st.button(label='Stop', on_click=on_stop)
# Create an input for the question and use new_question directly
new_question = st.text_area("Question",
value=st.session_state.question_text or "",
height=150,
key="question_input",
on_change=handle_enter,
args=("ctrl+enter",)
)
print(f"After text_area, new_question: '{new_question}'")
# Check if new_question has changed and is not empty
if new_question and new_question != st.session_state.question_text:
st.session_state.question_text = new_question
st.session_state.submitted = True
st.markdown("## Navigation")
for header in st.session_state.headers:
st.markdown(create_anchor_link(header), unsafe_allow_html=True)
if st.session_state.question_text and not api_key:
st.info("Please add your OpenAI API key to continue.")
st.stop()
if st.session_state.submitted and not st.session_state.stopped:
st.session_state.headers.append(st.session_state.question_text)
if st.session_state.function_call_count == 0:
header = f'## {st.session_state.question_text}'
anchor = create_anchor_link(st.session_state.question_text)
st.session_state.response_content += f'{header}\n\n{anchor}\n\n'
else:
header = f'\n\n---\n{st.session_state.question_text}\n---\n\n'
anchor = create_anchor_link(st.session_state.question_text)
st.session_state.response_content += f'{header}{anchor}\n\n'
st.session_state.function_call_count += 1
client = OpenAI(api_key=api_key)
st.session_state.messages = [{"role": "user", "content": st.session_state.question_text}]
response = client.chat.completions.create(
model="gpt-4o",
messages=st.session_state.messages,
stream=True
)
for chunk in response:
if st.session_state.stopped:
st.session_state.stopped = False
st.session_state.submitted = False
break
else:
if chunk and chunk.choices[0].delta.content:
st.session_state.response_content += chunk.choices[0].delta.content
placeholder.markdown(st.session_state.response_content, unsafe_allow_html=True)
expander.header = "Completed Answer"
st.session_state.submitted = False
st.session_state.stopped = False
placeholder.markdown(st.session_state.response_content, unsafe_allow_html=True)
st.session_state.stopped = False |