File size: 8,665 Bytes
cb3a367
c8e6d98
c1b6881
c8e6d98
 
cdb12ff
0c94ada
 
c9b7a80
2f39b29
c9b7a80
5c780cd
c9b7a80
 
040ff03
ad58e24
2f39b29
c9b7a80
5c780cd
 
 
 
 
 
 
 
 
 
 
c9b7a80
085dad3
c1b6881
 
085dad3
c1b6881
 
085dad3
c1b6881
 
085dad3
c1b6881
 
c9b7a80
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
01afc48
 
 
 
 
 
8739ad3
 
01afc48
8739ad3
 
 
01afc48
8739ad3
 
 
 
01afc48
8739ad3
 
 
01afc48
8739ad3
 
 
 
 
c9b7a80
2d30d9c
8739ad3
10de1f1
b2e5352
10de1f1
 
97b6e08
b2e5352
fc52a02
 
 
 
10de1f1
b2e5352
01afc48
 
 
 
10de1f1
 
b2e5352
 
 
 
 
 
10de1f1
b2e5352
 
 
 
 
10de1f1
 
b2e5352
 
10de1f1
cb3a367
10de1f1
21957bf
8739ad3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5419e7e
d080bcc
 
 
 
 
 
 
 
8739ad3
01afc48
c9b7a80
01afc48
c9b7a80
01afc48
 
 
 
 
 
 
c9b7a80
 
01afc48
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c9b7a80
 
 
 
8739ad3
c9b7a80
8739ad3
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
  # Importing required packages
import streamlit as st
import openai
import uuid
import time
import os
from PIL import Image
import io
import matplotlib.pyplot as plt

st.set_page_config(page_title="OpenAI - Assistent API")

# Initialize OpenAI client
client = openai.Client()
api_key = os.getenv("OPENAI_API_KEY")
assistant_id = os.getenv("assistant_id")

# Function to handle and display images
def handle_and_display_image(file_id):
    api_response = client.files.with_raw_response.retrieve_content(file_id)
    if api_response.status_code == 200:
        content = api_response.content
        with open('image.png', 'wb') as f:
            f.write(content)
        return Image.open('image.png')
    else:
        print('Failed to download file.')
        return None

# Initialize global session state
if "session_id" not in st.session_state:
    st.session_state.session_id = str(uuid.uuid4())

if "run" not in st.session_state:
    st.session_state.run = {"status": None}

if "messages" not in st.session_state:
    st.session_state.messages = []

if "retry_error" not in st.session_state:
    st.session_state.retry_error = 0

# Main function to manage pages
def main():
    # Sidebar for page selection
    with st.sidebar:
        st.title('BinDoc GmbH')
        st.markdown("Experience revolutionary interaction with BinDocs Chat App, leveraging state-of-the-art AI technology.")
        # Add more sidebar content as needed
        page = st.sidebar.selectbox("Choose a page", ["Analysis Bot", "Test Page"])

    # Main area content based on page selection
    if page == "Analysis Bot":
        page1()  # Call the function for the first page (to be defined)
    elif page == "Test Page":
        page2()  # Call the function for the second page (to be defined)



def page2():
    try:
        hide_streamlit_style = """
                <style>
                #MainMenu {visibility: hidden;}
                footer {visibility: hidden;}
                </style>
                """
        st.markdown(hide_streamlit_style, unsafe_allow_html=True)
    
         # Create columns for layout
        col1, col2 = st.columns([3, 1])  # Adjust the ratio to your liking

        with col1:
            st.title("Test Page with Logo!")

        with col2:
            # Load and display the image in the right column, which will be the top-right corner of the page
            image = Image.open('BinDoc Logo (Quadratisch).png')
            st.image(image, use_column_width='always')

    except Exception as e:
        st.error(f"Upsi, an unexpected error occurred: {e}")

