File size: 6,434 Bytes
a67b944
8d70907
 
 
e879fee
a67b944
 
 
 
f5e78b1
a67b944
e879fee
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0d1af53
 
f5e78b1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a67b944
f5e78b1
02deea6
e879fee
f5e78b1
 
02deea6
 
 
 
f5e78b1
02deea6
6f92975
f5e78b1
 
 
 
e879fee
f5e78b1
e879fee
 
a67b944
f5e78b1
a67b944
 
 
 
 
f5e78b1
a67b944
e879fee
a67b944
 
ea2d7d7
02deea6
a67b944
f5e78b1
a67b944
e879fee
 
 
a67b944
 
f5e78b1
a67b944
 
e879fee
0d1af53
a67b944
 
f5e78b1
 
 
 
 
 
 
a67b944
e879fee
a67b944
e879fee
a67b944
 
e879fee
 
 
 
a67b944
 
e879fee
 
f5e78b1
a67b944
f5e78b1
a67b944
 
 
e879fee
a67b944
02deea6
f5e78b1
02deea6
 
a67b944
e879fee
f5e78b1
e879fee
 
 
 
f5e78b1
8d70907
 
a67b944
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
import gradio as gr
import google.generativeai as genai
import os

# 1. Configure Gemini API
GEMINI_API_KEY = os.environ.get("GEMINI_API_KEY")
if GEMINI_API_KEY:
    genai.configure(api_key=GEMINI_API_KEY)

# 2. Detailed University Information
NIELIT_INFO = """
You are the official AI Assistant for NIELIT (National Institute of Electronics & Information Technology) Deemed to be University. 

UNIVERSITY STATUS:
- Autonomous scientific society under MeitY, Govt of India.
- Conferred "Deemed to be University" status under Section 3 of the UGC Act, 1956.

FEE STRUCTURE (Session 2025-26/2026):
- Admission Fee: ₹5,000 (One-time)
- Security Deposit: ₹5,000 (Refundable)
- Academic Fee: ₹5,000 (Per odd semester)
- Tuition Fee (Per Semester):
  * B.Tech: ₹50,000
  * M.Tech: ₹60,000
  * MCA: ₹32,000
  * BCA: ₹30,000
  * Diploma: ₹27,000
  * PhD: ₹40,000
- Note: Tuition & Exam fees are waived for SC/ST candidates as per Govt. rules.

IMPORTANT DATES (January 2026 Cycle):
- Theory Exams (O/A/B/C Level): Jan 10 – Jan 18, 2026.
- Practical Exams: Starting Feb 7, 2026.
- DLC (CCC/BCC) Jan 2026 Exam: Postponed to Feb 23–27, 2026.

GUIDELINES:
1. Use a professional, student-friendly tone.
2. If asked about fees or dates not listed here, provide the specific 2026 data mentioned above.
3. Always encourage students to verify at https://student.nielit.gov.in for their specific admit cards.
"""

# --- ROBUST MODEL SELECTOR (Prevents 404 Errors) ---
def get_working_model():
    """Finds a model that actually exists for your key"""
    try:
        # Get all available models
        available = [m.name for m in genai.list_models() if 'generateContent' in m.supported_generation_methods]
        
        # Priority list (Fastest -> Best -> Fallback)
        priorities = [
            "models/gemini-1.5-flash",
            "models/gemini-1.5-pro",
            "models/gemini-1.0-pro",
            "models/gemini-pro"
        ]
        
        # Pick the first priority that exists in your available list
        for model in priorities:
            if model in available:
                return model
                
        # If no priority match, just take the first available one
        return available[0] if available else "models/gemini-pro"
        
    except Exception:
        # Emergency fallback
        return "gemini-pro"

