From 3fce8f903b73cbbdc53a1abe54615c84f8726d43 Mon Sep 17 00:00:00 2001 From: Bharat Puri Date: Tue, 21 Oct 2025 17:39:15 +0530 Subject: [PATCH] Week2 Assignment submission by Bharat Puri --- .../bharat_puri/employee_onboarding.ipynb | 388 ++++++++++++++++++ .../bharat_puri/onboarding.db | Bin 0 -> 12288 bytes 2 files changed, 388 insertions(+) create mode 100644 week2/community-contributions/bharat_puri/employee_onboarding.ipynb create mode 100644 week2/community-contributions/bharat_puri/onboarding.db diff --git a/week2/community-contributions/bharat_puri/employee_onboarding.ipynb b/week2/community-contributions/bharat_puri/employee_onboarding.ipynb new file mode 100644 index 0000000..f9f3968 --- /dev/null +++ b/week2/community-contributions/bharat_puri/employee_onboarding.ipynb @@ -0,0 +1,388 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "ddfa9ae6-69fe-444a-b994-8c4c5970a7ec", + "metadata": {}, + "source": [ + "# Project - New Employee Onboarding Assistant\n", + "\n", + "A friendly HR assistant that helps new employees get started — explains policies, checks training schedules, finds contacts, and shows office images — while speaking replies and displaying visuals." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "8b50bbe2-c0b1-49c3-9a5c-1ba7efa2bcb4", + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "\n", + "import os, json, sqlite3, base64\n", + "import json\n", + "from dotenv import load_dotenv\n", + "import gradio as gr\n", + "from io import BytesIO\n", + "from PIL import Image\n", + "import sys\n", + "sys.path.append(os.path.abspath(os.path.join(\"..\", \"..\"))) \n", + "from openai import OpenAI\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "747e8786-9da8-4342-b6c9-f5f69c2e22ae", + "metadata": {}, + "outputs": [], + "source": [ + "# Initialization\n", + "\n", + "conn = sqlite3.connect(\"onboarding.db\")\n", + "cursor = conn.cursor()\n", + "\n", + "cursor.execute(\"\"\"\n", + "CREATE TABLE IF NOT EXISTS employees (\n", + " name TEXT,\n", + " role TEXT,\n", + " start_date TEXT,\n", + " manager TEXT,\n", + " location TEXT\n", + ")\n", + "\"\"\")\n", + "\n", + "cursor.execute(\"\"\"\n", + "CREATE TABLE IF NOT EXISTS training (\n", + " role TEXT,\n", + " course TEXT,\n", + " duration TEXT\n", + ")\n", + "\"\"\")\n", + "\n", + "cursor.executemany(\"INSERT INTO employees VALUES (?, ?, ?, ?, ?)\", [\n", + " (\"Alice\", \"DevOps Engineer\", \"2025-10-15\", \"Bharat Puri\", \"Pune HQ\"),\n", + " (\"Ravi\", \"Data Analyst\", \"2025-10-20\", \"Neha Kapoor\", \"Bangalore\"),\n", + "])\n", + "\n", + "cursor.executemany(\"INSERT INTO training VALUES (?, ?, ?)\", [\n", + " (\"DevOps Engineer\", \"Cloud Infrastructure Basics\", \"2 weeks\"),\n", + " (\"DevOps Engineer\", \"Security and Compliance\", \"1 week\"),\n", + " (\"Data Analyst\", \"Python for Data Analysis\", \"3 weeks\")\n", + "])\n", + "\n", + "conn.commit()\n", + "conn.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c3e8173c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "✅ API Key loaded: sk-proj-****\n" + ] + } + ], + "source": [ + "load_dotenv(override=True)\n", + "\n", + "openai_api_key = os.getenv(\"OPENAI_API_KEY\")\n", + "if openai_api_key:\n", + " print(f\"✅ API Key loaded: {openai_api_key[:8]}****\")\n", + "else:\n", + " print(\"❌ OPENAI_API_KEY not set\")\n", + "\n", + "MODEL = \"gpt-4.1-mini\"\n", + "openai = OpenAI()\n", + "DB = \"onboarding.db\"" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "0a521d84-d07c-49ab-a0df-d6451499ed97", + "metadata": {}, + "outputs": [], + "source": [ + "system_message = \"\"\"\n", + "You are WelcomeAI, an onboarding assistant for new employees.\n", + "Be friendly and concise (1–2 sentences). \n", + "Always be accurate and supportive. If unsure, say so politely.\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "2f6396f8-247e-4289-9bca-590cfc94a377", + "metadata": {}, + "outputs": [], + "source": [ + "# -------------------- TOOLS --------------------\n", + "\n", + "def get_employee_info(name):\n", + " with sqlite3.connect(DB) as conn:\n", + " cursor = conn.cursor()\n", + " cursor.execute(\"SELECT * FROM employees WHERE lower(name)=?\", (name.lower(),))\n", + " result = cursor.fetchone()\n", + " if result:\n", + " name, role, start_date, manager, location = result\n", + " return f\"{name} is joining as a {role} on {start_date}. Manager: {manager}. Location: {location}.\"\n", + " else:\n", + " return \"I couldn’t find that employee in the database.\"" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "03f19289", + "metadata": {}, + "outputs": [], + "source": [ + "def get_training_schedule(role):\n", + " with sqlite3.connect(DB) as conn:\n", + " cursor = conn.cursor()\n", + " cursor.execute(\"SELECT course, duration FROM training WHERE role=?\", (role,))\n", + " results = cursor.fetchall()\n", + " if results:\n", + " schedule = \"; \".join([f\"{course} ({duration})\" for course, duration in results])\n", + " return f\"Training schedule for {role}: {schedule}\"\n", + " else:\n", + " return \"No training schedule found for that role.\"" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "bcfb6523", + "metadata": {}, + "outputs": [], + "source": [ + "# Tool schema definitions\n", + "employee_tool = {\n", + " \"name\": \"get_employee_info\",\n", + " \"description\": \"Retrieve onboarding information about a new employee.\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"employee_name\": {\"type\": \"string\", \"description\": \"The full name of the employee.\"}\n", + " },\n", + " \"required\": [\"employee_name\"],\n", + " },\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "61a2a15d-b559-4844-b377-6bd5cb4949f6", + "metadata": {}, + "outputs": [], + "source": [ + "training_tool = {\n", + " \"name\": \"get_training_schedule\",\n", + " \"description\": \"Get the training schedule for a given role.\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"role\": {\"type\": \"string\", \"description\": \"The job role of the employee.\"}\n", + " },\n", + " \"required\": [\"role\"],\n", + " },\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "c91d012e", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "tools = [{\"type\": \"function\", \"function\": employee_tool},\n", + " {\"type\": \"function\", \"function\": training_tool}]" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "956c3b61", + "metadata": {}, + "outputs": [], + "source": [ + "# -------------------- MULTI-MODAL --------------------\n", + "def artist(topic):\n", + " prompt = f\"A friendly HR welcome image showing {topic}, office vibes, smiling team, pop-art style\"\n", + " image_response = openai.images.generate(\n", + " model=\"dall-e-3\",\n", + " prompt=prompt,\n", + " size=\"1024x1024\",\n", + " response_format=\"b64_json\"\n", + " )\n", + " img_base64 = image_response.data[0].b64_json\n", + " img_data = base64.b64decode(img_base64)\n", + " return Image.open(BytesIO(img_data))\n", + "\n", + "def talker(message):\n", + " response = openai.audio.speech.create(\n", + " model=\"gpt-4o-mini-tts\",\n", + " voice=\"alloy\",\n", + " input=message\n", + " )\n", + " return response.content" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "8eca803e", + "metadata": {}, + "outputs": [], + "source": [ + "# -------------------- AGENT LOGIC --------------------\n", + "\n", + "def handle_tool_calls(message):\n", + " responses, topics = [], []\n", + " for call in message.tool_calls:\n", + " if call.function.name == \"get_employee_info\":\n", + " args = json.loads(call.function.arguments)\n", + " name = args.get(\"employee_name\")\n", + " topics.append(name)\n", + " info = get_employee_info(name)\n", + " responses.append({\"role\": \"tool\", \"content\": info, \"tool_call_id\": call.id})\n", + " elif call.function.name == \"get_training_schedule\":\n", + " args = json.loads(call.function.arguments)\n", + " role = args.get(\"role\")\n", + " topics.append(role)\n", + " info = get_training_schedule(role)\n", + " responses.append({\"role\": \"tool\", \"content\": info, \"tool_call_id\": call.id})\n", + " return responses, topics\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "2c27c4ba-8ed5-492f-add1-02ce9c81d34c", + "metadata": {}, + "outputs": [], + "source": [ + "def chat(history):\n", + " history = [{\"role\": h[\"role\"], \"content\": h[\"content\"]} for h in history]\n", + " messages = [{\"role\": \"system\", \"content\": system_message}] + history\n", + " response = openai.chat.completions.create(model=MODEL, messages=messages, tools=tools)\n", + " topics, image = [], None\n", + "\n", + " while response.choices[0].finish_reason == \"tool_calls\":\n", + " msg = response.choices[0].message\n", + " responses, topics = handle_tool_calls(msg)\n", + " messages.append(msg)\n", + " messages.extend(responses)\n", + " response = openai.chat.completions.create(model=MODEL, messages=messages, tools=tools)\n", + "\n", + " reply = response.choices[0].message.content\n", + " voice = talker(reply)\n", + "\n", + " if topics:\n", + " image = artist(topics[0])\n", + "\n", + " return history + [{\"role\": \"assistant\", \"content\": reply}], voice, image" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "773a9f11-557e-43c9-ad50-56cbec3a0f8f", + "metadata": {}, + "outputs": [], + "source": [ + "# -------------------- GRADIO UI --------------------\n", + "\n", + "def put_message_in_chatbot(message, history):\n", + " return \"\", history + [{\"role\": \"user\", \"content\": message}]\n", + "\n", + "with gr.Blocks() as ui:\n", + " gr.Markdown(\"## 🧑‍💼 WelcomeAI — Your HR Onboarding Companion\")\n", + " with gr.Row():\n", + " chatbot = gr.Chatbot(height=500, type=\"messages\")\n", + " image_output = gr.Image(height=500, interactive=False)\n", + " with gr.Row():\n", + " audio_output = gr.Audio(autoplay=True)\n", + " with gr.Row():\n", + " message = gr.Textbox(label=\"Ask me about onboarding, training, or company info:\")\n", + "\n", + " message.submit(put_message_in_chatbot, [message, chatbot], [message, chatbot]).then(\n", + " chat, chatbot, [chatbot, audio_output, image_output]\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "728a12c5-adc3-415d-bb05-82beb73b079b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Rerunning server... use `close()` to stop if you need to change `launch()` parameters.\n", + "----\n", + "* To create a public link, set `share=True` in `launch()`.\n" + ] + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ui.launch(inbrowser=True, auth=(\"hradmin\", \"welcome123\"))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.14" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/week2/community-contributions/bharat_puri/onboarding.db b/week2/community-contributions/bharat_puri/onboarding.db new file mode 100644 index 0000000000000000000000000000000000000000..098859a71157678157a389c689145ee8e6d2b7d0 GIT binary patch literal 12288 zcmeI&Pm9w)6aerfO;dNlWDiP_vUHZZpwzX0cI!n1+iqaRMZ3E_h!=UL({?bKDU-=c zkG*;n#BbtfQ1GMp6$EGNW{m|8%|*fYAkEB6r|3mJhT`^J`Gn#N;7 z48thutDvtmEWNPPjlP?i^`DkSy&yi1dYi6V8AKw6#3aDcSXYW#vRa6v>D@ q;bRH0l1ZQvNl6c47R2qJg&NMfofX&a%+A+YVcpKGwL3F&b@l^G3SH;` literal 0 HcmV?d00001