def page1():
    st.sidebar.title("OpenAI - Assistant API🤖")
    st.sidebar.markdown("**Model:** gpt-4-1106-preview API")
    st.sidebar.markdown("**Version:** 1.1")
    st.sidebar.markdown("**Session-ID:**")
    st.sidebar.markdown(st.session_state.session_id)
    st.sidebar.divider()

    # Create columns for layout
    col1, col2 = st.columns([3, 1])  # Adjust the ratio to your liking

    with col1:
        st.title('Welcome to MediMetrics!')
        st.subheader('powered by :orange[BinDoc GmbH] ')

    with col2:
        # Load and display the image in the right column
        image = Image.open('BinDoc Logo (Quadratisch).png')
        st.image(image, use_column_width='always')

    # Initialize chat history in session state if not exists
    if 'chat_history' not in st.session_state:
        st.session_state.chat_history = []

    # Function to handle question submission
    def submit_question(question):
        # Add question to chat history
        st.session_state.chat_history.append(("User", question))
        process_question(question)

    # Function to process the question
    def process_question(question):
        # Clear the previous run status and chat history
        st.session_state.run = None
        st.session_state.chat_history = [("User", question)]  # Start with the current user question
    
        # Add message to the thread
        client.beta.threads.messages.create(
            thread_id=st.session_state.thread.id,
            role="user",
            content=question
        )
    
        # Create a new run to process the messages in the thread
        st.session_state.run = client.beta.threads.runs.create(
            thread_id=st.session_state.thread.id,
            assistant_id=st.session_state.assistant.id,
        )
    
        # Wait for the run to complete
        while not hasattr(st.session_state.run, 'status') or st.session_state.run.status not in ["completed", "failed"]:
            time.sleep(1)
            st.session_state.run = client.beta.threads.runs.retrieve(
                thread_id=st.session_state.thread.id,
                run_id=st.session_state.run.id,
            )
    
        if st.session_state.run.status == "completed":
            # Retrieve the list of messages
            st.session_state.messages = client.beta.threads.messages.list(
                thread_id=st.session_state.thread.id
            )
    
            # Get the latest message from the assistant
            last_assistant_message = next((message for message in reversed(st.session_state.messages.data) if message.role == "assistant"), None)
            if last_assistant_message:
                # Update chat history with the assistant's response
                st.session_state.chat_history.append(("Assistant", last_assistant_message.content[0].text.value))
    

    # Example query buttons
    col3, col4 = st.columns(2)  # Create two columns for buttons

    with col3:
        if st.button("Plotte mir die Anzahl der Kliniken von 2010 bis 2020."):
            submit_question("Plotte mir die Anzahl der Kliniken von 2010 bis 2020.")
        if st.button("Erstelle mir ein Bar Chart über die Bettenanzahl zwischen 1994 und 2002."):
            submit_question("Erstelle mir ein Bar Chart über die Bettenanzahl zwischen 1994 und 2002.")

    with col4:
        if st.button("Hat die Bettenanzahl zwischen 2018 und 2021 zu- oder abgenommen?"):
            submit_question("Hat die Bettenanzahl zwischen 2018 und 2021 zu- oder abgenommen?")
        if st.button("Wie hat sich die Fremdkapitalquote des Malteser Krankenhaus St. Franziskus-Hospital verändert?"):
            submit_question("Wie hat sich die Fremdkapitalquote des Malteser Krankenhaus St. Franziskus-Hospital verändert?")

    prompt = st.text_input("Wie kann ich dir helfen?")

    if st.button("Submit"):
        submit_question(prompt)

    if "assistant" not in st.session_state:
        openai.api_key = api_key
        # Load the previously created assistant
        st.session_state.assistant = openai.beta.assistants.retrieve(assistant_id)

        # Create a new thread for this session
        st.session_state.thread = client.beta.threads.create(
            metadata={'session_id': st.session_state.session_id}
        )


    # Display chat history in Streamlit chat format
    for role, message in st.session_state.chat_history:
        if role == "User":
            with st.chat_message("User"):
                st.markdown(message)
        elif role == "Assistant":
            with st.chat_message("Assistant"):
                st.markdown(message)

    # Check if 'run' object has 'status' attribute
    if hasattr(st.session_state.run, 'status'):
        # Handle the 'running' status
        if st.session_state.run.status == "running":
            with st.chat_message('assistant'):
                st.write("Thinking ......")
            if st.session_state.retry_error < 3:
                time.sleep(1)  # Short delay to prevent immediate rerun
                st.rerun()

        # Handle the 'failed' status
        elif st.session_state.run.status == "failed":
            st.session_state.retry_error += 1
            with st.chat_message('assistant'):
                if st.session_state.retry_error < 3:
                    st.write("Run failed, retrying ......")
                    time.sleep(3)  # Longer delay before retrying
                    st.rerun()
                else:
                    st.error("FAILED: The OpenAI API is currently processing too many requests. Please try again later ......")

        # Handle any status that is not 'completed'
        elif st.session_state.run.status != "completed":
            # Attempt to retrieve the run again
            st.session_state.run = client.beta.threads.runs.retrieve(
                thread_id=st.session_state.thread.id,
                run_id=st.session_state.run.id,
            )
            if st.session_state.retry_error < 3:
                time.sleep(3)
                st.rerun()


if __name__ == "__main__":
    main()