LovnishVerma commited on
Commit
cfade39
·
verified ·
1 Parent(s): 3441a54

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +106 -200
app.py CHANGED
@@ -1,50 +1,82 @@
1
- import gradio as gr
2
  import google.generativeai as genai
 
 
3
  import os
 
 
 
4
  from datetime import datetime
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
 
6
- # Configure Gemini API
7
- GEMINI_API_KEY = os.environ.get("GEMINI_API_KEY")
8
- if GEMINI_API_KEY:
9
- genai.configure(api_key=GEMINI_API_KEY)
10
-
11
- # NIELIT University Information
12
- NIELIT_INFO = """
13
- You are an AI assistant for NIELIT (National Institute of Electronics & Information Technology) Deemed to be University.
14
-
15
- NIELIT UNIVERSITY INFORMATION:
16
- - NIELIT is an autonomous scientific society under the Ministry of Electronics and Information Technology (MeitY), Government of India
17
- - NIELIT has been conferred the status of "Deemed to be University" under Section 3 of the UGC Act, 1956
18
- - Offers various programs in IT, Electronics, and emerging technologies
19
- - Multiple centers across India including Delhi, Kolkata, Chennai, Calicut, Gorakhpur, Ajmer, Aurangabad, and more
20
- - Programs offered: B.Tech, M.Tech, MCA, PhD, and various certification courses
21
- - Focus areas: Artificial Intelligence, Machine Learning, Cybersecurity, IoT, Data Science, Cloud Computing, Blockchain
22
- - NIELIT also conducts CCC (Course on Computer Concepts), BCC, and other IT literacy programs
23
- - Conducts entrance exams for various programs
24
-
25
- KEY COURSES:
26
- 1. B.Tech in Computer Science & Engineering
27
- 2. M.Tech in various specializations (AI, Cybersecurity, Data Science, etc.)
28
- 3. MCA (Master of Computer Applications)
29
- 4. PhD programs in Computer Science and Electronics
30
- 5. Certificate and Diploma courses (CCC, BCC, O Level, A Level, B Level, C Level)
31
-
32
- ADMISSIONS:
33
- - Admissions through entrance examinations
34
- - Online application process
35
- - Merit-based selection for various programs
36
-
37
- When answering questions:
38
- 1. Be helpful, informative, and student-friendly
39
- 2. Provide accurate information about NIELIT programs and services
40
- 3. Guide students on admissions, courses, and career opportunities
41
- 4. If you don't know specific current details (fees, dates, etc.), suggest visiting the official NIELIT website or contacting the admission office
42
- 5. Be encouraging and supportive to prospective students
43
  """
44
 
 
45
  def get_available_model_name():
46
  """
47
- Dynamically finds a working Gemini model from the user's account.
48
  """
49
  try:
50
  available_models = []
@@ -53,9 +85,10 @@ def get_available_model_name():
53
  available_models.append(m.name)
54
 
55
  if not available_models:
 
56
  return None
57
 
58
- # Priority list: Try to find these specific models first
59
  preferred_order = [
60
  "models/gemini-1.5-flash",
61
  "models/gemini-1.5-pro",
@@ -63,176 +96,49 @@ def get_available_model_name():
63
  "models/gemini-1.0-pro"
64
  ]
65
 
66
- # Check if any preferred model is available
67
  for preferred in preferred_order:
68
  if preferred in available_models:
 
69
  return preferred
70
 
71
- # If none of the preferred ones exist, use the first available
72
- return available_models[0]
 
 
73
 
74
  except Exception as e:
 
75
  return None
76
 
77
- def get_chatbot_response(message, history):
78
- """Generate response using Gemini API"""
79
-
80
- if not GEMINI_API_KEY:
81
- return "⚠️ Please set the GEMINI_API_KEY environment variable in Hugging Face Spaces settings."
82
-
83
  try:
84
- # Get the best available model
85
- model_name = get_available_model_name()
86
-
87
- if not model_name:
88
- return "❌ No available Gemini models found for your API key.\n\n🔑 Please verify your API key at: https://aistudio.google.com/app/apikey\n\nMake sure you have access to Gemini models."
89
-
90
- # Initialize the model
91
- model = genai.GenerativeModel(model_name)
92
-
93
- # Build conversation history
94
- chat_history = []
95
- for human, assistant in history:
96
- chat_history.append({"role": "user", "parts": [human]})
97
- chat_history.append({"role": "model", "parts": [assistant]})
98
-
99
- # Start chat with history
100
- chat = model.start_chat(history=chat_history)
101
-
102
- # Create context-aware prompt
103
- full_prompt = f"{NIELIT_INFO}\n\nStudent Query: {message}\n\nProvide a helpful and accurate response:"
104
-
105
- # Get response
106
- response = chat.send_message(full_prompt)
107
-
108
- return response.text
109
-
110
  except Exception as e:
