-
Notifications
You must be signed in to change notification settings - Fork 1
/
App.py
103 lines (80 loc) · 2.77 KB
/
App.py
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
from dataclasses import dataclass
import streamlit as st
import time
import requests
import re
# Replace <random-id> with your actual ngrok ID
base_url = "https://f92b-34-125-236-111.ngrok-free.app"
@dataclass
class Message:
actor: str
payload: str
# Constants for actors and session state keys
USER = "user"
ASSISTANT = "ai"
MESSAGES = "messages"
# Initialize session state
def initialize_session_state():
if MESSAGES not in st.session_state:
st.session_state[MESSAGES] = [Message(actor=ASSISTANT, payload="Hi! How can I help you?")]
# Generate a response from the assistant
def generate_response(user_input: str) -> str:
try:
response = requests.get(f"{base_url}/gen_llm/{user_input}")
response.raise_for_status()
return response.text
except requests.exceptions.RequestException as e:
return f"Error: {e}"
# Display message function
def display_message(message: str, message_type: str):
placeholder = st.empty()
if message_type == "user-message":
message_content = f"""
<div class="user-message">
{message}
</div>
"""
placeholder.markdown(message_content, unsafe_allow_html=True)
time.sleep(1)
# Page functions
def chat_page():
# Initialize the session state
initialize_session_state()
# Custom CSS for user messages
st.markdown("""
<style>
.user-message {
width: fit-content;
background-color: #c8e6c9;
padding: 10px;
border-radius: 5px;
margin: 10px 0;
max-width: 70%;
text-align: right;
margin-left: auto;
align-self: flex-end;
}
</style>
""", unsafe_allow_html=True)
# Display previous messages
for msg in st.session_state[MESSAGES]:
if msg.actor == ASSISTANT:
with st.chat_message(name=msg.actor, avatar="bot_image.png"):
st.write(msg.payload)
else:
display_message(msg.payload, "user-message")
# Get the user input
prompt: str = st.chat_input("Begin your prompt with ""&"" if you want to retrive NSMQ questions")
# If the user has entered a prompt, process it
if prompt:
# Add the user's message to the session state
st.session_state[MESSAGES].append(Message(actor=USER, payload=prompt))
display_message(prompt, "user-message")
# Generate and display the assistant's response
response = generate_response(prompt)
st.session_state[MESSAGES].append(Message(actor=ASSISTANT, payload=response))
with st.chat_message(name=ASSISTANT, avatar="bot_image.png"):
st.write(response)
# Sidebar with navigation
st.sidebar.title("Navigation")
chat_page()