import os import re import json import requests from pypdf import PdfReader from openai import OpenAI import gradio as gr # ================= CONFIG ================= OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY") BASE_URL = "https://integrate.api.nvidia.com/v1" MODEL = "meta/llama3-8b-instruct" PUSHOVER_TOKEN = os.environ.get("PUSHOVER_TOKEN") PUSHOVER_USER = os.environ.get("PUSHOVER_USER") client = OpenAI( api_key=OPENAI_API_KEY, base_url=BASE_URL ) EMAIL_REGEX = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" # ================= PUSHOVER ================= def push(text): try: if not PUSHOVER_TOKEN or not PUSHOVER_USER: return requests.post( "https://api.pushover.net/1/messages.json", data={ "token": PUSHOVER_TOKEN, "user": PUSHOVER_USER, "message": text }, timeout=5 ) except Exception: pass def record_user_details(email, name="Name not provided", notes="Interested user"): push(f"🔥 Lead\nName: {name}\nEmail: {email}\nNotes: {notes}") def record_unknown_question(question): push(f"❓ Unknown Question:\n{question}") # ================= BOT CLASS ================= class Me: def __init__(self): self.name = "Ayush Tyagi" self.summary = "" self.linkedin = "" if os.path.exists("me/summary.txt"): with open("me/summary.txt", "r", encoding="utf-8") as f: self.summary = f.read() pdf_path = "me/Ayush_linkdin.pdf" if os.path.exists(pdf_path): reader = PdfReader(pdf_path) pages = [] for page in reader.pages: text = page.extract_text() if text: pages.append(text) self.linkedin = "\n\n".join(pages) def system_prompt(self): return f""" You are acting as {self.name}. Answer questions about his background, skills, experience, and projects. RULES: - Never share private address or sensitive data. - If the user sounds confused or asks something unrelated, say you’re not sure. - If user shows interest or asks for contact, politely ask for their email. PROFILE SUMMARY: {self.summary} LINKEDIN CONTENT: {self.linkedin} """ def chat(self, message, history): messages = [{"role": "system", "content": self.system_prompt()}] for h in history: messages.append(h) messages.append({"role": "user", "content": message}) response = client.chat.completions.create( model=MODEL, messages=messages, max_tokens=500 ) reply = response.choices[0].message.content # ---------- EMAIL DETECTION ---------- email_match = re.search(EMAIL_REGEX, message) if email_match: email = email_match.group(0) record_user_details(email=email) # ---------- UNKNOWN QUESTION ---------- if len(message.split()) > 10 and "ayush" not in message.lower(): record_unknown_question(message) return reply # ================= GRADIO ================= me = Me() def respond(user_message, history): bot_reply = me.chat(user_message, history) history.append({"role": "user", "content": user_message}) history.append({"role": "assistant", "content": bot_reply}) return "", history with gr.Blocks(css=""" body, .gradio-container { background-color: #0d0d0d; color: white; } .gr-button { background-color: #ff4da6 !important; color: black !important; font-weight: 600 !important; } .gr-button:hover { background-color: #ff1a8c !important; } #chatbot { background: #111; border-radius: 12px; padding: 10px; } """) as ui: chatbot = gr.Chatbot(type="messages", height=420, elem_id="chatbot") with gr.Row(): btn_about = gr.Button("Who are you?") btn_contact = gr.Button("Contact Info") btn_projects = gr.Button("Latest Projects") with gr.Row(): user_input = gr.Textbox(placeholder="Type your message...", scale=8) send_btn = gr.Button("Send", scale=1) btn_about.click(lambda: "Who are you?", None, user_input) btn_contact.click(lambda: "How can I contact Ayush Tyagi?", None, user_input) btn_projects.click(lambda: "Show Ayush Tyagi’s latest projects.", None, user_input) user_input.submit(respond, [user_input, chatbot], [user_input, chatbot]) send_btn.click(respond, [user_input, chatbot], [user_input, chatbot]) if __name__ == "__main__": ui.launch()