Sharmiaji commited on
Commit
9efdff5
·
verified ·
1 Parent(s): 6c88121

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +413 -0
app.py ADDED
@@ -0,0 +1,413 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ # Import necessary libraries
3
+ import streamlit as st
4
+ import mysql.connector
5
+ import bcrypt
6
+ import datetime
7
+ import re
8
+ import pytz
9
+ import time
10
+
11
+ # Import transformers library for GPT-2 model
12
+ from transformers import GPT2LMHeadModel, GPT2Tokenizer
13
+ import torch
14
+
15
+ # Configure Streamlit page settings
16
+ icon='https://media.istockphoto.com/id/1413286466/vector/chat-bot-icon-robot-virtual-assistant-bot-vector-illustration.jpg?s=612x612&w=0&k=20&c=ZSG3eqGPDJgIgFUIuVxID64uVUF3eqM3LrrDWtaKses='
17
+ st.set_page_config(page_title='GUVI - GPT',page_icon=icon, menu_items={"about":'This streamlit application was developed by S.S.SHARMILA'})
18
+
19
+
20
+ # HTML and CSS for the animated title
21
+ html_content = """
22
+ <!DOCTYPE html>
23
+ <html lang="en">
24
+ <head>
25
+ <meta charset="UTF-8">
26
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
27
+ <style>
28
+ body {
29
+ font-family: Arial, sans-serif;
30
+ display: flex;
31
+ align-items: center;
32
+ height: 100vh;
33
+ margin: 0;
34
+ background-color: #0E1117;
35
+ color: #ffffff;
36
+ }
37
+ .title {
38
+ font-size: 3rem;
39
+ }
40
+ .animated {
41
+ display: inline-block;
42
+ background: linear-gradient(90deg, #ff5733, #33ff57, #3357ff, #ff33a1);
43
+ background-size: 400% 400%;
44
+ -webkit-background-clip: text;
45
+ -webkit-text-fill-color: transparent;
46
+ animation: gradient 8s ease infinite;
47
+ }
48
+ @keyframes gradient {
49
+ 0% {
50
+ background-position: 0% 50%;
51
+ }
52
+ 50% {
53
+ background-position: 100% 50%;
54
+ }
55
+ 100% {
56
+ background-position: 0% 50%;
57
+ }
58
+ }
59
+ </style>
60
+ </head>
61
+ <body>
62
+ <h2 class="title">
63
+ <span class="animated">GUVI GPT - Text Generator</span>
64
+ </h2>
65
+ </body>
66
+ </html>
67
+ """
68
+
69
+ #Title
70
+ st.markdown(html_content, unsafe_allow_html=True)
71
+
72
+
73
+ # Connect to TiDB Cloud database
74
+ mydb = mysql.connector.connect(
75
+ host='gateway01.ap-southeast-1.prod.aws.tidbcloud.com', # Replace with your TiDB host URL
76
+ port=4000,
77
+ user='3hkfD9Jp3ccKZ2S.root', # Replace with your TiDB username
78
+ password='WnRcrrCr3bU9JEsY' # Replace with your TiDB password
79
+ )
80
+ mycursor = mydb.cursor(buffered=True)
81
+
82
+ # Create 'GUVI_DB' database and use
83
+ mycursor.execute("CREATE DATABASE IF NOT EXISTS GUVI_DB")
84
+ mycursor.execute('USE GUVI_DB')
85
+
86
+ # Create 'users' table if it does not exist
87
+ mycursor.execute('''CREATE TABLE IF NOT EXISTS users (
88
+ id INT AUTO_INCREMENT PRIMARY KEY,
89
+ username VARCHAR(50) UNIQUE NOT NULL,
90
+ password VARCHAR(255) NOT NULL,
91
+ email VARCHAR(255) UNIQUE NOT NULL,
92
+ registered_date TIMESTAMP,
93
+ last_login TIMESTAMP
94
+ );''')
95
+
96
+ # Check if username exists in the database
97
+ def username_exists(username):
98
+ mycursor.execute("SELECT * FROM users WHERE username = %s", (username,))
99
+ return mycursor.fetchone() is not None
100
+
101
+ # Check if email exists in the database
102
+ def email_exists(email):
103
+ mycursor.execute("SELECT * FROM users WHERE email = %s", (email,))
104
+ return mycursor.fetchone() is not None
105
+
106
+ # Validate email format using regular expressions
107
+ def is_valid_email(email):
108
+ pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
109
+ return re.match(pattern, email) is not None
110
+
111
+ # Create a new user in the database
112
+ def create_user(username, password, email):
113
+ if username_exists(username):
114
+ return 'username_exists'
115
+
116
+ if email_exists(email):
117
+ return 'email_exists'
118
+
119
+ hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
120
+ registered_date = datetime.datetime.now(pytz.timezone('Asia/Kolkata'))
121
+
122
+ # Insert user data into 'users' table
123
+ mycursor.execute(
124
+ "INSERT INTO users (username, password, email, registered_date) VALUES (%s, %s, %s, %s)",
125
+ (username, hashed_password, email, registered_date)
126
+ )
127
+ mydb.commit()
128
+ return 'success'
129
+
130
+ # Verify user credentials
131
+ def verify_user(username, password):
132
+ mycursor.execute("SELECT password FROM users WHERE username = %s", (username,))
133
+ record = mycursor.fetchone()
134
+ if record and bcrypt.checkpw(password.encode('utf-8'), record[0].encode('utf-8')):
135
+ # Update last login timestamp
136
+ mycursor.execute("UPDATE users SET last_login = %s WHERE username = %s", (datetime.datetime.now(pytz.timezone('Asia/Kolkata')), username))
137
+ mydb.commit()
138
+ return True
139
+ return False
140
+
141
+ # Reset user password
142
+ def reset_password(username, new_password):
143
+ hashed_password = bcrypt.hashpw(new_password.encode('utf-8'), bcrypt.gensalt())
144
+ # Update password in 'users' table
145
+ mycursor.execute(
146
+ "UPDATE users SET password = %s WHERE username = %s",
147
+ (hashed_password, username)
148
+ )
149
+ mydb.commit()
150
+
151
+ # Session state management
152
+ if 'sign_up_successful' not in st.session_state:
153
+ st.session_state.sign_up_successful = False
154
+ if 'login_successful' not in st.session_state:
155
+ st.session_state.login_successful = False
156
+ if 'reset_password' not in st.session_state:
157
+ st.session_state.reset_password = False
158
+ if 'username' not in st.session_state:
159
+ st.session_state.username = ''
160
+ if 'current_page' not in st.session_state:
161
+ st.session_state.current_page = 'login'
162
+
163
+
164
+ # Login form
165
+ def login():
166
+ st.subheader(':blue[**Login**]')
167
+ with st.form(key='login', clear_on_submit=True):
168
+ st.write("Enter your username and password below.")
169
+
170
+ # Input fields for username and password
171
+ username = st.text_input(label='Username', placeholder='Enter Your Username')
172
+ password = st.text_input(label='Password', placeholder='Enter Your Password', type='password')
173
+
174
+ if st.form_submit_button('Login'):
175
+ if not username or not password:
176
+ st.error("Please fill out all fields.")
177
+ elif verify_user(username, password):
178
+ st.session_state.login_successful = True
179
+ st.session_state.username = username
180
+ st.session_state.current_page = 'home'
181
+ st.rerun()
182
+ else:
183
+ st.error("Incorrect username or password. If you don't have an account, please sign up.")
184
+
185
+ # Display sign-up and reset password button
186
+ if not st.session_state.login_successful:
187
+ c1, c2 = st.columns(2)
188
+ with c1:
189
+ st.write(":red[New user?]")
190
+ if st.button('Sign Up'):
191
+ st.session_state.current_page = 'sign_up'
192
+ st.rerun()
193
+ with c2:
194
+ st.write(":red[Forgot Password?]")
195
+ if st.button('Reset Password'):
196
+ st.session_state.current_page = 'reset_password'
197
+ st.rerun()
198
+
199
+
200
+ # Sign-up form
201
+ def signup():
202
+ st.subheader(':blue[**Sign Up**]')
203
+ with st.form(key='signup', clear_on_submit=True):
204
+ st.write("Enter the required fields to create a new account.")
205
+
206
+ # Input fields for email, username, and password
207
+ email = st.text_input(label='Email', placeholder='Enter Your Email')
208
+ username = st.text_input(label='Username', placeholder='Enter Your Username')
209
+ password = st.text_input(label='Password', placeholder='Enter Your Password', type='password')
210
+ re_password = st.text_input(label='Confirm Password', placeholder='Confirm Your Password', type='password')
211
+
212
+
213
+ if st.form_submit_button('Sign Up'):
214
+ if not email or not username or not password or not re_password:
215
+ st.error("Please fill out all fields.")
216
+ elif not is_valid_email(email):
217
+ st.error("Please enter a valid email address.")
218
+ elif len(password) <= 3:
219
+ st.error("Password too short")
220
+ elif password != re_password:
221
+ st.error("Passwords do not match. Please re-enter.")
222
+ else:
223
+ result = create_user(username, password, email)
224
+ if result == 'username_exists':
225
+ st.error("Username already registered. Please use a different username.")
226
+ elif result == 'email_exists':
227
+ st.error("Email already registered. Please use a different email.")
228
+ elif result == 'success':
229
+ st.success(f"Username {username} created successfully! Please login.")
230
+ st.session_state.sign_up_successful = True
231
+ else:
232
+ st.error("Failed to create user. Please try again later.")
233
+
234
+ if st.session_state.sign_up_successful:
235
+ if st.button('Go to Login'):
236
+ st.session_state.current_page = 'login'
237
+ st.rerun()
238
+
239
+
240
+ # Reset password form
241
+ def reset_password_page():
242
+ st.subheader(':blue[Reset Password]')
243
+ with st.form(key='reset_password', clear_on_submit=True):
244
+ st.write("Enter your username and new password below.")
245
+
246
+ # Input fields for username and new password
247
+ username = st.text_input(label='Username', value='')
248
+ new_password = st.text_input(label='New Password', type='password')
249
+ re_password = st.text_input(label='Confirm New Password', type='password')
250
+
251
+ if st.form_submit_button('Reset Password'):
252
+ if not username:
253
+ st.error("Please enter your username.")
254
+ elif not username_exists(username):
255
+ st.error("Username not found. Please enter a valid username.")
256
+ elif not new_password or not re_password:
257
+ st.error("Please fill out all fields.")
258
+ elif len(new_password) <= 3:
259
+ st.error("Password too short")
260
+ elif new_password != re_password:
261
+ st.error("Passwords do not match. Please re-enter.")
262
+ else:
263
+ reset_password(username, new_password)
264
+ st.success("Password reset successfully. Please login with your new password.")
265
+ st.session_state.current_page = 'login'
266
+
267
+ # Button to return to login page
268
+ st.write('Return to Login page')
269
+ if st.button('Login'):
270
+ st.session_state.current_page = 'login'
271
+ st.rerun()
272
+
273
+
274
+
275
+ # CSS style for the running ticker effect
276
+ ticker_style = """
277
+ <style>
278
+ .ticker-wrap {
279
+ overflow: hidden;
280
+ position: relative;
281
+ box-sizing: border-box;
282
+ padding: 10px;
283
+ background-color: #0E1117;
284
+ color: #FAFAFA;
285
+ font-size: 18px;
286
+ white-space: nowrap;
287
+ }
288
+ .ticker-item {
289
+ display: inline-block;
290
+ padding-right: 30px;
291
+ animation: ticker-slide 15s linear infinite;
292
+ }
293
+ @keyframes ticker-slide {
294
+ 0% {
295
+ transform: translateX(100%);
296
+ }
297
+ 100% {
298
+ transform: translateX(-100%);
299
+ }
300
+ }
301
+ </style>
302
+ """
303
+
304
+
305
+ img='https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExOGttcXJnNXZ5azl5bnNrbDk1bnZ4eTJkeWNtbGJhM2I4ZDZheWplMiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/5k5vZwRFZR5aZeniqb/giphy.webp'
306
+
307
+ disclaimer_message = "Disclaimer: Model data sourced from various web articles. Performance may vary based on data quality and relevance."
308
+
309
+
310
+
311
+ # Load the fine-tuned model and tokenizer
312
+ model_name_or_path = "./fine_tuned_model"
313
+ model = GPT2LMHeadModel.from_pretrained(model_name_or_path)
314
+ tokenizer = GPT2Tokenizer.from_pretrained(model_name_or_path)
315
+
316
+ # Set the pad_token to eos_token if it's not already set
317
+ if tokenizer.pad_token is None:
318
+ tokenizer.pad_token = tokenizer.eos_token
319
+
320
+ # Move the model to GPU if available
321
+ device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
322
+ model.to(device)
323
+
324
+
325
+ # Define the text generation function
326
+ def generate_text(model, tokenizer, seed_text, max_length=100, temperature=0.01, num_return_sequences=1):
327
+ # Tokenize the input text with padding
328
+ inputs = tokenizer(seed_text, return_tensors='pt', padding=True, truncation=True)
329
+
330
+ input_ids = inputs['input_ids'].to(device)
331
+ attention_mask = inputs['attention_mask'].to(device)
332
+
333
+ # Generate text
334
+ with torch.no_grad():
335
+ output = model.generate(
336
+ input_ids,
337
+ attention_mask=attention_mask,
338
+ max_length=max_length,
339
+ temperature=temperature,
340
+ num_return_sequences=num_return_sequences,
341
+ do_sample=True,
342
+ top_k=50,
343
+ top_p=0.1,
344
+ pad_token_id=tokenizer.eos_token_id # Ensure padding token is set to eos_token_id
345
+ )
346
+
347
+ # Decode the generated text
348
+
349
+ generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
350
+
351
+ for word in generated_text.split():
352
+ yield word + " "
353
+ time.sleep(0.1)
354
+
355
+
356
+ #home page
357
+ def home_page():
358
+
359
+ with st.sidebar:
360
+
361
+ st.title(f"Welcome, {st.session_state.username}!")
362
+ st.image(img,use_column_width=True)
363
+
364
+ st.markdown('<br>',unsafe_allow_html=True)
365
+
366
+ st.write("### Example Prompts")
367
+ st.markdown(''' Guvi is an <br> Founders of guvi''',unsafe_allow_html=True)
368
+
369
+ st.markdown('<br>',unsafe_allow_html=True)
370
+
371
+ max=st.slider('Select MAX words',10,250)
372
+
373
+ if st.button("Logout"):
374
+ st.session_state.clear()
375
+ st.session_state.current_page = 'login'
376
+ st.rerun()
377
+
378
+
379
+
380
+ # Display the animated title in Streamlit
381
+
382
+ st.markdown(ticker_style, unsafe_allow_html=True)
383
+ st.markdown(f'<div class="ticker-wrap"><div class="ticker-item">{disclaimer_message}</div></div>', unsafe_allow_html=True)
384
+
385
+
386
+ if "messages" not in st.session_state:
387
+ st.session_state.messages = []
388
+
389
+ if prompt := st.chat_input("What up?"):
390
+
391
+ with st.chat_message("user"):
392
+ st.markdown(prompt)
393
+
394
+ st.session_state.messages.append({"role": "user", "content": prompt})
395
+
396
+ with st.chat_message("assistant"):
397
+
398
+ response = st.write_stream(generate_text(model, tokenizer, seed_text=prompt, max_length=max, temperature=0.01, num_return_sequences=1))
399
+
400
+ st.session_state.messages.append({"role": "assistant", "content": response})
401
+
402
+
403
+
404
+
405
+ # Display appropriate page based on session state
406
+ if st.session_state.current_page == 'home':
407
+ home_page()
408
+ elif st.session_state.current_page == 'login':
409
+ login()
410
+ elif st.session_state.current_page == 'sign_up':
411
+ signup()
412
+ elif st.session_state.current_page == 'reset_password':
413
+ reset_password_page()