File size: 3,864 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
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 on_stop():
    st.session_state.stopped = True

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

        # 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



        
    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



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)
    
    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
    )

    expander = st.expander(f"<h2><strong>{st.session_state.question_text}</strong></h2>", expanded=True)
    response_placeholder = expander.empty()
    complete_response = ""

    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:
                complete_response += chunk.choices[0].delta.content
                response_placeholder.markdown(complete_response, unsafe_allow_html=True)
    st.session_state.submitted = False
    st.session_state.stopped = False