111
- error_msg = str(e)
112
- if "API_KEY_INVALID" in error_msg or "invalid" in error_msg.lower():
113
- return f"❌ Invalid API Key Error: {error_msg}\n\n🔑 Please get a valid API key from: https://aistudio.google.com/app/apikey\n\nThen set it in Hugging Face Spaces: Settings → Repository secrets → GEMINI_API_KEY"
114
- return f"❌ Error: {error_msg}\n\nModel used: {model_name if 'model_name' in locals() else 'unknown'}\n\nIf the error persists, please verify your API key is correct."
115
-
116
- # Custom CSS for NIELIT branding
117
- custom_css = """
118
- #header {
119
- text-align: center;
120
- background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%);
121
- padding: 20px;
122
- border-radius: 10px;
123
- margin-bottom: 20px;
124
- }
125
-
126
- #header h1 {
127
- color: white;
128
- margin: 0;
129
- font-size: 2em;
130
- }
131
-
132
- #header p {
133
- color: #e0e0e0;
134
- margin: 5px 0 0 0;
135
- }
136
-
137
- .message-wrap {
138
- border-radius: 10px !important;
139
- }
140
-
141
- footer {
142
- text-align: center;
143
- margin-top: 20px;
144
- color: #666;
145
- }
146
- """
147
-
148
- # Predefined quick questions
149
- example_questions = [
150
- "What programs does NIELIT University offer?",
151
- "How can I apply for admission?",
152
- "What is the CCC course?",
153
- "Tell me about M.Tech programs",
154
- "What are the career opportunities after NIELIT courses?",
155
- "Information about PhD programs",
156
- ]
157
-
158
- # Create Gradio interface
159
- with gr.Blocks(css=custom_css, theme=gr.themes.Soft()) as demo:
160
- # Header
161
- with gr.Row(elem_id="header"):
162
- gr.HTML("""
163
- <div>
164
- <h1>🎓 NIELIT Deemed to be University</h1>
165
- <p>AI-Powered Student Assistance Chatbot</p>
166
- </div>
167
- """)
168
-
169
- # Main content
170
- with gr.Row():
171
- with gr.Column(scale=4):
172
- chatbot = gr.Chatbot(
173
- height=500,
174
- bubble_full_width=False,
175
- avatar_images=(None, "bot.png"),
176
- show_label=False
177
- )
178
-
179
- with gr.Row():
180
- msg = gr.Textbox(
181
- placeholder="Ask me anything about NIELIT University, programs, admissions...",
182
- show_label=False,
183
- scale=4,
184
- container=False
185
- )
186
- submit = gr.Button("Send", variant="primary", scale=1)
187
-
188
- clear = gr.Button("🗑️ Clear Chat")
189
-
190
- with gr.Column(scale=1):
191
- gr.Markdown("### 💡 Quick Questions")
192
-
193
- for question in example_questions:
194
- btn = gr.Button(question, size="sm")
195
- btn.click(
196
- lambda q=question: q,
197
- outputs=msg
198
- )
199
-
200
- gr.Markdown("---")
201
- gr.Markdown("""
202
- ### ℹ️ About
203
- This chatbot provides information about:
204
- - 📚 Academic Programs
205
- - 📝 Admissions Process
206
- - 🎯 Course Details
207
- - 💼 Career Guidance
208
- - 📞 Contact Information
209
-
210
- ### 🔗 Official Links
211
- - [NIELIT Website](https://www.nielit.gov.in)
212
- - [Student Portal](https://student.nielit.gov.in)
213
- - [Admissions](https://nielit.gov.in/admissions)
214
- """)
215
-
216
- # Footer
217
- gr.HTML("""
218
- <footer>
219
- <p>Powered by Google Gemini AI | Developed for NIELIT Deemed to be University</p>
220
- <p style="font-size: 0.9em; color: #999;">
221
- For official information, please visit <a href="https://www.nielit.gov.in" target="_blank">www.nielit.gov.in</a>
222
- </p>
223
- </footer>
224
- """)
225
 
226
- # Event handlers
227
- def respond(message, chat_history):
228
- bot_message = get_chatbot_response(message, chat_history)
229
- chat_history.append((message, bot_message))
230
- return "", chat_history
231
-
232
- msg.submit(respond, [msg, chatbot], [msg, chatbot])
233
- submit.click(respond, [msg, chatbot], [msg, chatbot])
234
- clear.click(lambda: None, None, chatbot, queue=False)
 
235
 
236
- # Launch the app
237
  if __name__ == "__main__":
238
- demo.launch()
 
 
1
  import google.generativeai as genai
2
+ from dotenv import load_dotenv
3
+ import logging
4
  import os
5
+ import requests
6
+ from bs4 import BeautifulSoup
7
+ import time
8
  from datetime import datetime
