App.py(Python Web framework using flask)
from flask import Flask, request, jsonify, render_template
import json
from difflib import get_close_matches
from typing import Optional, List, Dict
# File path as a constant
KNOWLEDGE_BASE_FILE = 'knowledgeBase.json'
app = Flask(__name__)
def load_knowledge_base(file_path: str) -> Dict:
with open(file_path, 'r') as file:
data = json.load(file)
return data
def save_knowledge_base(file_path: str, data: Dict) -> None:
with open(file_path, 'w') as file:
json.dump(data, file, indent=2)
def find_best_match(user_question: str, questions: List[str]) -> Optional[str]:
matches = get_close_matches(user_question, questions, n=1, cutoff=0.75)
return matches[0] if matches else None
def get_answer_for_question(question: str, knowledge_base: Dict) -> Optional[str]:
return knowledge_base["questions"].get(question)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/chat', methods=['POST'])
def chat():
user_input = request.json.get('message')
if not user_input:
return jsonify({"error": "No message provided"}), 400
knowledge_base = load_knowledge_base(KNOWLEDGE_BASE_FILE)
knowledge_base["questions"] = {q["question"]: q["answer"] for q in knowledge_base["questions"]}
all_questions = list(knowledge_base["questions"].keys())
best_match = find_best_match(user_input, all_questions)
if best_match:
answer = get_answer_for_question(best_match, knowledge_base)
return jsonify({"response": answer})
else:
return jsonify({"response": "I don't know the answer to that. Can you teach me?", "needs_training": True})
@app.route('/train', methods=['POST'])
def train():
user_input = request.json.get('message')
new_answer = request.json.get('answer')
if not user_input or not new_answer:
return jsonify({"error": "No message or answer provided"}), 400
knowledge_base = load_knowledge_base(KNOWLEDGE_BASE_FILE)
knowledge_base["questions"].append({"question": user_input, "answer": new_answer})
save_knowledge_base(KNOWLEDGE_BASE_FILE, {"questions": knowledge_base["questions"]})
return jsonify({"response": "Thank you! I learned a new response!"})
if __name__ == '__main__':
app.run(debug=True)
Comments
Post a Comment