flask_ai_tutor / app.py
DipakBundheliya's picture
Update port
b9b91cf
from flask import Flask , jsonify , request
from flask_cors import CORS
from pymongo import MongoClient
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_groq import ChatGroq
from langchain_mongodb.chat_message_histories import MongoDBChatMessageHistory
from passlib.hash import pbkdf2_sha256
from uuid import uuid4
import os
from dotenv import load_dotenv
import prompt
import json
app = Flask(__name__)
CORS(app)
# MongoDB Connection
load_dotenv()
username = os.getenv("MONGO_USERNAME")
password = os.getenv("MONGO_PASSWORD")
client = MongoClient(f"mongodb+srv://{username}:{password}@cluster0.hpg57sk.mongodb.net/?retryWrites=true&w=majority&appName=Cluster0")
db=client['my_db']
chat_collection=db["chat_histories"]
user_collection=db["user_data"]
system_prompt = prompt.system_prompt()
groq_api_key = os.getenv("GROQ_API_KEY")
chat = ChatGroq(temperature=0 ,groq_api_key=groq_api_key , model_name="llama3-70b-8192")
prompt = ChatPromptTemplate.from_messages(
[
("system", system_prompt),
MessagesPlaceholder(variable_name="history"),
("human", "{question}"),
]
)
chain = prompt | chat
chain_with_history = RunnableWithMessageHistory(
chain,
lambda session_id: MongoDBChatMessageHistory(
session_id=session_id,
connection_string=f"mongodb+srv://{username}:{password}@cluster0.hpg57sk.mongodb.net/?retryWrites=true&w=majority&appName=Cluster0",
database_name="my_db",
collection_name="chat_histories",
),
input_messages_key="question",
history_messages_key="history",
)
@app.route('/' , methods=["POST","GET"] )
def main():
return jsonify({'message' : 'API calls successfully'}) , 201
@app.route('/register' , methods=["POST"] )
def register():
data = request.json
username = data.get("username")
password = data.get("password")
if user_collection.find_one({'username':username}):
return jsonify({'message':'Username already exists!'}) , 400
hashed_password = pbkdf2_sha256.hash(password)
user_collection.insert_one({
'username': username,
'password': hashed_password
})
return jsonify({'message' : 'User registered successfully'}) , 201
@app.route('/login' , methods=["POST"] )
def login():
data = request.json
username = data.get("username")
password = data.get("password")
user = user_collection.find_one({'username':username})
if user:
if pbkdf2_sha256.verify(password , user["password"]):
return jsonify({ 'message' : 'Login Successful!'}) , 200
return jsonify({ 'message' : 'Password is not correct'}) , 401
else:
return jsonify({ 'message' : 'Invalid username' }) , 401
@app.route('/logout' , methods=["POST"])
def logout():
data = request.json
username = data.get("username")
result = user_collection.delete_one({'username' : username})
if result.deleted_count == 1:
return jsonify({ 'message' : 'Logout successfully' }) , 201
else:
return jsonify({ 'message' : 'User not found in database' }) , 401
@app.route('/chat' , methods=['POST'])
def chat():
data = request.json
SessionId = data.get('SessionId')
question = data.get('question')
if not SessionId:
SessionId = str(uuid4())
config = {"configurable": {"session_id": SessionId}}
response = chain_with_history.invoke({"question": question}, config=config)
print(response)
return jsonify({
'response' : str(response.content) ,
'SessionId' : SessionId
}) , 200
@app.route('/history' , methods=['POST'])
def history():
user_chats = []
data = request.json
SessionId = data.get('SessionId')
try :
cur = chat_collection.find({"SessionId":SessionId})
for doc in cur:
role = json.loads(doc["History"])['type']
content = json.loads(doc["History"])['data']['content']
user_chats.append({'role':role , 'content':content})
return jsonify({
'response' : user_chats
}) , 200
except:
return jsonify({
'response' : 'error while fetching chat history'
}) , 400
if __name__ == '__main__':
app.run(host='0.0.0.0', port=7860)