File size: 7,113 Bytes
423a42f
822dfd5
dd5f028
 
 
 
 
 
 
1af9f6b
509ca73
6d8186b
509ca73
25f7cba
 
 
 
7497699
 
 
 
dd5f028
 
 
 
 
 
 
 
1ddb359
 
 
 
dd5f028
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1ddb359
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
333978a
10f9ea6
333978a
 
 
 
 
 
10f9ea6
1af9f6b
8b77a26
dd5f028
772d03e
dd5f028
e60d9fc
 
 
 
10f9ea6
e60d9fc
09a4a4b
 
 
 
e60d9fc
09a4a4b
 
 
 
 
 
 
 
 
 
 
 
 
 
5abdf22
 
 
09a4a4b
10f9ea6
e60d9fc
ccb7aa0
370c257
24c6700
dd5f028
24c6700
dd5f028
772d03e
dd5f028
1af9f6b
 
 
 
 
24c6700
 
 
 
25f7cba
1af9f6b
423a42f
 
 
 
 
 
 
 
 
 
 
 
 
c34d039
24c6700
 
 
 
25f7cba
 
24c6700
5abdf22
 
 
24c6700
10f9ea6
423a42f
ccb7aa0
370c257
24c6700
509ca73
1af9f6b
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
from huggingface_hub import InferenceClient

import random

from flask import Flask, request, jsonify, make_response
from flask_jwt_extended import JWTManager, create_access_token, jwt_required, get_jwt_identity
from werkzeug.security import generate_password_hash, check_password_hash
import sqlite3

client = InferenceClient("mistralai/Mistral-7B-Instruct-v0.1")

app = Flask(__name__)

file_path = "mentor.txt"
with open(file_path, "r") as file:
    mentors_data = file.read()

@app.route('/')
def home():
    return jsonify({"message": "Welcome to the Recommendation API!"})

app.config['JWT_SECRET_KEY'] = 123456
jwt = JWTManager(app)

# Create SQLite database
conn = sqlite3.connect('users.db', check_same_thread=False)
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS users
             (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE, password TEXT)''')

c.execute('''CREATE TABLE IF NOT EXISTS user_details
             (id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER UNIQUE, full_name TEXT, email TEXT,
             FOREIGN KEY(user_id) REFERENCES users(id))''')
conn.commit()

# Endpoint for user registration
@app.route('/register', methods=['POST'])
def register():
    data = request.get_json()
    username = data.get('username')
    password = data.get('password')
    if not username or not password:
        return jsonify({"message": "Missing username or password"}), 400
    hashed_password = generate_password_hash(password)
    try:
        c.execute("INSERT INTO users (username, password) VALUES (?, ?)", (username, hashed_password))
        conn.commit()
        return jsonify({"message": "User created successfully"}), 201
    except sqlite3.IntegrityError:
        return jsonify({"message": "Username already exists"}), 400

# Endpoint for user login
@app.route('/login', methods=['POST'])
def login():
    data = request.get_json()
    username = data.get('username')
    password = data.get('password')
    if not username or not password:
        return jsonify({"message": "Missing username or password"}), 400
    user = c.execute("SELECT * FROM users WHERE username=?", (username,)).fetchone()
    if user and check_password_hash(user[2], password):
        access_token = create_access_token(identity=username, expires_delta=False)
        return jsonify({"access_token": access_token}), 200
    else:
        return jsonify({"message": "Invalid username or password"}), 401

# Endpoint for storing additional user details
@app.route('/user_details', methods=['POST'])
@jwt_required()
def add_user_details():
    current_user = get_jwt_identity()
    data = request.get_json()
    first_name = data.get('first_name')
    last_name = data.get('last_name')
    school_name = data.get('school_name')
    bachelors_degree = data.get('bachelors_degree')
    masters_degree = data.get('masters_degree')
    certification = data.get('certification')
    activity = data.get('activity')
    country = data.get('country')

    if not all([first_name, last_name, school_name, bachelors_degree, masters_degree, certification, activity, country]):
        return jsonify({"message": "Missing required fields"}), 400

    user = c.execute("SELECT * FROM users WHERE username=?", (current_user,)).fetchone()
    if not user:
        return jsonify({"message": "User not found"}), 404

    user_id = user[0]
    try:
        c.execute("INSERT INTO user_details (user_id, first_name, last_name, school_name, bachelors_degree, "
                  "masters_degree, certification, activity, country) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
                  (user_id, first_name, last_name, school_name, bachelors_degree, masters_degree, certification,
                   activity, country))
        conn.commit()
        return jsonify({"message": "User details added successfully"}), 201
    except sqlite3.IntegrityError:
        return jsonify({"message": "User details already exist"}), 400


def format_prompt(message):
    # Generate a random user prompt and bot response pair
    user_prompt = "UserPrompt"
    bot_response = "BotResponse"

    return f"<s>[INST] {user_prompt} [/INST] {bot_response}</s> [INST] {message} [/INST]"



@app.route('/get_course', methods=['POST'])
@jwt_required()
def recommend():
    current_user = get_jwt_identity()
    temperature = 0.9
    max_new_tokens = 256
    top_p = 0.95
    repetition_penalty = 1.0


    content = request.json
    user_degree = content.get('degree')
    user_stream = content.get('stream')
    user_semester = content.get('semester')

    generate_kwargs = dict(
        temperature=temperature,
        max_new_tokens=max_new_tokens,
        top_p=top_p,
        repetition_penalty=repetition_penalty,
        do_sample=True,
        seed=42,
    )
    prompt = f""" prompt: 
    You need to act like as recommendation engine for course recommendation for a student based on below details.
    Degree: {user_degree}
    Stream: {user_stream}
    Current Semester: {user_semester}
    Based on above details recommend the courses that relate to the above details 
    Note: Output should be list in below format:
    [course1, course2, course3,...]
    Return only answer not prompt and unnecessary stuff, also dont add any special characters or punctuation marks
    """
    formatted_prompt = format_prompt(prompt)

    stream = client.text_generation(formatted_prompt, **generate_kwargs, stream=False, details=False, return_full_text=False)
    return jsonify({"ans": stream})


@app.route('/get_mentor', methods=['POST'])
@jwt_required()
def mentor():
    current_user = get_jwt_identity()
    temperature = 0.9
    max_new_tokens = 256
    top_p = 0.95
    repetition_penalty = 1.0

    content = request.json
    user_degree = content.get('degree')
    user_stream = content.get('stream')
    user_semester = content.get('semester')
    courses = content.get('courses')

    temperature = float(temperature)
    if temperature < 1e-2:
        temperature = 1e-2
    top_p = float(top_p)

    generate_kwargs = dict(
        temperature=temperature,
        max_new_tokens=max_new_tokens,
        top_p=top_p,
        repetition_penalty=repetition_penalty,
        do_sample=True,
        seed=42,
    )
    prompt = f""" prompt:
    You need to act like as recommendataion engine for mentor recommendation for student based on below details also the list of mentors with their experience is attached.
    Degree: {user_degree}
    Stream: {user_stream}
    Current Semester: {user_semester}
    courses opted:{courses}
    Mentor list= {mentors_data}
    Based on above details recommend the mentor that realtes to above details 
    Note: Output should be list in below format:
    [mentor1,mentor2,mentor3,...]
    Return only answer not prompt and unnecessary stuff, also dont add any special characters or punctuation marks
    """
    formatted_prompt = format_prompt(prompt)

    stream = client.text_generation(formatted_prompt, **generate_kwargs, stream=False, details=False, return_full_text=False)
    return jsonify({"ans": stream})

if __name__ == '__main__':
    app.run(debug=True)