Arivu16 commited on
Commit
e7cb706
1 Parent(s): c76e337

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +253 -0
app.py ADDED
@@ -0,0 +1,253 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import mysql.connector
3
+ import bcrypt
4
+ import datetime
5
+ import re
6
+ import json
7
+ import torch
8
+ import pytz
9
+ from transformers import GPT2LMHeadModel, GPT2Tokenizer
10
+
11
+
12
+ # Sql Connection:
13
+
14
+ connection = mysql.connector.connect(
15
+ host = "gateway01.ap-southeast-1.prod.aws.tidbcloud.com",
16
+ port = 4000,
17
+ user = "2ZyEJgr7d9Z3zUr.root",
18
+ password = "Q970rGTYSeCyFYk2")
19
+
20
+ mycursor = connection.cursor(buffered=True)
21
+
22
+ mycursor.execute("CREATE DATABASE IF NOT EXISTS Guvi_GPT")
23
+ mycursor.execute('USE Guvi_GPT')
24
+
25
+ mycursor.execute('''CREATE TABLE IF NOT EXISTS User_data (
26
+ id INT AUTO_INCREMENT PRIMARY KEY,
27
+ user_name VARCHAR(50) UNIQUE NOT NULL,
28
+ password VARCHAR(255) NOT NULL,
29
+ email VARCHAR(255) UNIQUE NOT NULL,
30
+ registered_date TIMESTAMP,
31
+ last_login TIMESTAMP)''')
32
+
33
+ def username_exists(username):
34
+ mycursor.execute("SELECT * FROM users WHERE username = %s", (username,))
35
+ return mycursor.fetchone() is not None
36
+
37
+ def email_exists(email):
38
+ mycursor.execute("SELECT * FROM users WHERE email = %s", (email,))
39
+ return mycursor.fetchone() is not None
40
+
41
+ def is_valid_email(email):
42
+ pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
43
+ return re.match(pattern, email) is not None
44
+
45
+ def create_user(username, password, email, registered_date):
46
+ if username_exists(username):
47
+ return 'username_exists'
48
+
49
+ if email_exists(email):
50
+ return 'email_exists'
51
+
52
+ hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
53
+ mycursor.execute(
54
+ "INSERT INTO users (username, password, email, registered_date) VALUES (%s, %s, %s, %s)",
55
+ (username, hashed_password, email, registered_date)
56
+ )
57
+ connection.commit()
58
+ return 'success'
59
+
60
+ def verify_user(username, password):
61
+ mycursor.execute("SELECT password FROM users WHERE username = %s", (username,))
62
+ record = mycursor.fetchone()
63
+ if record and bcrypt.checkpw(password.encode('utf-8'), record[0].encode('utf-8')):
64
+ mycursor.execute("UPDATE users SET last_login = %s WHERE username = %s", (datetime.datetime.now(pytz.timezone('Asia/Kolkata')), username))
65
+ connection.commit()
66
+ return True
67
+ return False
68
+
69
+ def reset_password(username, new_password):
70
+ hashed_password = bcrypt.hashpw(new_password.encode('utf-8'), bcrypt.gensalt())
71
+ mycursor.execute(
72
+ "UPDATE users SET password = %s WHERE username = %s",
73
+ (hashed_password, username)
74
+ )
75
+ connection.commit()
76
+
77
+ # Load the fine-tuned model and tokenizer
78
+ model_name_or_path = "/content/fine_tuned_model"
79
+ model = GPT2LMHeadModel.from_pretrained(model_name_or_path)
80
+
81
+ token_name_or_path = "/content/fine_tuned_model"
82
+ tokenizer = GPT2Tokenizer.from_pretrained(token_name_or_path)
83
+
84
+ # Set the pad_token to eos_token if it's not already set
85
+ if tokenizer.pad_token is None:
86
+ tokenizer.pad_token = tokenizer.eos_token
87
+
88
+ # Move the model to GPU if available
89
+ device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
90
+ model.to(device)
91
+
92
+ # Define the text generation function
93
+ def generate_text(model, tokenizer, seed_text, max_length=100, temperature=1.0, num_return_sequences=1):
94
+ # Tokenize the input text with padding
95
+ inputs = tokenizer(seed_text, return_tensors='pt', padding=True, truncation=True)
96
+
97
+ input_ids = inputs['input_ids'].to(device)
98
+ attention_mask = inputs['attention_mask'].to(device)
99
+
100
+ # Generate text
101
+ with torch.no_grad():
102
+ output = model.generate(
103
+ input_ids,
104
+ attention_mask=attention_mask,
105
+ max_length=max_length,
106
+ temperature=temperature,
107
+ num_return_sequences=num_return_sequences,
108
+ do_sample=True,
109
+ top_k=50,
110
+ top_p=0.01,
111
+ pad_token_id=tokenizer.eos_token_id # Ensure padding token is set to eos_token_id
112
+ )
113
+
114
+ # Decode the generated text
115
+ generated_texts = []
116
+ for i in range(num_return_sequences):
117
+ generated_text = tokenizer.decode(output[i], skip_special_tokens=True)
118
+ generated_texts.append(generated_text)
119
+
120
+ return generated_texts
121
+
122
+ # Session state management
123
+ if 'sign_up_successful' not in st.session_state:
124
+ st.session_state.sign_up_successful = False
125
+ if 'login_successful' not in st.session_state:
126
+ st.session_state.login_successful = False
127
+ if 'reset_password' not in st.session_state:
128
+ st.session_state.reset_password = False
129
+ if 'username' not in st.session_state:
130
+ st.session_state.username = ''
131
+ if 'current_page' not in st.session_state:
132
+ st.session_state.current_page = 'login'
133
+
134
+ def home_page():
135
+ st.title(f"Welcome, {st.session_state.username}!")
136
+ st.write("This is the home page after successful login.")
137
+ st.info("Disclaimer: This application is a demonstration of a language model and is not affiliated with GUVI. The content generated by the model may not always be accurate or appropriate. Use it at your own discretion.")
138
+
139
+ # Text generation section
140
+ st.subheader("Generate Text")
141
+ seed_text = st.text_input("Enter text:")
142
+ max_length = st.slider("Max length", min_value=10, max_value=500, value=100)
143
+ #temperature = st.slider("Temperature", min_value=0.1, max_value=2.0, value=1.0)
144
+ #num_return_sequences = st.slider("Number of sequences", min_value=1, max_value=5, value=1)
145
+
146
+ if st.button("Generate"):
147
+ with st.spinner("Generating..."):
148
+ generated_texts = generate_text(model, tokenizer, seed_text, max_length, temperature=0.000001, num_return_sequences=1)
149
+ for i, text in enumerate(generated_texts):
150
+ st.write(f"Generated Text {i + 1}:\n{text}\n")
151
+
152
+ def login():
153
+ st.subheader(':blue[**Login**]')
154
+ with st.form(key='login', clear_on_submit=True):
155
+ username = st.text_input(label='Username', placeholder='Enter Your Username')
156
+ password = st.text_input(label='Password', placeholder='Enter Your Password', type='password')
157
+ if st.form_submit_button('Login'):
158
+ if not username or not password:
159
+ st.error("Please fill out all fields.")
160
+ elif verify_user(username, password):
161
+ st.session_state.login_successful = True
162
+ st.session_state.username = username
163
+ st.session_state.current_page = 'home'
164
+ st.rerun()
165
+ else:
166
+ st.error("Incorrect username or password. If you don't have an account, please sign up.")
167
+
168
+ if not st.session_state.login_successful:
169
+ c1, c2 = st.columns(2)
170
+ with c1:
171
+ st.write(":red[New user?]")
172
+ if st.button('Go to Sign Up'):
173
+ st.session_state.current_page = 'sign_up'
174
+ st.rerun()
175
+ with c2:
176
+ st.write(":red[Forgot Password?]")
177
+ if st.button('Reset Password'):
178
+ st.session_state.current_page = 'reset_password'
179
+ st.rerun()
180
+
181
+ def signup():
182
+ st.subheader(':blue[**Sign Up**]')
183
+ with st.form(key='signup', clear_on_submit=True):
184
+ email = st.text_input(label='Email', placeholder='Enter Your Email')
185
+ username = st.text_input(label='Username', placeholder='Enter Your Username')
186
+ password = st.text_input(label='Password', placeholder='Enter Your Password', type='password')
187
+ re_password = st.text_input(label='Confirm Password', placeholder='Confirm Your Password', type='password')
188
+ registered_date = datetime.datetime.now(pytz.timezone('Asia/Kolkata'))
189
+
190
+ if st.form_submit_button('Sign Up'):
191
+ if not email or not username or not password or not re_password:
192
+ st.error("Please fill out all fields.")
193
+ elif not is_valid_email(email):
194
+ st.error("Please enter a valid email address.")
195
+ elif len(password) <= 3:
196
+ st.error("Password too short")
197
+ elif password != re_password:
198
+ st.error("Passwords do not match. Please re-enter.")
199
+ else:
200
+ result = create_user(username, password, email, registered_date)
201
+ if result == 'username_exists':
202
+ st.error("Username already registered. Please use a different username.")
203
+ elif result == 'email_exists':
204
+ st.error("Email already registered. Please use a different email.")
205
+ elif result == 'success':
206
+ st.success(f"Username {username} created successfully! Please login.")
207
+ st.session_state.sign_up_successful = True
208
+ else:
209
+ st.error("Failed to create user. Please try again later.")
210
+
211
+ if st.session_state.sign_up_successful:
212
+ if st.button('Go to Login'):
213
+ st.session_state.current_page = 'login'
214
+ st.rerun()
215
+
216
+ def reset_password_page():
217
+ st.subheader(':bee[Reset Password]')
218
+ with st.form(key='reset_password', clear_on_submit=True):
219
+ username = st.text_input(label='Username', value='')
220
+ new_password = st.text_input(label='New Password', type='password')
221
+ re_password = st.text_input(label='Confirm New Password', type='password')
222
+
223
+ if st.form_submit_button('Reset Password'):
224
+ if not username:
225
+ st.error("Please enter your username.")
226
+ elif not username_exists(username):
227
+ st.error("Username not found. Please enter a valid username.")
228
+ elif not new_password or not re_password:
229
+ st.error("Please fill out all fields.")
230
+ elif len(new_password) <= 3:
231
+ st.error("Password too short")
232
+ elif new_password != re_password:
233
+ st.error("Passwords do not match. Please re-enter.")
234
+ else:
235
+ reset_password(username, new_password)
236
+ st.success("Password reset successfully. Please login with your new password.")
237
+ st.session_state.current_page = 'login'
238
+
239
+ st.write('Return to Login page')
240
+ if st.button('Login'):
241
+ st.session_state.current_page = 'login'
242
+ st.rerun()
243
+
244
+
245
+ # Display appropriate page based on session state
246
+ if st.session_state.current_page == 'home':
247
+ home_page()
248
+ elif st.session_state.current_page == 'login':
249
+ login()
250
+ elif st.session_state.current_page == 'sign_up':
251
+ signup()
252
+ elif st.session_state.current_page == 'reset_password':
253
+ reset_password_page()