def get_chatbot_response(message, history):
    # 1. Handle Empty/Greeting locally (Zero Latency)
    if not message or not message.strip():
        return ""
        
    greetings = ["hi", "hello", "hey", "hlo", "namaste", "hola"]
    if message.lower().strip() in greetings:
        return "Hello! 👋 I am the NIELIT University AI Assistant. How can I help you with admissions, fees, or exam details today?"

    if not GEMINI_API_KEY:
        return "⚠️ System Error: GEMINI_API_KEY is missing."

    try:
        # 2. Get a working model dynamically
        model_name = get_working_model()
        
        # 3. Initialize
        model = genai.GenerativeModel(
            model_name=model_name,
            system_instruction=NIELIT_INFO
        )
        
        # 4. Format History
        chat_history = []
        for human, assistant in history:
            chat_history.append({"role": "user", "parts": [human]})
            chat_history.append({"role": "model", "parts": [assistant]})
        
        # 5. Generate
        chat = model.start_chat(history=chat_history)
        response = chat.send_message(message)
        return response.text
        
    except Exception as e:
        return f"❌ Connection Error: {str(e)}"

# 3. Custom CSS
custom_css = """
#header { text-align: center; background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%); padding: 20px; border-radius: 10px; margin-bottom: 20px; color: white; }
.message-wrap { border-radius: 10px !important; }
footer { text-align: center; margin-top: 20px; color: #666; font-size: 0.9em; }
"""

# 4. UI Layout
with gr.Blocks(css=custom_css, theme=gr.themes.Soft()) as demo:
    with gr.Row(elem_id="header"):
        gr.HTML("<h1>🎓 NIELIT University AI Support</h1><p>Admissions • Fees • Exams • 2026 Session</p>")
    
    with gr.Row():
        with gr.Column(scale=4):
            # --- AVATAR CONFIGURATION HERE ---
            # (None, "bot.png") means: User gets default icon, Bot gets "bot.png"
            chatbot = gr.Chatbot(
                height=500, 
                show_label=False, 
                avatar_images=(None, "https://cdn-uploads.huggingface.co/production/uploads/6474405f90330355db146c76/dOtPhPMj5nk3SEceM_3Iq.png") 
            )
            with gr.Row():
                msg = gr.Textbox(placeholder="Ask about B.Tech fees, CCC exams, or admissions...", scale=4, container=False)
                submit = gr.Button("Send", variant="primary", scale=1)
            clear = gr.Button("🗑️ Clear Conversation")
        
        with gr.Column(scale=1):
            gr.Markdown("### 💡 FAQ")
            q1 = gr.Button("What are the B.Tech fees?", size="sm")
            q2 = gr.Button("When are the Jan 2026 exams?", size="sm")
            q3 = gr.Button("Is there a fee waiver for SC/ST?", size="sm")
            
            gr.Markdown("---")
            gr.Markdown("### 🔗 Links\n- [Student Portal](https://student.nielit.gov.in)\n- [Official Site](https://nielit.gov.in)")

    # 5. Logic
    def respond(message, chat_history):
        if chat_history is None: chat_history = []
        bot_message = get_chatbot_response(message, chat_history)
        chat_history.append((message, bot_message))
        return "", chat_history

    msg.submit(respond, [msg, chatbot], [msg, chatbot])
    
    # *** API ENDPOINT EXPOSED HERE ***
    submit.click(respond, [msg, chatbot], [msg, chatbot], api_name="chat_with_bot")
    
    clear.click(lambda: None, None, chatbot, queue=False)
    
    # Quick Links
    q1.click(lambda: "What is the fee structure for B.Tech programs?", outputs=msg).then(respond, [msg, chatbot], [msg, chatbot])
    q2.click(lambda: "What are the exam dates for January 2026?", outputs=msg).then(respond, [msg, chatbot], [msg, chatbot])
    q3.click(lambda: "Do SC/ST students get a fee waiver?", outputs=msg).then(respond, [msg, chatbot], [msg, chatbot])

    gr.HTML("<footer>Powered by Google Gemini | Official NIELIT Deemed University Assistant</footer>")

if __name__ == "__main__":
    demo.launch()