lifewjola's picture
Update app.py
41637c6
import json
from difflib import get_close_matches
import streamlit as st
def load_knowledge_base(file_path: str) -> dict:
with open(file_path, 'r') as file:
data: dict = json.load(file)
return data
def save_knowledge_base(file_path: str, data: dict):
with open(file_path, 'w') as file:
json.dump(data, file, indent=2)
def find_best_match(usr_question: str, questions: list[str]) -> str | None:
matches: list = get_close_matches(usr_question, questions, n=1, cutoff=0.6)
return matches[0] if matches else None
def get_answer_for_question(question: str, knowledge_base: dict) -> str | None:
for q in knowledge_base['questions']:
if q['question'] == question:
return q['answer']
st.title("Curious Chat Bot")
knowledge_base: dict = load_knowledge_base('knowledge_base.json')
widget_counter = st.session_state.get('widget_counter', 0)
user_input = st.text_input("You:", key=f"user_input_{widget_counter}")
if st.button("Ask"):
widget_counter += 1
best_match: str = find_best_match(user_input, [q['question'] for q in knowledge_base['questions']])
if best_match:
answer: str = get_answer_for_question(best_match, knowledge_base)
st.text(f"Bot: {answer}")
else:
st.text("Bot: I don't know the answer, please can you teach me?")
new_answer: str = st.text_input('Type the answer or "skip" to skip:', key=f"user_input_{widget_counter}")
widget_counter += 1
if new_answer.lower() != 'skip':
st.text("Bot: Thank you! I learnt something new.")
knowledge_base['questions'].append({'question': user_input, 'answer': new_answer})
save_knowledge_base('knowledge_base.json', knowledge_base)
st.session_state.widget_counter = widget_counter