From 051bcabeb4d67be8043b29ea9635fbd79ed301f0 Mon Sep 17 00:00:00 2001 From: udomai Date: Thu, 6 Feb 2025 00:29:01 +0100 Subject: [PATCH] add Gradio interface for GPT, Claude, and Gemini --- udo/w2d2/gradio_with_gemini.ipynb | 208 ++++++++++++++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100644 udo/w2d2/gradio_with_gemini.ipynb diff --git a/udo/w2d2/gradio_with_gemini.ipynb b/udo/w2d2/gradio_with_gemini.ipynb new file mode 100644 index 0000000..2c5d4a7 --- /dev/null +++ b/udo/w2d2/gradio_with_gemini.ipynb @@ -0,0 +1,208 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "76cf81ba-4caf-41dc-9cdb-c3a89d4b9f50", + "metadata": {}, + "outputs": [], + "source": [ + "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", + "from google import genai #had to pip install google-genai\n", + "import anthropic\n", + "import gradio as gr" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8fa0a173-710c-4fe8-94a3-c0768ae0a067", + "metadata": {}, + "outputs": [], + "source": [ + "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')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cd9f3562-6049-44e4-80ad-d41318a547b5", + "metadata": {}, + "outputs": [], + "source": [ + "openai = OpenAI()\n", + "claude = anthropic.Anthropic()\n", + "gemini = genai.Client(api_key=google_api_key)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "85c9be6c-a3e9-4c8a-9f61-338828425849", + "metadata": {}, + "outputs": [], + "source": [ + "system_message = \"You are the world's most knowledgeable and friendly chat assistant. Format your answers in markdown.\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2e27aed6-735e-4c1f-b74f-5e08e9d2c8e5", + "metadata": {}, + "outputs": [], + "source": [ + "def stream_gpt(prompt):\n", + " messages = [\n", + " {\"role\": \"system\", \"content\": system_message},\n", + " {\"role\": \"user\", \"content\": prompt}\n", + " ]\n", + " stream = openai.chat.completions.create(\n", + " model='gpt-4o-mini',\n", + " messages=messages,\n", + " stream=True\n", + " )\n", + " result = \"\"\n", + " for chunk in stream:\n", + " result += chunk.choices[0].delta.content or \"\"\n", + " yield result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e5faea20-2168-4386-b22c-12a240b45990", + "metadata": {}, + "outputs": [], + "source": [ + "force_dark_mode = \"\"\"\n", + "function refresh() {\n", + " const url = new URL(window.location);\n", + " if (url.searchParams.get('__theme') !== 'dark') {\n", + " url.searchParams.set('__theme', 'dark');\n", + " window.location.href = url.href;\n", + " }\n", + "}\n", + "\"\"\"\n", + "\n", + "force_light_mode = \"\"\"\n", + "function refresh() {\n", + " const url = new URL(window.location);\n", + " if (url.searchParams.get('__theme') !== 'light') {\n", + " url.searchParams.set('__theme', 'light');\n", + " window.location.href = url.href;\n", + " }\n", + "}\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9e626a04-e55e-43e3-b888-44dcf5f1260b", + "metadata": {}, + "outputs": [], + "source": [ + "def stream_claude(prompt):\n", + " result = claude.messages.stream(\n", + " model=\"claude-3-haiku-20240307\",\n", + " max_tokens=1000,\n", + " temperature=0.7,\n", + " system=system_message,\n", + " messages=[\n", + " {\"role\": \"user\", \"content\": prompt},\n", + " ],\n", + " )\n", + " response = \"\"\n", + " with result as stream:\n", + " for text in stream.text_stream:\n", + " response += text or \"\"\n", + " yield response" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fe988edf-a10f-42e2-a2a9-c0c191162f01", + "metadata": {}, + "outputs": [], + "source": [ + "def stream_gemini(prompt):\n", + " response = gemini.models.generate_content_stream(\n", + " model=\"gemini-2.0-flash\",\n", + " contents=[prompt]\n", + " )\n", + " result = \"\"\n", + " for chunk in response:\n", + " #print(chunk.text, end=\"\", flush=True)\n", + " result += chunk.text or \"\"\n", + " yield result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f4828289-0a69-4ecb-a1f6-1af9d26555ca", + "metadata": {}, + "outputs": [], + "source": [ + "def stream_model(prompt, model):\n", + " if model==\"GPT\":\n", + " result = stream_gpt(prompt)\n", + " elif model==\"Claude\":\n", + " result = stream_claude(prompt)\n", + " elif model==\"Gemini\":\n", + " result = stream_gemini(prompt)\n", + " else:\n", + " raise ValueError(\"Unknown model\")\n", + " yield from result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "50f57015-bc49-4b4c-a4f9-eb5adfd334a3", + "metadata": {}, + "outputs": [], + "source": [ + "view = gr.Interface(\n", + " fn=stream_model,\n", + " inputs=[gr.Textbox(label=\"Your message:\"), gr.Dropdown([\"GPT\", \"Claude\", \"Gemini\"], label=\"Select model\", value=\"GPT\")],\n", + " outputs=[gr.Markdown(label=\"Response:\")],\n", + " flagging_mode=\"never\",\n", + " js=force_dark_mode\n", + ")\n", + "view.launch(inbrowser=True)" + ] + } + ], + "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.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}