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