{ "cells": [ { "cell_type": "markdown", "id": "8b0e11f2-9ea4-48c2-b8d2-d0a4ba967827", "metadata": {}, "source": [ "# Gradio Day!\n", "\n", "Today we will build User Interfaces using the outrageously simple Gradio framework.\n", "\n", "Prepare for joy!\n", "\n", "Please note: your Gradio screens may appear in 'dark mode' or 'light mode' depending on your computer settings." ] }, { "cell_type": "code", "execution_count": 2, "id": "c44c5494-950d-4d2f-8d4f-b87b57c5b330", "metadata": {}, "outputs": [], "source": [ "# imports\n", "\n", "import os\n", "import requests\n", "from bs4 import BeautifulSoup\n", "from typing import List\n", "from dotenv import load_dotenv\n", "from openai import OpenAI\n", "import google.generativeai\n", "import anthropic" ] }, { "cell_type": "code", "execution_count": 3, "id": "d1715421-cead-400b-99af-986388a97aff", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: gradio in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (5.15.0)\n", "Requirement already satisfied: aiofiles<24.0,>=22.0 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from gradio) (23.2.1)\n", "Requirement already satisfied: anyio<5.0,>=3.0 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from gradio) (4.8.0)\n", "Requirement already satisfied: fastapi<1.0,>=0.115.2 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from gradio) (0.115.8)\n", "Requirement already satisfied: ffmpy in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from gradio) (0.5.0)\n", "Requirement already satisfied: gradio-client==1.7.0 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from gradio) (1.7.0)\n", "Requirement already satisfied: httpx>=0.24.1 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from gradio) (0.28.1)\n", "Requirement already satisfied: huggingface-hub>=0.28.1 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from gradio) (0.28.1)\n", "Requirement already satisfied: jinja2<4.0 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from gradio) (3.1.5)\n", "Requirement already satisfied: markupsafe~=2.0 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from gradio) (2.1.5)\n", "Requirement already satisfied: numpy<3.0,>=1.0 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from gradio) (2.2.2)\n", "Requirement already satisfied: orjson~=3.0 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from gradio) (3.10.15)\n", "Requirement already satisfied: packaging in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from gradio) (24.2)\n", "Requirement already satisfied: pandas<3.0,>=1.0 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from gradio) (2.2.3)\n", "Requirement already satisfied: pillow<12.0,>=8.0 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from gradio) (11.1.0)\n", "Requirement already satisfied: pydantic>=2.0 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from gradio) (2.10.6)\n", "Requirement already satisfied: pydub in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from gradio) (0.25.1)\n", "Requirement already satisfied: python-multipart>=0.0.18 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from gradio) (0.0.20)\n", "Requirement already satisfied: pyyaml<7.0,>=5.0 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from gradio) (6.0.2)\n", "Requirement already satisfied: ruff>=0.9.3 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from gradio) (0.9.4)\n", "Requirement already satisfied: safehttpx<0.2.0,>=0.1.6 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from gradio) (0.1.6)\n", "Requirement already satisfied: semantic-version~=2.0 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from gradio) (2.10.0)\n", "Requirement already satisfied: starlette<1.0,>=0.40.0 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from gradio) (0.45.3)\n", "Requirement already satisfied: tomlkit<0.14.0,>=0.12.0 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from gradio) (0.13.2)\n", "Requirement already satisfied: typer<1.0,>=0.12 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from gradio) (0.15.1)\n", "Requirement already satisfied: typing-extensions~=4.0 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from gradio) (4.12.2)\n", "Requirement already satisfied: uvicorn>=0.14.0 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from gradio) (0.34.0)\n", "Requirement already satisfied: fsspec in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from gradio-client==1.7.0->gradio) (2025.2.0)\n", "Requirement already satisfied: websockets<15.0,>=10.0 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from gradio-client==1.7.0->gradio) (14.2)\n", "Requirement already satisfied: idna>=2.8 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from anyio<5.0,>=3.0->gradio) (3.10)\n", "Requirement already satisfied: sniffio>=1.1 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from anyio<5.0,>=3.0->gradio) (1.3.1)\n", "Requirement already satisfied: certifi in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from httpx>=0.24.1->gradio) (2025.1.31)\n", "Requirement already satisfied: httpcore==1.* in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from httpx>=0.24.1->gradio) (1.0.7)\n", "Requirement already satisfied: h11<0.15,>=0.13 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from httpcore==1.*->httpx>=0.24.1->gradio) (0.14.0)\n", "Requirement already satisfied: filelock in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from huggingface-hub>=0.28.1->gradio) (3.17.0)\n", "Requirement already satisfied: requests in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from huggingface-hub>=0.28.1->gradio) (2.32.3)\n", "Requirement already satisfied: tqdm>=4.42.1 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from huggingface-hub>=0.28.1->gradio) (4.67.1)\n", "Requirement already satisfied: python-dateutil>=2.8.2 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from pandas<3.0,>=1.0->gradio) (2.9.0.post0)\n", "Requirement already satisfied: pytz>=2020.1 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from pandas<3.0,>=1.0->gradio) (2025.1)\n", "Requirement already satisfied: tzdata>=2022.7 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from pandas<3.0,>=1.0->gradio) (2025.1)\n", "Requirement already satisfied: annotated-types>=0.6.0 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from pydantic>=2.0->gradio) (0.7.0)\n", "Requirement already satisfied: pydantic-core==2.27.2 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from pydantic>=2.0->gradio) (2.27.2)\n", "Requirement already satisfied: click>=8.0.0 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from typer<1.0,>=0.12->gradio) (8.1.8)\n", "Requirement already satisfied: shellingham>=1.3.0 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from typer<1.0,>=0.12->gradio) (1.5.4)\n", "Requirement already satisfied: rich>=10.11.0 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from typer<1.0,>=0.12->gradio) (13.9.4)\n", "Requirement already satisfied: six>=1.5 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from python-dateutil>=2.8.2->pandas<3.0,>=1.0->gradio) (1.17.0)\n", "Requirement already satisfied: markdown-it-py>=2.2.0 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from rich>=10.11.0->typer<1.0,>=0.12->gradio) (3.0.0)\n", "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from rich>=10.11.0->typer<1.0,>=0.12->gradio) (2.19.1)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from requests->huggingface-hub>=0.28.1->gradio) (3.4.1)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from requests->huggingface-hub>=0.28.1->gradio) (2.3.0)\n", "Requirement already satisfied: mdurl~=0.1 in /Users/adang4/Documents/devwork/andersondang/llm_engineering/llms/lib/python3.11/site-packages (from markdown-it-py>=2.2.0->rich>=10.11.0->typer<1.0,>=0.12->gradio) (0.1.2)\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "%pip install gradio\n", "import gradio as gr # oh yeah!" ] }, { "cell_type": "code", "execution_count": 5, "id": "337d5dfc-0181-4e3b-8ab9-e78e0c3f657b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "OpenAI API Key exists and begins sk-proj-\n" ] } ], "source": [ "# Load environment variables in a file called .env\n", "# Print the key prefixes to help with any debugging\n", "\n", "load_dotenv()\n", "openai_api_key = os.getenv('OPENAI_API_KEY')\n", "#anthropic_api_key = os.getenv('ANTHROPIC_API_KEY')\n", "#google_api_key = os.getenv('GOOGLE_API_KEY')\n", "\n", "if openai_api_key:\n", " print(f\"OpenAI API Key exists and begins {openai_api_key[:8]}\")\n", "else:\n", " print(\"OpenAI API Key not set\")\n", " \n", "#if anthropic_api_key:\n", "# print(f\"Anthropic API Key exists and begins {anthropic_api_key[:7]}\")\n", "#else:\n", "# print(\"Anthropic API Key not set\")\n", "\n", "#if google_api_key:\n", "# print(f\"Google API Key exists and begins {google_api_key[:8]}\")\n", "#else:\n", "# print(\"Google API Key not set\")" ] }, { "cell_type": "code", "execution_count": 6, "id": "22586021-1795-4929-8079-63f5bb4edd4c", "metadata": {}, "outputs": [], "source": [ "# Connect to OpenAI, Anthropic and Google; comment out the Claude or Google lines if you're not using them\n", "\n", "openai = OpenAI()\n", "\n", "#claude = anthropic.Anthropic()\n", "\n", "#google.generativeai.configure()" ] }, { "cell_type": "code", "execution_count": 7, "id": "b16e6021-6dc4-4397-985a-6679d6c8ffd5", "metadata": {}, "outputs": [], "source": [ "# A generic system message - no more snarky adversarial AIs!\n", "\n", "system_message = \"You are a helpful assistant\"" ] }, { "cell_type": "code", "execution_count": 8, "id": "02ef9b69-ef31-427d-86d0-b8c799e1c1b1", "metadata": {}, "outputs": [], "source": [ "# Let's wrap a call to GPT-4o-mini in a simple function\n", "\n", "def message_gpt(prompt):\n", " messages = [\n", " {\"role\": \"system\", \"content\": system_message},\n", " {\"role\": \"user\", \"content\": prompt}\n", " ]\n", " completion = openai.chat.completions.create(\n", " model='gpt-4o-mini',\n", " messages=messages,\n", " )\n", " return completion.choices[0].message.content" ] }, { "cell_type": "code", "execution_count": 9, "id": "aef7d314-2b13-436b-b02d-8de3b72b193f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"Today's date is October 3, 2023.\"" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "message_gpt(\"What is today's date?\")" ] }, { "cell_type": "markdown", "id": "f94013d1-4f27-4329-97e8-8c58db93636a", "metadata": {}, "source": [ "## User Interface time!" ] }, { "cell_type": "code", "execution_count": 10, "id": "bc664b7a-c01d-4fea-a1de-ae22cdd5141a", "metadata": {}, "outputs": [], "source": [ "# here's a simple function\n", "\n", "def shout(text):\n", " print(f\"Shout has been called with input {text}\")\n", " return text.upper()" ] }, { "cell_type": "code", "execution_count": 11, "id": "083ea451-d3a0-4d13-b599-93ed49b975e4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Shout has been called with input hello\n" ] }, { "data": { "text/plain": [ "'HELLO'" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "shout(\"hello\")" ] }, { "cell_type": "code", "execution_count": 12, "id": "08f1f15a-122e-4502-b112-6ee2817dda32", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "* Running on local URL: http://127.0.0.1:7860\n", "\n", "To create a public link, set `share=True` in `launch()`.\n" ] }, { "data": { "text/html": [ "
" ], "text/plain": [ "\n",
" ![]() | \n",
" \n",
" Before you read the next few cells\n", " \n", " Try to do this yourself - go back to the company brochure in week1, day5 and add a Gradio UI to the end. Then come and look at the solution.\n", " \n", " | \n",
"