9
+ import gradio as gr
10
+
11
+ # ==========================================
12
+ # 1. SETUP & CONFIGURATION
13
+ # ==========================================
14
+ logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s')
15
+ logger = logging.getLogger(__name__)
16
+
17
+ load_dotenv()
18
+ api_key = os.getenv("GEMINI_API_KEY")
19
+
20
+ # Emergency Fallback (If env fails)
21
+ if not api_key:
22
+ # api_key = "PASTE_YOUR_KEY_HERE"
23
+ pass
24
+
25
+ try:
26
+ genai.configure(api_key=api_key)
27
+ except Exception as e:
28
+ print(f"⚠️ Key Error: {e}")
29
+
30
+ # ==========================================
31
+ # 2. THE WEB SCRAPER (Working Perfectly)
32
+ # ==========================================
33
+ def fetch_nielit_live_data():
34
+ target_urls = [
35
+ "https://nielit.ac.in/",
36
+ "https://www.nielit.gov.in/chandigarh/index.php"
37
+ ]
38
+
39
+ knowledge = f"### LIVE NIELIT DATA ({datetime.now().strftime('%Y-%m-%d')}) ###\n"
40
+ headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'}
41
+
42
+ print("⚡ SCANNING WEBSITES...")
43
+
44
+ for url in target_urls:
45
+ try:
46
+ print(f" Reading: {url}...")
47
+ resp = requests.get(url, headers=headers, timeout=10)
48
+ if resp.status_code == 200:
49
+ soup = BeautifulSoup(resp.content, 'html.parser')
50
+ for bad in soup(["script", "style", "nav", "footer"]):
51
+ bad.extract()
52
+ text = ' '.join(soup.get_text(separator=' ', strip=True).split())
53
+ knowledge += f"\n--- SOURCE: {url} ---\n{text[:8000]}\n"
54
+ except:
55
+ pass # Skip failed sites to prevent crashes
56
+
57
+ return knowledge
58
+
59
+ # ==========================================
60
+ # 3. INITIALIZATION
61
+ # ==========================================
62
+ print("\n🚀 STARTING BOT...")
63
+ nielit_data = fetch_nielit_live_data()
64
 
65
+ system_prompt = f"""You are the **Official AI Assistant for NIELIT Ropar**.
66
+ Your answers must be professional, academic, and based STRICTLY on the text below.
67
+
68
+ ### OFFICIAL DATA:
69
+ {nielit_data}
70
+
71
+ ### RULES:
72
+ 1. If details (like specific fees) aren't in the text, say: "Please check the official website for the latest updates."
73
+ 2. Do not hallucinate.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74
  """
75
 
76
+ # Try loading the model
77
  def get_available_model_name():
78
  """
79
+ Dynamically finds a working model from the user's account.
80
  """
81
  try:
82
  available_models = []
 
85
  available_models.append(m.name)
86
 
87
  if not available_models:
88
+ logger.error("No models found.")
89
  return None
90
 
91
+ # Priority list: Try to find these specific powerful models first
92
  preferred_order = [
93
  "models/gemini-1.5-flash",
94
  "models/gemini-1.5-pro",
 
96
  "models/gemini-1.0-pro"
97
  ]
98
 
99
+ # 1. Check if any preferred model is in the available list
100
  for preferred in preferred_order:
101
  if preferred in available_models:
102
+ logger.info(f"Selected Preferred Model: {preferred}")
103
  return preferred
104
 
105
+ # 2. If none of the preferred ones exist, take the first available one
106
+ fallback = available_models[0]
107
+ logger.warning(f"Preferred models missing. Falling back to: {fallback}")
108
+ return fallback
109
 
110
  except Exception as e:
111
+ logger.error(f"Error listing models: {e}")
112
  return None
113
 
114
+ # ==========================================
115
+ # 4. CHAT LOGIC
116
+ # ==========================================
117
+ def chat_response(message, history):
 
 
118
  try:
119
+ if not api_key: return "⚠️ API Key Missing."
120
+ return model.generate_content(message).text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
  except Exception as e:
122
+ return f"⚠️ Error: {str(e)}"
123
+
124
+ # ==========================================
125
+ # 5. UI (CRASH PROOF VERSION)
126
+ # ==========================================
127
+ # We use Blocks (Stable) instead of passing arguments to ChatInterface (Risky)
128
+ with gr.Blocks(theme=gr.themes.Soft()) as demo:
129
+ gr.Markdown("# 🎓 NIELIT Ropar AI Assistant")
130
+ gr.Markdown("Powered by **Gemini 1.5** + **Live Web Scraping**")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
131
 
132
+ # Simple, arguments-free Interface to prevent TypeErrors
133
+ chat_interface = gr.ChatInterface(
134
+ fn=chat_response,
135
+ examples=[
136
+ "Does NIELIT Ropar have bus facility?",
137
+ "Who is the Head of Training?",
138
+ "What is the Fee structure?",
139
+ "Where is the campus located?"
140
+ ]
141
+ )
142
 
 
143
  if __name__ == "__main__":
144
+ demo.queue().launch(server_name="0.0.0.0", server_port=7860)