You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

162 lines
5.6 KiB

import streamlit as st
import numpy as np
from PIL import Image
from bot import Chatbot, Report, CheckerBot, GeneralBot, botstrings
from time import sleep
from pprint import pprint
def send(message, check=True, add_to_memory=True):
store_state()
# Check if the message is a tip.
if check:
tip = checker_bot.check_for_tips(message)
else:
tip = False
if tip:
print(" I'TS A TIP ☠")
return False
else:
with st.chat_message("assistant"):
st.markdown(message)
# Add assistant response to chat history
st.session_state.messages.append({"role": "assistant", "content": message})
if add_to_memory:
chatbot.memory.append({"role":"assistant", "content": message})
return True
def store_state():
st.session_state.chatbot = chatbot
st.session_state.report = report
st.title("UNMAS Bot")
# Initialize chat history
if "messages" not in st.session_state:
st.session_state.messages = []
if 'upload_image' not in st.session_state:
st.session_state.upload_image = False
# Load chatbot from session state or create a new one
if "chatbot" not in st.session_state:
chatbot = Chatbot()
st.session_state.chatbot = chatbot
else:
chatbot = st.session_state.chatbot
# Load report from session state or create a new one
if "report" not in st.session_state:
report = Report()
st.session_state.report = report
else:
report = st.session_state.report
# Load checker and general bot from session state or create a new one
if "checker_bot" not in st.session_state:
checker_bot = CheckerBot()
st.session_state.checker_bot = checker_bot
else:
checker_bot = st.session_state.checker_bot
# Display chat messages from history on app rerun
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
if st.session_state.upload_image:
user_input = None
img_file = st.file_uploader('Upload an image', type=['png', 'jpg', 'jpeg'])
if img_file is not None:
image = Image.open(img_file)
img_array = np.array(image)
report.image = img_array
send('Thanks!', check=False, add_to_memory=False)
question = chatbot.ask_for_info(report, chatbot=chatbot)
send(question, check=False)
st.session_state.upload_image = False
store_state()
# user_input = st.chat_input('')
# if user_input:
# st.chat_message("user").markdown(user_input)
# chatbot.memory.append({"role":"user", "content": user_input})
# st.session_state.messages.append({"role": "user", "content": user_input})
else:
user_input = st.chat_input('')
if user_input and not st.session_state.upload_image:
st.chat_message("user").markdown(user_input)
# Add user message to chat history
st.session_state.messages.append({"role": "user", "content": user_input})
chatbot.memory.append({"role":"user", "content": user_input})
# Check the message type
print('Check message type')
message_type = checker_bot.check_message_type(message=user_input)
print('Message type:', message_type)
if not chatbot.first_instructions_sent:
# Give instructions for how to use the bot
chatbot.first_instructions_sent = True
chatbot.informations_requested = True
send(botstrings.first_instructions, check=False, add_to_memory=False)
sleep(1.2)
send('So first, tell me what you found?', check=False)
else:
if 'greeting' in message_type.lower():
# Answer the greeting
bot_answer = chatbot.generate(user_input)
send(bot_answer['content'])
elif 'question' in message_type.lower():
bot_answer = chatbot.generate(user_input) # TODO How to handle questions?
# Check if the answer is an answer to the question.
answered = checker_bot.check_answer(bot_answer['content'], user_input, chatbot)
if not answered:
bot_answer = 'I could not understand your question. Please ask again.'
send(bot_answer)
chatbot.memory.append({"role":"assistant", "content": bot_answer})
elif 'information' in message_type.lower():
if chatbot.informations_requested:
answered = checker_bot.check_answer(user_input, chatbot.memory[-1]['content'], chatbot)
if answered:
# Ask for information and send that message to the report
result = checker_bot.check_for_info(user_input, report, report.looking_for)
if result:
print(result)
else:
send('I could not understand your message. Please try again.', check=False)
question = chatbot.ask_for_info(report, chatbot=chatbot)
if question == 'image':
question = "Can you upload a picture of what you have found?"
st.session_state.upload_image = True
print(st.session_state.upload_image)
send(question, check=False, add_to_memory=False)
st.rerun()
else:
send(question, check=False)
else:
send('I could not understand your message. Please try again.', check=False)
else:
send('I could not understand your message. Please try again.', check=False)
store_state()