From e573af93c3149ef03c33d7e463403d80300daa98 Mon Sep 17 00:00:00 2001 From: vaishnavipalyam Date: Wed, 6 Aug 2025 13:51:46 +0530 Subject: [PATCH 01/72] Add Vaishnavi's day5 modification for scripting a youtube video based on a BhagavadGita theme. --- week1/day5_GitaScripting.ipynb | 338 +++++++++++++++++++++++++++++++++ 1 file changed, 338 insertions(+) create mode 100644 week1/day5_GitaScripting.ipynb diff --git a/week1/day5_GitaScripting.ipynb b/week1/day5_GitaScripting.ipynb new file mode 100644 index 0000000..964b183 --- /dev/null +++ b/week1/day5_GitaScripting.ipynb @@ -0,0 +1,338 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "7759922b-12c9-44e0-8ac3-5f2a02b321d7", + "metadata": {}, + "outputs": [], + "source": [ + "import fitz # PyMuPDF\n", + "import os\n", + "import requests\n", + "import json\n", + "from typing import List\n", + "from dotenv import load_dotenv\n", + "from IPython.display import Markdown, display, update_display\n", + "from openai import OpenAI" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a266273a-05e3-451e-a318-428726cfa39c", + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize and constants\n", + "\n", + "load_dotenv(override=True)\n", + "api_key = os.getenv('OPENAI_API_KEY')\n", + "\n", + "if api_key and api_key.startswith('sk-proj-') and len(api_key)>10:\n", + " print(\"API key looks good so far\")\n", + "else:\n", + " print(\"There might be a problem with your API key? Please visit the troubleshooting notebook!\")\n", + " \n", + "MODEL = 'gpt-4o-mini'\n", + "openai = OpenAI()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "45566572-dd66-48dc-ab7b-6adbe26eacba", + "metadata": {}, + "outputs": [], + "source": [ + "exceptions = []" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "effc0e7b-d668-48b3-86d0-dbb5d8fe3d55", + "metadata": {}, + "outputs": [], + "source": [ + "# Building system prompt\n", + "def get_verse_system_prompt():\n", + " system_prompt = \"You are a spiritual student who classifies the versus of the BhagavadGita according to a given theme.\\n\"\n", + " system_prompt += \"Given a theme, you should pick a verse from any chapter and give it's location in the form of index chapter.verse_number (6.2)\\n\"\n", + " system_prompt += \"You should respond in JSON as in this example:\\n\"\n", + " system_prompt += \"\"\"\n", + " {\"title\": \"Chapter 3, Verse 21 (3.21)\", \"verse\": \"कर्मणा ह्यपि संसिद्धिम्‌\n", + " आस्थिता जनकादय:।\n", + " लोकसंग्रहमेवापि\n", + " सम्पश्यन्कर्तुमर्हसि॥\"}\n", + " \"\"\"\n", + " return system_prompt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bbfb1035-b183-4481-9b49-3cc1b12b42e8", + "metadata": {}, + "outputs": [], + "source": [ + "print(get_verse_system_prompt())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6acdcd6c-1fc5-4c71-81d0-665e25808e46", + "metadata": {}, + "outputs": [], + "source": [ + "# Define user prompt\n", + "def get_verse_user_prompt(theme):\n", + " user_prompt = f'''\n", + " Here is the theme : {theme},\n", + " Please find a verse from BhagavadGita excluding {exceptions} for a given theme {theme}\n", + " '''#excluding those results which are already used\n", + " \n", + " user_prompt += \"If the verse is not in the exceptions for a given theme and used for a different theme, you are free to suggest it for a different theme.\"\n", + " return user_prompt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "72f5c755-ec2d-4545-9a31-0f6b2e5ed4da", + "metadata": {}, + "outputs": [], + "source": [ + "print(get_verse_user_prompt('motivation'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "304d432c-7216-4a90-a5d8-db36b193657d", + "metadata": {}, + "outputs": [], + "source": [ + "#Call openAI to return versus\n", + "def get_verses(theme):\n", + " response = openai.chat.completions.create(\n", + " model=MODEL,\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": get_verse_system_prompt()},\n", + " {\"role\": \"user\", \"content\": get_verse_user_prompt(theme)}\n", + " ],\n", + " response_format={\"type\": \"json_object\"}\n", + " )\n", + " result = response.choices[0].message.content\n", + " result = json.loads(result)\n", + "\n", + " #Remember those results which are suggested now\n", + " combination = (theme, result['title'])\n", + " exceptions.append(combination)\n", + " return result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b90eeb35-e10e-48ee-ade6-e0594da8c51b", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "print(get_verses('motivation'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b5b8925e-52e4-4cb7-9205-51c65ed88fb8", + "metadata": {}, + "outputs": [], + "source": [ + "# So far we have fetched the new verses relevant to a given theme \n", + "# Lets generate a script for producting youtube video" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8ff0862b-0310-4174-ad12-64047932dc9e", + "metadata": {}, + "outputs": [], + "source": [ + "#def function for system prompt\n", + "def get_script_system_prompt(tone, theme, format):\n", + " sys_prompt = 'You are a script writer for a youtube spiritual channel\\n'\n", + " sys_prompt += 'You are given a verse like below: \\n'\n", + " sys_prompt += str(get_verses(theme))\n", + " sys_prompt += '\\n'\n", + " sys_prompt += f'Give me an engaging script in a {tone} tone for a {format} format video for audience like youth seeking purpose, spiritual seekers, indians abroad, scholars and curious minds.'\n", + "\n", + " return sys_prompt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "47476516-cd2f-4b16-b378-a70617bbe284", + "metadata": {}, + "outputs": [], + "source": [ + "print(get_script_system_prompt('Motivating','motivation','long'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e305525b-8dde-4e93-927a-e24531827498", + "metadata": {}, + "outputs": [], + "source": [ + "# def function for user prompt\n", + "def get_script_user_prompt(format, theme):\n", + " user_prompt = f'Given the verse, help me generate a detailed script suitable for {format} format video.\\n'\n", + " user_prompt += f'Please give me the complete verse, its meaning, a relevant story having a dilemma which the verse solves and the interpretation of the verse with respect to {theme}.\\n'\n", + " user_prompt += 'Let the script give cues about video editing, host actions.'\n", + " user_prompt += 'given the below example, please follow the format:\\n'\n", + " user_prompt += \"\"\"\n", + " [Opening Scene - Soft Instrumental Music Playing]\n", + "\n", + " [Cut to Host in a serene setting, perhaps by a river or in a lush green garden.]\n", + "\n", + " Host: (Smiling at the camera) \"Namaste, dear viewers! Welcome back to our channel, where we explore the depths of spirituality and seek to ignite the flame of wisdom within you. Today, we delve into a profound verse from the Bhagavad Gita that speaks to the very essence of life and identity.\"\n", + "\n", + " [Text On Screen: Chapter 2, Verse 13 (2.13)]\n", + "\n", + " Host: (With a sense of reverence) \"Let’s first take a moment to recite this verse together. It goes like this:\n", + "\n", + " देहिनोऽस्मिन्न्यथा देहे कौमारं यौवनं जरा।\n", + " तथादेहान्तरप्राप्तिर्धीरस्तत्र न मुह्यति॥\n", + "\n", + " Now, let’s understand the essence of this verse.\"\n", + "\n", + " [Cut to Graphic: Verse Translation with Key Concepts Highlighted]\n", + "\n", + " Host Voiceover: (Calm and engaging tone) \"The meaning of this beautiful verse translates to: 'Just as the body undergoes changes from childhood to old age, similarly, the soul transitions from one body to another. The wise, who understand this, are never bewildered by these changes.'\n", + "\n", + " [Cut back to Host]\n", + "\n", + " Host: (Nodding, creating a connection)\n", + " \"So, why is this verse so important, especially for us as young seekers of purpose? It highlights a profound truth—that our identities are not confined by our physical forms or the stages of life we experience. Instead, we are eternal beings who are constantly evolving.\"\n", + "\n", + " [Scene Transition - Soft Music Playing]\n", + "\n", + " [Cut to a Story Animation - A young man named Arjun in a busy city]\n", + "\n", + " Host (Voiceover): \"Let me share a relatable story. Meet Arjun. Like many of us, he was once full of dreams and aspirations. He excelling in school, pursuing a career in engineering. But as the years passed, he faced a crossroads. As the pressure mounted, he began to question his identity.\n", + "\n", + " (Visuals show Arjun overwhelmed by societal expectations, with people pushing him in different directions.)\n", + "\n", + " He felt distinct phases of life pulling at him: childhood dreams, youthful ambitions, and the looming responsibilities of adulthood. The changing seasons of his life left him confused and wondering if he had lost his true self.\"\n", + "\n", + " [Cut back to Host, empathetic tone]\n", + "\n", + " Host: \"Have you ever felt like Arjun? It’s a dilemma we all face, especially in today's fast-paced world where expectations can cloud our true identity. But just like our verse suggests, we should recognize that these changes don’t define us. They are simply part of the journey.\"\n", + "\n", + " [Scene Transition - Calm Music Playing while Host meditates]\n", + "\n", + " Host: (Speaking gently) \"Let’s take a moment to reflect. When we are sad, does that sadness define us? Or when we achieve success, do we become defined solely by that success? The answer isn't as straightforward as it seems. Here’s the catch: our essence is beyond these transient states. Like the body, our identities are fluid.\"\n", + "\n", + " [Cut to Visuals of Nature - flowing rivers, trees shedding leaves, etc.]\n", + "\n", + " Host Voiceover: \"Imagine the endless cycle of nature—the changing seasons, the growth, the decay, and rebirth. Just like the leaves that drop to make way for new growth, our experiences contribute to our spiritual evolution.\"\n", + "\n", + " [Cut back to Host - Inviting and Warm Tone]\n", + "\n", + " Host: \"Just as the wise who understand the transformation of the soul remain unshaken, we, too, can cultivate that wisdom to rise above the chaos of change. Recognize your true essence—beyond the body, the roles, the titles. Understand that your spirit is eternal.\"\n", + "\n", + " [Scene Transition - Soft Inspirational Music Begins]\n", + "\n", + " Host: (Passionately) \"So how can we embody this truth in our daily lives? Here’s a small exercise: Each day, take a few moments to meditate on who you really are. Write down what aspects of your identity are tied to transient things. Challenge yourself—what happens when you peel these layers away?\"\n", + "\n", + " [Cut to host with a pad, writing ideas]\n", + "\n", + " [Scene Transition - Editing Cues - Show engaging graphics of identity, layers of a person, etc.]\n", + "\n", + " Host Voiceover: \"Each effort towards understanding and embracing our true self draws us closer to the realization that we are eternal souls, having a human experience. This is the wisdom that can empower you to stand tall against the adversities of life.\"\n", + "\n", + " [Cut back to Host]\n", + "\n", + " Host: (Concluding) \"Thank you for joining me today in this exploration of Chapter 2, Verse 13 of the Bhagavad Gita. Remember, when you feel lost in the complexities of life, return to this teachings and remind yourself that you are not just a body; you are an eternal being on a magnificent journey.\n", + "\n", + " [Closing Scene - Uplifting Music Playing]\n", + "\n", + " Host: \"Don’t forget to like, share, and subscribe if you found resonance in this message. And share your thoughts in the comments below. What did you find most challenging in your own journey of self-identity? Let’s connect and support each other in our spiritual quests. Until next time, stay enlightened, stay inspired!\"\n", + "\n", + " [End Screen with Subscribe Button and Previous Video Suggestions]\n", + "\n", + " [End of Script]\n", + " \"\"\"\n", + " \n", + " return user_prompt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c4b29cb9-d8d1-413a-8152-4250e2430a42", + "metadata": {}, + "outputs": [], + "source": [ + "print(get_script_user_prompt('long','motivation'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1dfa60ce-9e88-4f7d-8e60-ac37a0aafc15", + "metadata": {}, + "outputs": [], + "source": [ + "def create_script(tone, theme, format):\n", + " response = openai.chat.completions.create(\n", + " model=MODEL,\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": get_script_system_prompt(tone,theme,format)},\n", + " {\"role\": \"user\", \"content\": get_script_user_prompt(format,theme)}\n", + " ],\n", + " )\n", + " result = response.choices[0].message.content\n", + " display(Markdown(result))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ec86c436-42ae-4313-b12f-4fad42ab2227", + "metadata": {}, + "outputs": [], + "source": [ + "create_script('motivating','self-identity','long')" + ] + } + ], + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From fd3485248eacb543f3b8d06204ddafde2b6ba422 Mon Sep 17 00:00:00 2001 From: KiranAyyagari Date: Sat, 9 Aug 2025 20:39:34 +0530 Subject: [PATCH 02/72] Add web data extraction and summarization notebook Introduces a Jupyter notebook demonstrating web scraping with BeautifulSoup and summarization using OpenAI's gpt-5-mini model. The workflow includes scraping website content, formatting prompts, and displaying summaries in Markdown. --- .../text_summary_playwright_openai.ipynb | 231 ++++++++++++++++++ 1 file changed, 231 insertions(+) create mode 100644 community-contributions/kiran-text-summarizer-playwright/text_summary_playwright_openai.ipynb diff --git a/community-contributions/kiran-text-summarizer-playwright/text_summary_playwright_openai.ipynb b/community-contributions/kiran-text-summarizer-playwright/text_summary_playwright_openai.ipynb new file mode 100644 index 0000000..82be8e1 --- /dev/null +++ b/community-contributions/kiran-text-summarizer-playwright/text_summary_playwright_openai.ipynb @@ -0,0 +1,231 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "1e45263e", + "metadata": {}, + "source": [ + "# Web Data Extraction and Summarization using openAI Latest model gpt-5-mini" + ] + }, + { + "cell_type": "markdown", + "id": "df155151", + "metadata": {}, + "source": [ + "#### Import Libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "588f8e43", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import requests\n", + "from dotenv import load_dotenv\n", + "from bs4 import BeautifulSoup\n", + "from IPython.display import Markdown, display\n", + "from openai import OpenAI " + ] + }, + { + "cell_type": "markdown", + "id": "b5925769", + "metadata": {}, + "source": [ + "#### load api key" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6cca85ec", + "metadata": {}, + "outputs": [], + "source": [ + "load_dotenv(override=True)\n", + "api_key = os.getenv('OPENAI_API_KEY')" + ] + }, + { + "cell_type": "markdown", + "id": "56703f80", + "metadata": {}, + "source": [ + "#### ScrapWebsite using BeautifulSoup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3d60c909", + "metadata": {}, + "outputs": [], + "source": [ + "headers = {\n", + " \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36\"\n", + "}\n", + "\n", + "class ScrapeWebsite:\n", + "\n", + " def __init__(self, url):\n", + " \"\"\" Scraping Website which provides title and content\"\"\"\n", + " self.url = url\n", + " response = requests.get(self.url, headers=headers)\n", + " soup = BeautifulSoup(response.content, 'html.parser')\n", + " self.title = soup.title.string if soup.title else \"No title found\"\n", + " for irrelevant in soup.body([\"script\", \"style\", \"img\", \"input\"]):\n", + " irrelevant.decompose()\n", + " self.text = soup.body.get_text(separator=\"\\n\", strip=True)" + ] + }, + { + "cell_type": "markdown", + "id": "a8b73c27", + "metadata": {}, + "source": [ + "#### System Prompt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4a0c3bda", + "metadata": {}, + "outputs": [], + "source": [ + "system_prompt = \"You are an analyst that analyses the content of the website \\\n", + " provides summary and ignore text related to navigation. Respond in markdown.\"" + ] + }, + { + "cell_type": "markdown", + "id": "9117963b", + "metadata": {}, + "source": [ + "#### User Prompt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ab164d55", + "metadata": {}, + "outputs": [], + "source": [ + "def user_prompt_for(website):\n", + " user_prompt = f\"You are looking at a website titled {website.title}\"\n", + " user_prompt += \"\\nThe contents of this website is as follows; Please provide short summary in Markdown. Please include news and \\\n", + " announcements\"\n", + " user_prompt+=website.text\n", + " return user_prompt" + ] + }, + { + "cell_type": "markdown", + "id": "de7423fb", + "metadata": {}, + "source": [ + "#### Format messages in openAI standard" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "47c82247", + "metadata": {}, + "outputs": [], + "source": [ + "def messages_for(website):\n", + " return [\n", + " {\"role\":\"system\", \"content\": system_prompt},\n", + " {\"role\":\"user\", \"content\": user_prompt_for(website)}\n", + " ]" + ] + }, + { + "cell_type": "markdown", + "id": "6e9bb6e1", + "metadata": {}, + "source": [ + "#### Summarise the content in website using openAI latest model gpt-5-mini" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "068d6bb2", + "metadata": {}, + "outputs": [], + "source": [ + "def summarise(url):\n", + " website = ScrapeWebsite(url)\n", + " openai = OpenAI()\n", + " response = openai.chat.completions.create(model=\"gpt-5-mini\", messages=messages_for(website))\n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "markdown", + "id": "7e6e9da6", + "metadata": {}, + "source": [ + "#### Show summary as Markdown" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cd86c2ca", + "metadata": {}, + "outputs": [], + "source": [ + "def display_summary(url):\n", + " summary = summarise(url)\n", + " display(Markdown(summary))" + ] + }, + { + "cell_type": "markdown", + "id": "ed5e50d2", + "metadata": {}, + "source": [ + "#### Output" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "74a056b1", + "metadata": {}, + "outputs": [], + "source": [ + "display_summary(\"https://www.firstpost.com/world/united-states/\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "llms", + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From f7d8d58fa681a71edfb0fca2b6e74bde7ca49c00 Mon Sep 17 00:00:00 2001 From: KiranAyyagari Date: Sat, 9 Aug 2025 20:43:09 +0530 Subject: [PATCH 03/72] Rename text summarizer notebook for GPT-5 Mini Renamed the notebook from 'text_summary_playwright_openai.ipynb' to 'text_summary_openai_gpt_5mini.ipynb' to reflect its association with the GPT-5 Mini model. --- .../text_summary_openai_gpt_5mini.ipynb} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename community-contributions/{kiran-text-summarizer-playwright/text_summary_playwright_openai.ipynb => kiran-text-summarizer-gpt5mini/text_summary_openai_gpt_5mini.ipynb} (100%) diff --git a/community-contributions/kiran-text-summarizer-playwright/text_summary_playwright_openai.ipynb b/community-contributions/kiran-text-summarizer-gpt5mini/text_summary_openai_gpt_5mini.ipynb similarity index 100% rename from community-contributions/kiran-text-summarizer-playwright/text_summary_playwright_openai.ipynb rename to community-contributions/kiran-text-summarizer-gpt5mini/text_summary_openai_gpt_5mini.ipynb From a0938cd97f52549b7775f492284bfc499cf56532 Mon Sep 17 00:00:00 2001 From: KiranAyyagari Date: Sat, 9 Aug 2025 21:16:04 +0530 Subject: [PATCH 04/72] Move text summarizer notebook to week1 directory Renamed and relocated the text_summary_openai_gpt_5mini.ipynb notebook from community-contributions to the week1/community-contributions directory for improved organization. --- .../text_summary_openai_gpt_5mini.ipynb | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {community-contributions => week1/community-contributions}/kiran-text-summarizer-gpt5mini/text_summary_openai_gpt_5mini.ipynb (100%) diff --git a/community-contributions/kiran-text-summarizer-gpt5mini/text_summary_openai_gpt_5mini.ipynb b/week1/community-contributions/kiran-text-summarizer-gpt5mini/text_summary_openai_gpt_5mini.ipynb similarity index 100% rename from community-contributions/kiran-text-summarizer-gpt5mini/text_summary_openai_gpt_5mini.ipynb rename to week1/community-contributions/kiran-text-summarizer-gpt5mini/text_summary_openai_gpt_5mini.ipynb From ccf5cdb0fe2493c293a74e642df9e87d2206a58c Mon Sep 17 00:00:00 2001 From: KiranAyyagari Date: Sun, 10 Aug 2025 14:38:52 +0530 Subject: [PATCH 05/72] Refactor and relocate text summarizer notebooks Deleted the old kiran-text-summarizer-gpt5mini notebook and added refactored versions for OpenAI GPT-5-mini and Ollama models under week1_assignments. Introduced a reusable scrape_website.py module for web scraping logic. Updated 'day2 EXERCISE.ipynb' to set execution counts and include output for code cells, improving reproducibility and clarity. --- .../text_summary_openai_gpt_5mini.ipynb | 231 -- .../week1_assignments/scrape_website.py | 15 + .../text_summary_ollama.ipynb | 186 ++ .../text_summary_openai_gpt_5mini.ipynb | 265 ++ week1/day2 EXERCISE.ipynb | 2503 ++++++++++++++++- 5 files changed, 2951 insertions(+), 249 deletions(-) delete mode 100644 week1/community-contributions/kiran-text-summarizer-gpt5mini/text_summary_openai_gpt_5mini.ipynb create mode 100644 week1/community-contributions/week1_assignments/scrape_website.py create mode 100644 week1/community-contributions/week1_assignments/text_summary_ollama.ipynb create mode 100644 week1/community-contributions/week1_assignments/text_summary_openai_gpt_5mini.ipynb diff --git a/week1/community-contributions/kiran-text-summarizer-gpt5mini/text_summary_openai_gpt_5mini.ipynb b/week1/community-contributions/kiran-text-summarizer-gpt5mini/text_summary_openai_gpt_5mini.ipynb deleted file mode 100644 index 82be8e1..0000000 --- a/week1/community-contributions/kiran-text-summarizer-gpt5mini/text_summary_openai_gpt_5mini.ipynb +++ /dev/null @@ -1,231 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "1e45263e", - "metadata": {}, - "source": [ - "# Web Data Extraction and Summarization using openAI Latest model gpt-5-mini" - ] - }, - { - "cell_type": "markdown", - "id": "df155151", - "metadata": {}, - "source": [ - "#### Import Libraries" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "588f8e43", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import requests\n", - "from dotenv import load_dotenv\n", - "from bs4 import BeautifulSoup\n", - "from IPython.display import Markdown, display\n", - "from openai import OpenAI " - ] - }, - { - "cell_type": "markdown", - "id": "b5925769", - "metadata": {}, - "source": [ - "#### load api key" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6cca85ec", - "metadata": {}, - "outputs": [], - "source": [ - "load_dotenv(override=True)\n", - "api_key = os.getenv('OPENAI_API_KEY')" - ] - }, - { - "cell_type": "markdown", - "id": "56703f80", - "metadata": {}, - "source": [ - "#### ScrapWebsite using BeautifulSoup" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3d60c909", - "metadata": {}, - "outputs": [], - "source": [ - "headers = {\n", - " \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36\"\n", - "}\n", - "\n", - "class ScrapeWebsite:\n", - "\n", - " def __init__(self, url):\n", - " \"\"\" Scraping Website which provides title and content\"\"\"\n", - " self.url = url\n", - " response = requests.get(self.url, headers=headers)\n", - " soup = BeautifulSoup(response.content, 'html.parser')\n", - " self.title = soup.title.string if soup.title else \"No title found\"\n", - " for irrelevant in soup.body([\"script\", \"style\", \"img\", \"input\"]):\n", - " irrelevant.decompose()\n", - " self.text = soup.body.get_text(separator=\"\\n\", strip=True)" - ] - }, - { - "cell_type": "markdown", - "id": "a8b73c27", - "metadata": {}, - "source": [ - "#### System Prompt" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4a0c3bda", - "metadata": {}, - "outputs": [], - "source": [ - "system_prompt = \"You are an analyst that analyses the content of the website \\\n", - " provides summary and ignore text related to navigation. Respond in markdown.\"" - ] - }, - { - "cell_type": "markdown", - "id": "9117963b", - "metadata": {}, - "source": [ - "#### User Prompt" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ab164d55", - "metadata": {}, - "outputs": [], - "source": [ - "def user_prompt_for(website):\n", - " user_prompt = f\"You are looking at a website titled {website.title}\"\n", - " user_prompt += \"\\nThe contents of this website is as follows; Please provide short summary in Markdown. Please include news and \\\n", - " announcements\"\n", - " user_prompt+=website.text\n", - " return user_prompt" - ] - }, - { - "cell_type": "markdown", - "id": "de7423fb", - "metadata": {}, - "source": [ - "#### Format messages in openAI standard" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "47c82247", - "metadata": {}, - "outputs": [], - "source": [ - "def messages_for(website):\n", - " return [\n", - " {\"role\":\"system\", \"content\": system_prompt},\n", - " {\"role\":\"user\", \"content\": user_prompt_for(website)}\n", - " ]" - ] - }, - { - "cell_type": "markdown", - "id": "6e9bb6e1", - "metadata": {}, - "source": [ - "#### Summarise the content in website using openAI latest model gpt-5-mini" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "068d6bb2", - "metadata": {}, - "outputs": [], - "source": [ - "def summarise(url):\n", - " website = ScrapeWebsite(url)\n", - " openai = OpenAI()\n", - " response = openai.chat.completions.create(model=\"gpt-5-mini\", messages=messages_for(website))\n", - " return response.choices[0].message.content" - ] - }, - { - "cell_type": "markdown", - "id": "7e6e9da6", - "metadata": {}, - "source": [ - "#### Show summary as Markdown" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "cd86c2ca", - "metadata": {}, - "outputs": [], - "source": [ - "def display_summary(url):\n", - " summary = summarise(url)\n", - " display(Markdown(summary))" - ] - }, - { - "cell_type": "markdown", - "id": "ed5e50d2", - "metadata": {}, - "source": [ - "#### Output" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "74a056b1", - "metadata": {}, - "outputs": [], - "source": [ - "display_summary(\"https://www.firstpost.com/world/united-states/\")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "llms", - "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.13" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/week1/community-contributions/week1_assignments/scrape_website.py b/week1/community-contributions/week1_assignments/scrape_website.py new file mode 100644 index 0000000..d040e22 --- /dev/null +++ b/week1/community-contributions/week1_assignments/scrape_website.py @@ -0,0 +1,15 @@ +from bs4 import BeautifulSoup +import requests + + +class ScrapeWebsite: + + def __init__(self, url, headers): + """ Scraping Website which provides title and content""" + self.url = url + response = requests.get(self.url, headers=headers) + soup = BeautifulSoup(response.content, 'html.parser') + self.title = soup.title.string if soup.title else "No title found" + for irrelevant in soup.body(["script", "style", "img", "input"]): + irrelevant.decompose() + self.text = soup.body.get_text(separator="\n", strip=True) \ No newline at end of file diff --git a/week1/community-contributions/week1_assignments/text_summary_ollama.ipynb b/week1/community-contributions/week1_assignments/text_summary_ollama.ipynb new file mode 100644 index 0000000..d7a5b3b --- /dev/null +++ b/week1/community-contributions/week1_assignments/text_summary_ollama.ipynb @@ -0,0 +1,186 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "4e2a9393-7767-488e-a8bf-27c12dca35bd", + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "import os\n", + "from dotenv import load_dotenv\n", + "from IPython.display import Markdown, display\n", + "from openai import OpenAI \n", + "from scrape_website import ScrapeWebsite" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "29ddd15d-a3c5-4f4e-a678-873f56162724", + "metadata": {}, + "outputs": [], + "source": [ + "# Constants\n", + "MODEL = \"llama3.2\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "42c8a8c2", + "metadata": {}, + "outputs": [], + "source": [ + "system_prompt = \"You are an analyst that analyses the content of the website \\\n", + " provides summary and ignore text related to navigation. Respond in markdown.\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "51e86dd1", + "metadata": {}, + "outputs": [], + "source": [ + "def user_prompt_for(website):\n", + " user_prompt = f\"You are looking at a website titled {website.title}\"\n", + " user_prompt += \"\\nThe contents of this website is as follows; Please provide short summary in Markdown. Please include news and \\\n", + " announcements\"\n", + " user_prompt+=website.text\n", + " return user_prompt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b69d7238", + "metadata": {}, + "outputs": [], + "source": [ + "def messages_for(website):\n", + " return [\n", + " {\"role\":\"system\", \"content\": system_prompt},\n", + " {\"role\":\"user\", \"content\": user_prompt_for(website)}\n", + " ]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a56e99ea", + "metadata": {}, + "outputs": [], + "source": [ + "headers = {\n", + " \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36\"\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b4061d0", + "metadata": {}, + "outputs": [], + "source": [ + "def summarise(url):\n", + " website = ScrapeWebsite(url, headers)\n", + " ollama_via_openai = OpenAI(base_url='http://localhost:11434/v1', api_key='ollama')\n", + " response = ollama_via_openai.chat.completions.create(\n", + " model=MODEL,\n", + " messages=messages_for(website)\n", + " )\n", + "\n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "65f96545", + "metadata": {}, + "outputs": [], + "source": [ + "def display_summary(url):\n", + " summary = summarise(url)\n", + " display(Markdown(summary))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23057e00-b6fc-4678-93a9-6b31cb704bff", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generative AI has numerous business applications across various industries. Here are some examples:\n", + "\n", + "1. **Marketing and Advertising**: Generative AI can create personalized product recommendations, generate targeted advertisements, and develop new marketing campaigns.\n", + "2. **Content Creation**: AI-powered tools can assist in content creation, such as writing articles, generating social media posts, and creating videos, podcasts, and music.\n", + "3. **Product Design and Development**: Generative AI can aid in designing products, such as 3D modeling, prototyping, and testing product feasibility.\n", + "4. **Customer Service Chatbots**: AI-powered chatbots can provide personalized customer service, answering common queries, and helping resolve issues faster.\n", + "5. **Language Translation**: Generative AI can translate languages in real-time, enabling businesses to communicate with global customers more effectively.\n", + "6. **Data Analysis and Visualization**: AI can analyze large datasets, identify patterns, and create insights, making it easier for businesses to make informed decisions.\n", + "7. **Cybersecurity Threat Detection**: Generative AI-powered systems can detect and respond to cyber threats more efficiently, reducing the risk of data breaches and attacks.\n", + "8. **Supply Chain Optimization**: AI can optimize supply chain operations, predict demand, and identify opportunities for improvement, leading to increased efficiency and reduced costs.\n", + "9. **Network Security**: Generative AI can analyze network traffic patterns, detect anomalies, and prevent cyber-attacks.\n", + "10. **Finance and Banking**: AI-powered systems can detect financial fraud, predict customer creditworthiness, and generate credit reports.\n", + "\n", + "**Industry-specific applications:**\n", + "\n", + "1. **Healthcare**: AI can help with medical diagnosis, patient data analysis, and personalized medicine.\n", + "2. **Manufacturing**: Generative AI can create optimized production schedules, predict equipment failures, and improve product quality.\n", + "3. **Education**: AI-powered tools can develop personalized learning plans, automate grading, and provide educational resources.\n", + "4. **Real Estate**: AI can help with property valuations, identify market trends, and analyze potential clients' needs.\n", + "\n", + "**Business benefits:**\n", + "\n", + "1. **Increased efficiency**: Automating mundane tasks frees up human resources for more strategic work.\n", + "2. **Improved accuracy**: Generative AI reduces the likelihood of human error in decision-making and task execution.\n", + "3. **Enhanced customer experience**: Personalized experiences are created through data-driven insights.\n", + "4. **Competitive advantage**: Companies using AI can differentiate themselves from competitors by offering innovative services and products.\n", + "\n", + "As Generative AI continues to evolve, we can expect even more exciting applications across various industries, leading to increased efficiency, accuracy, and improved competitiveness for businesses worldwide.\n" + ] + } + ], + "source": [ + "display_summary(\"https://www.firstpost.com/world/united-states/\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6de38216-6d1c-48c4-877b-86d403f4e0f8", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "llms", + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/week1/community-contributions/week1_assignments/text_summary_openai_gpt_5mini.ipynb b/week1/community-contributions/week1_assignments/text_summary_openai_gpt_5mini.ipynb new file mode 100644 index 0000000..ab6c1a4 --- /dev/null +++ b/week1/community-contributions/week1_assignments/text_summary_openai_gpt_5mini.ipynb @@ -0,0 +1,265 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "1e45263e", + "metadata": {}, + "source": [ + "# Web Data Extraction and Summarization using openAI Latest model gpt-5-mini" + ] + }, + { + "cell_type": "markdown", + "id": "df155151", + "metadata": {}, + "source": [ + "#### Import Libraries" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "588f8e43", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from dotenv import load_dotenv\n", + "from IPython.display import Markdown, display\n", + "from openai import OpenAI \n", + "from scrape_website import ScrapeWebsite" + ] + }, + { + "cell_type": "markdown", + "id": "b5925769", + "metadata": {}, + "source": [ + "#### load api key" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "6cca85ec", + "metadata": {}, + "outputs": [], + "source": [ + "load_dotenv(override=True)\n", + "api_key = os.getenv('OPENAI_API_KEY')" + ] + }, + { + "cell_type": "markdown", + "id": "56703f80", + "metadata": {}, + "source": [ + "#### ScrapWebsite using BeautifulSoup" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "3d60c909", + "metadata": {}, + "outputs": [], + "source": [ + "headers = {\n", + " \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36\"\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "a8b73c27", + "metadata": {}, + "source": [ + "#### System Prompt" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "4a0c3bda", + "metadata": {}, + "outputs": [], + "source": [ + "system_prompt = \"You are an analyst that analyses the content of the website \\\n", + " provides summary and ignore text related to navigation. Respond in markdown.\"" + ] + }, + { + "cell_type": "markdown", + "id": "9117963b", + "metadata": {}, + "source": [ + "#### User Prompt" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "ab164d55", + "metadata": {}, + "outputs": [], + "source": [ + "def user_prompt_for(website):\n", + " user_prompt = f\"You are looking at a website titled {website.title}\"\n", + " user_prompt += \"\\nThe contents of this website is as follows; Please provide short summary in Markdown. Please include news and \\\n", + " announcements\"\n", + " user_prompt+=website.text\n", + " return user_prompt" + ] + }, + { + "cell_type": "markdown", + "id": "de7423fb", + "metadata": {}, + "source": [ + "#### Format messages in openAI standard" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "47c82247", + "metadata": {}, + "outputs": [], + "source": [ + "def messages_for(website):\n", + " return [\n", + " {\"role\":\"system\", \"content\": system_prompt},\n", + " {\"role\":\"user\", \"content\": user_prompt_for(website)}\n", + " ]" + ] + }, + { + "cell_type": "markdown", + "id": "6e9bb6e1", + "metadata": {}, + "source": [ + "#### Summarise the content in website using openAI latest model gpt-5-mini" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "068d6bb2", + "metadata": {}, + "outputs": [], + "source": [ + "def summarise(url):\n", + " website = ScrapeWebsite(url, headers)\n", + " openai = OpenAI()\n", + " response = openai.chat.completions.create(model=\"gpt-5-mini\", messages=messages_for(website))\n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "markdown", + "id": "7e6e9da6", + "metadata": {}, + "source": [ + "#### Show summary as Markdown" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "cd86c2ca", + "metadata": {}, + "outputs": [], + "source": [ + "def display_summary(url):\n", + " summary = summarise(url)\n", + " display(Markdown(summary))" + ] + }, + { + "cell_type": "markdown", + "id": "ed5e50d2", + "metadata": {}, + "source": [ + "#### Output" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "74a056b1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "# Summary — United States Of America | Firstpost (Live/Latest)\n", + "\n", + "Site focus: Live updates and rundowns of US and world news with emphasis on politics, justice, economy, national security, and breaking incidents. Coverage mixes headlines, investigations, opinion and special features/web stories.\n", + "\n", + "## Major news (headlines)\n", + "- Police shooting near CDC/Emory in Atlanta: a suspected shooter and a police officer were killed after reports of an active shooter near the CDC and Emory University campuses. \n", + "- Death of astronaut Jim Lovell (97): Apollo 13 commander and former Navy pilot died in a Chicago suburb. \n", + "- Stephen Miran named to Fed Board (short-term): Trump appointed economist Stephen Miran to the Federal Reserve Board through Jan 2026; noted for support of tariffs and rate cuts. \n", + "- Trump fires labour statistics chief: President Trump sacked the official overseeing labor data hours after a weak jobs report. \n", + "- House panel subpoenas Clintons over Epstein: congressional subpoenas seek documents in relation to Jeffrey Epstein amid pressure on the administration over Epstein files. \n", + "- Ghislaine Maxwell moved to lower-security prison in Texas amid scrutiny of Epstein files and government handling. \n", + "- FBI/administration tension on Epstein Files: Trump said he would “release everything” after reports the FBI redacted names from the Epstein Files. \n", + "- Probe launched into attorney who investigated Trump cases: US officials began a probe targeting Special Counsel Jack Smith. \n", + "- NTSB finds technical issues in Army helicopter crash: investigation into crash that killed 67 people identified technical problems. \n", + "- Trump unveils modified reciprocal tariffs: new executive order introduced modified tariffs on multiple countries; effective date possibly as late as Oct 5. \n", + "- Trump-EU trade deal announced: reported pact imposing a 15% tariff on most EU goods, with large energy and investment components but unresolved issues remain. \n", + "- Federal Reserve holds rates steady: Fed kept rates unchanged for a fifth meeting, despite political pressure from Trump. \n", + "- White House remodel plan: Trump pushing to build a reported $200 million ballroom at the presidential residence, funded by Trump/donors per WH. \n", + "- US citizenship test format under review: Trump administration considers reverting to the 2020 naturalisation test format, citing concerns the current test is too easy. \n", + "- American Airlines incident in Denver: passengers evacuated after a Boeing plane caught fire (tire/maintenance issue) before takeoff. \n", + "- John Bolton criticizes Tulsi Gabbard: former NSA lambastes Gabbard’s report on Obama as exaggerated and lacking substance. \n", + "- Ohio solicitor general Mathura Sridharan trolled: Indian-origin jurist faced racist online backlash after appointment; Ohio AG responded strongly.\n", + "\n", + "## Announcements, features & recurring elements\n", + "- Web stories and quick-read lists: travel/animals/safety themed pieces (e.g., “10 airport codes”, “10 animals that are naturally blue”, World Tiger Day lists). \n", + "- Regular sections and shows highlighted in coverage: Firstpost America, Firstpost Africa, First Sports, Vantage, Fast and Factual, Between The Lines, Flashback, Live TV. \n", + "- Events and special coverage teased: Raisina Dialogue, Champions Trophy, Delhi Elections 2025, Budget 2025, US Elections 2024, Firstpost Defence Summit. \n", + "- Trending topics emphasized: Donald Trump, Narendra Modi, Elon Musk, United States, Joe Biden. \n", + "- Quick-links / network: cross-promotion of other Network18 properties (News18, Moneycontrol, CNBC TV18, Forbes India).\n", + "\n", + "## Tone and emphasis\n", + "- Heavy focus on US politics, Trump administration actions and controversies (Epstein Files, tariffs, personnel changes), justice probes, national security incidents, and major breaking events.\n", + "- Mix of investigative/legal reporting, immediate breaking news, and light/web-story listicles.\n", + "\n", + "If you want, I can produce a one-page brief of just the Trump-related items, a timeline of the Epstein/Clinton/Subpoena coverage, or extract all headlines with publication order." + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display_summary(\"https://www.firstpost.com/world/united-states/\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "llms", + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/week1/day2 EXERCISE.ipynb b/week1/day2 EXERCISE.ipynb index 89a383f..519dca5 100644 --- a/week1/day2 EXERCISE.ipynb +++ b/week1/day2 EXERCISE.ipynb @@ -68,7 +68,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "4e2a9393-7767-488e-a8bf-27c12dca35bd", "metadata": {}, "outputs": [], @@ -82,7 +82,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "29ddd15d-a3c5-4f4e-a678-873f56162724", "metadata": {}, "outputs": [], @@ -96,7 +96,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "dac0a679-599c-441f-9bf2-ddc73d35b940", "metadata": {}, "outputs": [], @@ -110,7 +110,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "7bb9c624-14f0-4945-a719-8ddb64f66f47", "metadata": {}, "outputs": [], @@ -124,10 +124,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "479ff514-e8bd-4985-a572-2ea28bb4fa40", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠋ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠙ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠹ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠸ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠼ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠴ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠦ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠧ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠇ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠏ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠋ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠙ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠹ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠸ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠼ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest \u001b[K\n", + "pulling dde5aa3fc5ff: 100% ▕██████████████████▏ 2.0 GB \u001b[K\n", + "pulling 966de95ca8a6: 100% ▕██████████████████▏ 1.4 KB \u001b[K\n", + "pulling fcc5a6bec9da: 100% ▕██████████████████▏ 7.7 KB \u001b[K\n", + "pulling a70ff7e570d9: 100% ▕██████████████████▏ 6.0 KB \u001b[K\n", + "pulling 56bb8bd477a5: 100% ▕██████████████████▏ 96 B \u001b[K\n", + "pulling 34bb5ab01051: 100% ▕██████████████████▏ 561 B \u001b[K\n", + "verifying sha256 digest \u001b[K\n", + "writing manifest \u001b[K\n", + "success \u001b[K\u001b[?25h\u001b[?2026l\n" + ] + } + ], "source": [ "# Let's just make sure the model is loaded\n", "\n", @@ -136,10 +153,38 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "42b9f644-522d-4e05-a691-56e7658c0ea9", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generative AI has numerous business applications across various industries, including:\n", + "\n", + "1. **Content Creation**: Generative AI can be used to create high-quality content such as images, videos, and articles. This can help businesses reduce production costs and increase productivity.\n", + "2. **Marketing Automation**: Generative AI can be used to automate marketing tasks such as email marketing, social media management, and lead generation. It can also be used to personalize marketing messages based on customer behavior and preferences.\n", + "3. **Customer Service Chatbots**: Generative AI-powered chatbots can be used to provide 24/7 customer support and help customers with their queries. This can help businesses reduce the cost of customer service and improve customer satisfaction.\n", + "4. **Product Design**: Generative AI can be used to design new products, such as furniture, electronics, or automotive parts. It can also be used to optimize product designs for better performance and aesthetics.\n", + "5. **Supply Chain Optimization**: Generative AI can be used to analyze supply chain data and predict demand patterns. This can help businesses optimize their inventory levels and reduce waste.\n", + "6. **Financial Modeling**: Generative AI can be used to create financial models and forecast revenue streams. It can also be used to identify potential risks and opportunities in the market.\n", + "7. **Risk Assessment**: Generative AI can be used to assess risk in various areas such as credit risk, market risk, and operational risk. This can help businesses make informed investment decisions and mitigate potential losses.\n", + "8. **Language Translation**: Generative AI-powered translation tools can be used to translate text, images, and audio files across languages. This can help businesses expand their customer base and improve communication with international customers.\n", + "9. **Image Recognition**: Generative AI can be used to recognize objects, people, and patterns in images. This can help businesses automate image classification, object detection, and facial recognition tasks.\n", + "10. **Music and Audio Generation**: Generative AI can be used to create new music tracks, sound effects, and audio files. This can help businesses reduce production costs and improve the quality of their audio content.\n", + "\n", + "Some specific business applications of generative AI include:\n", + "\n", + "* **Automated data entry**: Use generative AI to automate data entry tasks such as typing addresses, phone numbers, and other contact information.\n", + "* **Predictive maintenance**: Use generative AI to predict equipment failures and schedule maintenance accordingly.\n", + "* **Personalized product recommendations**: Use generative AI to personalize product recommendations for customers based on their browsing history and purchase behavior.\n", + "* **Automated social media posting**: Use generative AI to automate social media posting tasks such as scheduling posts, creating content, and responding to comments.\n", + "\n", + "Overall, generative AI has the potential to transform various business processes and improve efficiency, productivity, and customer experience.\n" + ] + } + ], "source": [ "# If this doesn't work for any reason, try the 2 versions in the following cells\n", "# And double check the instructions in the 'Recap on installation of Ollama' at the top of this lab\n", @@ -163,10 +208,46 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "7745b9c4-57dc-4867-9180-61fa5db55eb8", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generative AI has numerous business applications across various industries. Here are some examples:\n", + "\n", + "1. **Content Creation**: Generative AI can be used to generate high-quality content such as articles, social media posts, and product descriptions. This can help businesses save time and money on content creation while maintaining consistency and quality.\n", + "2. **Marketing and Advertising**: Generative AI can be used to create personalized marketing campaigns, social media ads, and email newsletters. It can also help analyze customer behavior and preferences to improve targeting and conversion rates.\n", + "3. **Product Design and Development**: Generative AI can be used to design and develop new products, such as 3D models, prototypes, and even entire product lines. This can help reduce the time and cost associated with traditional product development methods.\n", + "4. **Customer Service Chatbots**: Generative AI can be used to create intelligent chatbots that can understand and respond to customer inquiries in a more human-like way. This can help improve customer satisfaction and reduce support costs.\n", + "5. **Data Analysis and Visualization**: Generative AI can be used to analyze and visualize large datasets, such as customer behavior patterns or market trends. This can help businesses gain insights and make data-driven decisions.\n", + "6. **Predictive Maintenance**: Generative AI can be used to predict equipment failures and maintenance needs, helping businesses reduce downtime and increase efficiency.\n", + "7. **Financial Analysis**: Generative AI can be used to analyze financial data and forecast future trends, helping businesses make informed investment decisions and manage risk.\n", + "8. **Virtual Customer Assistants**: Generative AI can be used to create virtual customer assistants that can handle tasks such as appointment scheduling, order tracking, and more.\n", + "9. **Brand Identity Generation**: Generative AI can be used to generate new brand identities, including logos, color palettes, typography, and overall visual styles.\n", + "10. **Supply Chain Optimization**: Generative AI can be used to optimize supply chain operations, including inventory management, logistics, and transportation planning.\n", + "\n", + "Some of the key benefits of generative AI in business include:\n", + "\n", + "* Increased efficiency and productivity\n", + "* Improved decision-making and forecasting\n", + "* Enhanced customer experience and engagement\n", + "* Reduced costs and risk\n", + "* New revenue streams through creative content generation\n", + "\n", + "However, it's worth noting that the use of generative AI also raises some challenges and concerns, such as:\n", + "\n", + "* Job displacement and workforce disruption\n", + "* Bias and fairness in decision-making\n", + "* Data security and privacy risks\n", + "* Dependence on technology and lack of human touch\n", + "\n", + "Overall, the application of generative AI in business will depend on the specific industry, company, and use case.\n" + ] + } + ], "source": [ "import ollama\n", "\n", @@ -184,10 +265,45 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "23057e00-b6fc-4678-93a9-6b31cb704bff", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generative AI has numerous business applications across various industries. Here are some examples:\n", + "\n", + "1. **Marketing and Advertising**: Generative AI can create personalized product recommendations, generate targeted advertisements, and develop new marketing campaigns.\n", + "2. **Content Creation**: AI-powered tools can assist in content creation, such as writing articles, generating social media posts, and creating videos, podcasts, and music.\n", + "3. **Product Design and Development**: Generative AI can aid in designing products, such as 3D modeling, prototyping, and testing product feasibility.\n", + "4. **Customer Service Chatbots**: AI-powered chatbots can provide personalized customer service, answering common queries, and helping resolve issues faster.\n", + "5. **Language Translation**: Generative AI can translate languages in real-time, enabling businesses to communicate with global customers more effectively.\n", + "6. **Data Analysis and Visualization**: AI can analyze large datasets, identify patterns, and create insights, making it easier for businesses to make informed decisions.\n", + "7. **Cybersecurity Threat Detection**: Generative AI-powered systems can detect and respond to cyber threats more efficiently, reducing the risk of data breaches and attacks.\n", + "8. **Supply Chain Optimization**: AI can optimize supply chain operations, predict demand, and identify opportunities for improvement, leading to increased efficiency and reduced costs.\n", + "9. **Network Security**: Generative AI can analyze network traffic patterns, detect anomalies, and prevent cyber-attacks.\n", + "10. **Finance and Banking**: AI-powered systems can detect financial fraud, predict customer creditworthiness, and generate credit reports.\n", + "\n", + "**Industry-specific applications:**\n", + "\n", + "1. **Healthcare**: AI can help with medical diagnosis, patient data analysis, and personalized medicine.\n", + "2. **Manufacturing**: Generative AI can create optimized production schedules, predict equipment failures, and improve product quality.\n", + "3. **Education**: AI-powered tools can develop personalized learning plans, automate grading, and provide educational resources.\n", + "4. **Real Estate**: AI can help with property valuations, identify market trends, and analyze potential clients' needs.\n", + "\n", + "**Business benefits:**\n", + "\n", + "1. **Increased efficiency**: Automating mundane tasks frees up human resources for more strategic work.\n", + "2. **Improved accuracy**: Generative AI reduces the likelihood of human error in decision-making and task execution.\n", + "3. **Enhanced customer experience**: Personalized experiences are created through data-driven insights.\n", + "4. **Competitive advantage**: Companies using AI can differentiate themselves from competitors by offering innovative services and products.\n", + "\n", + "As Generative AI continues to evolve, we can expect even more exciting applications across various industries, leading to increased efficiency, accuracy, and improved competitiveness for businesses worldwide.\n" + ] + } + ], "source": [ "# There's actually an alternative approach that some people might prefer\n", "# You can use the OpenAI client python library to call Ollama:\n", @@ -248,20 +364,2371 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "cf9eb44e-fe5b-47aa-b719-0bb63669ab3d", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠋ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠙ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠹ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠸ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠼ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠴ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠧ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠧ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠏ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠏ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠋ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠹ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠹ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠸ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠼ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠴ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠦ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠧ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠏ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠏ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠙ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠙ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠸ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠸ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠼ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 0% ▕ ▏ 200 KB/1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 0% ▕ ▏ 979 KB/1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 0% ▕ ▏ 1.2 MB/1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 0% ▕ ▏ 1.8 MB/1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 0% ▕ ▏ 2.3 MB/1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 0% ▕ ▏ 3.2 MB/1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 0% ▕ ▏ 3.4 MB/1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 0% ▕ ▏ 4.0 MB/1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 0% ▕ ▏ 5.5 MB/1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 0% ▕ ▏ 5.6 MB/1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 5.6 MB/1.1 GB 5.4 MB/s 3m24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 5.8 MB/1.1 GB 5.4 MB/s 3m24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 5.9 MB/1.1 GB 5.4 MB/s 3m24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 6.8 MB/1.1 GB 5.4 MB/s 3m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 6.8 MB/1.1 GB 5.4 MB/s 3m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 7.0 MB/1.1 GB 5.4 MB/s 3m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 7.0 MB/1.1 GB 5.4 MB/s 3m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 7.2 MB/1.1 GB 5.4 MB/s 3m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 7.3 MB/1.1 GB 5.4 MB/s 3m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 8.2 MB/1.1 GB 5.4 MB/s 3m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 9.5 MB/1.1 GB 4.7 MB/s 3m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 9.7 MB/1.1 GB 4.7 MB/s 3m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 9.8 MB/1.1 GB 4.7 MB/s 3m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 9.9 MB/1.1 GB 4.7 MB/s 3m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 9.9 MB/1.1 GB 4.7 MB/s 3m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 10 MB/1.1 GB 4.7 MB/s 3m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 10 MB/1.1 GB 4.7 MB/s 3m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 11 MB/1.1 GB 4.7 MB/s 3m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 12 MB/1.1 GB 4.7 MB/s 3m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 13 MB/1.1 GB 4.7 MB/s 3m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 13 MB/1.1 GB 4.7 MB/s 3m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 13 MB/1.1 GB 4.3 MB/s 4m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 13 MB/1.1 GB 4.3 MB/s 4m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 13 MB/1.1 GB 4.3 MB/s 4m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 13 MB/1.1 GB 4.3 MB/s 4m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 13 MB/1.1 GB 4.3 MB/s 4m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 14 MB/1.1 GB 4.3 MB/s 4m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 14 MB/1.1 GB 4.3 MB/s 4m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 14 MB/1.1 GB 4.3 MB/s 4m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 14 MB/1.1 GB 4.3 MB/s 4m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 14 MB/1.1 GB 4.3 MB/s 4m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 14 MB/1.1 GB 3.5 MB/s 5m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 14 MB/1.1 GB 3.5 MB/s 5m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 14 MB/1.1 GB 3.5 MB/s 5m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 14 MB/1.1 GB 3.5 MB/s 5m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 14 MB/1.1 GB 3.5 MB/s 5m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 14 MB/1.1 GB 3.5 MB/s 5m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 15 MB/1.1 GB 3.5 MB/s 5m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 15 MB/1.1 GB 3.5 MB/s 5m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 1% ▕ ▏ 16 MB/1.1 GB 3.5 MB/s 5m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 17 MB/1.1 GB 3.5 MB/s 5m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 17 MB/1.1 GB 3.4 MB/s 5m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 17 MB/1.1 GB 3.4 MB/s 5m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 17 MB/1.1 GB 3.4 MB/s 5m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 17 MB/1.1 GB 3.4 MB/s 5m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 17 MB/1.1 GB 3.4 MB/s 5m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 17 MB/1.1 GB 3.4 MB/s 5m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 17 MB/1.1 GB 3.4 MB/s 5m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 18 MB/1.1 GB 3.4 MB/s 5m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 18 MB/1.1 GB 3.4 MB/s 5m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 18 MB/1.1 GB 3.4 MB/s 5m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 18 MB/1.1 GB 3.1 MB/s 5m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 18 MB/1.1 GB 3.1 MB/s 5m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 18 MB/1.1 GB 3.1 MB/s 5m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 19 MB/1.1 GB 3.1 MB/s 5m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 20 MB/1.1 GB 3.1 MB/s 5m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 20 MB/1.1 GB 3.1 MB/s 5m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 21 MB/1.1 GB 3.1 MB/s 5m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 21 MB/1.1 GB 3.1 MB/s 5m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 21 MB/1.1 GB 3.1 MB/s 5m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 22 MB/1.1 GB 3.1 MB/s 5m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 22 MB/1.1 GB 3.2 MB/s 5m44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 22 MB/1.1 GB 3.2 MB/s 5m44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 23 MB/1.1 GB 3.2 MB/s 5m43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 23 MB/1.1 GB 3.2 MB/s 5m43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 23 MB/1.1 GB 3.2 MB/s 5m43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 23 MB/1.1 GB 3.2 MB/s 5m43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 24 MB/1.1 GB 3.2 MB/s 5m43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 24 MB/1.1 GB 3.2 MB/s 5m43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 25 MB/1.1 GB 3.2 MB/s 5m43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 25 MB/1.1 GB 3.2 MB/s 5m43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 25 MB/1.1 GB 3.2 MB/s 5m43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 26 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 26 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 26 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 26 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 27 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 2% ▕ ▏ 27 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 3% ▕ ▏ 28 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 3% ▕ ▏ 28 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 3% ▕ ▏ 28 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 3% ▕ ▏ 29 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 3% ▕ ▏ 29 MB/1.1 GB 3.2 MB/s 5m34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 3% ▕ ▏ 29 MB/1.1 GB 3.2 MB/s 5m34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 3% ▕ ▏ 29 MB/1.1 GB 3.2 MB/s 5m34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 3% ▕ ▏ 30 MB/1.1 GB 3.2 MB/s 5m34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 3% ▕ ▏ 30 MB/1.1 GB 3.2 MB/s 5m34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 3% ▕ ▏ 31 MB/1.1 GB 3.2 MB/s 5m34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 3% ▕ ▏ 31 MB/1.1 GB 3.2 MB/s 5m34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 3% ▕ ▏ 31 MB/1.1 GB 3.2 MB/s 5m34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 3% ▕ ▏ 32 MB/1.1 GB 3.2 MB/s 5m34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 3% ▕ ▏ 32 MB/1.1 GB 3.2 MB/s 5m33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 3% ▕ ▏ 32 MB/1.1 GB 3.0 MB/s 5m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 3% ▕ ▏ 33 MB/1.1 GB 3.0 MB/s 5m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 3% ▕ ▏ 33 MB/1.1 GB 3.0 MB/s 5m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 3% ▕ ▏ 34 MB/1.1 GB 3.0 MB/s 5m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 3% ▕ ▏ 34 MB/1.1 GB 3.0 MB/s 5m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 3% ▕ ▏ 35 MB/1.1 GB 3.0 MB/s 5m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 3% ▕ ▏ 35 MB/1.1 GB 3.0 MB/s 5m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 3% ▕ ▏ 36 MB/1.1 GB 3.0 MB/s 5m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 3% ▕ ▏ 36 MB/1.1 GB 3.0 MB/s 5m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 3% ▕ ▏ 37 MB/1.1 GB 3.0 MB/s 5m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 3% ▕ ▏ 37 MB/1.1 GB 3.1 MB/s 5m45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 3% ▕ ▏ 38 MB/1.1 GB 3.1 MB/s 5m45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 3% ▕ ▏ 38 MB/1.1 GB 3.1 MB/s 5m45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 3% ▕ ▏ 38 MB/1.1 GB 3.1 MB/s 5m45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 4% ▕ ▏ 39 MB/1.1 GB 3.1 MB/s 5m45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 4% ▕ ▏ 39 MB/1.1 GB 3.1 MB/s 5m45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 4% ▕ ▏ 40 MB/1.1 GB 3.1 MB/s 5m44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 4% ▕ ▏ 40 MB/1.1 GB 3.1 MB/s 5m44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 4% ▕ ▏ 40 MB/1.1 GB 3.1 MB/s 5m44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 4% ▕ ▏ 41 MB/1.1 GB 3.1 MB/s 5m44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 4% ▕ ▏ 41 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 4% ▕ ▏ 42 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 4% ▕ ▏ 42 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 4% ▕ ▏ 43 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 4% ▕ ▏ 43 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 4% ▕ ▏ 43 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 4% ▕ ▏ 44 MB/1.1 GB 3.2 MB/s 5m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 4% ▕ ▏ 44 MB/1.1 GB 3.2 MB/s 5m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 4% ▕ ▏ 45 MB/1.1 GB 3.2 MB/s 5m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 4% ▕ ▏ 46 MB/1.1 GB 3.2 MB/s 5m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 4% ▕ ▏ 46 MB/1.1 GB 3.2 MB/s 5m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 4% ▕ ▏ 47 MB/1.1 GB 3.6 MB/s 4m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 4% ▕ ▏ 47 MB/1.1 GB 3.6 MB/s 4m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 4% ▕ ▏ 48 MB/1.1 GB 3.6 MB/s 4m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 4% ▕ ▏ 48 MB/1.1 GB 3.6 MB/s 4m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 4% ▕ ▏ 49 MB/1.1 GB 3.6 MB/s 4m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 4% ▕ ▏ 49 MB/1.1 GB 3.6 MB/s 4m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 4% ▕ ▏ 49 MB/1.1 GB 3.6 MB/s 4m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 5% ▕ ▏ 50 MB/1.1 GB 3.6 MB/s 4m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 5% ▕ ▏ 50 MB/1.1 GB 3.6 MB/s 4m53s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 5% ▕ ▏ 51 MB/1.1 GB 3.6 MB/s 4m53s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 5% ▕ ▏ 52 MB/1.1 GB 3.8 MB/s 4m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 5% ▕ ▏ 52 MB/1.1 GB 3.8 MB/s 4m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 5% ▕ ▏ 52 MB/1.1 GB 3.8 MB/s 4m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 5% ▕ ▏ 53 MB/1.1 GB 3.8 MB/s 4m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 5% ▕ ▏ 54 MB/1.1 GB 3.8 MB/s 4m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 5% ▕ ▏ 54 MB/1.1 GB 3.8 MB/s 4m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 5% ▕ ▏ 54 MB/1.1 GB 3.8 MB/s 4m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 5% ▕ ▏ 55 MB/1.1 GB 3.8 MB/s 4m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 5% ▕ ▏ 56 MB/1.1 GB 3.8 MB/s 4m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 5% ▕ ▏ 56 MB/1.1 GB 3.8 MB/s 4m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 5% ▕ ▏ 56 MB/1.1 GB 4.2 MB/s 4m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 5% ▕ ▏ 56 MB/1.1 GB 4.2 MB/s 4m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 5% ▕ ▏ 57 MB/1.1 GB 4.2 MB/s 4m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 5% ▕ ▏ 57 MB/1.1 GB 4.2 MB/s 4m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 5% ▕ ▏ 57 MB/1.1 GB 4.2 MB/s 4m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 5% ▕ ▏ 58 MB/1.1 GB 4.2 MB/s 4m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 5% ▕ ▏ 58 MB/1.1 GB 4.2 MB/s 4m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 5% ▕ ▏ 58 MB/1.1 GB 4.2 MB/s 4m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 5% ▕ ▏ 59 MB/1.1 GB 4.2 MB/s 4m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 5% ▕ ▏ 60 MB/1.1 GB 4.2 MB/s 4m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 5% ▕ ▏ 60 MB/1.1 GB 4.2 MB/s 4m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 5% ▕ ▏ 60 MB/1.1 GB 4.2 MB/s 4m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 6% ▕ ▏ 61 MB/1.1 GB 4.2 MB/s 4m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 6% ▕█ ▏ 62 MB/1.1 GB 4.2 MB/s 4m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 6% ▕█ ▏ 62 MB/1.1 GB 4.2 MB/s 4m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 6% ▕█ ▏ 63 MB/1.1 GB 4.2 MB/s 4m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 6% ▕█ ▏ 63 MB/1.1 GB 4.2 MB/s 4m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 6% ▕█ ▏ 64 MB/1.1 GB 4.2 MB/s 4m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 6% ▕█ ▏ 64 MB/1.1 GB 4.2 MB/s 4m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 6% ▕█ ▏ 65 MB/1.1 GB 4.2 MB/s 4m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 6% ▕█ ▏ 65 MB/1.1 GB 4.4 MB/s 3m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 6% ▕█ ▏ 66 MB/1.1 GB 4.4 MB/s 3m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 6% ▕█ ▏ 66 MB/1.1 GB 4.4 MB/s 3m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 6% ▕█ ▏ 67 MB/1.1 GB 4.4 MB/s 3m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 6% ▕█ ▏ 67 MB/1.1 GB 4.4 MB/s 3m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 6% ▕█ ▏ 68 MB/1.1 GB 4.4 MB/s 3m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 6% ▕█ ▏ 69 MB/1.1 GB 4.4 MB/s 3m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 6% ▕█ ▏ 69 MB/1.1 GB 4.4 MB/s 3m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 6% ▕█ ▏ 69 MB/1.1 GB 4.4 MB/s 3m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 6% ▕█ ▏ 70 MB/1.1 GB 4.4 MB/s 3m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 6% ▕█ ▏ 70 MB/1.1 GB 4.4 MB/s 3m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 6% ▕█ ▏ 71 MB/1.1 GB 4.6 MB/s 3m47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 6% ▕█ ▏ 72 MB/1.1 GB 4.6 MB/s 3m47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 6% ▕█ ▏ 72 MB/1.1 GB 4.6 MB/s 3m47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 7% ▕█ ▏ 72 MB/1.1 GB 4.6 MB/s 3m47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 7% ▕█ ▏ 73 MB/1.1 GB 4.6 MB/s 3m47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 7% ▕█ ▏ 74 MB/1.1 GB 4.6 MB/s 3m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 7% ▕█ ▏ 74 MB/1.1 GB 4.6 MB/s 3m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 7% ▕█ ▏ 74 MB/1.1 GB 4.6 MB/s 3m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 7% ▕█ ▏ 75 MB/1.1 GB 4.6 MB/s 3m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 7% ▕█ ▏ 75 MB/1.1 GB 4.6 MB/s 3m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 7% ▕█ ▏ 75 MB/1.1 GB 4.8 MB/s 3m39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 7% ▕█ ▏ 75 MB/1.1 GB 4.8 MB/s 3m39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 7% ▕█ ▏ 77 MB/1.1 GB 4.8 MB/s 3m38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 7% ▕█ ▏ 78 MB/1.1 GB 4.8 MB/s 3m38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 7% ▕█ ▏ 78 MB/1.1 GB 4.8 MB/s 3m38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 7% ▕█ ▏ 79 MB/1.1 GB 4.8 MB/s 3m38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 7% ▕█ ▏ 79 MB/1.1 GB 4.8 MB/s 3m38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 7% ▕█ ▏ 80 MB/1.1 GB 4.8 MB/s 3m38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 7% ▕█ ▏ 80 MB/1.1 GB 4.8 MB/s 3m38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 7% ▕█ ▏ 81 MB/1.1 GB 4.8 MB/s 3m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 7% ▕█ ▏ 82 MB/1.1 GB 4.9 MB/s 3m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 7% ▕█ ▏ 82 MB/1.1 GB 4.9 MB/s 3m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 7% ▕█ ▏ 83 MB/1.1 GB 4.9 MB/s 3m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 8% ▕█ ▏ 84 MB/1.1 GB 4.9 MB/s 3m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 8% ▕█ ▏ 84 MB/1.1 GB 4.9 MB/s 3m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 8% ▕█ ▏ 84 MB/1.1 GB 4.9 MB/s 3m28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 8% ▕█ ▏ 85 MB/1.1 GB 4.9 MB/s 3m28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 8% ▕█ ▏ 86 MB/1.1 GB 4.9 MB/s 3m28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 8% ▕█ ▏ 86 MB/1.1 GB 4.9 MB/s 3m28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 8% ▕█ ▏ 86 MB/1.1 GB 4.9 MB/s 3m28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 8% ▕█ ▏ 86 MB/1.1 GB 5.0 MB/s 3m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 8% ▕█ ▏ 87 MB/1.1 GB 5.0 MB/s 3m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 8% ▕█ ▏ 87 MB/1.1 GB 5.0 MB/s 3m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 8% ▕█ ▏ 89 MB/1.1 GB 5.0 MB/s 3m26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 8% ▕█ ▏ 90 MB/1.1 GB 5.0 MB/s 3m26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 8% ▕█ ▏ 90 MB/1.1 GB 5.0 MB/s 3m26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 8% ▕█ ▏ 91 MB/1.1 GB 5.0 MB/s 3m26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 8% ▕█ ▏ 92 MB/1.1 GB 5.0 MB/s 3m26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 8% ▕█ ▏ 92 MB/1.1 GB 5.0 MB/s 3m26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 8% ▕█ ▏ 92 MB/1.1 GB 5.0 MB/s 3m26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 8% ▕█ ▏ 94 MB/1.1 GB 5.3 MB/s 3m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 8% ▕█ ▏ 94 MB/1.1 GB 5.3 MB/s 3m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 8% ▕█ ▏ 94 MB/1.1 GB 5.3 MB/s 3m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 9% ▕█ ▏ 95 MB/1.1 GB 5.3 MB/s 3m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 9% ▕█ ▏ 95 MB/1.1 GB 5.3 MB/s 3m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 9% ▕█ ▏ 96 MB/1.1 GB 5.3 MB/s 3m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 9% ▕█ ▏ 97 MB/1.1 GB 5.3 MB/s 3m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 9% ▕█ ▏ 97 MB/1.1 GB 5.3 MB/s 3m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 9% ▕█ ▏ 98 MB/1.1 GB 5.3 MB/s 3m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 9% ▕█ ▏ 98 MB/1.1 GB 5.3 MB/s 3m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 9% ▕█ ▏ 99 MB/1.1 GB 5.3 MB/s 3m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 9% ▕█ ▏ 100 MB/1.1 GB 5.4 MB/s 3m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 9% ▕█ ▏ 100 MB/1.1 GB 5.4 MB/s 3m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 9% ▕█ ▏ 100 MB/1.1 GB 5.4 MB/s 3m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 9% ▕█ ▏ 101 MB/1.1 GB 5.4 MB/s 3m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 9% ▕█ ▏ 102 MB/1.1 GB 5.4 MB/s 3m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 9% ▕█ ▏ 103 MB/1.1 GB 5.4 MB/s 3m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 9% ▕█ ▏ 104 MB/1.1 GB 5.4 MB/s 3m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 9% ▕█ ▏ 104 MB/1.1 GB 5.4 MB/s 3m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 9% ▕█ ▏ 105 MB/1.1 GB 5.4 MB/s 3m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 9% ▕█ ▏ 105 MB/1.1 GB 5.4 MB/s 3m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 10% ▕█ ▏ 106 MB/1.1 GB 5.4 MB/s 3m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 10% ▕█ ▏ 107 MB/1.1 GB 5.4 MB/s 3m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 10% ▕█ ▏ 108 MB/1.1 GB 5.4 MB/s 3m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 10% ▕█ ▏ 109 MB/1.1 GB 5.4 MB/s 3m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 10% ▕█ ▏ 109 MB/1.1 GB 5.4 MB/s 3m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 10% ▕█ ▏ 110 MB/1.1 GB 5.4 MB/s 3m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 10% ▕█ ▏ 111 MB/1.1 GB 5.4 MB/s 3m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 10% ▕█ ▏ 111 MB/1.1 GB 5.4 MB/s 3m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 10% ▕█ ▏ 112 MB/1.1 GB 5.4 MB/s 3m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 10% ▕█ ▏ 113 MB/1.1 GB 5.4 MB/s 3m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 10% ▕█ ▏ 113 MB/1.1 GB 5.9 MB/s 2m48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 10% ▕█ ▏ 114 MB/1.1 GB 5.9 MB/s 2m48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 10% ▕█ ▏ 115 MB/1.1 GB 5.9 MB/s 2m48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 10% ▕█ ▏ 116 MB/1.1 GB 5.9 MB/s 2m48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 10% ▕█ ▏ 116 MB/1.1 GB 5.9 MB/s 2m48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 11% ▕█ ▏ 117 MB/1.1 GB 5.9 MB/s 2m48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 11% ▕█ ▏ 117 MB/1.1 GB 5.9 MB/s 2m48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 11% ▕█ ▏ 118 MB/1.1 GB 5.9 MB/s 2m48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 11% ▕█ ▏ 119 MB/1.1 GB 5.9 MB/s 2m47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 11% ▕█ ▏ 119 MB/1.1 GB 5.9 MB/s 2m47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 11% ▕█ ▏ 119 MB/1.1 GB 6.0 MB/s 2m47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 11% ▕█ ▏ 120 MB/1.1 GB 6.0 MB/s 2m47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 11% ▕█ ▏ 121 MB/1.1 GB 6.0 MB/s 2m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 11% ▕█ ▏ 122 MB/1.1 GB 6.0 MB/s 2m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 11% ▕█ ▏ 123 MB/1.1 GB 6.0 MB/s 2m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 11% ▕█ ▏ 123 MB/1.1 GB 6.0 MB/s 2m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 11% ▕██ ▏ 124 MB/1.1 GB 6.0 MB/s 2m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 11% ▕██ ▏ 125 MB/1.1 GB 6.0 MB/s 2m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 11% ▕██ ▏ 125 MB/1.1 GB 6.0 MB/s 2m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 11% ▕██ ▏ 126 MB/1.1 GB 6.0 MB/s 2m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 11% ▕██ ▏ 127 MB/1.1 GB 6.3 MB/s 2m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 11% ▕██ ▏ 128 MB/1.1 GB 6.3 MB/s 2m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 12% ▕██ ▏ 129 MB/1.1 GB 6.3 MB/s 2m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 12% ▕██ ▏ 129 MB/1.1 GB 6.3 MB/s 2m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 12% ▕██ ▏ 129 MB/1.1 GB 6.3 MB/s 2m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 12% ▕██ ▏ 131 MB/1.1 GB 6.3 MB/s 2m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 12% ▕██ ▏ 131 MB/1.1 GB 6.3 MB/s 2m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 12% ▕██ ▏ 132 MB/1.1 GB 6.3 MB/s 2m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 12% ▕██ ▏ 133 MB/1.1 GB 6.3 MB/s 2m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 12% ▕██ ▏ 133 MB/1.1 GB 6.3 MB/s 2m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 12% ▕██ ▏ 133 MB/1.1 GB 6.3 MB/s 2m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 12% ▕██ ▏ 134 MB/1.1 GB 6.5 MB/s 2m31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 12% ▕██ ▏ 135 MB/1.1 GB 6.5 MB/s 2m31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 12% ▕██ ▏ 135 MB/1.1 GB 6.5 MB/s 2m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 12% ▕██ ▏ 137 MB/1.1 GB 6.5 MB/s 2m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 12% ▕██ ▏ 137 MB/1.1 GB 6.5 MB/s 2m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 12% ▕██ ▏ 137 MB/1.1 GB 6.5 MB/s 2m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 12% ▕██ ▏ 137 MB/1.1 GB 6.5 MB/s 2m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 12% ▕██ ▏ 139 MB/1.1 GB 6.5 MB/s 2m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 13% ▕██ ▏ 140 MB/1.1 GB 6.5 MB/s 2m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 13% ▕██ ▏ 140 MB/1.1 GB 6.5 MB/s 2m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 13% ▕██ ▏ 141 MB/1.1 GB 6.6 MB/s 2m28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 13% ▕██ ▏ 141 MB/1.1 GB 6.6 MB/s 2m28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 13% ▕██ ▏ 142 MB/1.1 GB 6.6 MB/s 2m28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 13% ▕██ ▏ 142 MB/1.1 GB 6.6 MB/s 2m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 13% ▕██ ▏ 143 MB/1.1 GB 6.6 MB/s 2m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 13% ▕██ ▏ 144 MB/1.1 GB 6.6 MB/s 2m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 13% ▕██ ▏ 145 MB/1.1 GB 6.6 MB/s 2m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 13% ▕██ ▏ 145 MB/1.1 GB 6.6 MB/s 2m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 13% ▕██ ▏ 146 MB/1.1 GB 6.6 MB/s 2m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 13% ▕██ ▏ 147 MB/1.1 GB 6.6 MB/s 2m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 13% ▕██ ▏ 147 MB/1.1 GB 6.8 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 13% ▕██ ▏ 148 MB/1.1 GB 6.8 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 13% ▕██ ▏ 149 MB/1.1 GB 6.8 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 13% ▕██ ▏ 149 MB/1.1 GB 6.8 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 14% ▕██ ▏ 150 MB/1.1 GB 6.8 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 14% ▕██ ▏ 151 MB/1.1 GB 6.8 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 14% ▕██ ▏ 151 MB/1.1 GB 6.8 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 14% ▕██ ▏ 152 MB/1.1 GB 6.8 MB/s 2m21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 14% ▕██ ▏ 153 MB/1.1 GB 6.8 MB/s 2m21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 14% ▕██ ▏ 154 MB/1.1 GB 6.8 MB/s 2m21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 14% ▕██ ▏ 154 MB/1.1 GB 6.7 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 14% ▕██ ▏ 155 MB/1.1 GB 6.7 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 14% ▕██ ▏ 155 MB/1.1 GB 6.7 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 14% ▕██ ▏ 156 MB/1.1 GB 6.7 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 14% ▕██ ▏ 157 MB/1.1 GB 6.7 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 14% ▕██ ▏ 157 MB/1.1 GB 6.7 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 14% ▕██ ▏ 158 MB/1.1 GB 6.7 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 14% ▕██ ▏ 158 MB/1.1 GB 6.7 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 14% ▕██ ▏ 159 MB/1.1 GB 6.7 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 14% ▕██ ▏ 160 MB/1.1 GB 6.7 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 14% ▕██ ▏ 160 MB/1.1 GB 6.8 MB/s 2m21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 14% ▕██ ▏ 161 MB/1.1 GB 6.8 MB/s 2m21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 15% ▕██ ▏ 162 MB/1.1 GB 6.8 MB/s 2m21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 15% ▕██ ▏ 163 MB/1.1 GB 6.8 MB/s 2m20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 15% ▕██ ▏ 163 MB/1.1 GB 6.8 MB/s 2m20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 15% ▕██ ▏ 164 MB/1.1 GB 6.8 MB/s 2m20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 15% ▕██ ▏ 165 MB/1.1 GB 6.8 MB/s 2m20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 15% ▕██ ▏ 165 MB/1.1 GB 6.8 MB/s 2m20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 15% ▕██ ▏ 166 MB/1.1 GB 6.8 MB/s 2m20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 15% ▕██ ▏ 166 MB/1.1 GB 6.8 MB/s 2m20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 15% ▕██ ▏ 167 MB/1.1 GB 6.8 MB/s 2m20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 15% ▕██ ▏ 168 MB/1.1 GB 7.0 MB/s 2m16s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 15% ▕██ ▏ 169 MB/1.1 GB 7.0 MB/s 2m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 15% ▕██ ▏ 170 MB/1.1 GB 7.0 MB/s 2m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 15% ▕██ ▏ 171 MB/1.1 GB 7.0 MB/s 2m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 15% ▕██ ▏ 172 MB/1.1 GB 7.0 MB/s 2m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 15% ▕██ ▏ 172 MB/1.1 GB 7.0 MB/s 2m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 16% ▕██ ▏ 173 MB/1.1 GB 7.0 MB/s 2m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 16% ▕██ ▏ 174 MB/1.1 GB 7.0 MB/s 2m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 16% ▕██ ▏ 174 MB/1.1 GB 7.0 MB/s 2m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 16% ▕██ ▏ 174 MB/1.1 GB 7.0 MB/s 2m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 16% ▕██ ▏ 175 MB/1.1 GB 6.8 MB/s 2m18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 16% ▕██ ▏ 176 MB/1.1 GB 6.8 MB/s 2m18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 16% ▕██ ▏ 176 MB/1.1 GB 6.8 MB/s 2m18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 16% ▕██ ▏ 177 MB/1.1 GB 6.8 MB/s 2m18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 16% ▕██ ▏ 178 MB/1.1 GB 6.8 MB/s 2m18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 16% ▕██ ▏ 178 MB/1.1 GB 6.8 MB/s 2m18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 16% ▕██ ▏ 179 MB/1.1 GB 6.8 MB/s 2m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 16% ▕██ ▏ 180 MB/1.1 GB 6.8 MB/s 2m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 16% ▕██ ▏ 181 MB/1.1 GB 6.8 MB/s 2m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 16% ▕██ ▏ 182 MB/1.1 GB 6.8 MB/s 2m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 16% ▕██ ▏ 182 MB/1.1 GB 7.0 MB/s 2m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 16% ▕██ ▏ 183 MB/1.1 GB 7.0 MB/s 2m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 16% ▕██ ▏ 184 MB/1.1 GB 7.0 MB/s 2m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 17% ▕██ ▏ 184 MB/1.1 GB 7.0 MB/s 2m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 17% ▕██ ▏ 185 MB/1.1 GB 7.0 MB/s 2m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 17% ▕██ ▏ 185 MB/1.1 GB 7.0 MB/s 2m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 17% ▕███ ▏ 186 MB/1.1 GB 7.0 MB/s 2m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 17% ▕███ ▏ 187 MB/1.1 GB 7.0 MB/s 2m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 17% ▕███ ▏ 188 MB/1.1 GB 7.0 MB/s 2m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 17% ▕███ ▏ 189 MB/1.1 GB 7.0 MB/s 2m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 17% ▕███ ▏ 189 MB/1.1 GB 6.9 MB/s 2m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 17% ▕███ ▏ 190 MB/1.1 GB 6.9 MB/s 2m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 17% ▕███ ▏ 190 MB/1.1 GB 6.9 MB/s 2m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 17% ▕███ ▏ 192 MB/1.1 GB 6.9 MB/s 2m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 17% ▕███ ▏ 193 MB/1.1 GB 6.9 MB/s 2m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 17% ▕███ ▏ 193 MB/1.1 GB 6.9 MB/s 2m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 17% ▕███ ▏ 194 MB/1.1 GB 6.9 MB/s 2m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 18% ▕███ ▏ 195 MB/1.1 GB 6.9 MB/s 2m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 18% ▕███ ▏ 195 MB/1.1 GB 6.9 MB/s 2m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 18% ▕███ ▏ 196 MB/1.1 GB 6.9 MB/s 2m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 18% ▕███ ▏ 197 MB/1.1 GB 7.0 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 18% ▕███ ▏ 197 MB/1.1 GB 7.0 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 18% ▕███ ▏ 198 MB/1.1 GB 7.0 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 18% ▕███ ▏ 198 MB/1.1 GB 7.0 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 18% ▕███ ▏ 198 MB/1.1 GB 7.0 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 18% ▕███ ▏ 200 MB/1.1 GB 7.0 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 18% ▕███ ▏ 201 MB/1.1 GB 7.0 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 18% ▕███ ▏ 201 MB/1.1 GB 7.0 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 18% ▕███ ▏ 202 MB/1.1 GB 7.0 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 18% ▕███ ▏ 203 MB/1.1 GB 7.0 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 18% ▕███ ▏ 204 MB/1.1 GB 7.0 MB/s 2m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 18% ▕███ ▏ 205 MB/1.1 GB 7.0 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 18% ▕███ ▏ 205 MB/1.1 GB 7.0 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 18% ▕███ ▏ 205 MB/1.1 GB 7.0 MB/s 2m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 18% ▕███ ▏ 205 MB/1.1 GB 7.0 MB/s 2m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 18% ▕███ ▏ 206 MB/1.1 GB 7.0 MB/s 2m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 19% ▕███ ▏ 207 MB/1.1 GB 7.0 MB/s 2m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 19% ▕███ ▏ 208 MB/1.1 GB 7.0 MB/s 2m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 19% ▕███ ▏ 208 MB/1.1 GB 7.0 MB/s 2m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 19% ▕███ ▏ 208 MB/1.1 GB 7.0 MB/s 2m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 19% ▕███ ▏ 210 MB/1.1 GB 7.0 MB/s 2m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 19% ▕███ ▏ 211 MB/1.1 GB 6.9 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 19% ▕███ ▏ 211 MB/1.1 GB 6.9 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 19% ▕███ ▏ 211 MB/1.1 GB 6.9 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 19% ▕███ ▏ 212 MB/1.1 GB 6.9 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 19% ▕███ ▏ 213 MB/1.1 GB 6.9 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 19% ▕███ ▏ 213 MB/1.1 GB 6.9 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 19% ▕███ ▏ 214 MB/1.1 GB 6.9 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 19% ▕███ ▏ 214 MB/1.1 GB 6.9 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 19% ▕███ ▏ 215 MB/1.1 GB 6.9 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 19% ▕███ ▏ 215 MB/1.1 GB 6.9 MB/s 2m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 19% ▕███ ▏ 216 MB/1.1 GB 6.9 MB/s 2m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 19% ▕███ ▏ 216 MB/1.1 GB 6.9 MB/s 2m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 19% ▕███ ▏ 217 MB/1.1 GB 6.9 MB/s 2m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 19% ▕███ ▏ 217 MB/1.1 GB 6.9 MB/s 2m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 20% ▕███ ▏ 218 MB/1.1 GB 6.9 MB/s 2m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 20% ▕███ ▏ 219 MB/1.1 GB 6.9 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 20% ▕███ ▏ 220 MB/1.1 GB 6.9 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 20% ▕███ ▏ 221 MB/1.1 GB 6.9 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 20% ▕███ ▏ 222 MB/1.1 GB 6.9 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 20% ▕███ ▏ 222 MB/1.1 GB 6.9 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 20% ▕███ ▏ 223 MB/1.1 GB 7.0 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 20% ▕███ ▏ 224 MB/1.1 GB 7.0 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 20% ▕███ ▏ 224 MB/1.1 GB 7.0 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 20% ▕███ ▏ 225 MB/1.1 GB 7.0 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 20% ▕███ ▏ 226 MB/1.1 GB 7.0 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 20% ▕███ ▏ 227 MB/1.1 GB 7.0 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 20% ▕███ ▏ 227 MB/1.1 GB 7.0 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 20% ▕███ ▏ 227 MB/1.1 GB 7.0 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 20% ▕███ ▏ 228 MB/1.1 GB 7.0 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 21% ▕███ ▏ 229 MB/1.1 GB 7.0 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 21% ▕███ ▏ 230 MB/1.1 GB 6.9 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 21% ▕███ ▏ 230 MB/1.1 GB 6.9 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 21% ▕███ ▏ 231 MB/1.1 GB 6.9 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 21% ▕███ ▏ 232 MB/1.1 GB 6.9 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 21% ▕███ ▏ 233 MB/1.1 GB 6.9 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 21% ▕███ ▏ 233 MB/1.1 GB 6.9 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 21% ▕███ ▏ 234 MB/1.1 GB 6.9 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 21% ▕███ ▏ 235 MB/1.1 GB 6.9 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 21% ▕███ ▏ 235 MB/1.1 GB 6.9 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 21% ▕███ ▏ 236 MB/1.1 GB 6.9 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 21% ▕███ ▏ 237 MB/1.1 GB 6.9 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 21% ▕███ ▏ 237 MB/1.1 GB 6.9 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 21% ▕███ ▏ 238 MB/1.1 GB 6.9 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 21% ▕███ ▏ 239 MB/1.1 GB 6.9 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 21% ▕███ ▏ 239 MB/1.1 GB 6.9 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 22% ▕███ ▏ 240 MB/1.1 GB 6.9 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 22% ▕███ ▏ 240 MB/1.1 GB 6.9 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 22% ▕███ ▏ 242 MB/1.1 GB 6.9 MB/s 2m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 22% ▕███ ▏ 243 MB/1.1 GB 6.9 MB/s 2m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 22% ▕███ ▏ 243 MB/1.1 GB 6.9 MB/s 2m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 22% ▕███ ▏ 243 MB/1.1 GB 6.9 MB/s 2m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 22% ▕███ ▏ 244 MB/1.1 GB 6.8 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 22% ▕███ ▏ 244 MB/1.1 GB 6.8 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 22% ▕███ ▏ 245 MB/1.1 GB 6.8 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 22% ▕███ ▏ 246 MB/1.1 GB 6.8 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 22% ▕███ ▏ 246 MB/1.1 GB 6.8 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 22% ▕███ ▏ 247 MB/1.1 GB 6.8 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 22% ▕████ ▏ 248 MB/1.1 GB 6.8 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 22% ▕████ ▏ 249 MB/1.1 GB 6.8 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 22% ▕████ ▏ 249 MB/1.1 GB 6.8 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 22% ▕████ ▏ 250 MB/1.1 GB 6.8 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 22% ▕████ ▏ 251 MB/1.1 GB 6.8 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 23% ▕████ ▏ 251 MB/1.1 GB 6.8 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 23% ▕████ ▏ 252 MB/1.1 GB 6.8 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 23% ▕████ ▏ 252 MB/1.1 GB 6.8 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 23% ▕████ ▏ 253 MB/1.1 GB 6.8 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 23% ▕████ ▏ 253 MB/1.1 GB 6.8 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 23% ▕████ ▏ 254 MB/1.1 GB 6.8 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 23% ▕████ ▏ 255 MB/1.1 GB 6.8 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 23% ▕████ ▏ 256 MB/1.1 GB 6.8 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 23% ▕████ ▏ 257 MB/1.1 GB 6.8 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 23% ▕████ ▏ 257 MB/1.1 GB 6.7 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 23% ▕████ ▏ 258 MB/1.1 GB 6.7 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 23% ▕████ ▏ 259 MB/1.1 GB 6.7 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 23% ▕████ ▏ 260 MB/1.1 GB 6.7 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 23% ▕████ ▏ 261 MB/1.1 GB 6.7 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 23% ▕████ ▏ 261 MB/1.1 GB 6.7 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 23% ▕████ ▏ 261 MB/1.1 GB 6.7 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 24% ▕████ ▏ 263 MB/1.1 GB 6.7 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 24% ▕████ ▏ 263 MB/1.1 GB 6.7 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 24% ▕████ ▏ 264 MB/1.1 GB 6.7 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 24% ▕████ ▏ 265 MB/1.1 GB 6.7 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 24% ▕████ ▏ 266 MB/1.1 GB 6.7 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 24% ▕████ ▏ 267 MB/1.1 GB 6.7 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 24% ▕████ ▏ 267 MB/1.1 GB 6.7 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 24% ▕████ ▏ 267 MB/1.1 GB 6.7 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 24% ▕████ ▏ 268 MB/1.1 GB 6.7 MB/s 2m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 24% ▕████ ▏ 269 MB/1.1 GB 6.7 MB/s 2m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 24% ▕████ ▏ 269 MB/1.1 GB 6.7 MB/s 2m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 24% ▕████ ▏ 269 MB/1.1 GB 6.7 MB/s 2m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 24% ▕████ ▏ 271 MB/1.1 GB 6.7 MB/s 2m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 24% ▕████ ▏ 271 MB/1.1 GB 6.7 MB/s 2m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 24% ▕████ ▏ 271 MB/1.1 GB 6.8 MB/s 2m4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 24% ▕████ ▏ 272 MB/1.1 GB 6.8 MB/s 2m4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 24% ▕████ ▏ 273 MB/1.1 GB 6.8 MB/s 2m4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 25% ▕████ ▏ 274 MB/1.1 GB 6.8 MB/s 2m4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 25% ▕████ ▏ 275 MB/1.1 GB 6.8 MB/s 2m3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 25% ▕████ ▏ 275 MB/1.1 GB 6.8 MB/s 2m3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 25% ▕████ ▏ 276 MB/1.1 GB 6.8 MB/s 2m3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 25% ▕████ ▏ 277 MB/1.1 GB 6.8 MB/s 2m3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 25% ▕████ ▏ 277 MB/1.1 GB 6.8 MB/s 2m3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 25% ▕████ ▏ 278 MB/1.1 GB 6.8 MB/s 2m3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 25% ▕████ ▏ 279 MB/1.1 GB 7.0 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 25% ▕████ ▏ 279 MB/1.1 GB 7.0 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 25% ▕████ ▏ 280 MB/1.1 GB 7.0 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 25% ▕████ ▏ 281 MB/1.1 GB 7.0 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 25% ▕████ ▏ 281 MB/1.1 GB 7.0 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 25% ▕████ ▏ 282 MB/1.1 GB 7.0 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 25% ▕████ ▏ 282 MB/1.1 GB 7.0 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 25% ▕████ ▏ 283 MB/1.1 GB 7.0 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 25% ▕████ ▏ 284 MB/1.1 GB 7.0 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 26% ▕████ ▏ 285 MB/1.1 GB 7.0 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 26% ▕████ ▏ 285 MB/1.1 GB 6.9 MB/s 2m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 26% ▕████ ▏ 285 MB/1.1 GB 6.9 MB/s 2m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 26% ▕████ ▏ 286 MB/1.1 GB 6.9 MB/s 2m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 26% ▕████ ▏ 287 MB/1.1 GB 6.9 MB/s 2m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 26% ▕████ ▏ 287 MB/1.1 GB 6.9 MB/s 2m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 26% ▕████ ▏ 288 MB/1.1 GB 6.9 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 26% ▕████ ▏ 288 MB/1.1 GB 6.9 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 26% ▕████ ▏ 289 MB/1.1 GB 6.9 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 26% ▕████ ▏ 290 MB/1.1 GB 6.9 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 26% ▕████ ▏ 291 MB/1.1 GB 6.9 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 26% ▕████ ▏ 291 MB/1.1 GB 6.8 MB/s 2m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 26% ▕████ ▏ 292 MB/1.1 GB 6.8 MB/s 2m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 26% ▕████ ▏ 293 MB/1.1 GB 6.8 MB/s 2m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 26% ▕████ ▏ 293 MB/1.1 GB 6.8 MB/s 2m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 26% ▕████ ▏ 294 MB/1.1 GB 6.8 MB/s 2m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 26% ▕████ ▏ 294 MB/1.1 GB 6.8 MB/s 2m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 27% ▕████ ▏ 296 MB/1.1 GB 6.8 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 27% ▕████ ▏ 297 MB/1.1 GB 6.8 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 27% ▕████ ▏ 297 MB/1.1 GB 6.8 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 27% ▕████ ▏ 297 MB/1.1 GB 6.8 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 27% ▕████ ▏ 298 MB/1.1 GB 6.8 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 27% ▕████ ▏ 299 MB/1.1 GB 6.8 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 27% ▕████ ▏ 299 MB/1.1 GB 6.8 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 27% ▕████ ▏ 300 MB/1.1 GB 6.8 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 27% ▕████ ▏ 301 MB/1.1 GB 6.8 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 27% ▕████ ▏ 301 MB/1.1 GB 6.8 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 27% ▕████ ▏ 302 MB/1.1 GB 6.8 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 27% ▕████ ▏ 303 MB/1.1 GB 6.8 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 27% ▕████ ▏ 303 MB/1.1 GB 6.8 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 27% ▕████ ▏ 304 MB/1.1 GB 6.8 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 27% ▕████ ▏ 304 MB/1.1 GB 6.8 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 27% ▕████ ▏ 305 MB/1.1 GB 6.8 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 27% ▕████ ▏ 306 MB/1.1 GB 6.8 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 27% ▕████ ▏ 306 MB/1.1 GB 6.8 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 27% ▕████ ▏ 306 MB/1.1 GB 6.8 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 28% ▕████ ▏ 307 MB/1.1 GB 6.8 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 28% ▕████ ▏ 308 MB/1.1 GB 6.8 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 28% ▕████ ▏ 308 MB/1.1 GB 6.8 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 28% ▕████ ▏ 309 MB/1.1 GB 6.8 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 28% ▕████ ▏ 309 MB/1.1 GB 6.8 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 28% ▕█████ ▏ 311 MB/1.1 GB 6.8 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 28% ▕█████ ▏ 311 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 28% ▕█████ ▏ 312 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 28% ▕█████ ▏ 312 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 28% ▕█████ ▏ 313 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 28% ▕█████ ▏ 313 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 28% ▕█████ ▏ 313 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 28% ▕█████ ▏ 315 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 28% ▕█████ ▏ 315 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 28% ▕█████ ▏ 316 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 28% ▕█████ ▏ 317 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 28% ▕█████ ▏ 317 MB/1.1 GB 6.7 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 28% ▕█████ ▏ 317 MB/1.1 GB 6.7 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 28% ▕█████ ▏ 318 MB/1.1 GB 6.7 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 28% ▕█████ ▏ 318 MB/1.1 GB 6.7 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 29% ▕█████ ▏ 320 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 29% ▕█████ ▏ 321 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 29% ▕█████ ▏ 321 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 29% ▕█████ ▏ 322 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 29% ▕█████ ▏ 322 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 29% ▕█████ ▏ 323 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 29% ▕█████ ▏ 324 MB/1.1 GB 6.6 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 29% ▕█████ ▏ 325 MB/1.1 GB 6.6 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 29% ▕█████ ▏ 325 MB/1.1 GB 6.6 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 29% ▕█████ ▏ 326 MB/1.1 GB 6.6 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 29% ▕█████ ▏ 327 MB/1.1 GB 6.6 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 29% ▕█████ ▏ 327 MB/1.1 GB 6.6 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 29% ▕█████ ▏ 328 MB/1.1 GB 6.6 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 29% ▕█████ ▏ 329 MB/1.1 GB 6.6 MB/s 1m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 30% ▕█████ ▏ 329 MB/1.1 GB 6.6 MB/s 1m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 30% ▕█████ ▏ 331 MB/1.1 GB 6.6 MB/s 1m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 30% ▕█████ ▏ 331 MB/1.1 GB 6.7 MB/s 1m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 30% ▕█████ ▏ 332 MB/1.1 GB 6.7 MB/s 1m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 30% ▕█████ ▏ 333 MB/1.1 GB 6.7 MB/s 1m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 30% ▕█████ ▏ 334 MB/1.1 GB 6.7 MB/s 1m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 30% ▕█████ ▏ 334 MB/1.1 GB 6.7 MB/s 1m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 30% ▕█████ ▏ 335 MB/1.1 GB 6.7 MB/s 1m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 30% ▕█████ ▏ 336 MB/1.1 GB 6.7 MB/s 1m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 30% ▕█████ ▏ 336 MB/1.1 GB 6.7 MB/s 1m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 30% ▕█████ ▏ 337 MB/1.1 GB 6.7 MB/s 1m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 30% ▕█████ ▏ 338 MB/1.1 GB 6.7 MB/s 1m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 30% ▕█████ ▏ 339 MB/1.1 GB 6.7 MB/s 1m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 30% ▕█████ ▏ 340 MB/1.1 GB 6.8 MB/s 1m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 31% ▕█████ ▏ 341 MB/1.1 GB 6.8 MB/s 1m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 31% ▕█████ ▏ 341 MB/1.1 GB 6.8 MB/s 1m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 31% ▕█████ ▏ 342 MB/1.1 GB 6.8 MB/s 1m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 31% ▕█████ ▏ 343 MB/1.1 GB 6.8 MB/s 1m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 31% ▕█████ ▏ 343 MB/1.1 GB 6.8 MB/s 1m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 31% ▕█████ ▏ 344 MB/1.1 GB 6.8 MB/s 1m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 31% ▕█████ ▏ 345 MB/1.1 GB 6.8 MB/s 1m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 31% ▕█████ ▏ 346 MB/1.1 GB 6.8 MB/s 1m53s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 31% ▕█████ ▏ 346 MB/1.1 GB 6.8 MB/s 1m53s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 31% ▕█████ ▏ 347 MB/1.1 GB 6.9 MB/s 1m51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 31% ▕█████ ▏ 348 MB/1.1 GB 6.9 MB/s 1m51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 31% ▕█████ ▏ 349 MB/1.1 GB 6.9 MB/s 1m51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 31% ▕█████ ▏ 349 MB/1.1 GB 6.9 MB/s 1m51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 31% ▕█████ ▏ 350 MB/1.1 GB 6.9 MB/s 1m51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 31% ▕█████ ▏ 351 MB/1.1 GB 6.9 MB/s 1m50s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 31% ▕█████ ▏ 351 MB/1.1 GB 6.9 MB/s 1m50s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 32% ▕█████ ▏ 352 MB/1.1 GB 6.9 MB/s 1m50s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 32% ▕█████ ▏ 352 MB/1.1 GB 6.9 MB/s 1m50s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 32% ▕█████ ▏ 353 MB/1.1 GB 6.9 MB/s 1m50s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 32% ▕█████ ▏ 354 MB/1.1 GB 7.0 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 32% ▕█████ ▏ 355 MB/1.1 GB 7.0 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 32% ▕█████ ▏ 356 MB/1.1 GB 7.0 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 32% ▕█████ ▏ 356 MB/1.1 GB 7.0 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 32% ▕█████ ▏ 357 MB/1.1 GB 7.0 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 32% ▕█████ ▏ 357 MB/1.1 GB 7.0 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 32% ▕█████ ▏ 358 MB/1.1 GB 7.0 MB/s 1m48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 32% ▕█████ ▏ 359 MB/1.1 GB 7.0 MB/s 1m48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 32% ▕█████ ▏ 359 MB/1.1 GB 7.0 MB/s 1m48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 32% ▕█████ ▏ 359 MB/1.1 GB 7.0 MB/s 1m48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 32% ▕█████ ▏ 360 MB/1.1 GB 6.9 MB/s 1m50s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 32% ▕█████ ▏ 361 MB/1.1 GB 6.9 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 32% ▕█████ ▏ 361 MB/1.1 GB 6.9 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 32% ▕█████ ▏ 362 MB/1.1 GB 6.9 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 33% ▕█████ ▏ 363 MB/1.1 GB 6.9 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 33% ▕█████ ▏ 363 MB/1.1 GB 6.9 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 33% ▕█████ ▏ 364 MB/1.1 GB 6.9 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 33% ▕█████ ▏ 366 MB/1.1 GB 6.9 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 33% ▕█████ ▏ 366 MB/1.1 GB 6.9 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 33% ▕█████ ▏ 366 MB/1.1 GB 6.9 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 33% ▕█████ ▏ 368 MB/1.1 GB 7.0 MB/s 1m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 33% ▕█████ ▏ 368 MB/1.1 GB 7.0 MB/s 1m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 33% ▕█████ ▏ 369 MB/1.1 GB 7.0 MB/s 1m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 33% ▕█████ ▏ 370 MB/1.1 GB 7.0 MB/s 1m45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 33% ▕█████ ▏ 371 MB/1.1 GB 7.0 MB/s 1m45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 33% ▕█████ ▏ 372 MB/1.1 GB 7.0 MB/s 1m45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 33% ▕██████ ▏ 372 MB/1.1 GB 7.0 MB/s 1m45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 33% ▕██████ ▏ 373 MB/1.1 GB 7.0 MB/s 1m45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 34% ▕██████ ▏ 374 MB/1.1 GB 7.0 MB/s 1m45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 34% ▕██████ ▏ 375 MB/1.1 GB 7.0 MB/s 1m45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 34% ▕██████ ▏ 376 MB/1.1 GB 7.0 MB/s 1m45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 34% ▕██████ ▏ 376 MB/1.1 GB 7.2 MB/s 1m42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 34% ▕██████ ▏ 377 MB/1.1 GB 7.2 MB/s 1m42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 34% ▕██████ ▏ 378 MB/1.1 GB 7.2 MB/s 1m42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 34% ▕██████ ▏ 378 MB/1.1 GB 7.2 MB/s 1m42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 34% ▕██████ ▏ 380 MB/1.1 GB 7.2 MB/s 1m42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 34% ▕██████ ▏ 380 MB/1.1 GB 7.2 MB/s 1m42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 34% ▕██████ ▏ 381 MB/1.1 GB 7.2 MB/s 1m42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 34% ▕██████ ▏ 381 MB/1.1 GB 7.2 MB/s 1m42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 34% ▕██████ ▏ 381 MB/1.1 GB 7.2 MB/s 1m42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 34% ▕██████ ▏ 382 MB/1.1 GB 7.2 MB/s 1m42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 34% ▕██████ ▏ 383 MB/1.1 GB 7.4 MB/s 1m39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 34% ▕██████ ▏ 384 MB/1.1 GB 7.4 MB/s 1m39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 35% ▕██████ ▏ 385 MB/1.1 GB 7.4 MB/s 1m39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 35% ▕██████ ▏ 386 MB/1.1 GB 7.4 MB/s 1m39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 35% ▕██████ ▏ 386 MB/1.1 GB 7.4 MB/s 1m39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 35% ▕██████ ▏ 387 MB/1.1 GB 7.4 MB/s 1m39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 35% ▕██████ ▏ 388 MB/1.1 GB 7.4 MB/s 1m39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 35% ▕██████ ▏ 388 MB/1.1 GB 7.4 MB/s 1m39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 35% ▕██████ ▏ 390 MB/1.1 GB 7.4 MB/s 1m38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 35% ▕██████ ▏ 391 MB/1.1 GB 7.4 MB/s 1m38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 35% ▕██████ ▏ 391 MB/1.1 GB 7.4 MB/s 1m38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 35% ▕██████ ▏ 392 MB/1.1 GB 7.4 MB/s 1m38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 35% ▕██████ ▏ 393 MB/1.1 GB 7.4 MB/s 1m38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 35% ▕██████ ▏ 394 MB/1.1 GB 7.4 MB/s 1m38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 35% ▕██████ ▏ 394 MB/1.1 GB 7.4 MB/s 1m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 35% ▕██████ ▏ 394 MB/1.1 GB 7.4 MB/s 1m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 35% ▕██████ ▏ 394 MB/1.1 GB 7.4 MB/s 1m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 35% ▕██████ ▏ 396 MB/1.1 GB 7.4 MB/s 1m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 36% ▕██████ ▏ 397 MB/1.1 GB 7.4 MB/s 1m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 36% ▕██████ ▏ 397 MB/1.1 GB 7.4 MB/s 1m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 36% ▕██████ ▏ 398 MB/1.1 GB 7.4 MB/s 1m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 36% ▕██████ ▏ 399 MB/1.1 GB 7.4 MB/s 1m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 36% ▕██████ ▏ 399 MB/1.1 GB 7.4 MB/s 1m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 36% ▕██████ ▏ 401 MB/1.1 GB 7.4 MB/s 1m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 36% ▕██████ ▏ 401 MB/1.1 GB 7.4 MB/s 1m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 36% ▕██████ ▏ 402 MB/1.1 GB 7.4 MB/s 1m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 36% ▕██████ ▏ 403 MB/1.1 GB 7.4 MB/s 1m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 36% ▕██████ ▏ 404 MB/1.1 GB 7.4 MB/s 1m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 36% ▕██████ ▏ 405 MB/1.1 GB 7.4 MB/s 1m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 36% ▕██████ ▏ 405 MB/1.1 GB 7.4 MB/s 1m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 36% ▕██████ ▏ 406 MB/1.1 GB 7.4 MB/s 1m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 36% ▕██████ ▏ 406 MB/1.1 GB 7.4 MB/s 1m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 37% ▕██████ ▏ 408 MB/1.1 GB 7.4 MB/s 1m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 37% ▕██████ ▏ 408 MB/1.1 GB 7.4 MB/s 1m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 37% ▕██████ ▏ 409 MB/1.1 GB 7.4 MB/s 1m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 37% ▕██████ ▏ 410 MB/1.1 GB 7.4 MB/s 1m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 37% ▕██████ ▏ 410 MB/1.1 GB 7.4 MB/s 1m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 37% ▕██████ ▏ 411 MB/1.1 GB 7.4 MB/s 1m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 37% ▕██████ ▏ 412 MB/1.1 GB 7.4 MB/s 1m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 37% ▕██████ ▏ 413 MB/1.1 GB 7.4 MB/s 1m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 37% ▕██████ ▏ 413 MB/1.1 GB 7.4 MB/s 1m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 37% ▕██████ ▏ 414 MB/1.1 GB 7.5 MB/s 1m34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 37% ▕██████ ▏ 414 MB/1.1 GB 7.5 MB/s 1m34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 37% ▕██████ ▏ 416 MB/1.1 GB 7.5 MB/s 1m33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 37% ▕██████ ▏ 416 MB/1.1 GB 7.5 MB/s 1m33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 37% ▕██████ ▏ 417 MB/1.1 GB 7.5 MB/s 1m33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 37% ▕██████ ▏ 418 MB/1.1 GB 7.5 MB/s 1m33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 37% ▕██████ ▏ 418 MB/1.1 GB 7.5 MB/s 1m33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 38% ▕██████ ▏ 420 MB/1.1 GB 7.5 MB/s 1m33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 38% ▕██████ ▏ 420 MB/1.1 GB 7.5 MB/s 1m33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 38% ▕██████ ▏ 421 MB/1.1 GB 7.5 MB/s 1m33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 38% ▕██████ ▏ 422 MB/1.1 GB 7.5 MB/s 1m32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 38% ▕██████ ▏ 422 MB/1.1 GB 7.5 MB/s 1m32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 38% ▕██████ ▏ 423 MB/1.1 GB 7.5 MB/s 1m32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 38% ▕██████ ▏ 424 MB/1.1 GB 7.5 MB/s 1m32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 38% ▕██████ ▏ 424 MB/1.1 GB 7.5 MB/s 1m32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 38% ▕██████ ▏ 425 MB/1.1 GB 7.5 MB/s 1m31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 38% ▕██████ ▏ 426 MB/1.1 GB 7.5 MB/s 1m31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 38% ▕██████ ▏ 426 MB/1.1 GB 7.5 MB/s 1m31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 38% ▕██████ ▏ 427 MB/1.1 GB 7.5 MB/s 1m31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 38% ▕██████ ▏ 428 MB/1.1 GB 7.5 MB/s 1m31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 38% ▕██████ ▏ 428 MB/1.1 GB 7.6 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 38% ▕██████ ▏ 429 MB/1.1 GB 7.6 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 39% ▕██████ ▏ 430 MB/1.1 GB 7.6 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 39% ▕██████ ▏ 430 MB/1.1 GB 7.6 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 39% ▕██████ ▏ 431 MB/1.1 GB 7.6 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 39% ▕██████ ▏ 432 MB/1.1 GB 7.6 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 39% ▕██████ ▏ 432 MB/1.1 GB 7.6 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 39% ▕██████ ▏ 433 MB/1.1 GB 7.6 MB/s 1m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 39% ▕███████ ▏ 434 MB/1.1 GB 7.6 MB/s 1m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 39% ▕███████ ▏ 435 MB/1.1 GB 7.6 MB/s 1m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 39% ▕███████ ▏ 436 MB/1.1 GB 7.6 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 39% ▕███████ ▏ 436 MB/1.1 GB 7.6 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 39% ▕███████ ▏ 437 MB/1.1 GB 7.6 MB/s 1m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 39% ▕███████ ▏ 438 MB/1.1 GB 7.6 MB/s 1m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 39% ▕███████ ▏ 439 MB/1.1 GB 7.6 MB/s 1m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 39% ▕███████ ▏ 439 MB/1.1 GB 7.6 MB/s 1m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 39% ▕███████ ▏ 440 MB/1.1 GB 7.6 MB/s 1m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 39% ▕███████ ▏ 441 MB/1.1 GB 7.6 MB/s 1m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 40% ▕███████ ▏ 441 MB/1.1 GB 7.6 MB/s 1m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 40% ▕███████ ▏ 442 MB/1.1 GB 7.6 MB/s 1m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 40% ▕███████ ▏ 443 MB/1.1 GB 7.4 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 40% ▕███████ ▏ 443 MB/1.1 GB 7.4 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 40% ▕███████ ▏ 444 MB/1.1 GB 7.4 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 40% ▕███████ ▏ 445 MB/1.1 GB 7.4 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 40% ▕███████ ▏ 446 MB/1.1 GB 7.4 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 40% ▕███████ ▏ 447 MB/1.1 GB 7.4 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 40% ▕███████ ▏ 447 MB/1.1 GB 7.4 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 40% ▕███████ ▏ 447 MB/1.1 GB 7.4 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 40% ▕███████ ▏ 449 MB/1.1 GB 7.4 MB/s 1m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 40% ▕███████ ▏ 450 MB/1.1 GB 7.4 MB/s 1m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 40% ▕███████ ▏ 450 MB/1.1 GB 7.4 MB/s 1m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 40% ▕███████ ▏ 451 MB/1.1 GB 7.5 MB/s 1m28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 41% ▕███████ ▏ 452 MB/1.1 GB 7.5 MB/s 1m28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 41% ▕███████ ▏ 453 MB/1.1 GB 7.5 MB/s 1m28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 41% ▕███████ ▏ 454 MB/1.1 GB 7.5 MB/s 1m28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 41% ▕███████ ▏ 455 MB/1.1 GB 7.5 MB/s 1m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 41% ▕███████ ▏ 455 MB/1.1 GB 7.5 MB/s 1m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 41% ▕███████ ▏ 456 MB/1.1 GB 7.5 MB/s 1m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 41% ▕███████ ▏ 457 MB/1.1 GB 7.5 MB/s 1m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 41% ▕███████ ▏ 457 MB/1.1 GB 7.5 MB/s 1m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 41% ▕███████ ▏ 458 MB/1.1 GB 7.5 MB/s 1m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 41% ▕███████ ▏ 459 MB/1.1 GB 7.5 MB/s 1m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 41% ▕███████ ▏ 459 MB/1.1 GB 7.5 MB/s 1m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 41% ▕███████ ▏ 460 MB/1.1 GB 7.5 MB/s 1m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 41% ▕███████ ▏ 462 MB/1.1 GB 7.5 MB/s 1m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 41% ▕███████ ▏ 462 MB/1.1 GB 7.5 MB/s 1m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 41% ▕███████ ▏ 463 MB/1.1 GB 7.5 MB/s 1m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 42% ▕███████ ▏ 464 MB/1.1 GB 7.5 MB/s 1m26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 42% ▕███████ ▏ 464 MB/1.1 GB 7.5 MB/s 1m26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 42% ▕███████ ▏ 465 MB/1.1 GB 7.5 MB/s 1m26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 42% ▕███████ ▏ 466 MB/1.1 GB 7.5 MB/s 1m26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 42% ▕███████ ▏ 467 MB/1.1 GB 7.6 MB/s 1m25s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 42% ▕███████ ▏ 467 MB/1.1 GB 7.6 MB/s 1m25s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 42% ▕███████ ▏ 468 MB/1.1 GB 7.6 MB/s 1m25s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 42% ▕███████ ▏ 469 MB/1.1 GB 7.6 MB/s 1m25s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 42% ▕███████ ▏ 470 MB/1.1 GB 7.6 MB/s 1m24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 42% ▕███████ ▏ 471 MB/1.1 GB 7.6 MB/s 1m24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 42% ▕███████ ▏ 471 MB/1.1 GB 7.6 MB/s 1m24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 42% ▕███████ ▏ 472 MB/1.1 GB 7.6 MB/s 1m24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 42% ▕███████ ▏ 473 MB/1.1 GB 7.6 MB/s 1m24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 42% ▕███████ ▏ 473 MB/1.1 GB 7.6 MB/s 1m24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 43% ▕███████ ▏ 475 MB/1.1 GB 7.6 MB/s 1m24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 43% ▕███████ ▏ 475 MB/1.1 GB 7.6 MB/s 1m24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 43% ▕███████ ▏ 476 MB/1.1 GB 7.6 MB/s 1m24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 43% ▕███████ ▏ 477 MB/1.1 GB 7.6 MB/s 1m24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 43% ▕███████ ▏ 479 MB/1.1 GB 7.6 MB/s 1m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 43% ▕███████ ▏ 479 MB/1.1 GB 7.6 MB/s 1m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 43% ▕███████ ▏ 480 MB/1.1 GB 7.6 MB/s 1m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 43% ▕███████ ▏ 480 MB/1.1 GB 7.6 MB/s 1m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 43% ▕███████ ▏ 481 MB/1.1 GB 7.6 MB/s 1m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 43% ▕███████ ▏ 482 MB/1.1 GB 7.6 MB/s 1m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 43% ▕███████ ▏ 483 MB/1.1 GB 7.7 MB/s 1m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 43% ▕███████ ▏ 483 MB/1.1 GB 7.7 MB/s 1m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 43% ▕███████ ▏ 484 MB/1.1 GB 7.7 MB/s 1m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 43% ▕███████ ▏ 485 MB/1.1 GB 7.7 MB/s 1m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 44% ▕███████ ▏ 486 MB/1.1 GB 7.7 MB/s 1m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 44% ▕███████ ▏ 487 MB/1.1 GB 7.7 MB/s 1m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 44% ▕███████ ▏ 488 MB/1.1 GB 7.7 MB/s 1m21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 44% ▕███████ ▏ 488 MB/1.1 GB 7.7 MB/s 1m21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 44% ▕███████ ▏ 490 MB/1.1 GB 7.7 MB/s 1m21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 44% ▕███████ ▏ 491 MB/1.1 GB 7.7 MB/s 1m21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 44% ▕███████ ▏ 491 MB/1.1 GB 7.7 MB/s 1m21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 44% ▕███████ ▏ 492 MB/1.1 GB 7.8 MB/s 1m20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 44% ▕███████ ▏ 492 MB/1.1 GB 7.8 MB/s 1m20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 44% ▕███████ ▏ 494 MB/1.1 GB 7.8 MB/s 1m20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 44% ▕███████ ▏ 494 MB/1.1 GB 7.8 MB/s 1m20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 44% ▕███████ ▏ 495 MB/1.1 GB 7.8 MB/s 1m19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 44% ▕███████ ▏ 496 MB/1.1 GB 7.8 MB/s 1m19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 44% ▕████████ ▏ 496 MB/1.1 GB 7.8 MB/s 1m19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 45% ▕████████ ▏ 497 MB/1.1 GB 7.8 MB/s 1m19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 45% ▕████████ ▏ 498 MB/1.1 GB 7.8 MB/s 1m19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 45% ▕████████ ▏ 499 MB/1.1 GB 7.8 MB/s 1m19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 45% ▕████████ ▏ 500 MB/1.1 GB 7.9 MB/s 1m18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 45% ▕████████ ▏ 500 MB/1.1 GB 7.9 MB/s 1m18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 45% ▕████████ ▏ 501 MB/1.1 GB 7.9 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 45% ▕████████ ▏ 502 MB/1.1 GB 7.9 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 45% ▕████████ ▏ 503 MB/1.1 GB 7.9 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 45% ▕████████ ▏ 504 MB/1.1 GB 7.9 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 45% ▕████████ ▏ 504 MB/1.1 GB 7.9 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 45% ▕████████ ▏ 504 MB/1.1 GB 7.9 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 45% ▕████████ ▏ 505 MB/1.1 GB 7.9 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 45% ▕████████ ▏ 506 MB/1.1 GB 7.9 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 45% ▕████████ ▏ 506 MB/1.1 GB 7.8 MB/s 1m18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 45% ▕████████ ▏ 507 MB/1.1 GB 7.8 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 46% ▕████████ ▏ 508 MB/1.1 GB 7.8 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 46% ▕████████ ▏ 508 MB/1.1 GB 7.8 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 46% ▕████████ ▏ 509 MB/1.1 GB 7.8 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 46% ▕████████ ▏ 510 MB/1.1 GB 7.8 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 46% ▕████████ ▏ 511 MB/1.1 GB 7.8 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 46% ▕████████ ▏ 512 MB/1.1 GB 7.8 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 46% ▕████████ ▏ 513 MB/1.1 GB 7.8 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 46% ▕████████ ▏ 513 MB/1.1 GB 7.8 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 46% ▕████████ ▏ 514 MB/1.1 GB 8.0 MB/s 1m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 46% ▕████████ ▏ 515 MB/1.1 GB 8.0 MB/s 1m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 46% ▕████████ ▏ 516 MB/1.1 GB 8.0 MB/s 1m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 46% ▕████████ ▏ 516 MB/1.1 GB 8.0 MB/s 1m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 46% ▕████████ ▏ 518 MB/1.1 GB 8.0 MB/s 1m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 46% ▕████████ ▏ 518 MB/1.1 GB 8.0 MB/s 1m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 46% ▕████████ ▏ 519 MB/1.1 GB 8.0 MB/s 1m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 47% ▕████████ ▏ 520 MB/1.1 GB 8.0 MB/s 1m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 47% ▕████████ ▏ 521 MB/1.1 GB 8.0 MB/s 1m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 47% ▕████████ ▏ 521 MB/1.1 GB 8.0 MB/s 1m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 47% ▕████████ ▏ 522 MB/1.1 GB 7.9 MB/s 1m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 47% ▕████████ ▏ 522 MB/1.1 GB 7.9 MB/s 1m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 47% ▕████████ ▏ 523 MB/1.1 GB 7.9 MB/s 1m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 47% ▕████████ ▏ 524 MB/1.1 GB 7.9 MB/s 1m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 47% ▕████████ ▏ 524 MB/1.1 GB 7.9 MB/s 1m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 47% ▕████████ ▏ 526 MB/1.1 GB 7.9 MB/s 1m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 47% ▕████████ ▏ 527 MB/1.1 GB 7.9 MB/s 1m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 47% ▕████████ ▏ 527 MB/1.1 GB 7.9 MB/s 1m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 47% ▕████████ ▏ 528 MB/1.1 GB 7.9 MB/s 1m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 47% ▕████████ ▏ 529 MB/1.1 GB 7.9 MB/s 1m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 47% ▕████████ ▏ 530 MB/1.1 GB 7.9 MB/s 1m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 48% ▕████████ ▏ 531 MB/1.1 GB 8.0 MB/s 1m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 48% ▕████████ ▏ 532 MB/1.1 GB 8.0 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 48% ▕████████ ▏ 532 MB/1.1 GB 8.0 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 48% ▕████████ ▏ 533 MB/1.1 GB 8.0 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 48% ▕████████ ▏ 534 MB/1.1 GB 8.0 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 48% ▕████████ ▏ 534 MB/1.1 GB 8.0 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 48% ▕████████ ▏ 534 MB/1.1 GB 8.0 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 48% ▕████████ ▏ 536 MB/1.1 GB 8.0 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 48% ▕████████ ▏ 536 MB/1.1 GB 8.0 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 48% ▕████████ ▏ 536 MB/1.1 GB 8.0 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 48% ▕████████ ▏ 538 MB/1.1 GB 7.9 MB/s 1m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 48% ▕████████ ▏ 539 MB/1.1 GB 7.9 MB/s 1m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 48% ▕████████ ▏ 539 MB/1.1 GB 7.9 MB/s 1m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 48% ▕████████ ▏ 540 MB/1.1 GB 7.9 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 48% ▕████████ ▏ 541 MB/1.1 GB 7.9 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 48% ▕████████ ▏ 541 MB/1.1 GB 7.9 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 49% ▕████████ ▏ 543 MB/1.1 GB 7.9 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 49% ▕████████ ▏ 543 MB/1.1 GB 7.9 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 49% ▕████████ ▏ 544 MB/1.1 GB 7.9 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 49% ▕████████ ▏ 545 MB/1.1 GB 7.9 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 49% ▕████████ ▏ 546 MB/1.1 GB 7.9 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 49% ▕████████ ▏ 547 MB/1.1 GB 7.9 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 49% ▕████████ ▏ 548 MB/1.1 GB 7.9 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 49% ▕████████ ▏ 548 MB/1.1 GB 7.9 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 49% ▕████████ ▏ 549 MB/1.1 GB 7.9 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 49% ▕████████ ▏ 550 MB/1.1 GB 7.9 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 49% ▕████████ ▏ 550 MB/1.1 GB 7.9 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 49% ▕████████ ▏ 551 MB/1.1 GB 7.9 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 49% ▕████████ ▏ 552 MB/1.1 GB 7.9 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 49% ▕████████ ▏ 552 MB/1.1 GB 7.9 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 50% ▕████████ ▏ 553 MB/1.1 GB 7.8 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 50% ▕████████ ▏ 555 MB/1.1 GB 7.8 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 50% ▕████████ ▏ 555 MB/1.1 GB 7.8 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 50% ▕████████ ▏ 556 MB/1.1 GB 7.8 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 50% ▕████████ ▏ 557 MB/1.1 GB 7.8 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 50% ▕████████ ▏ 557 MB/1.1 GB 7.8 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 50% ▕████████ ▏ 558 MB/1.1 GB 7.8 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 50% ▕█████████ ▏ 559 MB/1.1 GB 7.8 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 50% ▕█████████ ▏ 559 MB/1.1 GB 7.8 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 50% ▕█████████ ▏ 560 MB/1.1 GB 7.8 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 50% ▕█████████ ▏ 561 MB/1.1 GB 7.7 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 50% ▕█████████ ▏ 561 MB/1.1 GB 7.7 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 50% ▕█████████ ▏ 561 MB/1.1 GB 7.7 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 50% ▕█████████ ▏ 562 MB/1.1 GB 7.7 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 50% ▕█████████ ▏ 562 MB/1.1 GB 7.7 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 51% ▕█████████ ▏ 564 MB/1.1 GB 7.7 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 51% ▕█████████ ▏ 565 MB/1.1 GB 7.7 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 51% ▕█████████ ▏ 565 MB/1.1 GB 7.7 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 51% ▕█████████ ▏ 566 MB/1.1 GB 7.7 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 51% ▕█████████ ▏ 567 MB/1.1 GB 7.7 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 51% ▕█████████ ▏ 568 MB/1.1 GB 7.7 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 51% ▕█████████ ▏ 569 MB/1.1 GB 7.7 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 51% ▕█████████ ▏ 569 MB/1.1 GB 7.7 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 51% ▕█████████ ▏ 570 MB/1.1 GB 7.7 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 51% ▕█████████ ▏ 570 MB/1.1 GB 7.7 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 51% ▕█████████ ▏ 571 MB/1.1 GB 7.7 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 51% ▕█████████ ▏ 572 MB/1.1 GB 7.7 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 51% ▕█████████ ▏ 573 MB/1.1 GB 7.7 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 51% ▕█████████ ▏ 574 MB/1.1 GB 7.7 MB/s 1m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 51% ▕█████████ ▏ 574 MB/1.1 GB 7.7 MB/s 1m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 52% ▕█████████ ▏ 575 MB/1.1 GB 7.7 MB/s 1m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 52% ▕█████████ ▏ 576 MB/1.1 GB 7.7 MB/s 1m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 52% ▕█████████ ▏ 577 MB/1.1 GB 7.7 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 52% ▕█████████ ▏ 578 MB/1.1 GB 7.7 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 52% ▕█████████ ▏ 578 MB/1.1 GB 7.7 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 52% ▕█████████ ▏ 579 MB/1.1 GB 7.7 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 52% ▕█████████ ▏ 581 MB/1.1 GB 7.7 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 52% ▕█████████ ▏ 582 MB/1.1 GB 7.7 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 52% ▕█████████ ▏ 582 MB/1.1 GB 7.7 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 52% ▕█████████ ▏ 582 MB/1.1 GB 7.7 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 52% ▕█████████ ▏ 584 MB/1.1 GB 7.7 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 52% ▕█████████ ▏ 584 MB/1.1 GB 7.7 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 52% ▕█████████ ▏ 585 MB/1.1 GB 7.7 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 52% ▕█████████ ▏ 585 MB/1.1 GB 7.7 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 52% ▕█████████ ▏ 585 MB/1.1 GB 7.7 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 52% ▕█████████ ▏ 586 MB/1.1 GB 7.7 MB/s 1m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 53% ▕█████████ ▏ 587 MB/1.1 GB 7.7 MB/s 1m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 53% ▕█████████ ▏ 587 MB/1.1 GB 7.7 MB/s 1m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 53% ▕█████████ ▏ 588 MB/1.1 GB 7.7 MB/s 1m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 53% ▕█████████ ▏ 589 MB/1.1 GB 7.7 MB/s 1m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 53% ▕█████████ ▏ 589 MB/1.1 GB 7.7 MB/s 1m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 53% ▕█████████ ▏ 590 MB/1.1 GB 7.5 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 53% ▕█████████ ▏ 590 MB/1.1 GB 7.5 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 53% ▕█████████ ▏ 592 MB/1.1 GB 7.5 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 53% ▕█████████ ▏ 593 MB/1.1 GB 7.5 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 53% ▕█████████ ▏ 594 MB/1.1 GB 7.5 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 53% ▕█████████ ▏ 594 MB/1.1 GB 7.5 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 53% ▕█████████ ▏ 595 MB/1.1 GB 7.5 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 53% ▕█████████ ▏ 596 MB/1.1 GB 7.5 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 53% ▕█████████ ▏ 597 MB/1.1 GB 7.5 MB/s 1m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 54% ▕█████████ ▏ 598 MB/1.1 GB 7.5 MB/s 1m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 54% ▕█████████ ▏ 599 MB/1.1 GB 7.6 MB/s 1m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 54% ▕█████████ ▏ 599 MB/1.1 GB 7.6 MB/s 1m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 54% ▕█████████ ▏ 600 MB/1.1 GB 7.6 MB/s 1m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 54% ▕█████████ ▏ 600 MB/1.1 GB 7.6 MB/s 1m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 54% ▕█████████ ▏ 601 MB/1.1 GB 7.6 MB/s 1m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 54% ▕█████████ ▏ 602 MB/1.1 GB 7.6 MB/s 1m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 54% ▕█████████ ▏ 603 MB/1.1 GB 7.6 MB/s 1m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 54% ▕█████████ ▏ 604 MB/1.1 GB 7.6 MB/s 1m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 54% ▕█████████ ▏ 604 MB/1.1 GB 7.6 MB/s 1m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 54% ▕█████████ ▏ 605 MB/1.1 GB 7.6 MB/s 1m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 54% ▕█████████ ▏ 606 MB/1.1 GB 7.6 MB/s 1m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 54% ▕█████████ ▏ 607 MB/1.1 GB 7.6 MB/s 1m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 54% ▕█████████ ▏ 608 MB/1.1 GB 7.6 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 54% ▕█████████ ▏ 608 MB/1.1 GB 7.6 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 55% ▕█████████ ▏ 609 MB/1.1 GB 7.6 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 55% ▕█████████ ▏ 609 MB/1.1 GB 7.6 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 55% ▕█████████ ▏ 610 MB/1.1 GB 7.6 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 55% ▕█████████ ▏ 610 MB/1.1 GB 7.6 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 55% ▕█████████ ▏ 611 MB/1.1 GB 7.6 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 55% ▕█████████ ▏ 612 MB/1.1 GB 7.6 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 55% ▕█████████ ▏ 613 MB/1.1 GB 7.6 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 55% ▕█████████ ▏ 614 MB/1.1 GB 7.5 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 55% ▕█████████ ▏ 614 MB/1.1 GB 7.5 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 55% ▕█████████ ▏ 615 MB/1.1 GB 7.5 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 55% ▕█████████ ▏ 616 MB/1.1 GB 7.5 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 55% ▕█████████ ▏ 617 MB/1.1 GB 7.5 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 55% ▕█████████ ▏ 618 MB/1.1 GB 7.5 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 55% ▕█████████ ▏ 618 MB/1.1 GB 7.5 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 55% ▕█████████ ▏ 618 MB/1.1 GB 7.5 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 56% ▕█████████ ▏ 620 MB/1.1 GB 7.5 MB/s 1m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 56% ▕██████████ ▏ 621 MB/1.1 GB 7.5 MB/s 1m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 56% ▕██████████ ▏ 621 MB/1.1 GB 7.5 MB/s 1m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 56% ▕██████████ ▏ 622 MB/1.1 GB 7.5 MB/s 1m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 56% ▕██████████ ▏ 623 MB/1.1 GB 7.5 MB/s 1m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 56% ▕██████████ ▏ 624 MB/1.1 GB 7.5 MB/s 1m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 56% ▕██████████ ▏ 625 MB/1.1 GB 7.5 MB/s 1m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 56% ▕██████████ ▏ 625 MB/1.1 GB 7.5 MB/s 1m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 56% ▕██████████ ▏ 625 MB/1.1 GB 7.5 MB/s 1m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 56% ▕██████████ ▏ 626 MB/1.1 GB 7.5 MB/s 1m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 56% ▕██████████ ▏ 628 MB/1.1 GB 7.5 MB/s 1m4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 56% ▕██████████ ▏ 628 MB/1.1 GB 7.5 MB/s 1m4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 56% ▕██████████ ▏ 628 MB/1.1 GB 7.5 MB/s 1m4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 56% ▕██████████ ▏ 630 MB/1.1 GB 7.5 MB/s 1m4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 56% ▕██████████ ▏ 630 MB/1.1 GB 7.5 MB/s 1m4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 57% ▕██████████ ▏ 631 MB/1.1 GB 7.5 MB/s 1m4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 57% ▕██████████ ▏ 632 MB/1.1 GB 7.5 MB/s 1m4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 57% ▕██████████ ▏ 633 MB/1.1 GB 7.5 MB/s 1m4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 57% ▕██████████ ▏ 633 MB/1.1 GB 7.5 MB/s 1m4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 57% ▕██████████ ▏ 635 MB/1.1 GB 7.5 MB/s 1m3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 57% ▕██████████ ▏ 635 MB/1.1 GB 7.5 MB/s 1m3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 57% ▕██████████ ▏ 636 MB/1.1 GB 7.5 MB/s 1m3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 57% ▕██████████ ▏ 637 MB/1.1 GB 7.6 MB/s 1m3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 57% ▕██████████ ▏ 637 MB/1.1 GB 7.6 MB/s 1m2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 57% ▕██████████ ▏ 639 MB/1.1 GB 7.6 MB/s 1m2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 57% ▕██████████ ▏ 639 MB/1.1 GB 7.6 MB/s 1m2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 57% ▕██████████ ▏ 640 MB/1.1 GB 7.6 MB/s 1m2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 57% ▕██████████ ▏ 640 MB/1.1 GB 7.6 MB/s 1m2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 57% ▕██████████ ▏ 641 MB/1.1 GB 7.6 MB/s 1m2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 57% ▕██████████ ▏ 642 MB/1.1 GB 7.6 MB/s 1m2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 58% ▕██████████ ▏ 643 MB/1.1 GB 7.6 MB/s 1m2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 58% ▕██████████ ▏ 644 MB/1.1 GB 7.6 MB/s 1m2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 58% ▕██████████ ▏ 644 MB/1.1 GB 7.6 MB/s 1m2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 58% ▕██████████ ▏ 645 MB/1.1 GB 7.7 MB/s 1m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 58% ▕██████████ ▏ 646 MB/1.1 GB 7.7 MB/s 1m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 58% ▕██████████ ▏ 646 MB/1.1 GB 7.7 MB/s 1m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 58% ▕██████████ ▏ 648 MB/1.1 GB 7.7 MB/s 1m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 58% ▕██████████ ▏ 648 MB/1.1 GB 7.7 MB/s 1m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 58% ▕██████████ ▏ 648 MB/1.1 GB 7.7 MB/s 1m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 58% ▕██████████ ▏ 649 MB/1.1 GB 7.7 MB/s 1m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 58% ▕██████████ ▏ 650 MB/1.1 GB 7.7 MB/s 1m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 58% ▕██████████ ▏ 650 MB/1.1 GB 7.7 MB/s 1m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 58% ▕██████████ ▏ 651 MB/1.1 GB 7.7 MB/s 1m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 58% ▕██████████ ▏ 653 MB/1.1 GB 7.6 MB/s 1m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 58% ▕██████████ ▏ 653 MB/1.1 GB 7.6 MB/s 1m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 59% ▕██████████ ▏ 654 MB/1.1 GB 7.6 MB/s 1m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 59% ▕██████████ ▏ 655 MB/1.1 GB 7.6 MB/s 1m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 59% ▕██████████ ▏ 656 MB/1.1 GB 7.6 MB/s 1m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 59% ▕██████████ ▏ 657 MB/1.1 GB 7.6 MB/s 1m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 59% ▕██████████ ▏ 657 MB/1.1 GB 7.6 MB/s 1m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 59% ▕██████████ ▏ 658 MB/1.1 GB 7.6 MB/s 1m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 59% ▕██████████ ▏ 659 MB/1.1 GB 7.6 MB/s 1m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 59% ▕██████████ ▏ 659 MB/1.1 GB 7.6 MB/s 1m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 59% ▕██████████ ▏ 660 MB/1.1 GB 7.8 MB/s 58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 59% ▕██████████ ▏ 661 MB/1.1 GB 7.8 MB/s 58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 59% ▕██████████ ▏ 662 MB/1.1 GB 7.8 MB/s 58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 59% ▕██████████ ▏ 663 MB/1.1 GB 7.8 MB/s 57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 59% ▕██████████ ▏ 664 MB/1.1 GB 7.8 MB/s 57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 59% ▕██████████ ▏ 664 MB/1.1 GB 7.8 MB/s 57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 60% ▕██████████ ▏ 665 MB/1.1 GB 7.8 MB/s 57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 60% ▕██████████ ▏ 666 MB/1.1 GB 7.8 MB/s 57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 60% ▕██████████ ▏ 667 MB/1.1 GB 7.8 MB/s 57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 60% ▕██████████ ▏ 668 MB/1.1 GB 7.8 MB/s 57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 60% ▕██████████ ▏ 668 MB/1.1 GB 7.7 MB/s 58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 60% ▕██████████ ▏ 669 MB/1.1 GB 7.7 MB/s 58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 60% ▕██████████ ▏ 669 MB/1.1 GB 7.7 MB/s 58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 60% ▕██████████ ▏ 671 MB/1.1 GB 7.7 MB/s 58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 60% ▕██████████ ▏ 672 MB/1.1 GB 7.7 MB/s 58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 60% ▕██████████ ▏ 672 MB/1.1 GB 7.7 MB/s 57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 60% ▕██████████ ▏ 673 MB/1.1 GB 7.7 MB/s 57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 60% ▕██████████ ▏ 674 MB/1.1 GB 7.7 MB/s 57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 60% ▕██████████ ▏ 674 MB/1.1 GB 7.7 MB/s 57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 60% ▕██████████ ▏ 675 MB/1.1 GB 7.7 MB/s 57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 61% ▕██████████ ▏ 676 MB/1.1 GB 7.8 MB/s 56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 61% ▕██████████ ▏ 676 MB/1.1 GB 7.8 MB/s 56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 61% ▕██████████ ▏ 677 MB/1.1 GB 7.8 MB/s 56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 61% ▕██████████ ▏ 678 MB/1.1 GB 7.8 MB/s 56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 61% ▕██████████ ▏ 678 MB/1.1 GB 7.8 MB/s 56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 61% ▕██████████ ▏ 679 MB/1.1 GB 7.8 MB/s 56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 61% ▕██████████ ▏ 680 MB/1.1 GB 7.8 MB/s 56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 61% ▕██████████ ▏ 680 MB/1.1 GB 7.8 MB/s 56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 61% ▕██████████ ▏ 681 MB/1.1 GB 7.8 MB/s 56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 61% ▕███████████ ▏ 683 MB/1.1 GB 7.8 MB/s 55s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 61% ▕███████████ ▏ 683 MB/1.1 GB 7.8 MB/s 55s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 61% ▕███████████ ▏ 684 MB/1.1 GB 7.8 MB/s 55s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 61% ▕███████████ ▏ 684 MB/1.1 GB 7.8 MB/s 55s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 61% ▕███████████ ▏ 684 MB/1.1 GB 7.8 MB/s 55s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 61% ▕███████████ ▏ 687 MB/1.1 GB 7.8 MB/s 55s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 62% ▕███████████ ▏ 688 MB/1.1 GB 7.8 MB/s 54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 62% ▕███████████ ▏ 688 MB/1.1 GB 7.8 MB/s 54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 62% ▕███████████ ▏ 689 MB/1.1 GB 7.8 MB/s 54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 62% ▕███████████ ▏ 690 MB/1.1 GB 7.8 MB/s 54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 62% ▕███████████ ▏ 691 MB/1.1 GB 7.8 MB/s 54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 62% ▕███████████ ▏ 692 MB/1.1 GB 7.8 MB/s 54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 62% ▕███████████ ▏ 692 MB/1.1 GB 7.9 MB/s 53s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 62% ▕███████████ ▏ 693 MB/1.1 GB 7.9 MB/s 53s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 62% ▕███████████ ▏ 694 MB/1.1 GB 7.9 MB/s 53s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 62% ▕███████████ ▏ 695 MB/1.1 GB 7.9 MB/s 53s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 62% ▕███████████ ▏ 695 MB/1.1 GB 7.9 MB/s 53s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 62% ▕███████████ ▏ 695 MB/1.1 GB 7.9 MB/s 53s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 62% ▕███████████ ▏ 697 MB/1.1 GB 7.9 MB/s 53s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 62% ▕███████████ ▏ 697 MB/1.1 GB 7.9 MB/s 53s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 63% ▕███████████ ▏ 698 MB/1.1 GB 7.9 MB/s 53s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 63% ▕███████████ ▏ 700 MB/1.1 GB 7.9 MB/s 53s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 63% ▕███████████ ▏ 700 MB/1.1 GB 8.0 MB/s 52s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 63% ▕███████████ ▏ 701 MB/1.1 GB 8.0 MB/s 52s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 63% ▕███████████ ▏ 702 MB/1.1 GB 8.0 MB/s 52s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 63% ▕███████████ ▏ 703 MB/1.1 GB 8.0 MB/s 52s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 63% ▕███████████ ▏ 703 MB/1.1 GB 8.0 MB/s 52s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 63% ▕███████████ ▏ 705 MB/1.1 GB 8.0 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 63% ▕███████████ ▏ 705 MB/1.1 GB 8.0 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 63% ▕███████████ ▏ 706 MB/1.1 GB 8.0 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 63% ▕███████████ ▏ 706 MB/1.1 GB 8.0 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 63% ▕███████████ ▏ 707 MB/1.1 GB 8.0 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 63% ▕███████████ ▏ 708 MB/1.1 GB 7.9 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 63% ▕███████████ ▏ 708 MB/1.1 GB 7.9 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 64% ▕███████████ ▏ 709 MB/1.1 GB 7.9 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 64% ▕███████████ ▏ 710 MB/1.1 GB 7.9 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 64% ▕███████████ ▏ 711 MB/1.1 GB 7.9 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 64% ▕███████████ ▏ 712 MB/1.1 GB 7.9 MB/s 50s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 64% ▕███████████ ▏ 712 MB/1.1 GB 7.9 MB/s 50s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 64% ▕███████████ ▏ 713 MB/1.1 GB 7.9 MB/s 50s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 64% ▕███████████ ▏ 713 MB/1.1 GB 7.9 MB/s 50s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 64% ▕███████████ ▏ 714 MB/1.1 GB 7.9 MB/s 50s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 64% ▕███████████ ▏ 715 MB/1.1 GB 7.7 MB/s 52s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 64% ▕███████████ ▏ 715 MB/1.1 GB 7.7 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 64% ▕███████████ ▏ 716 MB/1.1 GB 7.7 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 64% ▕███████████ ▏ 718 MB/1.1 GB 7.7 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 64% ▕███████████ ▏ 718 MB/1.1 GB 7.7 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 64% ▕███████████ ▏ 718 MB/1.1 GB 7.7 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 64% ▕███████████ ▏ 719 MB/1.1 GB 7.7 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 64% ▕███████████ ▏ 720 MB/1.1 GB 7.7 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 65% ▕███████████ ▏ 721 MB/1.1 GB 7.7 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 65% ▕███████████ ▏ 722 MB/1.1 GB 7.7 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 65% ▕███████████ ▏ 722 MB/1.1 GB 7.7 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 65% ▕███████████ ▏ 724 MB/1.1 GB 7.9 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 65% ▕███████████ ▏ 725 MB/1.1 GB 7.9 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 65% ▕███████████ ▏ 725 MB/1.1 GB 7.9 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 65% ▕███████████ ▏ 725 MB/1.1 GB 7.9 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 65% ▕███████████ ▏ 726 MB/1.1 GB 7.9 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 65% ▕███████████ ▏ 726 MB/1.1 GB 7.9 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 65% ▕███████████ ▏ 727 MB/1.1 GB 7.9 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 65% ▕███████████ ▏ 728 MB/1.1 GB 7.9 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 65% ▕███████████ ▏ 729 MB/1.1 GB 7.9 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 65% ▕███████████ ▏ 730 MB/1.1 GB 7.9 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 65% ▕███████████ ▏ 730 MB/1.1 GB 7.8 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 65% ▕███████████ ▏ 731 MB/1.1 GB 7.8 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 66% ▕███████████ ▏ 732 MB/1.1 GB 7.8 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 66% ▕███████████ ▏ 733 MB/1.1 GB 7.8 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 66% ▕███████████ ▏ 734 MB/1.1 GB 7.8 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 66% ▕███████████ ▏ 734 MB/1.1 GB 7.8 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 66% ▕███████████ ▏ 735 MB/1.1 GB 7.8 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 66% ▕███████████ ▏ 736 MB/1.1 GB 7.8 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 66% ▕███████████ ▏ 736 MB/1.1 GB 7.8 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 66% ▕███████████ ▏ 737 MB/1.1 GB 7.8 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 66% ▕███████████ ▏ 737 MB/1.1 GB 7.7 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 66% ▕███████████ ▏ 738 MB/1.1 GB 7.7 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 66% ▕███████████ ▏ 739 MB/1.1 GB 7.7 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 66% ▕███████████ ▏ 739 MB/1.1 GB 7.7 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 66% ▕███████████ ▏ 740 MB/1.1 GB 7.7 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 66% ▕███████████ ▏ 741 MB/1.1 GB 7.7 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 66% ▕███████████ ▏ 741 MB/1.1 GB 7.7 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 66% ▕███████████ ▏ 742 MB/1.1 GB 7.7 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 67% ▕███████████ ▏ 743 MB/1.1 GB 7.7 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 67% ▕███████████ ▏ 743 MB/1.1 GB 7.7 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 67% ▕███████████ ▏ 743 MB/1.1 GB 7.4 MB/s 50s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 67% ▕████████████ ▏ 745 MB/1.1 GB 7.4 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 67% ▕████████████ ▏ 745 MB/1.1 GB 7.4 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 67% ▕████████████ ▏ 746 MB/1.1 GB 7.4 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 67% ▕████████████ ▏ 747 MB/1.1 GB 7.4 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 67% ▕████████████ ▏ 747 MB/1.1 GB 7.4 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 67% ▕████████████ ▏ 748 MB/1.1 GB 7.4 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 67% ▕████████████ ▏ 749 MB/1.1 GB 7.4 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 67% ▕████████████ ▏ 750 MB/1.1 GB 7.4 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 67% ▕████████████ ▏ 750 MB/1.1 GB 7.4 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 67% ▕████████████ ▏ 751 MB/1.1 GB 7.4 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 67% ▕████████████ ▏ 751 MB/1.1 GB 7.4 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 67% ▕████████████ ▏ 753 MB/1.1 GB 7.4 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 67% ▕████████████ ▏ 754 MB/1.1 GB 7.4 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 68% ▕████████████ ▏ 754 MB/1.1 GB 7.4 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 68% ▕████████████ ▏ 754 MB/1.1 GB 7.4 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 68% ▕████████████ ▏ 755 MB/1.1 GB 7.4 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 68% ▕████████████ ▏ 756 MB/1.1 GB 7.4 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 68% ▕████████████ ▏ 756 MB/1.1 GB 7.4 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 68% ▕████████████ ▏ 757 MB/1.1 GB 7.4 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 68% ▕████████████ ▏ 758 MB/1.1 GB 7.4 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 68% ▕████████████ ▏ 759 MB/1.1 GB 7.4 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 68% ▕████████████ ▏ 759 MB/1.1 GB 7.4 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 68% ▕████████████ ▏ 761 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 68% ▕████████████ ▏ 761 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 68% ▕████████████ ▏ 762 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 68% ▕████████████ ▏ 763 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 68% ▕████████████ ▏ 764 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 68% ▕████████████ ▏ 765 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 69% ▕████████████ ▏ 765 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 69% ▕████████████ ▏ 766 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 69% ▕████████████ ▏ 767 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 69% ▕████████████ ▏ 768 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 69% ▕████████████ ▏ 769 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 69% ▕████████████ ▏ 769 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 69% ▕████████████ ▏ 770 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 69% ▕████████████ ▏ 771 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 69% ▕████████████ ▏ 771 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 69% ▕████████████ ▏ 772 MB/1.1 GB 7.4 MB/s 46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 69% ▕████████████ ▏ 773 MB/1.1 GB 7.4 MB/s 46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 69% ▕████████████ ▏ 774 MB/1.1 GB 7.4 MB/s 46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 69% ▕████████████ ▏ 775 MB/1.1 GB 7.4 MB/s 46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 69% ▕████████████ ▏ 775 MB/1.1 GB 7.4 MB/s 46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 70% ▕████████████ ▏ 777 MB/1.1 GB 7.4 MB/s 46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 70% ▕████████████ ▏ 777 MB/1.1 GB 7.4 MB/s 46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 70% ▕████████████ ▏ 777 MB/1.1 GB 7.4 MB/s 45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 70% ▕████████████ ▏ 778 MB/1.1 GB 7.4 MB/s 45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 70% ▕████████████ ▏ 778 MB/1.1 GB 7.4 MB/s 45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 70% ▕████████████ ▏ 779 MB/1.1 GB 7.4 MB/s 45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 70% ▕████████████ ▏ 780 MB/1.1 GB 7.4 MB/s 45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 70% ▕████████████ ▏ 781 MB/1.1 GB 7.4 MB/s 45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 70% ▕████████████ ▏ 781 MB/1.1 GB 7.4 MB/s 45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 70% ▕████████████ ▏ 783 MB/1.1 GB 7.4 MB/s 44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 70% ▕████████████ ▏ 783 MB/1.1 GB 7.4 MB/s 44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 70% ▕████████████ ▏ 784 MB/1.1 GB 7.4 MB/s 44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 70% ▕████████████ ▏ 785 MB/1.1 GB 7.4 MB/s 44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 70% ▕████████████ ▏ 786 MB/1.1 GB 7.4 MB/s 44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 70% ▕████████████ ▏ 787 MB/1.1 GB 7.4 MB/s 44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 71% ▕████████████ ▏ 787 MB/1.1 GB 7.4 MB/s 44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 71% ▕████████████ ▏ 788 MB/1.1 GB 7.4 MB/s 44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 71% ▕████████████ ▏ 789 MB/1.1 GB 7.4 MB/s 44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 71% ▕████████████ ▏ 790 MB/1.1 GB 7.4 MB/s 44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 71% ▕████████████ ▏ 790 MB/1.1 GB 7.4 MB/s 44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 71% ▕████████████ ▏ 791 MB/1.1 GB 7.4 MB/s 44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 71% ▕████████████ ▏ 792 MB/1.1 GB 7.4 MB/s 43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 71% ▕████████████ ▏ 792 MB/1.1 GB 7.4 MB/s 43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 71% ▕████████████ ▏ 793 MB/1.1 GB 7.4 MB/s 43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 71% ▕████████████ ▏ 794 MB/1.1 GB 7.4 MB/s 43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 71% ▕████████████ ▏ 794 MB/1.1 GB 7.4 MB/s 43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 71% ▕████████████ ▏ 796 MB/1.1 GB 7.4 MB/s 43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 71% ▕████████████ ▏ 796 MB/1.1 GB 7.4 MB/s 43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 71% ▕████████████ ▏ 797 MB/1.1 GB 7.4 MB/s 43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 71% ▕████████████ ▏ 798 MB/1.1 GB 7.5 MB/s 42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 72% ▕████████████ ▏ 799 MB/1.1 GB 7.5 MB/s 42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 72% ▕████████████ ▏ 799 MB/1.1 GB 7.5 MB/s 42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 72% ▕████████████ ▏ 800 MB/1.1 GB 7.5 MB/s 42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 72% ▕████████████ ▏ 800 MB/1.1 GB 7.5 MB/s 42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 72% ▕████████████ ▏ 801 MB/1.1 GB 7.5 MB/s 42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 72% ▕████████████ ▏ 802 MB/1.1 GB 7.5 MB/s 42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 72% ▕████████████ ▏ 803 MB/1.1 GB 7.5 MB/s 41s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 72% ▕████████████ ▏ 803 MB/1.1 GB 7.5 MB/s 41s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 72% ▕████████████ ▏ 805 MB/1.1 GB 7.5 MB/s 41s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 72% ▕████████████ ▏ 805 MB/1.1 GB 7.6 MB/s 41s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 72% ▕████████████ ▏ 806 MB/1.1 GB 7.6 MB/s 41s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 72% ▕█████████████ ▏ 807 MB/1.1 GB 7.6 MB/s 40s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 72% ▕█████████████ ▏ 807 MB/1.1 GB 7.6 MB/s 40s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 72% ▕█████████████ ▏ 808 MB/1.1 GB 7.6 MB/s 40s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 72% ▕█████████████ ▏ 809 MB/1.1 GB 7.6 MB/s 40s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 72% ▕█████████████ ▏ 809 MB/1.1 GB 7.6 MB/s 40s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 72% ▕█████████████ ▏ 809 MB/1.1 GB 7.6 MB/s 40s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 810 MB/1.1 GB 7.6 MB/s 40s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 811 MB/1.1 GB 7.6 MB/s 40s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 812 MB/1.1 GB 7.7 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 813 MB/1.1 GB 7.7 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 813 MB/1.1 GB 7.7 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 813 MB/1.1 GB 7.7 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 815 MB/1.1 GB 7.7 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 816 MB/1.1 GB 7.7 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 816 MB/1.1 GB 7.7 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 816 MB/1.1 GB 7.7 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 817 MB/1.1 GB 7.7 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 817 MB/1.1 GB 7.7 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 819 MB/1.1 GB 7.6 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 820 MB/1.1 GB 7.6 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 820 MB/1.1 GB 7.6 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 821 MB/1.1 GB 7.6 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 821 MB/1.1 GB 7.6 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 821 MB/1.1 GB 7.6 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 822 MB/1.1 GB 7.6 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 823 MB/1.1 GB 7.6 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 823 MB/1.1 GB 7.6 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 824 MB/1.1 GB 7.6 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 826 MB/1.1 GB 7.4 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 826 MB/1.1 GB 7.4 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 827 MB/1.1 GB 7.4 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 827 MB/1.1 GB 7.4 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 828 MB/1.1 GB 7.4 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 829 MB/1.1 GB 7.4 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 830 MB/1.1 GB 7.4 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 830 MB/1.1 GB 7.4 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 830 MB/1.1 GB 7.4 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 831 MB/1.1 GB 7.4 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 831 MB/1.1 GB 7.4 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 832 MB/1.1 GB 7.3 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 833 MB/1.1 GB 7.3 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 833 MB/1.1 GB 7.3 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 835 MB/1.1 GB 7.3 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 835 MB/1.1 GB 7.3 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 836 MB/1.1 GB 7.3 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 837 MB/1.1 GB 7.3 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 838 MB/1.1 GB 7.3 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 838 MB/1.1 GB 7.3 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 838 MB/1.1 GB 7.3 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 840 MB/1.1 GB 7.1 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 840 MB/1.1 GB 7.1 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 840 MB/1.1 GB 7.1 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 842 MB/1.1 GB 7.1 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 842 MB/1.1 GB 7.1 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 843 MB/1.1 GB 7.1 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 843 MB/1.1 GB 7.1 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 843 MB/1.1 GB 7.1 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 844 MB/1.1 GB 7.1 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 844 MB/1.1 GB 7.1 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 845 MB/1.1 GB 7.0 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 847 MB/1.1 GB 7.0 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 847 MB/1.1 GB 7.0 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 848 MB/1.1 GB 7.0 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 849 MB/1.1 GB 7.0 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 849 MB/1.1 GB 7.0 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 850 MB/1.1 GB 7.0 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 851 MB/1.1 GB 7.0 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 852 MB/1.1 GB 7.0 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 853 MB/1.1 GB 7.0 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 853 MB/1.1 GB 7.1 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 855 MB/1.1 GB 7.1 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 855 MB/1.1 GB 7.1 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 856 MB/1.1 GB 7.1 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 857 MB/1.1 GB 7.1 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 857 MB/1.1 GB 7.1 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 857 MB/1.1 GB 7.1 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 858 MB/1.1 GB 7.1 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 859 MB/1.1 GB 7.1 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 861 MB/1.1 GB 7.1 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 861 MB/1.1 GB 7.1 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 861 MB/1.1 GB 7.1 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 863 MB/1.1 GB 7.1 MB/s 35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 863 MB/1.1 GB 7.1 MB/s 35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 864 MB/1.1 GB 7.1 MB/s 35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 865 MB/1.1 GB 7.1 MB/s 35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 78% ▕█████████████ ▏ 865 MB/1.1 GB 7.1 MB/s 35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 78% ▕█████████████ ▏ 865 MB/1.1 GB 7.1 MB/s 35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 78% ▕█████████████ ▏ 867 MB/1.1 GB 7.1 MB/s 35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 78% ▕█████████████ ▏ 868 MB/1.1 GB 7.1 MB/s 35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 78% ▕█████████████ ▏ 868 MB/1.1 GB 7.1 MB/s 35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 78% ▕█████████████ ▏ 868 MB/1.1 GB 7.0 MB/s 35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 78% ▕██████████████ ▏ 870 MB/1.1 GB 7.0 MB/s 35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 78% ▕██████████████ ▏ 870 MB/1.1 GB 7.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 78% ▕██████████████ ▏ 871 MB/1.1 GB 7.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 78% ▕██████████████ ▏ 872 MB/1.1 GB 7.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 78% ▕██████████████ ▏ 872 MB/1.1 GB 7.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 78% ▕██████████████ ▏ 873 MB/1.1 GB 7.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 78% ▕██████████████ ▏ 874 MB/1.1 GB 7.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 78% ▕██████████████ ▏ 875 MB/1.1 GB 7.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 78% ▕██████████████ ▏ 875 MB/1.1 GB 7.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 78% ▕██████████████ ▏ 876 MB/1.1 GB 7.1 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 78% ▕██████████████ ▏ 876 MB/1.1 GB 7.1 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 877 MB/1.1 GB 7.1 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 878 MB/1.1 GB 7.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 879 MB/1.1 GB 7.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 880 MB/1.1 GB 7.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 880 MB/1.1 GB 7.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 880 MB/1.1 GB 7.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 881 MB/1.1 GB 7.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 882 MB/1.1 GB 7.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 882 MB/1.1 GB 7.0 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 883 MB/1.1 GB 7.0 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 883 MB/1.1 GB 7.0 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 884 MB/1.1 GB 7.0 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 885 MB/1.1 GB 7.0 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 885 MB/1.1 GB 7.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 885 MB/1.1 GB 7.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 885 MB/1.1 GB 7.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 886 MB/1.1 GB 7.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 887 MB/1.1 GB 7.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 888 MB/1.1 GB 7.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 889 MB/1.1 GB 7.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 889 MB/1.1 GB 7.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 890 MB/1.1 GB 7.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 891 MB/1.1 GB 7.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 891 MB/1.1 GB 7.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 892 MB/1.1 GB 7.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 893 MB/1.1 GB 7.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 893 MB/1.1 GB 7.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 894 MB/1.1 GB 7.0 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 895 MB/1.1 GB 7.1 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 895 MB/1.1 GB 7.1 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 896 MB/1.1 GB 7.1 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 897 MB/1.1 GB 7.1 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 897 MB/1.1 GB 7.1 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 898 MB/1.1 GB 7.1 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 900 MB/1.1 GB 7.1 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 900 MB/1.1 GB 7.1 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 900 MB/1.1 GB 7.1 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 901 MB/1.1 GB 7.1 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 902 MB/1.1 GB 7.1 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 902 MB/1.1 GB 7.1 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 904 MB/1.1 GB 7.1 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 904 MB/1.1 GB 7.1 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 905 MB/1.1 GB 7.1 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 905 MB/1.1 GB 7.1 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 905 MB/1.1 GB 7.1 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 905 MB/1.1 GB 7.1 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 906 MB/1.1 GB 7.1 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 907 MB/1.1 GB 7.1 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 907 MB/1.1 GB 7.1 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 909 MB/1.1 GB 7.0 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 909 MB/1.1 GB 7.0 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 910 MB/1.1 GB 7.0 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 910 MB/1.1 GB 7.0 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 910 MB/1.1 GB 7.0 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 911 MB/1.1 GB 7.0 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 911 MB/1.1 GB 7.0 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 912 MB/1.1 GB 7.0 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 912 MB/1.1 GB 7.0 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 913 MB/1.1 GB 7.0 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 913 MB/1.1 GB 6.7 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 914 MB/1.1 GB 6.7 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 914 MB/1.1 GB 6.7 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 914 MB/1.1 GB 6.7 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 914 MB/1.1 GB 6.7 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 915 MB/1.1 GB 6.7 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 915 MB/1.1 GB 6.7 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 915 MB/1.1 GB 6.7 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 916 MB/1.1 GB 6.7 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 916 MB/1.1 GB 6.7 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 917 MB/1.1 GB 6.2 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 918 MB/1.1 GB 6.2 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 918 MB/1.1 GB 6.2 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 919 MB/1.1 GB 6.2 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 920 MB/1.1 GB 6.2 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 920 MB/1.1 GB 6.2 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 920 MB/1.1 GB 6.2 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 921 MB/1.1 GB 6.2 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 921 MB/1.1 GB 6.2 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 922 MB/1.1 GB 6.2 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 923 MB/1.1 GB 6.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 923 MB/1.1 GB 6.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 924 MB/1.1 GB 6.0 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 925 MB/1.1 GB 6.0 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 925 MB/1.1 GB 6.0 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 926 MB/1.1 GB 6.0 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 926 MB/1.1 GB 6.0 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 927 MB/1.1 GB 6.0 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 927 MB/1.1 GB 6.0 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 928 MB/1.1 GB 6.0 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 929 MB/1.1 GB 6.0 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 929 MB/1.1 GB 5.9 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 930 MB/1.1 GB 5.9 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 930 MB/1.1 GB 5.9 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 83% ▕███████████████ ▏ 931 MB/1.1 GB 5.9 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 83% ▕███████████████ ▏ 931 MB/1.1 GB 5.9 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 83% ▕███████████████ ▏ 932 MB/1.1 GB 5.9 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 83% ▕███████████████ ▏ 932 MB/1.1 GB 5.9 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 83% ▕███████████████ ▏ 932 MB/1.1 GB 5.9 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 933 MB/1.1 GB 5.9 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 934 MB/1.1 GB 5.9 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 934 MB/1.1 GB 5.8 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 934 MB/1.1 GB 5.8 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 935 MB/1.1 GB 5.8 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 936 MB/1.1 GB 5.8 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 936 MB/1.1 GB 5.8 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 936 MB/1.1 GB 5.8 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 937 MB/1.1 GB 5.8 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 937 MB/1.1 GB 5.8 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 938 MB/1.1 GB 5.8 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 938 MB/1.1 GB 5.8 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 938 MB/1.1 GB 5.5 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 938 MB/1.1 GB 5.5 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 938 MB/1.1 GB 5.5 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 938 MB/1.1 GB 5.5 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 939 MB/1.1 GB 5.5 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 939 MB/1.1 GB 5.5 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 940 MB/1.1 GB 5.5 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 941 MB/1.1 GB 5.5 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 941 MB/1.1 GB 5.5 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 941 MB/1.1 GB 5.5 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 941 MB/1.1 GB 5.1 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 941 MB/1.1 GB 5.1 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 941 MB/1.1 GB 5.1 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 942 MB/1.1 GB 5.1 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 942 MB/1.1 GB 5.1 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 942 MB/1.1 GB 5.1 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 943 MB/1.1 GB 5.1 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 943 MB/1.1 GB 5.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 943 MB/1.1 GB 5.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 943 MB/1.1 GB 5.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 943 MB/1.1 GB 4.6 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 944 MB/1.1 GB 4.6 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 944 MB/1.1 GB 4.6 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 944 MB/1.1 GB 4.6 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 945 MB/1.1 GB 4.6 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 945 MB/1.1 GB 4.6 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 946 MB/1.1 GB 4.6 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 946 MB/1.1 GB 4.6 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 947 MB/1.1 GB 4.6 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 947 MB/1.1 GB 4.6 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 947 MB/1.1 GB 4.6 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 948 MB/1.1 GB 4.4 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 949 MB/1.1 GB 4.4 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 949 MB/1.1 GB 4.4 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 950 MB/1.1 GB 4.4 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 950 MB/1.1 GB 4.4 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 950 MB/1.1 GB 4.4 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 950 MB/1.1 GB 4.4 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 950 MB/1.1 GB 4.4 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 951 MB/1.1 GB 4.4 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 951 MB/1.1 GB 4.4 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 952 MB/1.1 GB 4.2 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 952 MB/1.1 GB 4.2 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 953 MB/1.1 GB 4.2 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 953 MB/1.1 GB 4.2 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 954 MB/1.1 GB 4.2 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 954 MB/1.1 GB 4.2 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 955 MB/1.1 GB 4.2 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 955 MB/1.1 GB 4.2 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 955 MB/1.1 GB 4.2 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 956 MB/1.1 GB 4.2 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 956 MB/1.1 GB 4.3 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 956 MB/1.1 GB 4.3 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 957 MB/1.1 GB 4.3 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 957 MB/1.1 GB 4.3 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 958 MB/1.1 GB 4.3 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 958 MB/1.1 GB 4.3 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 959 MB/1.1 GB 4.3 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 959 MB/1.1 GB 4.3 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 960 MB/1.1 GB 4.3 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 960 MB/1.1 GB 4.3 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 960 MB/1.1 GB 4.2 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 961 MB/1.1 GB 4.2 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 961 MB/1.1 GB 4.2 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 962 MB/1.1 GB 4.2 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 962 MB/1.1 GB 4.2 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 962 MB/1.1 GB 4.2 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 963 MB/1.1 GB 4.2 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 963 MB/1.1 GB 4.2 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 963 MB/1.1 GB 4.2 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 964 MB/1.1 GB 4.2 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 964 MB/1.1 GB 4.0 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 965 MB/1.1 GB 4.0 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 965 MB/1.1 GB 4.0 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 965 MB/1.1 GB 4.0 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 966 MB/1.1 GB 4.0 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 966 MB/1.1 GB 4.0 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 967 MB/1.1 GB 4.0 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 967 MB/1.1 GB 4.0 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 968 MB/1.1 GB 4.0 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 968 MB/1.1 GB 4.0 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 969 MB/1.1 GB 4.0 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 969 MB/1.1 GB 3.9 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 970 MB/1.1 GB 3.9 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 970 MB/1.1 GB 3.9 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 971 MB/1.1 GB 3.9 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 971 MB/1.1 GB 3.9 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 972 MB/1.1 GB 3.9 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 972 MB/1.1 GB 3.9 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 973 MB/1.1 GB 3.9 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 973 MB/1.1 GB 3.9 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 974 MB/1.1 GB 3.9 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 974 MB/1.1 GB 4.0 MB/s 35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 975 MB/1.1 GB 4.0 MB/s 35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 975 MB/1.1 GB 4.0 MB/s 35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 976 MB/1.1 GB 4.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 976 MB/1.1 GB 4.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 977 MB/1.1 GB 4.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 977 MB/1.1 GB 4.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 978 MB/1.1 GB 4.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 978 MB/1.1 GB 4.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 978 MB/1.1 GB 4.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 978 MB/1.1 GB 4.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 978 MB/1.1 GB 4.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 978 MB/1.1 GB 4.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 978 MB/1.1 GB 4.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 979 MB/1.1 GB 4.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 979 MB/1.1 GB 4.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 979 MB/1.1 GB 4.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 979 MB/1.1 GB 4.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 980 MB/1.1 GB 4.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 980 MB/1.1 GB 4.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 981 MB/1.1 GB 4.2 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 981 MB/1.1 GB 4.2 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 982 MB/1.1 GB 4.2 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 982 MB/1.1 GB 4.2 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 983 MB/1.1 GB 4.2 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 983 MB/1.1 GB 4.2 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 984 MB/1.1 GB 4.2 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 984 MB/1.1 GB 4.2 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 984 MB/1.1 GB 4.2 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 985 MB/1.1 GB 4.2 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 986 MB/1.1 GB 4.3 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 986 MB/1.1 GB 4.3 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 986 MB/1.1 GB 4.3 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 987 MB/1.1 GB 4.3 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 987 MB/1.1 GB 4.3 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 988 MB/1.1 GB 4.3 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 89% ▕███████████████ ▏ 988 MB/1.1 GB 4.3 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 89% ▕███████████████ ▏ 989 MB/1.1 GB 4.3 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 89% ▕███████████████ ▏ 989 MB/1.1 GB 4.3 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 89% ▕███████████████ ▏ 990 MB/1.1 GB 4.3 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 89% ▕███████████████ ▏ 990 MB/1.1 GB 4.3 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 89% ▕███████████████ ▏ 991 MB/1.1 GB 4.4 MB/s 28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 89% ▕███████████████ ▏ 991 MB/1.1 GB 4.4 MB/s 28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 89% ▕███████████████ ▏ 992 MB/1.1 GB 4.4 MB/s 28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 89% ▕███████████████ ▏ 992 MB/1.1 GB 4.4 MB/s 28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 993 MB/1.1 GB 4.4 MB/s 28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 993 MB/1.1 GB 4.4 MB/s 28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 994 MB/1.1 GB 4.4 MB/s 28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 994 MB/1.1 GB 4.4 MB/s 28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 995 MB/1.1 GB 4.4 MB/s 28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 995 MB/1.1 GB 4.4 MB/s 27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 996 MB/1.1 GB 4.4 MB/s 27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 996 MB/1.1 GB 4.4 MB/s 27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 997 MB/1.1 GB 4.4 MB/s 27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 997 MB/1.1 GB 4.4 MB/s 27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 997 MB/1.1 GB 4.4 MB/s 27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 998 MB/1.1 GB 4.4 MB/s 27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 998 MB/1.1 GB 4.4 MB/s 27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 998 MB/1.1 GB 4.4 MB/s 27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 999 MB/1.1 GB 4.4 MB/s 26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 25s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 25s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 25s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 25s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 25s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 25s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 25s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.1 MB/s 20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.1 MB/s 20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.1 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.1 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.1 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.1 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.1 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.1 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.1 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.1 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.0 MB/s 20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.0 MB/s 20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.0 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.0 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.0 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.0 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.0 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.0 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.0 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.0 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.9 MB/s 20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.9 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.9 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.9 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.9 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.9 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.9 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.9 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.9 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.9 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.8 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.8 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.8 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.8 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.8 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.8 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.8 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.8 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.8 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.8 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.6 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.6 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.6 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.6 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.6 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.5 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 94% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.2 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.2 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.2 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.2 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.2 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.2 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.2 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.2 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.2 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.2 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 16s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 16s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 16s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 16s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 16s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 16s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.4 MB/s 12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.4 MB/s 11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.4 MB/s 11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.4 MB/s 11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.4 MB/s 11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.4 MB/s 11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.4 MB/s 11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.4 MB/s 11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.4 MB/s 11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.4 MB/s 11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.6 MB/s 6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.6 MB/s 6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.6 MB/s 6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.6 MB/s 6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.6 MB/s 6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.6 MB/s 6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.6 MB/s 5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.6 MB/s 5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.6 MB/s 5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.6 MB/s 5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.9 MB/s 4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.9 MB/s 3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.9 MB/s 3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.9 MB/s 3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.9 MB/s 3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.9 MB/s 3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.9 MB/s 3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.9 MB/s 3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.9 MB/s 3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.9 MB/s 3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.1 MB/s 2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.1 MB/s 2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.1 MB/s 2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.1 MB/s 2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.1 MB/s 2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.1 MB/s 2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.1 MB/s 2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.1 MB/s 2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.1 MB/s 2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.1 MB/s 2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.0 MB/s 2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.0 MB/s 2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.0 MB/s 2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.0 MB/s 2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.0 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.0 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.0 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.0 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.0 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.0 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.0 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest ⠋ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest ⠙ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest ⠹ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest ⠸ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest ⠼ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest ⠴ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest ⠦ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest ⠧ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest ⠇ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest ⠏ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest ⠋ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest ⠙ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest ⠹ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest ⠸ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest ⠼ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest ⠴ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest ⠦ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest ⠧ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest ⠇ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest ⠏ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest ⠋ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest ⠙ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest ⠹ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest ⠸ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest ⠼ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest ⠴ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest ⠦ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest ⠧ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest ⠇ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", + "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", + "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", + "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", + "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", + "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", + "verifying sha256 digest \u001b[K\n", + "writing manifest \u001b[K\n", + "success \u001b[K\u001b[?25h\u001b[?2026l\n" + ] + } + ], "source": [ "!ollama pull deepseek-r1:1.5b" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "1d3d554b-e00d-4c08-9300-45e073950a76", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Okay, so I need to figure out how to define some core concepts related to Large Language Models (LLMs) specifically focusing on neural networks, attention mechanisms, and transformers. Hmm, where do I start? Well, I remember that big models are created using layers of many neural network units connected together sequentially. So for LLMs, which are composed of neural networks, each might have a certain number of hidden layers, maybe hundreds or even thousands of them. That seems pretty complex but works similarly to traditional models.\n", + "\n", + "Then there's attention and the transformer aspect. I'm a bit confused about their specific roles here. Wait, the user mentioned \"attention,\" so I think that refers to how the model processes information by focusing different parts on different aspects. The decoder part comes into play because in LLMs, the entire input text is being modeled by the output from each hidden layer.\n", + "\n", + "But I'm not entirely sure about all the steps involved in the attention mechanism for transformers. Let me think: In traditional RNNs, models process data one step at a time and consider both its current output and inputs from the previous step. For LSTMs, they use gates to manage content from inputs. Transformers differ by using a self-attention mechanism, which means each token in a sequence is compared with every other token, producing attention scores that help focus on relevant parts of the input.\n", + "\n", + "So when combined, each layer's output passes through an attention mechanism and another sub-layer. Maybe this creates something like a multi-head attention where multiple parallel attention heads are processed separately but produce different results from each. Each of these could be passed to further processing steps beyond just feed-forward layers.\n", + "\n", + "Wait, how precise is that? I think the key idea is that without the attention mechanisms, the models might not effectively capture context within sequences, which is important for understanding meaning in languages. So attention allows the model to weigh the importance of certain tokens relative to others, thus improving both efficiency and effectiveness in processing language.\n", + "\n", + "Also, the user mentioned a large number of hidden layers—hundreds to thousands. That sounds right because it would exponentially increase the complexity of the model without allowing it to be scaled or practical on its own. Instead, larger models are usually combined with specialized components like self-attention and transformers to make them practical for real-world use.\n", + "\n", + "Putting this together, perhaps the neural networks handle forward and backward processing (in traditional RNNs), but LLMs might not have that—so maybe their layers only process one-directional information at a time since they're composed of multiple layers. The transformer's self-attention mechanism with attention weights helps model contextual relationships, making each layer focus on different aspects while the decoder feeds its output into higher layers to improve context.\n", + "\n", + "Alright, I think I've got some basic understanding, but maybe I should look for precise definitions or examples elsewhere. For instance, the \"standard architecture\" section mentions a large neural network with multiple hidden layers, each containing many neurons, and using feed-forward layers. The decoder handles the entire text processing by passing output from one layer into higher layers to enhance context.\n", + "\n", + "In terms of attention in transformers, I think the key is that each token generates an attention mask that determines its position importance relative to other elements. This helps the model attend to different parts when needed, making it a self-attention mechanism without multi-heads or parallel processing as in traditional RNNs with multiple heads.\n", + "\n", + "So, in summary: The neural networks for LLMs process text sequentially but not both directions (forward and backward). The transformer uses self-attention with attention masks to weigh the importance of all tokens relative to each other during forward pass, enhancing contextual understanding. This layering allows higher layers to focus on different elements while feeding their output back into subsequent layers to maintain context.\n", + "\n", + "Wait, does that mean multi-layer processing combined with self-attention and decoder-style forward passes make LLMs unique? Yes, because in RNNs with traditional attention, there's usually a parallel layer of attention at each step, but here transformers share the same attention mask across all neurons in a layer, making it more efficient.\n", + "\n", + "I think I'm getting closer. Maybe to make it even clearer: Large Language Models are neural networks composed of layers that each process text sequentially (since RNNs handle only forward), using self-attention and decoder-style processing. Each hidden layer's output is fed into higher layers for more context, while attention masks ensure the model focuses on relevant parts relative to others.\n", + "\n", + "I should probably structure this into points: Define neural networks for LLMs as forward-only sequential processing with multiple layers. Attention in transformers through self-attention mechanisms and masking. Transformers integrate these with decoder-style processing, each layer's output sent to higher layers for context enhancement.\n", + "\n", + "\n", + "**Definitions of Core Concepts in Large Language Models (LLMs):**\n", + "\n", + "1. **Neural Networks in LLMs:**\n", + " - **Structure:** Large Neural Network\n", + " - Composed of multiple hidden layers, each containing numerous neurons connected sequentially.\n", + " - These structures allow sequential processing of text information.\n", + " - **Forward Processing:** Sequential\n", + " - Text is processed one step at a time without reversing (forward only), unlike traditional RNNs which handle both forward and backward processing.\n", + "\n", + "2. **Attention in Transformers:**\n", + " - **Self-Aware Mechanism:**\n", + " - Each token generates an attention mask that determines its position importance.\n", + " - This highlights the relative importance of all tokens, enabling focused context modeling.\n", + " - **Weighted Context Focus:**\n", + " - Attention scores (weights) are used to generate probability distributions over possible words for each position in a sequence.\n", + "\n", + "3. **Transformer's Decoder-Style Processing:**\n", + " - Processing Through Decoders:\n", + " - The model processes both input and output sequences through layers, with the decoder feeding its output into higher layers.\n", + " - **Layered Context Enhancement:**\n", + " - Each layer enhances context by processing all tokens' contributions, allowing models to focus on relevant parts while maintaining global information.\n", + "\n", + "**Summary:** Large Language Models (LLMs) utilize forward-only sequential neural networks. Transformers employ self-attention mechanisms and decoder-style processing, enabling each layer to enhance context while feeding its output into higher layers for global understanding. This architecture allows LLMs to effectively capture contextual relationships in sequences.\n" + ] + } + ], "source": [ "# This may take a few minutes to run! You should then see a fascinating \"thinking\" trace inside tags, followed by some decent definitions\n", "\n", @@ -294,7 +2761,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "llms", "language": "python", "name": "python3" }, @@ -308,7 +2775,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.12" + "version": "3.11.13" } }, "nbformat": 4, From 5dc1abfa388cb36d35d718a84adc845ce81d824e Mon Sep 17 00:00:00 2001 From: vaishnavipalyam Date: Sun, 10 Aug 2025 16:40:20 +0530 Subject: [PATCH 06/72] Add Vaishnavi's week 1 day 5 community contribution (cleared outputs) --- .../day5-GitaScripting.ipynb | 566 ++++++++++++++++++ 1 file changed, 566 insertions(+) create mode 100644 week1/community-contributions/day5-GitaScripting.ipynb diff --git a/week1/community-contributions/day5-GitaScripting.ipynb b/week1/community-contributions/day5-GitaScripting.ipynb new file mode 100644 index 0000000..063d614 --- /dev/null +++ b/week1/community-contributions/day5-GitaScripting.ipynb @@ -0,0 +1,566 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 15, + "id": "7759922b-12c9-44e0-8ac3-5f2a02b321d7", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } + }, + "outputs": [], + "source": [ + "import fitz # PyMuPDF\n", + "import os\n", + "import requests\n", + "import json\n", + "from typing import List\n", + "from dotenv import load_dotenv\n", + "from IPython.display import Markdown, display, update_display\n", + "from openai import OpenAI" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "a266273a-05e3-451e-a318-428726cfa39c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "API key looks good so far\n" + ] + } + ], + "source": [ + "# Initialize and constants\n", + "\n", + "load_dotenv(override=True)\n", + "api_key = os.getenv('OPENAI_API_KEY')\n", + "\n", + "if api_key and api_key.startswith('sk-proj-') and len(api_key)>10:\n", + " print(\"API key looks good so far\")\n", + "else:\n", + " print(\"There might be a problem with your API key? Please visit the troubleshooting notebook!\")\n", + " \n", + "MODEL = 'gpt-4o-mini'\n", + "openai = OpenAI()" + ] + }, + { + "cell_type": "code", + "execution_count": 125, + "id": "45566572-dd66-48dc-ab7b-6adbe26eacba", + "metadata": {}, + "outputs": [], + "source": [ + "exceptions = []" + ] + }, + { + "cell_type": "code", + "execution_count": 111, + "id": "effc0e7b-d668-48b3-86d0-dbb5d8fe3d55", + "metadata": {}, + "outputs": [], + "source": [ + "# Building system prompt\n", + "def get_verse_system_prompt():\n", + " system_prompt = \"You are a spiritual student who classifies the versus of the BhagavadGita according to a given theme.\\n\"\n", + " system_prompt += \"Given a theme, you should pick a verse from any chapter and give it's location in the form of index chapter.verse_number (6.2)\\n\"\n", + " system_prompt += \"You should respond in JSON as in this example:\\n\"\n", + " system_prompt += \"\"\"\n", + " {\"title\": \"Chapter 3, Verse 21 (3.21)\", \"verse\": \"कर्मणा ह्यपि संसिद्धिम्‌\n", + " आस्थिता जनकादय:।\n", + " लोकसंग्रहमेवापि\n", + " सम्पश्यन्कर्तुमर्हसि॥\"}\n", + " \"\"\"\n", + " return system_prompt" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "id": "bbfb1035-b183-4481-9b49-3cc1b12b42e8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You are a spiritual student who classifies the versus of the BhagavadGita according to a given theme.\n", + "Given a theme, you should pick a verse from any chapter and give it's location in the form of index chapter.verse_number (6.2)\n", + "You should respond in JSON as in this example:\n", + "\n", + " {\"title\": \"Chapter 3, Verse 21 (3.21)\", \"verse\": \"कर्मणा ह्यपि संसिद्धिम्‌\n", + " आस्थिता जनकादय:।\n", + " लोकसंग्रहमेवापि\n", + " सम्पश्यन्कर्तुमर्हसि॥\"}\n", + " \n" + ] + } + ], + "source": [ + "print(get_verse_system_prompt())" + ] + }, + { + "cell_type": "code", + "execution_count": 131, + "id": "6acdcd6c-1fc5-4c71-81d0-665e25808e46", + "metadata": {}, + "outputs": [], + "source": [ + "# Define user prompt\n", + "def get_verse_user_prompt(theme):\n", + " user_prompt = f'''\n", + " Here is the theme : {theme},\n", + " Please find a verse from BhagavadGita excluding {exceptions} for a given theme {theme}\n", + " '''#excluding those results which are already used\n", + " \n", + " user_prompt += \"If the verse is not in the exceptions for a given theme and used for a different theme, you are free to suggest it for a different theme.\"\n", + " return user_prompt" + ] + }, + { + "cell_type": "code", + "execution_count": 132, + "id": "72f5c755-ec2d-4545-9a31-0f6b2e5ed4da", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " Here is the theme : motivation,\n", + " Please find a verse from BhagavadGita excluding [('motivation', 'Chapter 3, Verse 16 (3.16)'), ('motivation', 'Chapter 2, Verse 47 (2.47)'), ('motivation', 'Chapter 5, Verse 10 (5.10)')] for a given theme motivation\n", + " If the verse is not in the exceptions for a given theme and used for a different theme, you are free to suggest it for a different theme.\n" + ] + } + ], + "source": [ + "print(get_verse_user_prompt('motivation'))" + ] + }, + { + "cell_type": "code", + "execution_count": 133, + "id": "304d432c-7216-4a90-a5d8-db36b193657d", + "metadata": {}, + "outputs": [], + "source": [ + "#Call openAI to return versus\n", + "def get_verses(theme):\n", + " response = openai.chat.completions.create(\n", + " model=MODEL,\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": get_verse_system_prompt()},\n", + " {\"role\": \"user\", \"content\": get_verse_user_prompt(theme)}\n", + " ],\n", + " response_format={\"type\": \"json_object\"}\n", + " )\n", + " result = response.choices[0].message.content\n", + " result = json.loads(result)\n", + "\n", + " #Remember those results which are suggested now\n", + " combination = (theme, result['title'])\n", + " exceptions.append(combination)\n", + " return result" + ] + }, + { + "cell_type": "code", + "execution_count": 134, + "id": "b90eeb35-e10e-48ee-ade6-e0594da8c51b", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'title': 'Chapter 6, Verse 5 (6.5)', 'verse': 'उद्धरेदात्मनात्मानं आत्मैव ह्यात्मना पूजित:।\\n\\nअात्मानमात्मना कृत्वा नात्मानं उपसंपद्यते॥'}\n" + ] + } + ], + "source": [ + "print(get_verses('motivation'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b5b8925e-52e4-4cb7-9205-51c65ed88fb8", + "metadata": {}, + "outputs": [], + "source": [ + "# So far we have fetched the new verses relevant to a given theme \n", + "# Lets generate a script for producting youtube video" + ] + }, + { + "cell_type": "code", + "execution_count": 140, + "id": "8ff0862b-0310-4174-ad12-64047932dc9e", + "metadata": {}, + "outputs": [], + "source": [ + "#def function for system prompt\n", + "def get_script_system_prompt(tone, theme, format):\n", + " sys_prompt = 'You are a script writer for a youtube spiritual channel\\n'\n", + " sys_prompt += 'You are given a verse like below: \\n'\n", + " sys_prompt += str(get_verses(theme))\n", + " sys_prompt += '\\n'\n", + " sys_prompt += f'Give me an engaging script in a {tone} tone for a {format} format video for audience like youth seeking purpose, spiritual seekers, indians abroad, scholars and curious minds.'\n", + "\n", + " return sys_prompt" + ] + }, + { + "cell_type": "code", + "execution_count": 141, + "id": "47476516-cd2f-4b16-b378-a70617bbe284", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You are a script writer for a youtube spiritual channel\n", + "You are given a verse like below: \n", + "{'title': 'Chapter 2, Verse 48 (2.48)', 'verse': 'योगस्थः कुरु कर्माणि सङ्गं त्यक्त्वा धनञ्जय।\\nसिद्ध्यसिद्ध्यो: समो भूत्वा समत्वं योग उच्यते॥'}\n", + "Give me an engaging script in a Motivating tone for a long format video for audience like youth seeking purpose, spiritual seekers, indians abroad, scholars and curious minds.\n" + ] + } + ], + "source": [ + "print(get_script_system_prompt('Motivating','motivation','long'))" + ] + }, + { + "cell_type": "code", + "execution_count": 150, + "id": "e305525b-8dde-4e93-927a-e24531827498", + "metadata": {}, + "outputs": [], + "source": [ + "# def function for user prompt\n", + "def get_script_user_prompt(format, theme):\n", + " user_prompt = f'Given the verse, help me generate a detailed script suitable for {format} format video.\\n'\n", + " user_prompt += f'Please give me the complete verse, its meaning, a relevant story having a dilemma which the verse solves and the interpretation of the verse with respect to {theme}.\\n'\n", + " user_prompt += 'Let the script give cues about video editing, host actions.'\n", + " user_prompt += 'given the below example, please follow the format:\\n'\n", + " user_prompt += \"\"\"\n", + " [Opening Scene - Soft Instrumental Music Playing]\n", + "\n", + " [Cut to Host in a serene setting, perhaps by a river or in a lush green garden.]\n", + "\n", + " Host: (Smiling at the camera) \"Namaste, dear viewers! Welcome back to our channel, where we explore the depths of spirituality and seek to ignite the flame of wisdom within you. Today, we delve into a profound verse from the Bhagavad Gita that speaks to the very essence of life and identity.\"\n", + "\n", + " [Text On Screen: Chapter 2, Verse 13 (2.13)]\n", + "\n", + " Host: (With a sense of reverence) \"Let’s first take a moment to recite this verse together. It goes like this:\n", + "\n", + " देहिनोऽस्मिन्न्यथा देहे कौमारं यौवनं जरा।\n", + " तथादेहान्तरप्राप्तिर्धीरस्तत्र न मुह्यति॥\n", + "\n", + " Now, let’s understand the essence of this verse.\"\n", + "\n", + " [Cut to Graphic: Verse Translation with Key Concepts Highlighted]\n", + "\n", + " Host Voiceover: (Calm and engaging tone) \"The meaning of this beautiful verse translates to: 'Just as the body undergoes changes from childhood to old age, similarly, the soul transitions from one body to another. The wise, who understand this, are never bewildered by these changes.'\n", + "\n", + " [Cut back to Host]\n", + "\n", + " Host: (Nodding, creating a connection)\n", + " \"So, why is this verse so important, especially for us as young seekers of purpose? It highlights a profound truth—that our identities are not confined by our physical forms or the stages of life we experience. Instead, we are eternal beings who are constantly evolving.\"\n", + "\n", + " [Scene Transition - Soft Music Playing]\n", + "\n", + " [Cut to a Story Animation - A young man named Arjun in a busy city]\n", + "\n", + " Host (Voiceover): \"Let me share a relatable story. Meet Arjun. Like many of us, he was once full of dreams and aspirations. He excelling in school, pursuing a career in engineering. But as the years passed, he faced a crossroads. As the pressure mounted, he began to question his identity.\n", + "\n", + " (Visuals show Arjun overwhelmed by societal expectations, with people pushing him in different directions.)\n", + "\n", + " He felt distinct phases of life pulling at him: childhood dreams, youthful ambitions, and the looming responsibilities of adulthood. The changing seasons of his life left him confused and wondering if he had lost his true self.\"\n", + "\n", + " [Cut back to Host, empathetic tone]\n", + "\n", + " Host: \"Have you ever felt like Arjun? It’s a dilemma we all face, especially in today's fast-paced world where expectations can cloud our true identity. But just like our verse suggests, we should recognize that these changes don’t define us. They are simply part of the journey.\"\n", + "\n", + " [Scene Transition - Calm Music Playing while Host meditates]\n", + "\n", + " Host: (Speaking gently) \"Let’s take a moment to reflect. When we are sad, does that sadness define us? Or when we achieve success, do we become defined solely by that success? The answer isn't as straightforward as it seems. Here’s the catch: our essence is beyond these transient states. Like the body, our identities are fluid.\"\n", + "\n", + " [Cut to Visuals of Nature - flowing rivers, trees shedding leaves, etc.]\n", + "\n", + " Host Voiceover: \"Imagine the endless cycle of nature—the changing seasons, the growth, the decay, and rebirth. Just like the leaves that drop to make way for new growth, our experiences contribute to our spiritual evolution.\"\n", + "\n", + " [Cut back to Host - Inviting and Warm Tone]\n", + "\n", + " Host: \"Just as the wise who understand the transformation of the soul remain unshaken, we, too, can cultivate that wisdom to rise above the chaos of change. Recognize your true essence—beyond the body, the roles, the titles. Understand that your spirit is eternal.\"\n", + "\n", + " [Scene Transition - Soft Inspirational Music Begins]\n", + "\n", + " Host: (Passionately) \"So how can we embody this truth in our daily lives? Here’s a small exercise: Each day, take a few moments to meditate on who you really are. Write down what aspects of your identity are tied to transient things. Challenge yourself—what happens when you peel these layers away?\"\n", + "\n", + " [Cut to host with a pad, writing ideas]\n", + "\n", + " [Scene Transition - Editing Cues - Show engaging graphics of identity, layers of a person, etc.]\n", + "\n", + " Host Voiceover: \"Each effort towards understanding and embracing our true self draws us closer to the realization that we are eternal souls, having a human experience. This is the wisdom that can empower you to stand tall against the adversities of life.\"\n", + "\n", + " [Cut back to Host]\n", + "\n", + " Host: (Concluding) \"Thank you for joining me today in this exploration of Chapter 2, Verse 13 of the Bhagavad Gita. Remember, when you feel lost in the complexities of life, return to this teachings and remind yourself that you are not just a body; you are an eternal being on a magnificent journey.\n", + "\n", + " [Closing Scene - Uplifting Music Playing]\n", + "\n", + " Host: \"Don’t forget to like, share, and subscribe if you found resonance in this message. And share your thoughts in the comments below. What did you find most challenging in your own journey of self-identity? Let’s connect and support each other in our spiritual quests. Until next time, stay enlightened, stay inspired!\"\n", + "\n", + " [End Screen with Subscribe Button and Previous Video Suggestions]\n", + "\n", + " [End of Script]\n", + " \"\"\"\n", + " \n", + " return user_prompt" + ] + }, + { + "cell_type": "code", + "execution_count": 151, + "id": "c4b29cb9-d8d1-413a-8152-4250e2430a42", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Given the verse, help me generate a detailed script suitable for long format video.\n", + "Please give me the complete verse, its meaning, a relevant story having a dilemma which the verse solves and the interpretation of the verse with respect to motivation.\n", + "Let the script give cues about video editing, host actions.given the below example, please follow the format:\n", + "\n", + " [Opening Scene - Soft Instrumental Music Playing]\n", + "\n", + " [Cut to Host in a serene setting, perhaps by a river or in a lush green garden.]\n", + "\n", + " Host: (Smiling at the camera) \"Namaste, dear viewers! Welcome back to our channel, where we explore the depths of spirituality and seek to ignite the flame of wisdom within you. Today, we delve into a profound verse from the Bhagavad Gita that speaks to the very essence of life and identity.\"\n", + "\n", + " [Text On Screen: Chapter 2, Verse 13 (2.13)]\n", + "\n", + " Host: (With a sense of reverence) \"Let’s first take a moment to recite this verse together. It goes like this:\n", + "\n", + " देहिनोऽस्मिन्न्यथा देहे कौमारं यौवनं जरा।\n", + " तथादेहान्तरप्राप्तिर्धीरस्तत्र न मुह्यति॥\n", + "\n", + " Now, let’s understand the essence of this verse.\"\n", + "\n", + " [Cut to Graphic: Verse Translation with Key Concepts Highlighted]\n", + "\n", + " Host Voiceover: (Calm and engaging tone) \"The meaning of this beautiful verse translates to: 'Just as the body undergoes changes from childhood to old age, similarly, the soul transitions from one body to another. The wise, who understand this, are never bewildered by these changes.'\n", + "\n", + " [Cut back to Host]\n", + "\n", + " Host: (Nodding, creating a connection)\n", + " \"So, why is this verse so important, especially for us as young seekers of purpose? It highlights a profound truth—that our identities are not confined by our physical forms or the stages of life we experience. Instead, we are eternal beings who are constantly evolving.\"\n", + "\n", + " [Scene Transition - Soft Music Playing]\n", + "\n", + " [Cut to a Story Animation - A young man named Arjun in a busy city]\n", + "\n", + " Host (Voiceover): \"Let me share a relatable story. Meet Arjun. Like many of us, he was once full of dreams and aspirations. He excelling in school, pursuing a career in engineering. But as the years passed, he faced a crossroads. As the pressure mounted, he began to question his identity.\n", + "\n", + " (Visuals show Arjun overwhelmed by societal expectations, with people pushing him in different directions.)\n", + "\n", + " He felt distinct phases of life pulling at him: childhood dreams, youthful ambitions, and the looming responsibilities of adulthood. The changing seasons of his life left him confused and wondering if he had lost his true self.\"\n", + "\n", + " [Cut back to Host, empathetic tone]\n", + "\n", + " Host: \"Have you ever felt like Arjun? It’s a dilemma we all face, especially in today's fast-paced world where expectations can cloud our true identity. But just like our verse suggests, we should recognize that these changes don’t define us. They are simply part of the journey.\"\n", + "\n", + " [Scene Transition - Calm Music Playing while Host meditates]\n", + "\n", + " Host: (Speaking gently) \"Let’s take a moment to reflect. When we are sad, does that sadness define us? Or when we achieve success, do we become defined solely by that success? The answer isn't as straightforward as it seems. Here’s the catch: our essence is beyond these transient states. Like the body, our identities are fluid.\"\n", + "\n", + " [Cut to Visuals of Nature - flowing rivers, trees shedding leaves, etc.]\n", + "\n", + " Host Voiceover: \"Imagine the endless cycle of nature—the changing seasons, the growth, the decay, and rebirth. Just like the leaves that drop to make way for new growth, our experiences contribute to our spiritual evolution.\"\n", + "\n", + " [Cut back to Host - Inviting and Warm Tone]\n", + "\n", + " Host: \"Just as the wise who understand the transformation of the soul remain unshaken, we, too, can cultivate that wisdom to rise above the chaos of change. Recognize your true essence—beyond the body, the roles, the titles. Understand that your spirit is eternal.\"\n", + "\n", + " [Scene Transition - Soft Inspirational Music Begins]\n", + "\n", + " Host: (Passionately) \"So how can we embody this truth in our daily lives? Here’s a small exercise: Each day, take a few moments to meditate on who you really are. Write down what aspects of your identity are tied to transient things. Challenge yourself—what happens when you peel these layers away?\"\n", + "\n", + " [Cut to host with a pad, writing ideas]\n", + "\n", + " [Scene Transition - Editing Cues - Show engaging graphics of identity, layers of a person, etc.]\n", + "\n", + " Host Voiceover: \"Each effort towards understanding and embracing our true self draws us closer to the realization that we are eternal souls, having a human experience. This is the wisdom that can empower you to stand tall against the adversities of life.\"\n", + "\n", + " [Cut back to Host]\n", + "\n", + " Host: (Concluding) \"Thank you for joining me today in this exploration of Chapter 2, Verse 13 of the Bhagavad Gita. Remember, when you feel lost in the complexities of life, return to this teachings and remind yourself that you are not just a body; you are an eternal being on a magnificent journey.\n", + "\n", + " [Closing Scene - Uplifting Music Playing]\n", + "\n", + " Host: \"Don’t forget to like, share, and subscribe if you found resonance in this message. And share your thoughts in the comments below. What did you find most challenging in your own journey of self-identity? Let’s connect and support each other in our spiritual quests. Until next time, stay enlightened, stay inspired!\"\n", + "\n", + " [End Screen with Subscribe Button and Previous Video Suggestions]\n", + "\n", + " [End of Script]\n", + " \n" + ] + } + ], + "source": [ + "print(get_script_user_prompt('long','motivation'))" + ] + }, + { + "cell_type": "code", + "execution_count": 152, + "id": "1dfa60ce-9e88-4f7d-8e60-ac37a0aafc15", + "metadata": {}, + "outputs": [], + "source": [ + "def create_script(tone, theme, format):\n", + " response = openai.chat.completions.create(\n", + " model=MODEL,\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": get_script_system_prompt(tone,theme,format)},\n", + " {\"role\": \"user\", \"content\": get_script_user_prompt(format,theme)}\n", + " ],\n", + " )\n", + " result = response.choices[0].message.content\n", + " display(Markdown(result))" + ] + }, + { + "cell_type": "code", + "execution_count": 153, + "id": "ec86c436-42ae-4313-b12f-4fad42ab2227", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "[Opening Scene - Soft Instrumental Music Playing]\n", + "\n", + "[Cut to Host in a tranquil space, surrounded by nature, perhaps under a blossoming tree or near a peaceful body of water.]\n", + "\n", + "Host: (Smiling warmly) \"Namaste, dear souls! Welcome back to our spiritual journey. Today, we're diving into a powerful verse from the Bhagavad Gita—one that transcends time and speaks directly to the hearts of youth, seekers, and scholars alike. This wisdom offers clarity about our true identities amidst the chaos of life.\"\n", + "\n", + "[Text On Screen: Chapter 2, Verse 19 (2.19)]\n", + "\n", + "Host: (With a sense of reverence) \"Let’s immerse ourselves in the sacred words of this verse together:\n", + "\n", + "य एनं वेत्ति हन्तारं यश्चैनं वेत्ति हन्तकम्। \n", + "उभौ तौ न विजानीतो नायं हन्ति न हन्यते॥\n", + "\n", + "[Pause for the recitation to resonate with the audience]\n", + "\n", + "Host: (Calmly) \"This translates to: 'The one who kills, and the one who thinks he is killed, are both ignorant. The truth is, the soul can neither kill nor be killed.' \n", + "\n", + "Now, let's unpack this beautifully complex verse.\"\n", + "\n", + "[Cut to Graphic: Verse Translation with Key Concepts Highlighted]\n", + "\n", + "Host Voiceover: (Engaging and soothing tone) \"In this verse, Lord Krishna emphasizes the immortality of the soul. The physical body can undergo changes, but the true essence of who we are—our soul—is eternal and cannot be harmed. This understanding leads to profound peace and clarity.\"\n", + "\n", + "[Cut back to Host]\n", + "\n", + "Host: (Nodding thoughtfully) \"Why is this verse crucial for us, especially in challenging times? It invites us to reevaluate how we perceive life, relationships, and our fundamental identity. In moments of upheaval or sorrow, understanding this truth empowers us to rise above fear and despair.\"\n", + "\n", + "[Scene Transition - Gentle Music Playing]\n", + "\n", + "[Cut to a Story Animation - A young woman named Maya navigating through life’s challenges in a bustling city.]\n", + "\n", + "Host (Voiceover): \"Let me share a story that might resonate with many of you. This is Maya. Full of dreams and aspirations, she navigates her way through the tumultuous journey of life. \n", + "\n", + "(Visuals depict Maya juggling work pressure, academic stress, and societal expectations, feeling overwhelmed)\n", + "\n", + "As the years went by, Maya found herself caught in a web of expectations. She started questioning her choices, her worth, and—even more profound—her identity.\"\n", + "\n", + "[Cut back to Host, expressing empathy]\n", + "\n", + "Host: \"Sound familiar? This dilemma, of feeling lost and pressured, is something many of us face today, especially those of us who strive for purpose. It’s easy to think that our worth is attached to our achievements, our appearances, or the roles we play. Yet, the truth of the verse beckons us to look deeper.\"\n", + "\n", + "[Scene Transition - Soft Music Playing while Host meditates]\n", + "\n", + "Host: (Speaking gently) \"Take a moment to reflect: When you've faced hardship or heartbreak, did you allow those circumstances to define you? Or in moments of joy, do you believe that mere happiness captures your essence? Pondering these questions can help unveil the layers of our identity.\"\n", + "\n", + "[Cut to Visuals of Nature - flowing rivers, vibrant flowers, and changing landscapes]\n", + "\n", + "Host Voiceover: \"Nature constantly reminds us of this timeless truth—the ebb and flow, the birth and decay, each phase is crucial, yet none are the essence of nature itself. Like the seasons that come and go, our experiences are transient, yet our spirit remains unscathed.\"\n", + "\n", + "[Cut back to Host - Inviting and Warm Tone]\n", + "\n", + "Host: \"This wisdom affords us a liberating perspective: while life presents us with challenges, it is not those challenges that define us; rather, it is how we respond to them. Recognizing our eternal nature allows us to navigate life with grace and assurance.\"\n", + "\n", + "[Scene Transition - Inspiring Music Gently Builds]\n", + "\n", + "Host: (Passionately) \"Now, how do we embody this profound understanding? Here’s a simple yet powerful exercise: Each day, carve out a few moments to meditate on your immutable self. Reflect on how many layers of identity you wear that are tied to transient aspects of life—your career, your physical appearance, your relationships.\"\n", + "\n", + "[Cut to Host with a journal, jotting down insights]\n", + "\n", + "[Scene Transition - Editing Cues - Visual graphics demonstrating self-discovery, removing layers to reveal the core identity]\n", + "\n", + "Host Voiceover: \"Each time you peel back these layers, you're one step closer to understanding that beneath it all, your spirit is pure, untainted, and eternal. This wisdom is transformative; it empowers you to rise from the ashes of despair into the light of surrender and acceptance.\"\n", + "\n", + "[Cut back to Host]\n", + "\n", + "Host: (Concluding with warmth) \"Thank you for exploring Chapter 2, Verse 19 from the Bhagavad Gita with me today. Remember, in the grand tapestry of life, the threads of our experiences are important, yet it is the essence of our soul that is everlasting. When you feel entangled in life’s complexities, simply return to this truth: You are an eternal being experiencing the human journey.\"\n", + "\n", + "[Closing Scene - Uplifting Music Playing]\n", + "\n", + "Host: \"If this message resonated with you, don’t forget to like, share, and subscribe! And I encourage you to share in the comments below how you connect with your true self or any experiences that have challenged your identity. Together, let's support one another on this beautiful voyage of self-discovery. Until next time, stay enlightened, stay inspired!\"\n", + "\n", + "[End Screen with Subscribe Button and Previous Video Suggestions]\n", + "\n", + "[End of Script]" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "create_script('motivating','self-identity','long')" + ] + } + ], + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 90ba1cf6c26635f1ebc0bbff791d4ef3c405ca5c Mon Sep 17 00:00:00 2001 From: vaishnavipalyam Date: Sun, 10 Aug 2025 16:53:14 +0530 Subject: [PATCH 07/72] add vaishnavi day5 contribution of Gita Scripting --- .../day5-GitaScripting.ipynb | 274 ++---------------- 1 file changed, 23 insertions(+), 251 deletions(-) diff --git a/week1/community-contributions/day5-GitaScripting.ipynb b/week1/community-contributions/day5-GitaScripting.ipynb index 063d614..964b183 100644 --- a/week1/community-contributions/day5-GitaScripting.ipynb +++ b/week1/community-contributions/day5-GitaScripting.ipynb @@ -2,14 +2,9 @@ "cells": [ { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "id": "7759922b-12c9-44e0-8ac3-5f2a02b321d7", - "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - } - }, + "metadata": {}, "outputs": [], "source": [ "import fitz # PyMuPDF\n", @@ -24,18 +19,10 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "id": "a266273a-05e3-451e-a318-428726cfa39c", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "API key looks good so far\n" - ] - } - ], + "outputs": [], "source": [ "# Initialize and constants\n", "\n", @@ -53,7 +40,7 @@ }, { "cell_type": "code", - "execution_count": 125, + "execution_count": null, "id": "45566572-dd66-48dc-ab7b-6adbe26eacba", "metadata": {}, "outputs": [], @@ -63,7 +50,7 @@ }, { "cell_type": "code", - "execution_count": 111, + "execution_count": null, "id": "effc0e7b-d668-48b3-86d0-dbb5d8fe3d55", "metadata": {}, "outputs": [], @@ -84,33 +71,17 @@ }, { "cell_type": "code", - "execution_count": 112, + "execution_count": null, "id": "bbfb1035-b183-4481-9b49-3cc1b12b42e8", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You are a spiritual student who classifies the versus of the BhagavadGita according to a given theme.\n", - "Given a theme, you should pick a verse from any chapter and give it's location in the form of index chapter.verse_number (6.2)\n", - "You should respond in JSON as in this example:\n", - "\n", - " {\"title\": \"Chapter 3, Verse 21 (3.21)\", \"verse\": \"कर्मणा ह्यपि संसिद्धिम्‌\n", - " आस्थिता जनकादय:।\n", - " लोकसंग्रहमेवापि\n", - " सम्पश्यन्कर्तुमर्हसि॥\"}\n", - " \n" - ] - } - ], + "outputs": [], "source": [ "print(get_verse_system_prompt())" ] }, { "cell_type": "code", - "execution_count": 131, + "execution_count": null, "id": "6acdcd6c-1fc5-4c71-81d0-665e25808e46", "metadata": {}, "outputs": [], @@ -128,28 +99,17 @@ }, { "cell_type": "code", - "execution_count": 132, + "execution_count": null, "id": "72f5c755-ec2d-4545-9a31-0f6b2e5ed4da", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - " Here is the theme : motivation,\n", - " Please find a verse from BhagavadGita excluding [('motivation', 'Chapter 3, Verse 16 (3.16)'), ('motivation', 'Chapter 2, Verse 47 (2.47)'), ('motivation', 'Chapter 5, Verse 10 (5.10)')] for a given theme motivation\n", - " If the verse is not in the exceptions for a given theme and used for a different theme, you are free to suggest it for a different theme.\n" - ] - } - ], + "outputs": [], "source": [ "print(get_verse_user_prompt('motivation'))" ] }, { "cell_type": "code", - "execution_count": 133, + "execution_count": null, "id": "304d432c-7216-4a90-a5d8-db36b193657d", "metadata": {}, "outputs": [], @@ -175,20 +135,12 @@ }, { "cell_type": "code", - "execution_count": 134, + "execution_count": null, "id": "b90eeb35-e10e-48ee-ade6-e0594da8c51b", "metadata": { "scrolled": true }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'title': 'Chapter 6, Verse 5 (6.5)', 'verse': 'उद्धरेदात्मनात्मानं आत्मैव ह्यात्मना पूजित:।\\n\\nअात्मानमात्मना कृत्वा नात्मानं उपसंपद्यते॥'}\n" - ] - } - ], + "outputs": [], "source": [ "print(get_verses('motivation'))" ] @@ -206,7 +158,7 @@ }, { "cell_type": "code", - "execution_count": 140, + "execution_count": null, "id": "8ff0862b-0310-4174-ad12-64047932dc9e", "metadata": {}, "outputs": [], @@ -224,28 +176,17 @@ }, { "cell_type": "code", - "execution_count": 141, + "execution_count": null, "id": "47476516-cd2f-4b16-b378-a70617bbe284", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You are a script writer for a youtube spiritual channel\n", - "You are given a verse like below: \n", - "{'title': 'Chapter 2, Verse 48 (2.48)', 'verse': 'योगस्थः कुरु कर्माणि सङ्गं त्यक्त्वा धनञ्जय।\\nसिद्ध्यसिद्ध्यो: समो भूत्वा समत्वं योग उच्यते॥'}\n", - "Give me an engaging script in a Motivating tone for a long format video for audience like youth seeking purpose, spiritual seekers, indians abroad, scholars and curious minds.\n" - ] - } - ], + "outputs": [], "source": [ "print(get_script_system_prompt('Motivating','motivation','long'))" ] }, { "cell_type": "code", - "execution_count": 150, + "execution_count": null, "id": "e305525b-8dde-4e93-927a-e24531827498", "metadata": {}, "outputs": [], @@ -335,100 +276,17 @@ }, { "cell_type": "code", - "execution_count": 151, + "execution_count": null, "id": "c4b29cb9-d8d1-413a-8152-4250e2430a42", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Given the verse, help me generate a detailed script suitable for long format video.\n", - "Please give me the complete verse, its meaning, a relevant story having a dilemma which the verse solves and the interpretation of the verse with respect to motivation.\n", - "Let the script give cues about video editing, host actions.given the below example, please follow the format:\n", - "\n", - " [Opening Scene - Soft Instrumental Music Playing]\n", - "\n", - " [Cut to Host in a serene setting, perhaps by a river or in a lush green garden.]\n", - "\n", - " Host: (Smiling at the camera) \"Namaste, dear viewers! Welcome back to our channel, where we explore the depths of spirituality and seek to ignite the flame of wisdom within you. Today, we delve into a profound verse from the Bhagavad Gita that speaks to the very essence of life and identity.\"\n", - "\n", - " [Text On Screen: Chapter 2, Verse 13 (2.13)]\n", - "\n", - " Host: (With a sense of reverence) \"Let’s first take a moment to recite this verse together. It goes like this:\n", - "\n", - " देहिनोऽस्मिन्न्यथा देहे कौमारं यौवनं जरा।\n", - " तथादेहान्तरप्राप्तिर्धीरस्तत्र न मुह्यति॥\n", - "\n", - " Now, let’s understand the essence of this verse.\"\n", - "\n", - " [Cut to Graphic: Verse Translation with Key Concepts Highlighted]\n", - "\n", - " Host Voiceover: (Calm and engaging tone) \"The meaning of this beautiful verse translates to: 'Just as the body undergoes changes from childhood to old age, similarly, the soul transitions from one body to another. The wise, who understand this, are never bewildered by these changes.'\n", - "\n", - " [Cut back to Host]\n", - "\n", - " Host: (Nodding, creating a connection)\n", - " \"So, why is this verse so important, especially for us as young seekers of purpose? It highlights a profound truth—that our identities are not confined by our physical forms or the stages of life we experience. Instead, we are eternal beings who are constantly evolving.\"\n", - "\n", - " [Scene Transition - Soft Music Playing]\n", - "\n", - " [Cut to a Story Animation - A young man named Arjun in a busy city]\n", - "\n", - " Host (Voiceover): \"Let me share a relatable story. Meet Arjun. Like many of us, he was once full of dreams and aspirations. He excelling in school, pursuing a career in engineering. But as the years passed, he faced a crossroads. As the pressure mounted, he began to question his identity.\n", - "\n", - " (Visuals show Arjun overwhelmed by societal expectations, with people pushing him in different directions.)\n", - "\n", - " He felt distinct phases of life pulling at him: childhood dreams, youthful ambitions, and the looming responsibilities of adulthood. The changing seasons of his life left him confused and wondering if he had lost his true self.\"\n", - "\n", - " [Cut back to Host, empathetic tone]\n", - "\n", - " Host: \"Have you ever felt like Arjun? It’s a dilemma we all face, especially in today's fast-paced world where expectations can cloud our true identity. But just like our verse suggests, we should recognize that these changes don’t define us. They are simply part of the journey.\"\n", - "\n", - " [Scene Transition - Calm Music Playing while Host meditates]\n", - "\n", - " Host: (Speaking gently) \"Let’s take a moment to reflect. When we are sad, does that sadness define us? Or when we achieve success, do we become defined solely by that success? The answer isn't as straightforward as it seems. Here’s the catch: our essence is beyond these transient states. Like the body, our identities are fluid.\"\n", - "\n", - " [Cut to Visuals of Nature - flowing rivers, trees shedding leaves, etc.]\n", - "\n", - " Host Voiceover: \"Imagine the endless cycle of nature—the changing seasons, the growth, the decay, and rebirth. Just like the leaves that drop to make way for new growth, our experiences contribute to our spiritual evolution.\"\n", - "\n", - " [Cut back to Host - Inviting and Warm Tone]\n", - "\n", - " Host: \"Just as the wise who understand the transformation of the soul remain unshaken, we, too, can cultivate that wisdom to rise above the chaos of change. Recognize your true essence—beyond the body, the roles, the titles. Understand that your spirit is eternal.\"\n", - "\n", - " [Scene Transition - Soft Inspirational Music Begins]\n", - "\n", - " Host: (Passionately) \"So how can we embody this truth in our daily lives? Here’s a small exercise: Each day, take a few moments to meditate on who you really are. Write down what aspects of your identity are tied to transient things. Challenge yourself—what happens when you peel these layers away?\"\n", - "\n", - " [Cut to host with a pad, writing ideas]\n", - "\n", - " [Scene Transition - Editing Cues - Show engaging graphics of identity, layers of a person, etc.]\n", - "\n", - " Host Voiceover: \"Each effort towards understanding and embracing our true self draws us closer to the realization that we are eternal souls, having a human experience. This is the wisdom that can empower you to stand tall against the adversities of life.\"\n", - "\n", - " [Cut back to Host]\n", - "\n", - " Host: (Concluding) \"Thank you for joining me today in this exploration of Chapter 2, Verse 13 of the Bhagavad Gita. Remember, when you feel lost in the complexities of life, return to this teachings and remind yourself that you are not just a body; you are an eternal being on a magnificent journey.\n", - "\n", - " [Closing Scene - Uplifting Music Playing]\n", - "\n", - " Host: \"Don’t forget to like, share, and subscribe if you found resonance in this message. And share your thoughts in the comments below. What did you find most challenging in your own journey of self-identity? Let’s connect and support each other in our spiritual quests. Until next time, stay enlightened, stay inspired!\"\n", - "\n", - " [End Screen with Subscribe Button and Previous Video Suggestions]\n", - "\n", - " [End of Script]\n", - " \n" - ] - } - ], + "outputs": [], "source": [ "print(get_script_user_prompt('long','motivation'))" ] }, { "cell_type": "code", - "execution_count": 152, + "execution_count": null, "id": "1dfa60ce-9e88-4f7d-8e60-ac37a0aafc15", "metadata": {}, "outputs": [], @@ -447,96 +305,10 @@ }, { "cell_type": "code", - "execution_count": 153, + "execution_count": null, "id": "ec86c436-42ae-4313-b12f-4fad42ab2227", "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "[Opening Scene - Soft Instrumental Music Playing]\n", - "\n", - "[Cut to Host in a tranquil space, surrounded by nature, perhaps under a blossoming tree or near a peaceful body of water.]\n", - "\n", - "Host: (Smiling warmly) \"Namaste, dear souls! Welcome back to our spiritual journey. Today, we're diving into a powerful verse from the Bhagavad Gita—one that transcends time and speaks directly to the hearts of youth, seekers, and scholars alike. This wisdom offers clarity about our true identities amidst the chaos of life.\"\n", - "\n", - "[Text On Screen: Chapter 2, Verse 19 (2.19)]\n", - "\n", - "Host: (With a sense of reverence) \"Let’s immerse ourselves in the sacred words of this verse together:\n", - "\n", - "य एनं वेत्ति हन्तारं यश्चैनं वेत्ति हन्तकम्। \n", - "उभौ तौ न विजानीतो नायं हन्ति न हन्यते॥\n", - "\n", - "[Pause for the recitation to resonate with the audience]\n", - "\n", - "Host: (Calmly) \"This translates to: 'The one who kills, and the one who thinks he is killed, are both ignorant. The truth is, the soul can neither kill nor be killed.' \n", - "\n", - "Now, let's unpack this beautifully complex verse.\"\n", - "\n", - "[Cut to Graphic: Verse Translation with Key Concepts Highlighted]\n", - "\n", - "Host Voiceover: (Engaging and soothing tone) \"In this verse, Lord Krishna emphasizes the immortality of the soul. The physical body can undergo changes, but the true essence of who we are—our soul—is eternal and cannot be harmed. This understanding leads to profound peace and clarity.\"\n", - "\n", - "[Cut back to Host]\n", - "\n", - "Host: (Nodding thoughtfully) \"Why is this verse crucial for us, especially in challenging times? It invites us to reevaluate how we perceive life, relationships, and our fundamental identity. In moments of upheaval or sorrow, understanding this truth empowers us to rise above fear and despair.\"\n", - "\n", - "[Scene Transition - Gentle Music Playing]\n", - "\n", - "[Cut to a Story Animation - A young woman named Maya navigating through life’s challenges in a bustling city.]\n", - "\n", - "Host (Voiceover): \"Let me share a story that might resonate with many of you. This is Maya. Full of dreams and aspirations, she navigates her way through the tumultuous journey of life. \n", - "\n", - "(Visuals depict Maya juggling work pressure, academic stress, and societal expectations, feeling overwhelmed)\n", - "\n", - "As the years went by, Maya found herself caught in a web of expectations. She started questioning her choices, her worth, and—even more profound—her identity.\"\n", - "\n", - "[Cut back to Host, expressing empathy]\n", - "\n", - "Host: \"Sound familiar? This dilemma, of feeling lost and pressured, is something many of us face today, especially those of us who strive for purpose. It’s easy to think that our worth is attached to our achievements, our appearances, or the roles we play. Yet, the truth of the verse beckons us to look deeper.\"\n", - "\n", - "[Scene Transition - Soft Music Playing while Host meditates]\n", - "\n", - "Host: (Speaking gently) \"Take a moment to reflect: When you've faced hardship or heartbreak, did you allow those circumstances to define you? Or in moments of joy, do you believe that mere happiness captures your essence? Pondering these questions can help unveil the layers of our identity.\"\n", - "\n", - "[Cut to Visuals of Nature - flowing rivers, vibrant flowers, and changing landscapes]\n", - "\n", - "Host Voiceover: \"Nature constantly reminds us of this timeless truth—the ebb and flow, the birth and decay, each phase is crucial, yet none are the essence of nature itself. Like the seasons that come and go, our experiences are transient, yet our spirit remains unscathed.\"\n", - "\n", - "[Cut back to Host - Inviting and Warm Tone]\n", - "\n", - "Host: \"This wisdom affords us a liberating perspective: while life presents us with challenges, it is not those challenges that define us; rather, it is how we respond to them. Recognizing our eternal nature allows us to navigate life with grace and assurance.\"\n", - "\n", - "[Scene Transition - Inspiring Music Gently Builds]\n", - "\n", - "Host: (Passionately) \"Now, how do we embody this profound understanding? Here’s a simple yet powerful exercise: Each day, carve out a few moments to meditate on your immutable self. Reflect on how many layers of identity you wear that are tied to transient aspects of life—your career, your physical appearance, your relationships.\"\n", - "\n", - "[Cut to Host with a journal, jotting down insights]\n", - "\n", - "[Scene Transition - Editing Cues - Visual graphics demonstrating self-discovery, removing layers to reveal the core identity]\n", - "\n", - "Host Voiceover: \"Each time you peel back these layers, you're one step closer to understanding that beneath it all, your spirit is pure, untainted, and eternal. This wisdom is transformative; it empowers you to rise from the ashes of despair into the light of surrender and acceptance.\"\n", - "\n", - "[Cut back to Host]\n", - "\n", - "Host: (Concluding with warmth) \"Thank you for exploring Chapter 2, Verse 19 from the Bhagavad Gita with me today. Remember, in the grand tapestry of life, the threads of our experiences are important, yet it is the essence of our soul that is everlasting. When you feel entangled in life’s complexities, simply return to this truth: You are an eternal being experiencing the human journey.\"\n", - "\n", - "[Closing Scene - Uplifting Music Playing]\n", - "\n", - "Host: \"If this message resonated with you, don’t forget to like, share, and subscribe! And I encourage you to share in the comments below how you connect with your true self or any experiences that have challenged your identity. Together, let's support one another on this beautiful voyage of self-discovery. Until next time, stay enlightened, stay inspired!\"\n", - "\n", - "[End Screen with Subscribe Button and Previous Video Suggestions]\n", - "\n", - "[End of Script]" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "create_script('motivating','self-identity','long')" ] From 1f5afda37bec4293072897ab472c42ad81051843 Mon Sep 17 00:00:00 2001 From: Syed Abrar Ahmad Date: Sun, 10 Aug 2025 16:27:22 +0500 Subject: [PATCH 08/72] Added a new notebook for week 2 Exercise. --- .../week2_exercise_by_abrar.ipynb | 482 ++++++++++++++++++ 1 file changed, 482 insertions(+) create mode 100644 week2/community-contributions/week2_exercise_by_abrar.ipynb diff --git a/week2/community-contributions/week2_exercise_by_abrar.ipynb b/week2/community-contributions/week2_exercise_by_abrar.ipynb new file mode 100644 index 0000000..2c53738 --- /dev/null +++ b/week2/community-contributions/week2_exercise_by_abrar.ipynb @@ -0,0 +1,482 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "ddfa9ae6-69fe-444a-b994-8c4c5970a7ec", + "metadata": {}, + "source": [ + "# Project - Cricket Anaylyst AI Assistant\n", + "\n", + "Cricket Analyst AI Assistant is an intelligent tool that analyzes cricket data to compare players, evaluate performances across formats, and provide insightful statistics. It processes historical and recent match data to deliver easy-to-understand summaries, helping fans, analysts, and coaches make informed decisions." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8b50bbe2-c0b1-49c3-9a5c-1ba7efa2bcb4", + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "\n", + "import os\n", + "import json\n", + "from dotenv import load_dotenv\n", + "from openai import OpenAI\n", + "import gradio as gr\n", + "import speech_recognition as sr\n", + "import pandas as pd\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "747e8786-9da8-4342-b6c9-f5f69c2e22ae", + "metadata": {}, + "outputs": [], + "source": [ + "# Initialization\n", + "\n", + "load_dotenv(override=True)\n", + "\n", + "openai_api_key = os.getenv('OPENAI_API_KEY')\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", + "MODEL = \"gpt-4o-mini\"\n", + "openai = OpenAI()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0a521d84-d07c-49ab-a0df-d6451499ed97", + "metadata": {}, + "outputs": [], + "source": [ + "system_message = \"\"\"\n", + "You are a Cricket Analyst AI with deep knowledge of cricket statistics and match analysis.\n", + "When comparing players, call the `analyze_cricket` tool to get factual data before answering.\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d7be34a6-7288-43b0-ad4e-bbed836cb786", + "metadata": {}, + "outputs": [], + "source": [ + "# Sample cricket stats as a list of dicts\n", + "cricket_data = [\n", + " {\"Player\": \"Virat Kohli\", \"Format\": \"ODI\", \"Year\": 2023, \"Runs\": 1377, \"Matches\": 27, \"Average\": 57.37, \"StrikeRate\": 93.21},\n", + " {\"Player\": \"Virat Kohli\", \"Format\": \"ODI\", \"Year\": 2022, \"Runs\": 765, \"Matches\": 20, \"Average\": 42.50, \"StrikeRate\": 88.40},\n", + " {\"Player\": \"Virat Kohli\", \"Format\": \"ODI\", \"Year\": 2021, \"Runs\": 560, \"Matches\": 15, \"Average\": 40.00, \"StrikeRate\": 90.10},\n", + " {\"Player\": \"Babar Azam\", \"Format\": \"ODI\", \"Year\": 2023, \"Runs\": 1454, \"Matches\": 26, \"Average\": 62.00, \"StrikeRate\": 89.50},\n", + " {\"Player\": \"Babar Azam\", \"Format\": \"ODI\", \"Year\": 2022, \"Runs\": 1198, \"Matches\": 18, \"Average\": 66.55, \"StrikeRate\": 92.00},\n", + " {\"Player\": \"Babar Azam\", \"Format\": \"ODI\", \"Year\": 2021, \"Runs\": 949, \"Matches\": 15, \"Average\": 67.78, \"StrikeRate\": 90.50},\n", + "]" + ] + }, + { + "cell_type": "markdown", + "id": "36bedabf-a0a7-4985-ad8e-07ed6a55a3a4", + "metadata": {}, + "source": [ + "## Tools\n", + "\n", + "Tools starts from here. \n", + "For this notebook, I have just wrote one Tool, you can add multiple tools for your agent." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "46a0a260-b11b-4bde-ab80-911a81e2c281", + "metadata": {}, + "outputs": [], + "source": [ + "def analyze_cricket(data_list, player1, player2, match_format=\"ODI\", years=3):\n", + " \"\"\"\n", + " Compare two cricket players' performances using an in-memory list of dicts.\n", + " \"\"\"\n", + " print(\"Tool 'analyze_cricket' is called\")\n", + " df = pd.DataFrame(data_list)\n", + " latest_year = df['Year'].max()\n", + " min_year = latest_year - years + 1\n", + "\n", + " filtered = df[\n", + " (df['Format'].str.upper() == match_format.upper()) &\n", + " (df['Year'] >= min_year) &\n", + " (df['Player'].isin([player1, player2]))\n", + " ]\n", + " if filtered.empty:\n", + " return {\"error\": f\"No data found for {player1} and {player2} in {match_format} for last {years} years.\"}\n", + "\n", + " summary = filtered.groupby(\"Player\").agg({\n", + " \"Matches\": \"sum\",\n", + " \"Runs\": \"sum\",\n", + " \"Average\": \"mean\",\n", + " \"StrikeRate\": \"mean\"\n", + " }).round(2)\n", + "\n", + " return summary.reset_index().to_dict(orient=\"records\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cbfd413e-b5d4-42bd-b86f-ed9b4ee360eb", + "metadata": {}, + "outputs": [], + "source": [ + "# Example usage:\n", + "result = analyze_cricket(cricket_data, \"Virat Kohli\", \"Babar Azam\", \"ODI\", 3)\n", + "print(result)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c92699c1-802b-4948-a654-df89e0c19adb", + "metadata": {}, + "outputs": [], + "source": [ + "# Tool definition \n", + "analyze_cricket_functions = {\n", + " \"name\": \"analyze_cricket\",\n", + " \"description\": \"Compare two cricket players' performances over the last N years.\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"player1\": {\"type\": \"string\", \"description\": \"Name of first player\"},\n", + " \"player2\": {\"type\": \"string\", \"description\": \"Name of second player\"},\n", + " \"match_format\": {\"type\": \"string\", \"enum\": [\"ODI\", \"Test\", \"T20\"], \"description\": \"Format of the match\"},\n", + " \"years\": {\"type\": \"integer\", \"description\": \"Number of years to compare\"}\n", + " },\n", + " \"required\": [\"player1\", \"player2\"]\n", + " }\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bdca8679-935f-4e7f-97e6-e71a4d4f228c", + "metadata": {}, + "outputs": [], + "source": [ + "# And this is included in a list of tools:\n", + "\n", + "tools = [{\"type\": \"function\", \"function\": analyze_cricket_functions}]" + ] + }, + { + "cell_type": "markdown", + "id": "c3d3554f-b4e3-4ce7-af6f-68faa6dd2340", + "metadata": {}, + "source": [ + "## Getting OpenAI to use our Tool\n", + "\n", + "There's some fiddly stuff to allow OpenAI \"to call our tool\"\n", + "\n", + "What we actually do is give the LLM the opportunity to inform us that it wants us to run the tool.\n", + "\n", + "Here's how the new chat function looks:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ce9b0744-9c78-408d-b9df-9f6fd9ed78cf", + "metadata": {}, + "outputs": [], + "source": [ + "def chat(message, history):\n", + " messages = [{\"role\": \"system\", \"content\": system_message}] + history + [{\"role\": \"user\", \"content\": message}]\n", + " response = openai.chat.completions.create(model=MODEL, messages=messages, tools=tools)\n", + "\n", + " if response.choices[0].finish_reason==\"tool_calls\":\n", + " message = response.choices[0].message\n", + " response, player1, player2 = handle_tool_call(message)\n", + " messages.append(message)\n", + " messages.append(response)\n", + " response = openai.chat.completions.create(model=MODEL, messages=messages)\n", + " \n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b0992986-ea09-4912-a076-8e5603ee631f", + "metadata": {}, + "outputs": [], + "source": [ + "# We have to write that function handle_tool_call:\n", + "\n", + "def handle_tool_call(message):\n", + " tool_call = message.tool_calls[0]\n", + " print(\"tool_call.id\", tool_call.id)\n", + " arguments = json.loads(tool_call.function.arguments)\n", + " print(\"arguments\", arguments)\n", + " player1 = arguments.get('player1')\n", + " player2 = arguments.get('player2')\n", + " match_format = arguments.get('match_format', 'ODI')\n", + " years = arguments.get('years', 3)\n", + " result = analyze_cricket(cricket_data, player1, player2, match_format, years)\n", + " print(\"result from analyze_cricket function: \", result)\n", + " response = {\n", + " \"role\": \"tool\",\n", + " \"content\": json.dumps(result),\n", + " \"tool_call_id\": tool_call.id\n", + " }\n", + " return response, player1, player2" + ] + }, + { + "cell_type": "markdown", + "id": "924e7225-b76d-4518-abad-5bea5c356cf8", + "metadata": {}, + "source": [ + "# Sample User prompt\n", + "\n", + "1. ### Compare Babar and Virat in ODI matches over the last 3 years.\n", + "Here \n", + "Player1 is Babar\n", + "Player2 is Virat\n", + "match_format is ODI\n", + "years is 3\n", + "\n", + "\n", + "2. ### can you please give me the comparison of Virat and babar?\n", + "Here you are not provided the info of format and number of years. In this case, the function will pick the default values for the match format, which is ODI and years which is 3.\n", + "\n", + "\n", + "3. ### Compare Rizwan and Babar in ODI Matches over the last years.\n", + "The given data is not available in the above data list. \n", + "- **Output**: \n", + "It seems that I couldn't retrieve specific data for Mohammad Rizwan and Babar Azam in ODI matches over the last three years. However, I can provide a general comparison based on available statistics up to October 2023.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f4be8a71-b19e-4c2f-80df-f59ff2661f14", + "metadata": {}, + "outputs": [], + "source": [ + "gr.ChatInterface(fn=chat, type=\"messages\").launch()" + ] + }, + { + "cell_type": "markdown", + "id": "473e5b39-da8f-4db1-83ae-dbaca2e9531e", + "metadata": {}, + "source": [ + "# Let's go multi-modal!!\n", + "\n", + "We can use DALL-E-3, the image generation model behind GPT-4o, to make us some images\n", + "\n", + "Let's put this in a function called artist.\n", + "\n", + "### Price alert: each time I generate an image it costs about 4 cents - don't go crazy with images!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2c27c4ba-8ed5-492f-add1-02ce9c81d34c", + "metadata": {}, + "outputs": [], + "source": [ + "# Some imports for handling images\n", + "\n", + "import base64\n", + "from io import BytesIO\n", + "from PIL import Image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "773a9f11-557e-43c9-ad50-56cbec3a0f8f", + "metadata": {}, + "outputs": [], + "source": [ + "def artist(player1, player2):\n", + " return None\n", + " # image_response = openai.images.generate(\n", + " # model=\"dall-e-3\",\n", + " # prompt=f\"An image representing a comparison of {player1} and {player2}, showing their country flags and bowling or batting style\",\n", + " # size=\"1024x1024\",\n", + " # n=1,\n", + " # response_format=\"b64_json\",\n", + " # )\n", + " # image_base64 = image_response.data[0].b64_json\n", + " # image_data = base64.b64decode(image_base64)\n", + " # return Image.open(BytesIO(image_data))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d877c453-e7fb-482a-88aa-1a03f976b9e9", + "metadata": {}, + "outputs": [], + "source": [ + "image = artist(\"Babar\", \"Virat\")\n", + "display(image)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "728a12c5-adc3-415d-bb05-82beb73b079b", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ffbfe93b-5e86-4e68-ba71-b301cd5230db", + "metadata": {}, + "outputs": [], + "source": [ + "from pydub import AudioSegment\n", + "from pydub.playback import play\n", + "\n", + "def talker(message):\n", + " response = openai.audio.speech.create(\n", + " model=\"tts-1\",\n", + " voice=\"onyx\", # Also, try replacing onyx with alloy\n", + " input=message\n", + " )\n", + " \n", + " audio_stream = BytesIO(response.content)\n", + " audio = AudioSegment.from_file(audio_stream, format=\"mp3\")\n", + " play(audio)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b88d775d-d357-4292-a1ad-5dc5ed567281", + "metadata": {}, + "outputs": [], + "source": [ + "talker(\"Well, hi there\")" + ] + }, + { + "cell_type": "markdown", + "id": "1d48876d-c4fa-46a8-a04f-f9fadf61fb0d", + "metadata": {}, + "source": [ + "# Our Agent Framework\n", + "\n", + "The term 'Agentic AI' and Agentization is an umbrella term that refers to a number of techniques, such as:\n", + "\n", + "1. Breaking a complex problem into smaller steps, with multiple LLMs carrying out specialized tasks\n", + "2. The ability for LLMs to use Tools to give them additional capabilities\n", + "3. The 'Agent Environment' which allows Agents to collaborate\n", + "4. An LLM can act as the Planner, dividing bigger tasks into smaller ones for the specialists\n", + "5. The concept of an Agent having autonomy / agency, beyond just responding to a prompt - such as Memory\n", + "\n", + "We're showing 1 and 2 here, and to a lesser extent 3 and 5. In week 8 we will do the lot!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ba820c95-02f5-499e-8f3c-8727ee0a6c0c", + "metadata": {}, + "outputs": [], + "source": [ + "def chat(history):\n", + " messages = [{\"role\": \"system\", \"content\": system_message}] + history\n", + " response = openai.chat.completions.create(model=MODEL, messages=messages, tools=tools)\n", + " image = None\n", + " \n", + " if response.choices[0].finish_reason==\"tool_calls\":\n", + " message = response.choices[0].message\n", + " response, player1, player2 = handle_tool_call(message)\n", + " messages.append(message)\n", + " messages.append(response)\n", + " \n", + " image = artist(player1, player2) #QUERY: how can i pass the value of format_dropdown in this function? \n", + " \n", + " response = openai.chat.completions.create(model=MODEL, messages=messages)\n", + " \n", + " reply = response.choices[0].message.content\n", + " history += [{\"role\":\"assistant\", \"content\":reply}]\n", + "\n", + " # Comment out or delete the next line if you'd rather skip Audio for now..\n", + " talker(reply)\n", + " \n", + " return history, image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f38d0d27-33bf-4992-a2e5-5dbed973cde7", + "metadata": {}, + "outputs": [], + "source": [ + "# More involved Gradio code as we're not using the preset Chat interface!\n", + "# Passing in inbrowser=True in the last line will cause a Gradio window to pop up immediately.\n", + "\n", + "with gr.Blocks() as ui:\n", + " with gr.Row():\n", + " chatbot = gr.Chatbot(height=500, type=\"messages\")\n", + " image_output = gr.Image(height=500)\n", + "\n", + " with gr.Row(): #QUERY: How can I receive the value of \"Yes\" or \"No\" in chat function?\n", + " format_dropdown = gr.Dropdown(\n", + " choices=[\"Yes\", \"No\"],\n", + " label=\"Do you want image?\"\n", + " )\n", + " with gr.Row():\n", + " entry = gr.Textbox(label=\"Chat with our AI Assistant:\")\n", + " with gr.Row():\n", + " clear = gr.Button(\"Clear\")\n", + "\n", + " def do_entry(message, history):\n", + " history += [{\"role\": \"user\", \"content\": message}]\n", + " return \"\", history\n", + "\n", + " entry.submit(do_entry, inputs=[entry, chatbot, format_dropdown], outputs=[entry, chatbot]).then(\n", + " chat, inputs=chatbot, outputs=[chatbot, image_output]\n", + " ) #QUERY: This part is a little bit confusing for me.\n", + " clear.click(lambda: None, inputs=None, outputs=chatbot, queue=False)\n", + "\n", + "ui.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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 9112f629f25dc65c2bab22036d02a7e593fb3c9f Mon Sep 17 00:00:00 2001 From: vaishnavipalyam Date: Sun, 10 Aug 2025 17:17:31 +0530 Subject: [PATCH 09/72] Delete week1/day5_GitaScripting.ipynb --- week1/day5_GitaScripting.ipynb | 338 --------------------------------- 1 file changed, 338 deletions(-) delete mode 100644 week1/day5_GitaScripting.ipynb diff --git a/week1/day5_GitaScripting.ipynb b/week1/day5_GitaScripting.ipynb deleted file mode 100644 index 964b183..0000000 --- a/week1/day5_GitaScripting.ipynb +++ /dev/null @@ -1,338 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "7759922b-12c9-44e0-8ac3-5f2a02b321d7", - "metadata": {}, - "outputs": [], - "source": [ - "import fitz # PyMuPDF\n", - "import os\n", - "import requests\n", - "import json\n", - "from typing import List\n", - "from dotenv import load_dotenv\n", - "from IPython.display import Markdown, display, update_display\n", - "from openai import OpenAI" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a266273a-05e3-451e-a318-428726cfa39c", - "metadata": {}, - "outputs": [], - "source": [ - "# Initialize and constants\n", - "\n", - "load_dotenv(override=True)\n", - "api_key = os.getenv('OPENAI_API_KEY')\n", - "\n", - "if api_key and api_key.startswith('sk-proj-') and len(api_key)>10:\n", - " print(\"API key looks good so far\")\n", - "else:\n", - " print(\"There might be a problem with your API key? Please visit the troubleshooting notebook!\")\n", - " \n", - "MODEL = 'gpt-4o-mini'\n", - "openai = OpenAI()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "45566572-dd66-48dc-ab7b-6adbe26eacba", - "metadata": {}, - "outputs": [], - "source": [ - "exceptions = []" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "effc0e7b-d668-48b3-86d0-dbb5d8fe3d55", - "metadata": {}, - "outputs": [], - "source": [ - "# Building system prompt\n", - "def get_verse_system_prompt():\n", - " system_prompt = \"You are a spiritual student who classifies the versus of the BhagavadGita according to a given theme.\\n\"\n", - " system_prompt += \"Given a theme, you should pick a verse from any chapter and give it's location in the form of index chapter.verse_number (6.2)\\n\"\n", - " system_prompt += \"You should respond in JSON as in this example:\\n\"\n", - " system_prompt += \"\"\"\n", - " {\"title\": \"Chapter 3, Verse 21 (3.21)\", \"verse\": \"कर्मणा ह्यपि संसिद्धिम्‌\n", - " आस्थिता जनकादय:।\n", - " लोकसंग्रहमेवापि\n", - " सम्पश्यन्कर्तुमर्हसि॥\"}\n", - " \"\"\"\n", - " return system_prompt" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bbfb1035-b183-4481-9b49-3cc1b12b42e8", - "metadata": {}, - "outputs": [], - "source": [ - "print(get_verse_system_prompt())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6acdcd6c-1fc5-4c71-81d0-665e25808e46", - "metadata": {}, - "outputs": [], - "source": [ - "# Define user prompt\n", - "def get_verse_user_prompt(theme):\n", - " user_prompt = f'''\n", - " Here is the theme : {theme},\n", - " Please find a verse from BhagavadGita excluding {exceptions} for a given theme {theme}\n", - " '''#excluding those results which are already used\n", - " \n", - " user_prompt += \"If the verse is not in the exceptions for a given theme and used for a different theme, you are free to suggest it for a different theme.\"\n", - " return user_prompt" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "72f5c755-ec2d-4545-9a31-0f6b2e5ed4da", - "metadata": {}, - "outputs": [], - "source": [ - "print(get_verse_user_prompt('motivation'))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "304d432c-7216-4a90-a5d8-db36b193657d", - "metadata": {}, - "outputs": [], - "source": [ - "#Call openAI to return versus\n", - "def get_verses(theme):\n", - " response = openai.chat.completions.create(\n", - " model=MODEL,\n", - " messages=[\n", - " {\"role\": \"system\", \"content\": get_verse_system_prompt()},\n", - " {\"role\": \"user\", \"content\": get_verse_user_prompt(theme)}\n", - " ],\n", - " response_format={\"type\": \"json_object\"}\n", - " )\n", - " result = response.choices[0].message.content\n", - " result = json.loads(result)\n", - "\n", - " #Remember those results which are suggested now\n", - " combination = (theme, result['title'])\n", - " exceptions.append(combination)\n", - " return result" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b90eeb35-e10e-48ee-ade6-e0594da8c51b", - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "print(get_verses('motivation'))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b5b8925e-52e4-4cb7-9205-51c65ed88fb8", - "metadata": {}, - "outputs": [], - "source": [ - "# So far we have fetched the new verses relevant to a given theme \n", - "# Lets generate a script for producting youtube video" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8ff0862b-0310-4174-ad12-64047932dc9e", - "metadata": {}, - "outputs": [], - "source": [ - "#def function for system prompt\n", - "def get_script_system_prompt(tone, theme, format):\n", - " sys_prompt = 'You are a script writer for a youtube spiritual channel\\n'\n", - " sys_prompt += 'You are given a verse like below: \\n'\n", - " sys_prompt += str(get_verses(theme))\n", - " sys_prompt += '\\n'\n", - " sys_prompt += f'Give me an engaging script in a {tone} tone for a {format} format video for audience like youth seeking purpose, spiritual seekers, indians abroad, scholars and curious minds.'\n", - "\n", - " return sys_prompt" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "47476516-cd2f-4b16-b378-a70617bbe284", - "metadata": {}, - "outputs": [], - "source": [ - "print(get_script_system_prompt('Motivating','motivation','long'))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e305525b-8dde-4e93-927a-e24531827498", - "metadata": {}, - "outputs": [], - "source": [ - "# def function for user prompt\n", - "def get_script_user_prompt(format, theme):\n", - " user_prompt = f'Given the verse, help me generate a detailed script suitable for {format} format video.\\n'\n", - " user_prompt += f'Please give me the complete verse, its meaning, a relevant story having a dilemma which the verse solves and the interpretation of the verse with respect to {theme}.\\n'\n", - " user_prompt += 'Let the script give cues about video editing, host actions.'\n", - " user_prompt += 'given the below example, please follow the format:\\n'\n", - " user_prompt += \"\"\"\n", - " [Opening Scene - Soft Instrumental Music Playing]\n", - "\n", - " [Cut to Host in a serene setting, perhaps by a river or in a lush green garden.]\n", - "\n", - " Host: (Smiling at the camera) \"Namaste, dear viewers! Welcome back to our channel, where we explore the depths of spirituality and seek to ignite the flame of wisdom within you. Today, we delve into a profound verse from the Bhagavad Gita that speaks to the very essence of life and identity.\"\n", - "\n", - " [Text On Screen: Chapter 2, Verse 13 (2.13)]\n", - "\n", - " Host: (With a sense of reverence) \"Let’s first take a moment to recite this verse together. It goes like this:\n", - "\n", - " देहिनोऽस्मिन्न्यथा देहे कौमारं यौवनं जरा।\n", - " तथादेहान्तरप्राप्तिर्धीरस्तत्र न मुह्यति॥\n", - "\n", - " Now, let’s understand the essence of this verse.\"\n", - "\n", - " [Cut to Graphic: Verse Translation with Key Concepts Highlighted]\n", - "\n", - " Host Voiceover: (Calm and engaging tone) \"The meaning of this beautiful verse translates to: 'Just as the body undergoes changes from childhood to old age, similarly, the soul transitions from one body to another. The wise, who understand this, are never bewildered by these changes.'\n", - "\n", - " [Cut back to Host]\n", - "\n", - " Host: (Nodding, creating a connection)\n", - " \"So, why is this verse so important, especially for us as young seekers of purpose? It highlights a profound truth—that our identities are not confined by our physical forms or the stages of life we experience. Instead, we are eternal beings who are constantly evolving.\"\n", - "\n", - " [Scene Transition - Soft Music Playing]\n", - "\n", - " [Cut to a Story Animation - A young man named Arjun in a busy city]\n", - "\n", - " Host (Voiceover): \"Let me share a relatable story. Meet Arjun. Like many of us, he was once full of dreams and aspirations. He excelling in school, pursuing a career in engineering. But as the years passed, he faced a crossroads. As the pressure mounted, he began to question his identity.\n", - "\n", - " (Visuals show Arjun overwhelmed by societal expectations, with people pushing him in different directions.)\n", - "\n", - " He felt distinct phases of life pulling at him: childhood dreams, youthful ambitions, and the looming responsibilities of adulthood. The changing seasons of his life left him confused and wondering if he had lost his true self.\"\n", - "\n", - " [Cut back to Host, empathetic tone]\n", - "\n", - " Host: \"Have you ever felt like Arjun? It’s a dilemma we all face, especially in today's fast-paced world where expectations can cloud our true identity. But just like our verse suggests, we should recognize that these changes don’t define us. They are simply part of the journey.\"\n", - "\n", - " [Scene Transition - Calm Music Playing while Host meditates]\n", - "\n", - " Host: (Speaking gently) \"Let’s take a moment to reflect. When we are sad, does that sadness define us? Or when we achieve success, do we become defined solely by that success? The answer isn't as straightforward as it seems. Here’s the catch: our essence is beyond these transient states. Like the body, our identities are fluid.\"\n", - "\n", - " [Cut to Visuals of Nature - flowing rivers, trees shedding leaves, etc.]\n", - "\n", - " Host Voiceover: \"Imagine the endless cycle of nature—the changing seasons, the growth, the decay, and rebirth. Just like the leaves that drop to make way for new growth, our experiences contribute to our spiritual evolution.\"\n", - "\n", - " [Cut back to Host - Inviting and Warm Tone]\n", - "\n", - " Host: \"Just as the wise who understand the transformation of the soul remain unshaken, we, too, can cultivate that wisdom to rise above the chaos of change. Recognize your true essence—beyond the body, the roles, the titles. Understand that your spirit is eternal.\"\n", - "\n", - " [Scene Transition - Soft Inspirational Music Begins]\n", - "\n", - " Host: (Passionately) \"So how can we embody this truth in our daily lives? Here’s a small exercise: Each day, take a few moments to meditate on who you really are. Write down what aspects of your identity are tied to transient things. Challenge yourself—what happens when you peel these layers away?\"\n", - "\n", - " [Cut to host with a pad, writing ideas]\n", - "\n", - " [Scene Transition - Editing Cues - Show engaging graphics of identity, layers of a person, etc.]\n", - "\n", - " Host Voiceover: \"Each effort towards understanding and embracing our true self draws us closer to the realization that we are eternal souls, having a human experience. This is the wisdom that can empower you to stand tall against the adversities of life.\"\n", - "\n", - " [Cut back to Host]\n", - "\n", - " Host: (Concluding) \"Thank you for joining me today in this exploration of Chapter 2, Verse 13 of the Bhagavad Gita. Remember, when you feel lost in the complexities of life, return to this teachings and remind yourself that you are not just a body; you are an eternal being on a magnificent journey.\n", - "\n", - " [Closing Scene - Uplifting Music Playing]\n", - "\n", - " Host: \"Don’t forget to like, share, and subscribe if you found resonance in this message. And share your thoughts in the comments below. What did you find most challenging in your own journey of self-identity? Let’s connect and support each other in our spiritual quests. Until next time, stay enlightened, stay inspired!\"\n", - "\n", - " [End Screen with Subscribe Button and Previous Video Suggestions]\n", - "\n", - " [End of Script]\n", - " \"\"\"\n", - " \n", - " return user_prompt" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c4b29cb9-d8d1-413a-8152-4250e2430a42", - "metadata": {}, - "outputs": [], - "source": [ - "print(get_script_user_prompt('long','motivation'))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1dfa60ce-9e88-4f7d-8e60-ac37a0aafc15", - "metadata": {}, - "outputs": [], - "source": [ - "def create_script(tone, theme, format):\n", - " response = openai.chat.completions.create(\n", - " model=MODEL,\n", - " messages=[\n", - " {\"role\": \"system\", \"content\": get_script_system_prompt(tone,theme,format)},\n", - " {\"role\": \"user\", \"content\": get_script_user_prompt(format,theme)}\n", - " ],\n", - " )\n", - " result = response.choices[0].message.content\n", - " display(Markdown(result))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ec86c436-42ae-4313-b12f-4fad42ab2227", - "metadata": {}, - "outputs": [], - "source": [ - "create_script('motivating','self-identity','long')" - ] - } - ], - "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.13" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} From efcd9af9afe3be43df85438e3bef188679a39c12 Mon Sep 17 00:00:00 2001 From: Elijah Rwothoromo Date: Sun, 10 Aug 2025 22:53:28 +0300 Subject: [PATCH 10/72] Update day5 --- .../rwothoromo/day5.ipynb | 698 ++++++++++++++++++ .../rwothoromo/week2 EXERCISE.ipynb | 51 ++ 2 files changed, 749 insertions(+) create mode 100644 week2/community-contributions/rwothoromo/day5.ipynb create mode 100644 week2/community-contributions/rwothoromo/week2 EXERCISE.ipynb diff --git a/week2/community-contributions/rwothoromo/day5.ipynb b/week2/community-contributions/rwothoromo/day5.ipynb new file mode 100644 index 0000000..f591fa9 --- /dev/null +++ b/week2/community-contributions/rwothoromo/day5.ipynb @@ -0,0 +1,698 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "ddfa9ae6-69fe-444a-b994-8c4c5970a7ec", + "metadata": {}, + "source": [ + "# Project - Airline AI Assistant\n", + "\n", + "We'll now bring together what we've learned to make an AI Customer Support assistant for an Airline" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8b50bbe2-c0b1-49c3-9a5c-1ba7efa2bcb4", + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "\n", + "import os, json, gradio as gr\n", + "from dotenv import load_dotenv\n", + "from openai import OpenAI" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "747e8786-9da8-4342-b6c9-f5f69c2e22ae", + "metadata": {}, + "outputs": [], + "source": [ + "# Initialization\n", + "\n", + "load_dotenv(override=True)\n", + "\n", + "openai_api_key = os.getenv('OPENAI_API_KEY')\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", + "MODEL = \"gpt-4o-mini\"\n", + "openai = OpenAI()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0a521d84-d07c-49ab-a0df-d6451499ed97", + "metadata": {}, + "outputs": [], + "source": [ + "system_message = \"You are a helpful assistant for an Airline called FlightAI. \"\n", + "system_message += \"Give short, courteous answers, no more than 1 sentence. \"\n", + "system_message += \"Always be accurate. If you don't know the answer, say so.\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "61a2a15d-b559-4844-b377-6bd5cb4949f6", + "metadata": {}, + "outputs": [], + "source": [ + "# Just take in history\n", + "def chat(history):\n", + " message = history[-1][\"content\"] # Get the last message from the user\n", + " messages = [{\"role\": \"system\", \"content\": system_message}] + history + [{\"role\": \"user\", \"content\": message}]\n", + " response = openai.chat.completions.create(model=MODEL, messages=messages, tools=tools)\n", + "\n", + " if response.choices[0].finish_reason==\"tool_calls\":\n", + " message = response.choices[0].message\n", + " response_tool, city = handle_tool_call(message)\n", + " messages.append(message)\n", + " messages.append(response_tool)\n", + " image = artist(city)\n", + " response = openai.chat.completions.create(model=MODEL, messages=messages)\n", + "\n", + "\n", + " # After getting the final response from OpenAI\n", + " final_response_content = response.choices[0].message.content\n", + " history.append({\"role\": \"assistant\", \"content\": final_response_content})\n", + "\n", + " # The return value should be a tuple of (history, image)\n", + " return history, image\n", + "\n", + "# gr.ChatInterface(fn=chat, type=\"messages\").launch()" + ] + }, + { + "cell_type": "markdown", + "id": "36bedabf-a0a7-4985-ad8e-07ed6a55a3a4", + "metadata": {}, + "source": [ + "## Tools\n", + "\n", + "Tools are an incredibly powerful feature provided by the frontier LLMs.\n", + "\n", + "With tools, you can write a function, and have the LLM call that function as part of its response.\n", + "\n", + "Sounds almost spooky.. we're giving it the power to run code on our machine?\n", + "\n", + "Well, kinda." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0696acb1-0b05-4dc2-80d5-771be04f1fb2", + "metadata": {}, + "outputs": [], + "source": [ + "# Let's start by making a useful function\n", + "\n", + "ticket_prices = {\"london\": \"$799\", \"paris\": \"$899\", \"tokyo\": \"$1400\", \"berlin\": \"$499\"}\n", + "\n", + "def get_ticket_price(destination_city):\n", + " print(f\"Tool get_ticket_price called for {destination_city}\")\n", + " city = destination_city.lower()\n", + " return ticket_prices.get(city, \"Unknown\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "80ca4e09-6287-4d3f-997d-fa6afbcf6c85", + "metadata": {}, + "outputs": [], + "source": [ + "# get_ticket_price(\"London\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4afceded-7178-4c05-8fa6-9f2085e6a344", + "metadata": {}, + "outputs": [], + "source": [ + "# There's a particular dictionary structure that's required to describe our function:\n", + "\n", + "price_function = {\n", + " \"name\": \"get_ticket_price\",\n", + " \"description\": \"Get the price of a return ticket to the destination city. Call this whenever you need to know the ticket price, for example when a customer asks 'How much is a ticket to this city'\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"destination_city\": {\n", + " \"type\": \"string\",\n", + " \"description\": \"The city that the customer wants to travel to\",\n", + " },\n", + " },\n", + " \"required\": [\"destination_city\"],\n", + " \"additionalProperties\": False\n", + " }\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bdca8679-935f-4e7f-97e6-e71a4d4f228c", + "metadata": {}, + "outputs": [], + "source": [ + "# And this is included in a list of tools:\n", + "\n", + "tools = [{\"type\": \"function\", \"function\": price_function}]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "83070cc0-b213-4309-8040-b0cc8390b64b", + "metadata": {}, + "outputs": [], + "source": [ + "# Simulate the booking process by simply returning a confirmation string.\n", + "\n", + "def book_flight(destination_city, number_of_passengers, booking_date):\n", + " \"\"\"\n", + " Simulates booking a flight.\n", + " \"\"\"\n", + " print(f\"Tool book_flight called for {destination_city} for {number_of_passengers} passengers on {booking_date}\")\n", + " return f\"Your booking to {destination_city} for {number_of_passengers} passengers on {booking_date} has been confirmed. Your booking reference is BKG-{hash(destination_city + str(number_of_passengers) + str(booking_date))}\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "781786f0-7106-4b10-89d7-453a0d10d204", + "metadata": {}, + "outputs": [], + "source": [ + "# Tool definition for book_flight\n", + "\n", + "booking_function = {\n", + " \"name\": \"book_flight\",\n", + " \"description\": \"Books a flight for a customer. Call this whenever a customer asks to book a flight.\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"destination_city\": {\n", + " \"type\": \"string\",\n", + " \"description\": \"The city the customer wants to fly to.\"\n", + " },\n", + " \"number_of_passengers\": {\n", + " \"type\": \"integer\",\n", + " \"description\": \"The number of passengers for the booking.\"\n", + " },\n", + " \"booking_date\": {\n", + " \"type\": \"string\",\n", + " \"description\": \"The date of the flight booking in YYYY-MM-DD format.\"\n", + " }\n", + " },\n", + " \"required\": [\"destination_city\", \"number_of_passengers\", \"booking_date\"],\n", + " \"additionalProperties\": False\n", + " }\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e3fc237c-9721-4fee-a56b-2ff12fc98e27", + "metadata": {}, + "outputs": [], + "source": [ + "# Add the new booking_function to the existing tools list.\n", + "\n", + "tools.append({\"type\": \"function\", \"function\": booking_function})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a482eb03-188a-4526-8acf-3a1fe96aaaf0", + "metadata": {}, + "outputs": [], + "source": [ + "# To translate to a given language\n", + "\n", + "def translate_text(text, target_language):\n", + " \"\"\"\n", + " Translates text to a specified language.\n", + " \n", + " Args:\n", + " text (str): The text to translate.\n", + " target_language (str): The language to translate the text into.\n", + " \n", + " Returns:\n", + " str: The translated text or an error message.\n", + " \"\"\"\n", + " print(f\"Tool translate_text called to translate to {target_language}\")\n", + " \n", + " # Use a system prompt to instruct the model to perform a translation\n", + " system_prompt_for_language = f\"You are a helpful translation assistant. Translate the following text into {target_language}. Only provide the translated text without any additional conversational text.\"\n", + " \n", + " try:\n", + " response = openai.chat.completions.create(\n", + " model=MODEL,\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt_for_language},\n", + " {\"role\": \"user\", \"content\": text}\n", + " ],\n", + " )\n", + " result = response.choices[0].message.content\n", + " return result\n", + " \n", + " except Exception as e:\n", + " print(f\"Error during translation: {e}\")\n", + " return \"Sorry, I encountered an error and could not complete the translation.\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "756e9859-94bc-4cef-bbc7-070d8ef6164b", + "metadata": {}, + "outputs": [], + "source": [ + "# Tool definition for translate_text\n", + "\n", + "translation_function = {\n", + " \"name\": \"translate_text\",\n", + " \"description\": \"Translates a given text to a specified target language. Call this whenever a customer asks for a translation.\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"text\": {\n", + " \"type\": \"string\",\n", + " \"description\": \"The text to be translated.\"\n", + " },\n", + " \"target_language\": {\n", + " \"type\": \"string\",\n", + " \"description\": \"The language to translate the text into (e.g., 'French', 'Spanish', 'Swahili').\"\n", + " }\n", + " },\n", + " \"required\": [\"text\", \"target_language\"],\n", + " \"additionalProperties\": False\n", + " }\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5444455e-6e5c-4ef6-bd39-5ff01731dd4b", + "metadata": {}, + "outputs": [], + "source": [ + "# Integrate the tool\n", + "\n", + "tools.append({\"type\": \"function\", \"function\": translation_function})" + ] + }, + { + "cell_type": "markdown", + "id": "c3d3554f-b4e3-4ce7-af6f-68faa6dd2340", + "metadata": {}, + "source": [ + "## Getting OpenAI to use our Tool\n", + "\n", + "There's some fiddly stuff to allow OpenAI \"to call our tool\"\n", + "\n", + "What we actually do is give the LLM the opportunity to inform us that it wants us to run the tool.\n", + "\n", + "Here's how the new chat function looks:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ce9b0744-9c78-408d-b9df-9f6fd9ed78cf", + "metadata": {}, + "outputs": [], + "source": [ + "def chat(message, history):\n", + " messages = [{\"role\": \"system\", \"content\": system_message}] + history + [{\"role\": \"user\", \"content\": message}]\n", + " response = openai.chat.completions.create(model=MODEL, messages=messages, tools=tools)\n", + "\n", + " if response.choices[0].finish_reason==\"tool_calls\":\n", + " message = response.choices[0].message\n", + " response, city = handle_tool_call(message)\n", + " messages.append(message)\n", + " messages.append(response)\n", + " response = openai.chat.completions.create(model=MODEL, messages=messages)\n", + " \n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b0992986-ea09-4912-a076-8e5603ee631f", + "metadata": {}, + "outputs": [], + "source": [ + "# We have to write that function handle_tool_call:\n", + "\n", + "# Handle multiple tools\n", + "def handle_tool_call(message):\n", + " tool_call = message.tool_calls[0]\n", + " function_name = tool_call.function.name\n", + " arguments = json.loads(tool_call.function.arguments)\n", + "\n", + " destination_city = None\n", + " translated_text = None\n", + "\n", + " if function_name == \"get_ticket_price\":\n", + " city = arguments.get('destination_city')\n", + " price = get_ticket_price(city)\n", + " response_content = json.dumps({\"destination_city\": city, \"price\": price})\n", + " destination_city = city\n", + " elif function_name == \"book_flight\":\n", + " destination_city = arguments.get('destination_city')\n", + " number_of_passengers = arguments.get('number_of_passengers')\n", + " booking_date = arguments.get('booking_date')\n", + " confirmation = book_flight(destination_city, number_of_passengers, booking_date)\n", + " response_content = json.dumps({\"confirmation_message\": confirmation})\n", + " elif function_name == \"translate_text\":\n", + " text = arguments.get('text')\n", + " target_language = arguments.get('target_language')\n", + " translated_text = translate_text(text, target_language)\n", + " response_content = json.dumps({\"translated_text\": translated_text})\n", + " else:\n", + " response_content = json.dumps({\"error\": f\"Unknown tool: {function_name}\"})\n", + "\n", + " response = {\n", + " \"role\": \"tool\",\n", + " \"content\": response_content,\n", + " \"tool_call_id\": tool_call.id\n", + " }\n", + " return response, destination_city" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f4be8a71-b19e-4c2f-80df-f59ff2661f14", + "metadata": {}, + "outputs": [], + "source": [ + "# gr.ChatInterface(fn=chat, type=\"messages\").launch()" + ] + }, + { + "cell_type": "markdown", + "id": "473e5b39-da8f-4db1-83ae-dbaca2e9531e", + "metadata": {}, + "source": [ + "# Let's go multi-modal!!\n", + "\n", + "We can use DALL-E-3, the image generation model behind GPT-4o, to make us some images\n", + "\n", + "Let's put this in a function called artist.\n", + "\n", + "### Price alert: each time I generate an image it costs about 4 cents - don't go crazy with images!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2c27c4ba-8ed5-492f-add1-02ce9c81d34c", + "metadata": {}, + "outputs": [], + "source": [ + "# Some imports for handling images\n", + "\n", + "import base64\n", + "from io import BytesIO\n", + "from PIL import Image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "773a9f11-557e-43c9-ad50-56cbec3a0f8f", + "metadata": {}, + "outputs": [], + "source": [ + "def artist(city):\n", + " image_response = openai.images.generate(\n", + " model=\"dall-e-3\",\n", + " prompt=f\"An image representing a vacation in {city}, showing tourist spots and everything unique about {city}, in a vibrant pop-art style\",\n", + " size=\"1024x1024\",\n", + " n=1,\n", + " response_format=\"b64_json\",\n", + " )\n", + " image_base64 = image_response.data[0].b64_json\n", + " image_data = base64.b64decode(image_base64)\n", + " return Image.open(BytesIO(image_data))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d877c453-e7fb-482a-88aa-1a03f976b9e9", + "metadata": {}, + "outputs": [], + "source": [ + "# image = artist(\"New York City\")\n", + "# display(image)" + ] + }, + { + "cell_type": "markdown", + "id": "f4975b87-19e9-4ade-a232-9b809ec75c9a", + "metadata": {}, + "source": [ + "## Audio (NOTE - Audio is optional for this course - feel free to skip Audio if it causes trouble!)\n", + "\n", + "And let's make a function talker that uses OpenAI's speech model to generate Audio\n", + "\n", + "### Troubleshooting Audio issues\n", + "\n", + "If you have any problems running this code below (like a FileNotFound error, or a warning of a missing package), you may need to install FFmpeg, a very popular audio utility.\n", + "\n", + "**For Mac Users**\n", + "\n", + "1. Install homebrew if you don't have it already by running this in a Terminal window and following any instructions: \n", + "`/bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\"`\n", + "\n", + "2. Then install FFmpeg with `brew install ffmpeg`\n", + "\n", + "3. Verify your installation with `ffmpeg -version` and if everything is good, within Jupyter Lab do Kernel -> Restart kernel to pick up the changes\n", + "\n", + "Message me or email me at ed@edwarddonner.com with any problems!" + ] + }, + { + "cell_type": "markdown", + "id": "4cc90e80-c96e-4dd4-b9d6-386fe2b7e797", + "metadata": {}, + "source": [ + "## To check you now have ffmpeg and can access it here\n", + "\n", + "Excecute the next cell to see if you get a version number. (Putting an exclamation mark before something in Jupyter Lab tells it to run it as a terminal command rather than python code).\n", + "\n", + "If this doesn't work, you may need to actually save and close down your Jupyter lab, and start it again from a new Terminal window (Mac) or Anaconda prompt (PC), remembering to activate the llms environment. This ensures you pick up ffmpeg.\n", + "\n", + "And if that doesn't work, please contact me!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7b3be0fb-1d34-4693-ab6f-dbff190afcd7", + "metadata": {}, + "outputs": [], + "source": [ + "!ffmpeg -version\n", + "!ffprobe -version\n", + "!ffplay -version" + ] + }, + { + "cell_type": "markdown", + "id": "d91d3f8f-e505-4e3c-a87c-9e42ed823db6", + "metadata": {}, + "source": [ + "# For Mac users - and possibly many PC users too\n", + "\n", + "This version should work fine for you. It might work for Windows users too, but you might get a Permissions error writing to a temp file. If so, see the next section!\n", + "\n", + "As always, if you have problems, please contact me! (You could also comment out the audio talker() in the later code if you're less interested in audio generation)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ffbfe93b-5e86-4e68-ba71-b301cd5230db", + "metadata": {}, + "outputs": [], + "source": [ + "from pydub import AudioSegment\n", + "from pydub.playback import play\n", + "\n", + "def talker(message):\n", + " response = openai.audio.speech.create(\n", + " model=\"tts-1\",\n", + " voice=\"alloy\", # Also, try replacing onyx with alloy\n", + " input=message\n", + " )\n", + " \n", + " audio_stream = BytesIO(response.content)\n", + " audio = AudioSegment.from_file(audio_stream, format=\"mp3\")\n", + " play(audio)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b88d775d-d357-4292-a1ad-5dc5ed567281", + "metadata": {}, + "outputs": [], + "source": [ + "# talker(\"Well, hi there\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f38d0d27-33bf-4992-a2e5-5dbed973cde7", + "metadata": {}, + "outputs": [], + "source": [ + "# More involved Gradio code as we're not using the preset Chat interface!\n", + "# Passing in inbrowser=True in the last line will cause a Gradio window to pop up immediately.\n", + "\n", + "with gr.Blocks() as ui:\n", + " with gr.Row():\n", + " chatbot = gr.Chatbot(height=500)\n", + " image = gr.Image(height=500)\n", + " with gr.Row():\n", + " entry = gr.Textbox(label=\"Chat with our AI Assistant:\")\n", + " with gr.Row():\n", + " languages = [\"English\", \"Swahili\", \"French\", \"Chinese\", \"German\"]\n", + " language_dropdown = gr.Dropdown(\n", + " label=\"Select a language for translation\",\n", + " choices=languages,\n", + " value=languages[0] # Default to English\n", + " )\n", + "\n", + " audio_options = [\"Yes\", \"No\"]\n", + " audio_dropdown = gr.Dropdown(\n", + " label=\"Select whether to respond with audio\",\n", + " choices=audio_options,\n", + " value=audio_options[1] # Default to No\n", + " )\n", + " \n", + " with gr.Row():\n", + " clear = gr.Button(\"Clear\")\n", + "\n", + " def user_message_updater(user_message, history):\n", + " return \"\", history + [[user_message, None]]\n", + "\n", + " def chat_with_assistant(history, target_language, audio_response):\n", + " message = history[-1][0] # Get the user's message from the last list in history\n", + " \n", + " # Use the existing chat logic\n", + " messages = [{\"role\": \"system\", \"content\": system_message}]\n", + " for msg_user, msg_assistant in history:\n", + " messages.append({\"role\": \"user\", \"content\": msg_user})\n", + " if msg_assistant:\n", + " messages.append({\"role\": \"assistant\", \"content\": msg_assistant})\n", + " \n", + " response = openai.chat.completions.create(model=MODEL, messages=messages, tools=tools)\n", + " \n", + " if response.choices[0].finish_reason==\"tool_calls\":\n", + " message = response.choices[0].message\n", + " response_tool, city = handle_tool_call(message)\n", + "\n", + " messages.append(message.model_dump()) # Append message as a dictionary using .model_dump()\n", + " messages.append(response_tool)\n", + " \n", + " response = openai.chat.completions.create(model=MODEL, messages=messages)\n", + " \n", + " \n", + " final_response_content = response.choices[0].message.content\n", + " history[-1][1] = final_response_content # Update the last message with the assistant's reply\n", + "\n", + " if target_language != \"English\": # Assuming \"English\" is the default and no translation is needed\n", + " translated_response = translate_text(final_response_content, target_language)\n", + " final_response_content = translated_response\n", + "\n", + " history[-1][1] = final_response_content\n", + "\n", + " if audio_response != \"No\":\n", + " talker(final_response_content)\n", + "\n", + " return history, None # Return a tuple of (the updated history, an empty image)\n", + "\n", + " entry.submit(\n", + " user_message_updater,\n", + " inputs=[entry, chatbot],\n", + " outputs=[entry, chatbot],\n", + " queue=False\n", + " ).then(\n", + " chat_with_assistant, \n", + " inputs=[chatbot, language_dropdown, audio_dropdown],\n", + " outputs=[chatbot, image]\n", + " )\n", + " \n", + " clear.click(lambda: None, inputs=None, outputs=[chatbot, image], queue=False)\n", + "\n", + "ui.launch(inbrowser=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26ab4bd7-b7c4-4e1c-aa51-578326660370", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69a51144-0e51-4bbf-b5d0-a9e0a60d05ae", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "39144b88-fc11-4156-84f9-d9157ddaec47", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/week2/community-contributions/rwothoromo/week2 EXERCISE.ipynb b/week2/community-contributions/rwothoromo/week2 EXERCISE.ipynb new file mode 100644 index 0000000..bebf2cd --- /dev/null +++ b/week2/community-contributions/rwothoromo/week2 EXERCISE.ipynb @@ -0,0 +1,51 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "d006b2ea-9dfe-49c7-88a9-a5a0775185fd", + "metadata": {}, + "source": [ + "# Additional End of week Exercise - week 2\n", + "\n", + "Now use everything you've learned from Week 2 to build a full prototype for the technical question/answerer you built in Week 1 Exercise.\n", + "\n", + "This should include a Gradio UI, streaming, use of the system prompt to add expertise, and the ability to switch between models. Bonus points if you can demonstrate use of a tool!\n", + "\n", + "If you feel bold, see if you can add audio input so you can talk to it, and have it respond with audio. ChatGPT or Claude can help you, or email me if you have questions.\n", + "\n", + "I will publish a full solution here soon - unless someone beats me to it...\n", + "\n", + "There are so many commercial applications for this, from a language tutor, to a company onboarding solution, to a companion AI to a course (like this one!) I can't wait to see your results." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a07e7793-b8f5-44f4-aded-5562f633271a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From f38c06c852476b08958acd023c7cb7bdef0bd4bc Mon Sep 17 00:00:00 2001 From: bharathchandrareddy Date: Sun, 10 Aug 2025 16:27:57 -0500 Subject: [PATCH 11/72] added my contributions to community- contibutions --- .../Business_Use_Case_Resume_Upgrader.ipynb | 179 ++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 week1/community-contributions/Business_Use_Case_Resume_Upgrader.ipynb diff --git a/week1/community-contributions/Business_Use_Case_Resume_Upgrader.ipynb b/week1/community-contributions/Business_Use_Case_Resume_Upgrader.ipynb new file mode 100644 index 0000000..173dafd --- /dev/null +++ b/week1/community-contributions/Business_Use_Case_Resume_Upgrader.ipynb @@ -0,0 +1,179 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "606e9c73-50fe-46b9-8df3-ae2246c00a3e", + "metadata": {}, + "source": [ + "# Business Use Case - LLM based Resume Upgrader" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "919f6546-80ec-4d4c-8a80-00228f50e4a0", + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "\n", + "import os\n", + "from openai import OpenAI\n", + "from dotenv import load_dotenv\n", + "from IPython.display import Markdown, display" + ] + }, + { + "cell_type": "markdown", + "id": "b2f5b02c-f782-4578-8a91-07891c39ceb0", + "metadata": {}, + "source": [ + "steps to perform\n", + "-> load API key from env file\n", + "-> create a function to call llm api\n", + "-> create messages for system prompt and user prompt\n", + "-> display the llm output" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "31aaa20e-4996-43cb-b43a-a1aef80fd391", + "metadata": {}, + "outputs": [], + "source": [ + "load_dotenv()\n", + "api_key = os.getenv('OPENAI_API_KEY')\n", + "# error handling\n", + "\n", + "if not api_key:\n", + " print(\"No API key was found - please head over to the troubleshooting notebook in this folder to identify & fix!\")\n", + "elif not api_key.startswith(\"sk-proj-\"):\n", + " print(\"An API key was found, but it doesn't start sk-proj-; please check you're using the right key - see troubleshooting notebook\")\n", + "elif api_key.strip() != api_key:\n", + " print(\"An API key was found, but it looks like it might have space or tab characters at the start or end - please remove them - see troubleshooting notebook\")\n", + "else:\n", + " print(\"API key found and looks good so far!\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "92f65c91-ca7f-47e6-9fd7-d63b278ba264", + "metadata": {}, + "outputs": [], + "source": [ + "openai = OpenAI()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "98fc7bac-07c8-4801-9225-8f843837f3c2", + "metadata": {}, + "outputs": [], + "source": [ + "# system prompt\n", + "\n", + "system_prompt = \"\"\"You are a helpful resume editor assistant that provides required assistance in changing a resume to match the given job descrption role \\\n", + "You are given a resume and job description, your job is to understand the resume and job description to suggest upto 6 missing key words in the resume. Then you have to \n", + "suggest how the user can improve his resume by giving upto 3 example sentences using the suggest keywords to fit into their resume.\n", + "by using the following structure provide your response \\\n", + "Sturcture:\n", + "Job role : [Job Role]:\n", + "Candidate Name : [Candidate Name]\n", + "Missing Key words in Resume Based on Given job description:\n", + " - [] Missing key words\n", + " -[] Missing key words\n", + "\n", + "\n", + "Suggestion:\n", + " - [] # write a sentence including the key words to put them in the resume\n", + " - [] # write a sentence including the key words to put them in the resume\n", + "\n", + "Guidelines:\n", + "- give proper keyword suggestions which are essential for the job function. Do not give any unnecesary suggestions\n", + "- Keep the suggested sentences less that 50 words\n", + "- \n", + "\"\"\"\n", + "user_prompt = f'Give me suggestions on how to improve my resume and for the given job description '\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0d9c40b5-8e27-41b9-8b88-2c83e7d2b3ec", + "metadata": {}, + "outputs": [], + "source": [ + "# call openai api\n", + "def resume_upgrader(resume:str, job_description:str):\n", + " user_prompt = f'Give me suggestions on how to improve my resume {resume} and for the given job description {job_description}'\n", + " messages = [\n", + " {'role': 'system', 'content': system_prompt},\n", + " {'role': 'user', 'content': user_prompt}\n", + " ]\n", + " try:\n", + " \n", + " response = openai.chat.completions.create(model =\"gpt-4o-mini\", messages = messages)\n", + " return response.choices[0].message.content\n", + " except:\n", + " print('got error while retting the response from api')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5aa29465-c119-4178-90f1-3ebdc9eeb11a", + "metadata": {}, + "outputs": [], + "source": [ + "def print_api_response(response_markdown):\n", + " \"\"\"Print the markdown response\"\"\"\n", + " display(Markdown(response_markdown))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "82a92034-6722-4e78-a901-b4ef2b9cbb84", + "metadata": {}, + "outputs": [], + "source": [ + "resume = input(\"Paste your resume in here\")\n", + "job_description = input(\"paste your job descritpion here\")\n", + "response = resume_upgrader(resume, job_description)\n", + "print_api_response(response)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d0be536f-e890-473f-8c68-767bc0e3b47c", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 731cb7c5945d65699652bd8b0a30a110459da351 Mon Sep 17 00:00:00 2001 From: ana-047 Date: Sun, 10 Aug 2025 21:20:54 -0700 Subject: [PATCH 12/72] Added HistoryBot Week2 Exercise --- .../HistoryBot-Week2Exercise.ipynb | 398 ++++++++++++++++++ 1 file changed, 398 insertions(+) create mode 100644 week2/community-contributions/HistoryBot-Week2Exercise.ipynb diff --git a/week2/community-contributions/HistoryBot-Week2Exercise.ipynb b/week2/community-contributions/HistoryBot-Week2Exercise.ipynb new file mode 100644 index 0000000..58d1728 --- /dev/null +++ b/week2/community-contributions/HistoryBot-Week2Exercise.ipynb @@ -0,0 +1,398 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "6a193ef7-41df-42cb-ab35-fb5fa77a78b9", + "metadata": {}, + "source": [ + "

HelloHistory- Learn History On the Go

" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "d813bcdb-fbff-43f8-97ae-28cf1ec2e094", + "metadata": {}, + "outputs": [], + "source": [ + "#Now use everything you've learned from Week 2 to build a full prototype for the technical question/answerer you built in Week 1 Exercise.\n", + "\n", + "#This should include a Gradio UI, streaming, use of the system prompt to add expertise, and the ability to switch between models. Bonus points if you can demonstrate use of a tool!\n", + "\n", + "#If you feel bold, see if you can add audio input so you can talk to it, and have it respond with audio. ChatGPT or Claude can help you, or email me if you have questions." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "ace8fd2d-341e-451d-a70e-82fac828299c", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from dotenv import load_dotenv\n", + "from openai import OpenAI\n", + "import anthropic\n", + "from IPython.display import Markdown, display, update_display\n", + "import gradio as gr" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "591b90d1-9771-40ae-ad99-6e864465a358", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "OpenAI API Key exists and begins sk\n", + "Anthropic API Key exists and begins sk\n" + ] + } + ], + "source": [ + "# Load environment variables in a file called .env\n", + "# Print the key prefixes to help with any debugging\n", + "\n", + "load_dotenv(override=True)\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[:2]}\")\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[:2]}\")\n", + "else:\n", + " print(\"Anthropic API Key not set\")\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "eace2872-0ddb-4b86-ae09-91ad9fc2dd04", + "metadata": {}, + "outputs": [], + "source": [ + "#connect to models\n", + "\n", + "openai = OpenAI()\n", + "\n", + "claude = anthropic.Anthropic()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "d5e99852-89f7-41da-84a5-5cf8659faddc", + "metadata": {}, + "outputs": [], + "source": [ + "system_message = \"You are a helpful tutor teaching people history. You have to answer their questions on historical events.\"" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "01d3fcb8-967e-4841-809a-b428e80c17c9", + "metadata": {}, + "outputs": [], + "source": [ + "#test 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": 7, + "id": "a214da55-644f-4469-8167-1b317a7cb8ce", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'World War II was won by the Allies, a coalition of countries that included the United States, the Soviet Union, the United Kingdom, China, and several other nations. The war officially ended in 1945, with the unconditional surrender of Nazi Germany in May and the surrender of Japan in September.'" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "message_gpt(\"Who won World War II?\")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "65b9c8ac-1319-46ed-a5d8-82d98cb3d831", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\"World War II began on September 1, 1939, when Germany, led by Adolf Hitler, invaded Poland. This invasion was a result of aggressive expansionist policies pursued by Nazi Germany throughout the 1930s, which included the annexation of Austria and the incorporation of Czechoslovakia's Sudetenland.\\n\\nThe invasion of Poland prompted Britain and France to declare war on Germany on September 3, 1939, fulfilling their commitments to support Poland. Tensions had been building in Europe due to unresolved issues from World War I, the rise of totalitarian regimes, and various treaties and alliances. The war would expand rapidly as other nations became involved, eventually leading to a global conflict that lasted until 1945.\"" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "message_gpt(\"How did World War II begin?\")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "41618892-8a7b-4871-9d8e-d030fabf1046", + "metadata": {}, + "outputs": [], + "source": [ + "#add streaming \n", + "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": 11, + "id": "ad6edb2a-9c2c-4b53-bead-6009f493f281", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "* Running on local URL: http://127.0.0.1:7861\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": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "view = gr.Interface(\n", + " fn=stream_gpt,\n", + " inputs=[gr.Textbox(label=\"Ask HistoryBot a question:\")],\n", + " outputs=[gr.Markdown(label=\"Response:\")],\n", + " flagging_mode=\"never\"\n", + ")\n", + "view.launch()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "54be6b30-db25-49b9-aecb-e63daa0b6873", + "metadata": {}, + "outputs": [], + "source": [ + "#streaming with Claude\n", + "\n", + "def stream_claude(prompt):\n", + " result = claude.messages.stream(\n", + " model=\"claude-3-haiku-20240307\",\n", + " max_tokens=1000,\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": 13, + "id": "62d94a31-1b2b-4266-8cfa-16e877240aa8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "* Running on local URL: http://127.0.0.1:7862\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": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "view = gr.Interface(\n", + " fn=stream_claude,\n", + " inputs=[gr.Textbox(label=\"Ask HistoryBot a question:\")],\n", + " outputs=[gr.Markdown(label=\"Response:\")],\n", + " flagging_mode=\"never\"\n", + ")\n", + "view.launch()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "b69fdbe0-abc7-429a-aadd-44620035f49e", + "metadata": {}, + "outputs": [], + "source": [ + "# function to select model\n", + "\n", + "def stream_model(prompt, model):\n", + " if model==\"GPT\":\n", + " result = stream_gpt(prompt)\n", + " elif model==\"Claude\":\n", + " result = stream_claude(prompt)\n", + " else:\n", + " raise ValueError(\"Unknown model\")\n", + " yield from result" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "40b2961a-2bb2-4a55-9abb-be967e184db9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "* Running on local URL: http://127.0.0.1:7864\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": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "view = gr.Interface(\n", + " fn=stream_model,\n", + " inputs=[gr.Textbox(label=\"Ask HistoryBot a question\"), gr.Dropdown([\"GPT\", \"Claude\"], label=\"Select model\", value=\"GPT\")],\n", + " outputs=[gr.Markdown(label=\"Response:\")],\n", + " flagging_mode=\"never\"\n", + ")\n", + "view.launch()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e8b78f97-597a-4d4a-8f7a-c6e982290596", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From f4e9798f3dd379cb4bc2cd2a1c99c26e694efb30 Mon Sep 17 00:00:00 2001 From: Elijah Rwothoromo Date: Mon, 11 Aug 2025 09:50:49 +0300 Subject: [PATCH 13/72] Use other model options for translation. Show city image --- .../rwothoromo/day5.ipynb | 111 ++++++++++++------ 1 file changed, 78 insertions(+), 33 deletions(-) diff --git a/week2/community-contributions/rwothoromo/day5.ipynb b/week2/community-contributions/rwothoromo/day5.ipynb index f591fa9..edd2a73 100644 --- a/week2/community-contributions/rwothoromo/day5.ipynb +++ b/week2/community-contributions/rwothoromo/day5.ipynb @@ -19,7 +19,7 @@ "source": [ "# imports\n", "\n", - "import os, json, gradio as gr\n", + "import os, json, gradio as gr, anthropic, google.generativeai\n", "from dotenv import load_dotenv\n", "from openai import OpenAI" ] @@ -42,7 +42,22 @@ " print(\"OpenAI API Key not set\")\n", " \n", "MODEL = \"gpt-4o-mini\"\n", - "openai = OpenAI()" + "openai = OpenAI()\n", + "\n", + "# Other LLMs\n", + "DALL_E_MODEL = \"dall-e-3\"\n", + "\n", + "CLAUDE_MODEL = \"claude-sonnet-4-20250514\"\n", + "claude = anthropic.Anthropic()\n", + "\n", + "google_api_key = os.getenv('GOOGLE_API_KEY')\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\")\n", + " \n", + "GEMINI_MODEL= \"gemini-2.5-flash\"\n", + "gemini = google.generativeai.configure()" ] }, { @@ -76,6 +91,7 @@ " messages.append(message)\n", " messages.append(response_tool)\n", " image = artist(city)\n", + " print(\"Avail image for: \", city)\n", " response = openai.chat.completions.create(model=MODEL, messages=messages)\n", "\n", "\n", @@ -167,7 +183,8 @@ "source": [ "# And this is included in a list of tools:\n", "\n", - "tools = [{\"type\": \"function\", \"function\": price_function}]" + "tools = [{\"type\": \"function\", \"function\": price_function}]\n", + "# print(tools)" ] }, { @@ -259,14 +276,39 @@ " system_prompt_for_language = f\"You are a helpful translation assistant. Translate the following text into {target_language}. Only provide the translated text without any additional conversational text.\"\n", " \n", " try:\n", - " response = openai.chat.completions.create(\n", - " model=MODEL,\n", + " # # Using OpenAI\n", + " # response = openai.chat.completions.create(\n", + " # model=MODEL,\n", + " # messages=[\n", + " # {\"role\": \"system\", \"content\": system_prompt_for_language},\n", + " # {\"role\": \"user\", \"content\": text}\n", + " # ],\n", + " # )\n", + " # result = response.choices[0].message.content\n", + " # return result\n", + "\n", + " \n", + " # # Using Gemini\n", + " # gemini = google.generativeai.GenerativeModel(\n", + " # model_name=GEMINI_MODEL,\n", + " # system_instruction=system_prompt_for_language\n", + " # )\n", + " # response = gemini.generate_content(text)\n", + " # result = response.text\n", + " # return result\n", + "\n", + " \n", + " # Using Claude\n", + " response = claude.messages.create(\n", + " model=CLAUDE_MODEL,\n", + " max_tokens=200,\n", + " temperature=0.7,\n", + " system=system_prompt_for_language,\n", " messages=[\n", - " {\"role\": \"system\", \"content\": system_prompt_for_language},\n", - " {\"role\": \"user\", \"content\": text}\n", + " {\"role\": \"user\", \"content\": text},\n", " ],\n", " )\n", - " result = response.choices[0].message.content\n", + " result = response.content[0].text\n", " return result\n", " \n", " except Exception as e:\n", @@ -443,7 +485,7 @@ "source": [ "def artist(city):\n", " image_response = openai.images.generate(\n", - " model=\"dall-e-3\",\n", + " model=DALL_E_MODEL,\n", " prompt=f\"An image representing a vacation in {city}, showing tourist spots and everything unique about {city}, in a vibrant pop-art style\",\n", " size=\"1024x1024\",\n", " n=1,\n", @@ -467,7 +509,7 @@ }, { "cell_type": "markdown", - "id": "f4975b87-19e9-4ade-a232-9b809ec75c9a", + "id": "6dd849b5-31ae-4237-9072-46b210792bf9", "metadata": {}, "source": [ "## Audio (NOTE - Audio is optional for this course - feel free to skip Audio if it causes trouble!)\n", @@ -541,7 +583,7 @@ "def talker(message):\n", " response = openai.audio.speech.create(\n", " model=\"tts-1\",\n", - " voice=\"alloy\", # Also, try replacing onyx with alloy\n", + " voice=\"onyx\", # Also, try replacing onyx with alloy\n", " input=message\n", " )\n", " \n", @@ -575,7 +617,9 @@ " chatbot = gr.Chatbot(height=500)\n", " image = gr.Image(height=500)\n", " with gr.Row():\n", - " entry = gr.Textbox(label=\"Chat with our AI Assistant:\")\n", + " # entry = gr.Textbox(label=\"Chat with our AI Assistant:\")\n", + " entry = gr.Textbox(label=\"Chat with our AI Assistant:\", scale=4)\n", + " submit_btn = gr.Button(\"Submit\", scale=1)\n", " with gr.Row():\n", " languages = [\"English\", \"Swahili\", \"French\", \"Chinese\", \"German\"]\n", " language_dropdown = gr.Dropdown(\n", @@ -597,10 +641,9 @@ " def user_message_updater(user_message, history):\n", " return \"\", history + [[user_message, None]]\n", "\n", - " def chat_with_assistant(history, target_language, audio_response):\n", + " def chat_with_assistant(history, target_language, use_audio):\n", " message = history[-1][0] # Get the user's message from the last list in history\n", " \n", - " # Use the existing chat logic\n", " messages = [{\"role\": \"system\", \"content\": system_message}]\n", " for msg_user, msg_assistant in history:\n", " messages.append({\"role\": \"user\", \"content\": msg_user})\n", @@ -608,11 +651,17 @@ " messages.append({\"role\": \"assistant\", \"content\": msg_assistant})\n", " \n", " response = openai.chat.completions.create(model=MODEL, messages=messages, tools=tools)\n", - " \n", + "\n", + " image = None\n", + " \n", " if response.choices[0].finish_reason==\"tool_calls\":\n", " message = response.choices[0].message\n", " response_tool, city = handle_tool_call(message)\n", "\n", + " # Check if a city was returned from the tool call to generate an image\n", + " if city:\n", + " image = artist(city) # Generate an image to represent the target City\n", + "\n", " messages.append(message.model_dump()) # Append message as a dictionary using .model_dump()\n", " messages.append(response_tool)\n", " \n", @@ -628,11 +677,12 @@ "\n", " history[-1][1] = final_response_content\n", "\n", - " if audio_response != \"No\":\n", + " if use_audio != \"No\":\n", " talker(final_response_content)\n", "\n", - " return history, None # Return a tuple of (the updated history, an empty image)\n", + " return history, image # Return a tuple of (the updated history, an image)\n", "\n", + " # The event listeners are updated to be triggered by both the textbox and the new button\n", " entry.submit(\n", " user_message_updater,\n", " inputs=[entry, chatbot],\n", @@ -643,28 +693,23 @@ " inputs=[chatbot, language_dropdown, audio_dropdown],\n", " outputs=[chatbot, image]\n", " )\n", + "\n", + " submit_btn.click(\n", + " user_message_updater,\n", + " inputs=[entry, chatbot],\n", + " outputs=[entry, chatbot],\n", + " queue=False\n", + " ).then(\n", + " chat_with_assistant,\n", + " inputs=[chatbot, language_dropdown, audio_dropdown],\n", + " outputs=[chatbot, image]\n", + " )\n", " \n", " clear.click(lambda: None, inputs=None, outputs=[chatbot, image], queue=False)\n", "\n", "ui.launch(inbrowser=True)" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "26ab4bd7-b7c4-4e1c-aa51-578326660370", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "69a51144-0e51-4bbf-b5d0-a9e0a60d05ae", - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "code", "execution_count": null, From 06b191a2d0ef72bf826ceb0dda78d694ad57d952 Mon Sep 17 00:00:00 2001 From: Elijah Rwothoromo Date: Mon, 11 Aug 2025 10:26:27 +0300 Subject: [PATCH 14/72] Introduce audio input and transcription --- .../rwothoromo/day5.ipynb | 81 ++++++++++++++++++- 1 file changed, 79 insertions(+), 2 deletions(-) diff --git a/week2/community-contributions/rwothoromo/day5.ipynb b/week2/community-contributions/rwothoromo/day5.ipynb index edd2a73..b51d15b 100644 --- a/week2/community-contributions/rwothoromo/day5.ipynb +++ b/week2/community-contributions/rwothoromo/day5.ipynb @@ -602,6 +602,40 @@ "# talker(\"Well, hi there\")" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "e927f333-7ed5-4625-9e5a-5e0b62f8a684", + "metadata": {}, + "outputs": [], + "source": [ + "# To transcribe an audio prompt/input\n", + "\n", + "import tempfile\n", + "from pydub import AudioSegment\n", + "from pydub.playback import play\n", + "\n", + "def transcribe_audio(audio_file):\n", + " \"\"\"\n", + " Transcribes an audio file using OpenAI's Whisper model.\n", + " \"\"\"\n", + " if audio_file is None:\n", + " return \"\"\n", + " \n", + " # The Gradio Audio component returns a tuple (sample_rate, numpy_array)\n", + " # We need to save this to a file to pass to the OpenAI API\n", + " with tempfile.NamedTemporaryFile(suffix=\".wav\", delete=True) as tmpfile:\n", + " audio = AudioSegment.from_file(audio_file, format=\"wav\")\n", + " audio.export(tmpfile.name, format=\"wav\")\n", + " \n", + " with open(tmpfile.name, \"rb\") as audio_file_obj:\n", + " transcript = openai.audio.transcriptions.create(\n", + " model=\"whisper-1\", \n", + " file=audio_file_obj\n", + " )\n", + " return transcript.text" + ] + }, { "cell_type": "code", "execution_count": null, @@ -621,6 +655,12 @@ " entry = gr.Textbox(label=\"Chat with our AI Assistant:\", scale=4)\n", " submit_btn = gr.Button(\"Submit\", scale=1)\n", " with gr.Row():\n", + " # Provide a microphone input\n", + " audio_input = gr.Audio(sources=[\"microphone\"], type=\"filepath\", label=\"Speak to our AI Assistant\", scale=4)\n", + " submit_audio_btn = gr.Button(\"Submit Audio\", scale=1)\n", + "\n", + "\n", + " with gr.Row():\n", " languages = [\"English\", \"Swahili\", \"French\", \"Chinese\", \"German\"]\n", " language_dropdown = gr.Dropdown(\n", " label=\"Select a language for translation\",\n", @@ -641,7 +681,7 @@ " def user_message_updater(user_message, history):\n", " return \"\", history + [[user_message, None]]\n", "\n", - " def chat_with_assistant(history, target_language, use_audio):\n", + " def chat_with_assistant(history, target_language, use_audio_output):\n", " message = history[-1][0] # Get the user's message from the last list in history\n", " \n", " messages = [{\"role\": \"system\", \"content\": system_message}]\n", @@ -677,11 +717,25 @@ "\n", " history[-1][1] = final_response_content\n", "\n", - " if use_audio != \"No\":\n", + " if use_audio_output != \"No\":\n", " talker(final_response_content)\n", "\n", " return history, image # Return a tuple of (the updated history, an image)\n", "\n", + " # This function ties together the transcription and the chat logic\n", + " def transcribe_and_chat(audio_file, history, target_language, use_audio_output):\n", + " if audio_file:\n", + " # Transcribe the audio file to text\n", + " transcribed_text = transcribe_audio(audio_file)\n", + " \n", + " # Update history with the transcribed text\n", + " new_history = history + [[transcribed_text, None]]\n", + " \n", + " # Call the main chat function with the new history\n", + " return chat_with_assistant(new_history, target_language, use_audio_output)\n", + " else:\n", + " return history, None\n", + "\n", " # The event listeners are updated to be triggered by both the textbox and the new button\n", " entry.submit(\n", " user_message_updater,\n", @@ -704,6 +758,21 @@ " inputs=[chatbot, language_dropdown, audio_dropdown],\n", " outputs=[chatbot, image]\n", " )\n", + "\n", + " # Event listener to trigger on audio stop\n", + " audio_input.stop(\n", + " transcribe_and_chat,\n", + " inputs=[audio_input, chatbot, language_dropdown, audio_dropdown],\n", + " outputs=[chatbot, image],\n", + " queue=False\n", + " )\n", + "\n", + " submit_audio_btn.click(\n", + " transcribe_and_chat,\n", + " inputs=[audio_input, chatbot, language_dropdown, audio_dropdown],\n", + " outputs=[chatbot, image],\n", + " queue=False\n", + " )\n", " \n", " clear.click(lambda: None, inputs=None, outputs=[chatbot, image], queue=False)\n", "\n", @@ -717,6 +786,14 @@ "metadata": {}, "outputs": [], "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3469b07d-2b9a-4409-bb1c-fbdab3248974", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { From e0dfd6610bbae3e51b9471c9a17a5b0c474975e7 Mon Sep 17 00:00:00 2001 From: Elijah Rwothoromo Date: Mon, 11 Aug 2025 13:30:26 +0300 Subject: [PATCH 15/72] Scrape with Ollama, GPT and Claude. Gemini still fails --- .../rwothoromo/week2 EXERCISE.ipynb | 568 +++++++++++++++++- 1 file changed, 567 insertions(+), 1 deletion(-) diff --git a/week2/community-contributions/rwothoromo/week2 EXERCISE.ipynb b/week2/community-contributions/rwothoromo/week2 EXERCISE.ipynb index bebf2cd..4f796dd 100644 --- a/week2/community-contributions/rwothoromo/week2 EXERCISE.ipynb +++ b/week2/community-contributions/rwothoromo/week2 EXERCISE.ipynb @@ -20,10 +20,576 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 63, + "id": "7b624d5b-69a2-441f-9147-fde105d3d551", + "metadata": {}, + "outputs": [], + "source": [ + "# sample question to use in the Gradle UI that pops up\n", + "\n", + "question = \"\"\"\n", + "How good at Software Development is Elijah Rwothoromo? \\\n", + "He has a Wordpress site https://rwothoromo.wordpress.com/. \\\n", + "He also has a LinkedIn profile https://www.linkedin.com/in/rwothoromoelaijah/. \\\n", + "As well as a GitHub Profile https://www.github.com/rwothoromo/.\\\n", + "What can we learn from him?\n", + "\"\"\"\n" + ] + }, + { + "cell_type": "code", + "execution_count": 64, "id": "a07e7793-b8f5-44f4-aded-5562f633271a", "metadata": {}, "outputs": [], + "source": [ + "# imports\n", + "\n", + "import re, requests, os, json, tempfile, gradio as gr, anthropic, google.generativeai, ollama\n", + "from bs4 import BeautifulSoup\n", + "from IPython.display import Markdown, display, update_display\n", + "from dotenv import load_dotenv\n", + "from openai import OpenAI\n", + "from pydub import AudioSegment\n", + "from pydub.playback import play\n", + "from io import BytesIO\n" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "id": "efb88276-6d74-4d94-95a2-b8ca82a4716c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "OpenAI API Key exists and begins sk-proj-\n", + "Anthropic API Key exists and begins sk-ant-a\n", + "Google API Key exists and begins AIzaSyAS\n" + ] + } + ], + "source": [ + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "openai_api_key = os.getenv('OPENAI_API_KEY')\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", + "\n", + "anthropic_api_key = os.getenv('ANTHROPIC_API_KEY')\n", + "if anthropic_api_key:\n", + " print(f\"Anthropic API Key exists and begins {anthropic_api_key[:8]}\")\n", + "else:\n", + " print(\"Anthropic API Key not set\")\n", + "\n", + "\n", + "google_api_key = os.getenv('GOOGLE_API_KEY')\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": 66, + "id": "484f0c3e-638d-4af7-bb9b-36faf6048f3c", + "metadata": {}, + "outputs": [], + "source": [ + "# constants\n", + "\n", + "MODEL_CLAUDE = \"claude-sonnet-4-20250514\"\n", + "MODEL_GEMINI = \"gemini-2.5-flash\"\n", + "MODEL_GPT = 'gpt-4o-mini'\n", + "MODEL_LLAMA = 'llama3.2'\n" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "id": "2e292401-e62f-4bfc-b060-07462ad20d3d", + "metadata": {}, + "outputs": [], + "source": [ + "# system messages\n", + "\n", + "system_message = \"You are an expert assistant. Synthesize a comprehensive answer in markdown format.\"\n", + "system_prompt_with_url_data = \"You are an expert assistant. \\\n", + " Analyze the user's question and the provided text from relevant websites to synthesize a comprehensive answer in markdown format.\\\n", + " Provide a short summary, ignoring text that might be navigation-related.\"\n" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "id": "84252e03-ccde-4ecf-975b-78227291ca5c", + "metadata": {}, + "outputs": [], + "source": [ + "# set up environment\n", + "\n", + "headers = {\n", + " \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36\"\n", + "}\n" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "id": "49396924-47c2-4f7d-baa2-9b0fece9da4a", + "metadata": {}, + "outputs": [], + "source": [ + "# Website class for URLs to be scraped\n", + "\n", + "class Website:\n", + " def __init__(self, url):\n", + " \"\"\"\n", + " Create this Website object from the given url using the BeautifulSoup library\n", + " \"\"\"\n", + " self.url = url\n", + " response = requests.get(url, headers=headers)\n", + " soup = BeautifulSoup(response.content, 'html.parser')\n", + " self.title = soup.title.string if soup.title else \"No title found\"\n", + " for irrelevant in soup.body([\"script\", \"style\", \"img\", \"input\"]):\n", + " irrelevant.decompose()\n", + " self.text = soup.body.get_text(separator=\"\\n\", strip=True)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "id": "c4d23747-d78a-4f36-9862-c00e1e8d9e44", + "metadata": {}, + "outputs": [], + "source": [ + "# Instantiate models with API keys from environment variables\n", + "\n", + "openai = OpenAI(api_key=os.getenv(\"OPENAI_API_KEY\"))\n", + "claude = anthropic.Anthropic(api_key=os.getenv(\"ANTHROPIC_API_KEY\"))\n", + "google.generativeai.configure(api_key=os.getenv(\"GOOGLE_API_KEY\"))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "id": "67e150be-502e-4ba4-9586-3a2f3fae3830", + "metadata": {}, + "outputs": [], + "source": [ + "# To scrape data based on URLs in the user prompt\n", + "\n", + "def scrape_urls(text):\n", + " try:\n", + " # Extract all URLs from the text string using regular expressions\n", + " urls = re.findall(r'https?://[^\\s)]+', text)\n", + " \n", + " if len(urls) > 0:\n", + " scraped_content = []\n", + " for url in urls:\n", + " print(f\"Scraping: {url}\")\n", + " try:\n", + " site = Website(url)\n", + " content = f\"Content from {url}:\\n---\\n{site.text}\\n---\\n\"\n", + " scraped_content.append(content)\n", + " print(f\"Scraping done!\")\n", + " except Exception as e:\n", + " print(f\"Could not scrape {url}: {e}\")\n", + " scraped_content.append(f\"Could not retrieve content from {url}.\\n\")\n", + " \n", + " return \"\\n\".join(scraped_content)\n", + " else:\n", + " return None\n", + " except Exception as e:\n", + " print(f\"Error during website scraping: {e}\")\n", + " return \"Sorry, I encountered an error and could not complete scraping the website(s).\"\n" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "id": "bd9d0511-2f78-4270-81f8-73708388dfad", + "metadata": {}, + "outputs": [], + "source": [ + "# Tool definition for scrape_urls\n", + "\n", + "scraping_function = {\n", + " \"name\": \"scrape_urls\",\n", + " \"description\": \"Scrapes available URLs for data to update the User prompt. Call this whenever a customer provides a URL.\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"text\": {\n", + " \"type\": \"string\",\n", + " \"description\": \"The website URL or user prompt containing URLs.\"\n", + " }\n", + " },\n", + " \"required\": [\"text\"]\n", + " }\n", + "}\n" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "id": "47733d5b-bb0a-44dd-b56d-a54677c88f80", + "metadata": {}, + "outputs": [], + "source": [ + "# Instantiate the tools\n", + "\n", + "# tools = [{\"type\": \"function\", \"function\": scraping_function}]\n", + "\n", + "# Define Ollama tools\n", + "tools_gpt_ollama = [{\"type\": \"function\", \"function\": scraping_function}]\n", + "\n", + "# Define Claude tools\n", + "tools_claude = [{\n", + " \"name\": scraping_function[\"name\"],\n", + " \"description\": scraping_function[\"description\"],\n", + " \"input_schema\": scraping_function[\"parameters\"]\n", + "}]\n", + "\n", + "# Gemini tool definition must be a FunctionDeclaration object without the top-level `type` in parameters.\n", + "tools_gemini = [google.generativeai.protos.FunctionDeclaration(\n", + " name=scraping_function[\"name\"],\n", + " description=scraping_function[\"description\"],\n", + " parameters=google.generativeai.protos.Schema(\n", + " type=google.generativeai.protos.Type.OBJECT,\n", + " properties={\n", + " \"text\": google.generativeai.protos.Schema(\n", + " type=google.generativeai.protos.Type.STRING,\n", + " description=scraping_function[\"parameters\"][\"properties\"][\"text\"][\"description\"]\n", + " )\n", + " },\n", + " required=scraping_function[\"parameters\"][\"required\"]\n", + " )\n", + ")]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "id": "aa3fa01b-97d0-443e-b0cc-55d277878cb7", + "metadata": {}, + "outputs": [], + "source": [ + "# Handle multiple tools\n", + "\n", + "def handle_tool_call(tool_call, user_message):\n", + " function_name = None\n", + " arguments = None\n", + " tool_call_id = None\n", + " \n", + " # Logic for different model tool call object formats\n", + " if isinstance(tool_call, dict) and 'function' in tool_call: # Ollama\n", + " function_name = tool_call['function']['name']\n", + " try:\n", + " arguments = json.loads(tool_call['function']['arguments'])\n", + " except (json.JSONDecodeError, TypeError):\n", + " arguments = {'text': tool_call['function'].get('arguments', user_message)}\n", + " elif hasattr(tool_call, 'function'): # GPT, Claude, Gemini\n", + " function_name = tool_call.function.name\n", + " tool_call_id = getattr(tool_call, 'id', None)\n", + " if isinstance(tool_call.function.arguments, dict): # For Gemini\n", + " arguments = tool_call.function.arguments\n", + " else: # For GPT and Claude\n", + " try:\n", + " arguments = json.loads(tool_call.function.arguments)\n", + " except (json.JSONDecodeError, TypeError):\n", + " arguments = {'text': tool_call.function.arguments}\n", + "\n", + " # Fallback if arguments are not parsed correctly\n", + " if not arguments or 'text' not in arguments:\n", + " arguments = {'text': user_message}\n", + " \n", + " if function_name == \"scrape_urls\":\n", + " url_scraped_data = scrape_urls(arguments['text'])\n", + " response_content = json.dumps({\"url_scraped_data\": url_scraped_data})\n", + " else:\n", + " response_content = json.dumps({\"error\": f\"Unknown tool: {function_name}\"})\n", + "\n", + " response = {\n", + " \"role\": \"tool\",\n", + " \"content\": response_content,\n", + " \"tool_call_id\": tool_call_id\n", + " }\n", + " return response\n" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "14083620-1b16-4c8b-8365-c221b831e678", + "metadata": {}, + "outputs": [], + "source": [ + "# Audio output\n", + "\n", + "def talker(message):\n", + " response = openai.audio.speech.create(\n", + " model=\"tts-1\",\n", + " voice=\"onyx\",\n", + " input=message\n", + " )\n", + " \n", + " audio_stream = BytesIO(response.content)\n", + " audio = AudioSegment.from_file(audio_stream, format=\"mp3\")\n", + " play(audio)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "id": "f9601a49-a490-4454-bd47-591ad793dc30", + "metadata": {}, + "outputs": [], + "source": [ + "# To transcribe an audio prompt/input to text\n", + "\n", + "def transcribe_audio(audio_file):\n", + " if audio_file is None:\n", + " return \"\"\n", + " \n", + " with tempfile.NamedTemporaryFile(suffix=\".wav\", delete=True) as tmpfile:\n", + " audio = AudioSegment.from_file(audio_file, format=\"wav\")\n", + " audio.export(tmpfile.name, format=\"wav\")\n", + " \n", + " with open(tmpfile.name, \"rb\") as audio_file_obj:\n", + " transcript = openai.audio.transcriptions.create(\n", + " model=\"whisper-1\", \n", + " file=audio_file_obj\n", + " )\n", + " return transcript.text\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "70c79408-f5f4-424b-b96c-d07e6893af6a", + "metadata": {}, + "outputs": [], + "source": [ + "# More involved Gradio code as we're not using the preset Chat interface!\n", + "# Passing in inbrowser=True in the last line will cause a Gradio window to pop up immediately.\n", + "\n", + "with gr.Blocks() as ui:\n", + " with gr.Row():\n", + " chatbot = gr.Chatbot(height=500)\n", + " with gr.Row():\n", + " entry = gr.Textbox(label=\"Chat with our AI Assistant:\", scale=4)\n", + " submit_btn = gr.Button(\"Submit\", scale=1)\n", + " with gr.Row():\n", + " audio_input = gr.Audio(sources=[\"microphone\"], type=\"filepath\", label=\"Speak to our AI Assistant\", scale=4)\n", + " submit_audio_btn = gr.Button(\"Submit Audio\", scale=1)\n", + "\n", + " with gr.Row():\n", + " models = [\"Claude\", \"Gemini\", \"GPT\", \"Ollama\"]\n", + " model_dropdown = gr.Dropdown(\n", + " label=\"Select a model\",\n", + " choices=models,\n", + " value=models[2]\n", + " )\n", + "\n", + " audio_options = [\"Yes\", \"No\"]\n", + " audio_dropdown = gr.Dropdown(\n", + " label=\"Select whether to respond with audio\",\n", + " choices=audio_options,\n", + " value=audio_options[1]\n", + " )\n", + " \n", + " with gr.Row():\n", + " clear = gr.Button(\"Clear\")\n", + "\n", + " def user_message_updater(user_message, history):\n", + " return \"\", history + [[user_message, None]]\n", + "\n", + " def chat_with_assistant(history, target_model, use_audio_output):\n", + " messages = []\n", + " for msg_user, msg_assistant in history:\n", + " messages.append({\"role\": \"user\", \"content\": msg_user})\n", + " if msg_assistant:\n", + " messages.append({\"role\": \"assistant\", \"content\": msg_assistant})\n", + " \n", + " user_message = history[-1][0]\n", + " final_response_content = \"\"\n", + " \n", + " if target_model == \"Claude\":\n", + " response = claude.messages.create(\n", + " model=MODEL_CLAUDE,\n", + " max_tokens=200,\n", + " temperature=0.7,\n", + " system=system_prompt_with_url_data,\n", + " messages=messages,\n", + " tools=tools_claude,\n", + " )\n", + " \n", + " tool_calls = [content_block for content_block in response.content if content_block.type == \"tool_use\"]\n", + " if tool_calls:\n", + " tool_use = tool_calls[0]\n", + " tool_output_content = scrape_urls(tool_use.input[\"text\"])\n", + " \n", + " messages.append({\"role\": \"assistant\", \"content\": response.content})\n", + " messages.append({\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\n", + " \"type\": \"tool_result\",\n", + " \"tool_use_id\": tool_use.id,\n", + " \"content\": tool_output_content\n", + " }\n", + " ]\n", + " })\n", + "\n", + " response = claude.messages.create(\n", + " model=MODEL_CLAUDE,\n", + " max_tokens=200,\n", + " temperature=0.7,\n", + " system=system_prompt_with_url_data,\n", + " messages=messages,\n", + " )\n", + " final_response_content = response.content[0].text\n", + "\n", + " elif target_model == \"Gemini\":\n", + " model = google.generativeai.GenerativeModel(\n", + " model_name=MODEL_GEMINI,\n", + " system_instruction=system_message,\n", + " tools=tools_gemini\n", + " )\n", + " \n", + " chat = model.start_chat(history=messages)\n", + " response = chat.send_message(user_message)\n", + " \n", + " if response.candidates[0].content.parts[0].function_call:\n", + " tool_call = response.candidates[0].content.parts[0].function_call\n", + " response_tool = handle_tool_call(tool_call, user_message)\n", + "\n", + " chat.send_message(response_tool)\n", + " response = chat.send_message(user_message)\n", + "\n", + " final_response_content = response.text\n", + "\n", + " elif target_model == \"Ollama\":\n", + " messages_ollama = [{\"role\": \"system\", \"content\": system_message}] + messages\n", + " response = ollama.chat(\n", + " model=MODEL_LLAMA,\n", + " messages=messages_ollama,\n", + " stream=False,\n", + " tools=tools_gpt_ollama,\n", + " )\n", + "\n", + " if 'tool_calls' in response['message'] and response['message']['tool_calls']:\n", + " response_tool = handle_tool_call(response['message']['tool_calls'][0], user_message)\n", + " messages_ollama.append({\"role\": \"assistant\", \"content\": response['message']['content'], \"tool_calls\": response['message']['tool_calls']})\n", + " messages_ollama.append(response_tool)\n", + " \n", + " response = ollama.chat(\n", + " model=MODEL_LLAMA,\n", + " messages=messages_ollama,\n", + " stream=False,\n", + " )\n", + " final_response_content = response['message']['content']\n", + " \n", + " else: # Assuming GPT is default\n", + " messages_gpt = [{\"role\": \"system\", \"content\": system_message}] + messages\n", + " response_stream = openai.chat.completions.create(model=MODEL_GPT, messages=messages_gpt, stream=True, tools=tools_gpt_ollama)\n", + " final_response_content = \"\"\n", + " for chunk in response_stream:\n", + " content = chunk.choices[0].delta.content or \"\"\n", + " tool_calls_chunk = chunk.choices[0].delta.tool_calls\n", + " if content:\n", + " final_response_content += content\n", + " \n", + " if tool_calls_chunk:\n", + " tool_call = tool_calls_chunk[0]\n", + " response_tool = handle_tool_call(tool_call, user_message)\n", + " \n", + " messages_gpt.append({\"role\": \"assistant\", \"tool_calls\": [tool_call]})\n", + " messages_gpt.append(response_tool)\n", + " \n", + " response_stream_after_tool = openai.chat.completions.create(model=MODEL_GPT, messages=messages_gpt, stream=True)\n", + " for chunk_after_tool in response_stream_after_tool:\n", + " final_response_content += chunk_after_tool.choices[0].delta.content or \"\"\n", + " break\n", + "\n", + " history[-1][1] = final_response_content\n", + " \n", + " if use_audio_output != \"No\":\n", + " talker(final_response_content)\n", + "\n", + " return history\n", + "\n", + " def transcribe_and_chat(audio_file, history, target_model, use_audio_output):\n", + " if audio_file:\n", + " transcribed_text = transcribe_audio(audio_file)\n", + " new_history = history + [[transcribed_text, None]]\n", + " return chat_with_assistant(new_history, target_model, use_audio_output)\n", + " else:\n", + " return history\n", + "\n", + " entry.submit(\n", + " user_message_updater,\n", + " inputs=[entry, chatbot],\n", + " outputs=[entry, chatbot],\n", + " queue=False\n", + " ).then(\n", + " chat_with_assistant,\n", + " inputs=[chatbot, model_dropdown, audio_dropdown],\n", + " outputs=[chatbot]\n", + " )\n", + "\n", + " submit_btn.click(\n", + " user_message_updater,\n", + " inputs=[entry, chatbot],\n", + " outputs=[entry, chatbot],\n", + " queue=False\n", + " ).then(\n", + " chat_with_assistant,\n", + " inputs=[chatbot, model_dropdown, audio_dropdown],\n", + " outputs=[chatbot]\n", + " )\n", + "\n", + " audio_input.stop(\n", + " transcribe_and_chat,\n", + " inputs=[audio_input, chatbot, model_dropdown, audio_dropdown],\n", + " outputs=[chatbot],\n", + " queue=False\n", + " )\n", + "\n", + " submit_audio_btn.click(\n", + " transcribe_and_chat,\n", + " inputs=[audio_input, chatbot, model_dropdown, audio_dropdown],\n", + " outputs=[chatbot],\n", + " queue=False\n", + " )\n", + " \n", + " clear.click(lambda: None, inputs=None, outputs=[chatbot], queue=False)\n", + "\n", + "ui.launch(inbrowser=True)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f6e1e727-4c55-4ed5-b50e-5388b246c8c5", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eb23b6cb-27af-43d6-8234-fe8295e7fe57", + "metadata": {}, + "outputs": [], "source": [] } ], From a605573de8c69e27570064323c0581c1d68bb98a Mon Sep 17 00:00:00 2001 From: Elijah Rwothoromo Date: Mon, 11 Aug 2025 13:48:02 +0300 Subject: [PATCH 16/72] Get Gemini to work --- .../rwothoromo/week2 EXERCISE.ipynb | 99 ++++++++++--------- 1 file changed, 52 insertions(+), 47 deletions(-) diff --git a/week2/community-contributions/rwothoromo/week2 EXERCISE.ipynb b/week2/community-contributions/rwothoromo/week2 EXERCISE.ipynb index 4f796dd..6745272 100644 --- a/week2/community-contributions/rwothoromo/week2 EXERCISE.ipynb +++ b/week2/community-contributions/rwothoromo/week2 EXERCISE.ipynb @@ -20,7 +20,7 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": null, "id": "7b624d5b-69a2-441f-9147-fde105d3d551", "metadata": {}, "outputs": [], @@ -38,7 +38,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": null, "id": "a07e7793-b8f5-44f4-aded-5562f633271a", "metadata": {}, "outputs": [], @@ -57,20 +57,10 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": null, "id": "efb88276-6d74-4d94-95a2-b8ca82a4716c", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "OpenAI API Key exists and begins sk-proj-\n", - "Anthropic API Key exists and begins sk-ant-a\n", - "Google API Key exists and begins AIzaSyAS\n" - ] - } - ], + "outputs": [], "source": [ "# Load environment variables\n", "load_dotenv()\n", @@ -98,7 +88,7 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": null, "id": "484f0c3e-638d-4af7-bb9b-36faf6048f3c", "metadata": {}, "outputs": [], @@ -113,7 +103,7 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": null, "id": "2e292401-e62f-4bfc-b060-07462ad20d3d", "metadata": {}, "outputs": [], @@ -128,7 +118,7 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": null, "id": "84252e03-ccde-4ecf-975b-78227291ca5c", "metadata": {}, "outputs": [], @@ -142,7 +132,7 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": null, "id": "49396924-47c2-4f7d-baa2-9b0fece9da4a", "metadata": {}, "outputs": [], @@ -165,7 +155,7 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": null, "id": "c4d23747-d78a-4f36-9862-c00e1e8d9e44", "metadata": {}, "outputs": [], @@ -179,7 +169,7 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": null, "id": "67e150be-502e-4ba4-9586-3a2f3fae3830", "metadata": {}, "outputs": [], @@ -214,7 +204,7 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": null, "id": "bd9d0511-2f78-4270-81f8-73708388dfad", "metadata": {}, "outputs": [], @@ -239,7 +229,7 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": null, "id": "47733d5b-bb0a-44dd-b56d-a54677c88f80", "metadata": {}, "outputs": [], @@ -260,24 +250,24 @@ "\n", "# Gemini tool definition must be a FunctionDeclaration object without the top-level `type` in parameters.\n", "tools_gemini = [google.generativeai.protos.FunctionDeclaration(\n", - " name=scraping_function[\"name\"],\n", - " description=scraping_function[\"description\"],\n", + " name=portable_scraping_function_definition[\"name\"],\n", + " description=portable_scraping_function_definition[\"description\"],\n", " parameters=google.generativeai.protos.Schema(\n", " type=google.generativeai.protos.Type.OBJECT,\n", " properties={\n", " \"text\": google.generativeai.protos.Schema(\n", " type=google.generativeai.protos.Type.STRING,\n", - " description=scraping_function[\"parameters\"][\"properties\"][\"text\"][\"description\"]\n", + " description=portable_scraping_function_definition[\"parameters\"][\"properties\"][\"text\"][\"description\"]\n", " )\n", " },\n", - " required=scraping_function[\"parameters\"][\"required\"]\n", + " required=portable_scraping_function_definition[\"parameters\"][\"required\"]\n", " )\n", ")]\n" ] }, { "cell_type": "code", - "execution_count": 74, + "execution_count": null, "id": "aa3fa01b-97d0-443e-b0cc-55d277878cb7", "metadata": {}, "outputs": [], @@ -296,16 +286,19 @@ " arguments = json.loads(tool_call['function']['arguments'])\n", " except (json.JSONDecodeError, TypeError):\n", " arguments = {'text': tool_call['function'].get('arguments', user_message)}\n", - " elif hasattr(tool_call, 'function'): # GPT, Claude, Gemini\n", + " elif hasattr(tool_call, 'function'): # GPT, Claude\n", " function_name = tool_call.function.name\n", " tool_call_id = getattr(tool_call, 'id', None)\n", - " if isinstance(tool_call.function.arguments, dict): # For Gemini\n", + " if isinstance(tool_call.function.arguments, dict):\n", " arguments = tool_call.function.arguments\n", - " else: # For GPT and Claude\n", + " else:\n", " try:\n", " arguments = json.loads(tool_call.function.arguments)\n", " except (json.JSONDecodeError, TypeError):\n", " arguments = {'text': tool_call.function.arguments}\n", + " elif hasattr(tool_call, 'name'): # Gemini\n", + " function_name = tool_call.name\n", + " arguments = tool_call.args\n", "\n", " # Fallback if arguments are not parsed correctly\n", " if not arguments or 'text' not in arguments:\n", @@ -327,7 +320,7 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": null, "id": "14083620-1b16-4c8b-8365-c221b831e678", "metadata": {}, "outputs": [], @@ -348,7 +341,7 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": null, "id": "f9601a49-a490-4454-bd47-591ad793dc30", "metadata": {}, "outputs": [], @@ -459,23 +452,43 @@ " final_response_content = response.content[0].text\n", "\n", " elif target_model == \"Gemini\":\n", + " messages_gemini = []\n", + " for m in history:\n", + " messages_gemini.append({\"role\": \"user\", \"parts\": [{\"text\": m[0]}]})\n", + " if m[1]:\n", + " messages_gemini.append({\"role\": \"model\", \"parts\": [{\"text\": m[1]}]})\n", + " \n", " model = google.generativeai.GenerativeModel(\n", " model_name=MODEL_GEMINI,\n", " system_instruction=system_message,\n", " tools=tools_gemini\n", " )\n", " \n", - " chat = model.start_chat(history=messages)\n", - " response = chat.send_message(user_message)\n", - " \n", + " chat = model.start_chat(history=messages_gemini[:-1])\n", + " response = chat.send_message(messages_gemini[-1])\n", + "\n", + " # Check if the response is a tool call before trying to extract text\n", " if response.candidates[0].content.parts[0].function_call:\n", " tool_call = response.candidates[0].content.parts[0].function_call\n", " response_tool = handle_tool_call(tool_call, user_message)\n", "\n", - " chat.send_message(response_tool)\n", - " response = chat.send_message(user_message)\n", - "\n", - " final_response_content = response.text\n", + " tool_response_content = json.loads(response_tool[\"content\"])\n", + " tool_response_gemini = {\n", + " \"role\": \"tool\",\n", + " \"parts\": [{\n", + " \"function_response\": {\n", + " \"name\": tool_call.name,\n", + " \"response\": tool_response_content\n", + " }\n", + " }]\n", + " }\n", + " \n", + " # Send the tool output back and get a new response\n", + " response = chat.send_message(tool_response_gemini)\n", + " final_response_content = response.text\n", + " else:\n", + " # If the original response was not a tool call, get the text directly\n", + " final_response_content = response.text\n", "\n", " elif target_model == \"Ollama\":\n", " messages_ollama = [{\"role\": \"system\", \"content\": system_message}] + messages\n", @@ -576,14 +589,6 @@ "ui.launch(inbrowser=True)\n" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "f6e1e727-4c55-4ed5-b50e-5388b246c8c5", - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "code", "execution_count": null, From 8cec79cd7f2ac1dbf7146681bddf7d5f7afcb608 Mon Sep 17 00:00:00 2001 From: Syed Abrar Ahmad Date: Mon, 11 Aug 2025 19:34:20 +0500 Subject: [PATCH 17/72] Fixed the Multiple functions calls error. --- .../week2_exercise_by_abrar.ipynb | 126 ++++++++++-------- 1 file changed, 67 insertions(+), 59 deletions(-) diff --git a/week2/community-contributions/week2_exercise_by_abrar.ipynb b/week2/community-contributions/week2_exercise_by_abrar.ipynb index 2c53738..3141217 100644 --- a/week2/community-contributions/week2_exercise_by_abrar.ipynb +++ b/week2/community-contributions/week2_exercise_by_abrar.ipynb @@ -77,6 +77,11 @@ " {\"Player\": \"Babar Azam\", \"Format\": \"ODI\", \"Year\": 2023, \"Runs\": 1454, \"Matches\": 26, \"Average\": 62.00, \"StrikeRate\": 89.50},\n", " {\"Player\": \"Babar Azam\", \"Format\": \"ODI\", \"Year\": 2022, \"Runs\": 1198, \"Matches\": 18, \"Average\": 66.55, \"StrikeRate\": 92.00},\n", " {\"Player\": \"Babar Azam\", \"Format\": \"ODI\", \"Year\": 2021, \"Runs\": 949, \"Matches\": 15, \"Average\": 67.78, \"StrikeRate\": 90.50},\n", + " {\"Player\": \"Joe Root\", \"Format\": \"Test\", \"Year\": 2025, \"Runs\": 949, \"Matches\": 15, \"Average\": 69.78, \"StrikeRate\": 95.50},\n", + " {\"Player\": \"Joe Root\", \"Format\": \"Test\", \"Year\": 2024, \"Runs\": 2025, \"Matches\": 22, \"Average\": 68.78, \"StrikeRate\": 90.50},\n", + " {\"Player\": \"Harry Brook\", \"Format\": \"Test\", \"Year\": 2025, \"Runs\": 1056, \"Matches\": 16, \"Average\": 67.78, \"StrikeRate\": 95.50},\n", + " {\"Player\": \"Harry Brook\", \"Format\": \"Test\", \"Year\": 2024, \"Runs\": 2200, \"Matches\": 21, \"Average\": 71.78, \"StrikeRate\": 98.50},\n", + "\n", "]" ] }, @@ -98,9 +103,9 @@ "metadata": {}, "outputs": [], "source": [ - "def analyze_cricket(data_list, player1, player2, match_format=\"ODI\", years=3):\n", + "def analyze_cricket(data_list, player1, match_format=\"ODI\", years=3):\n", " \"\"\"\n", - " Compare two cricket players' performances using an in-memory list of dicts.\n", + " Return cricket players' performances using an in-memory list of dicts.\n", " \"\"\"\n", " print(\"Tool 'analyze_cricket' is called\")\n", " df = pd.DataFrame(data_list)\n", @@ -110,10 +115,10 @@ " filtered = df[\n", " (df['Format'].str.upper() == match_format.upper()) &\n", " (df['Year'] >= min_year) &\n", - " (df['Player'].isin([player1, player2]))\n", + " (df['Player'].isin([player1]))\n", " ]\n", " if filtered.empty:\n", - " return {\"error\": f\"No data found for {player1} and {player2} in {match_format} for last {years} years.\"}\n", + " return {\"error\": f\"No data found for {player1} in {match_format} for last {years} years.\"}\n", "\n", " summary = filtered.groupby(\"Player\").agg({\n", " \"Matches\": \"sum\",\n", @@ -133,7 +138,7 @@ "outputs": [], "source": [ "# Example usage:\n", - "result = analyze_cricket(cricket_data, \"Virat Kohli\", \"Babar Azam\", \"ODI\", 3)\n", + "result = analyze_cricket(cricket_data, \"Virat Kohli\", \"ODI\", 3)\n", "print(result)" ] }, @@ -152,11 +157,11 @@ " \"type\": \"object\",\n", " \"properties\": {\n", " \"player1\": {\"type\": \"string\", \"description\": \"Name of first player\"},\n", - " \"player2\": {\"type\": \"string\", \"description\": \"Name of second player\"},\n", + " # \"player2\": {\"type\": \"string\", \"description\": \"Name of second player\"},\n", " \"match_format\": {\"type\": \"string\", \"enum\": [\"ODI\", \"Test\", \"T20\"], \"description\": \"Format of the match\"},\n", " \"years\": {\"type\": \"integer\", \"description\": \"Number of years to compare\"}\n", " },\n", - " \"required\": [\"player1\", \"player2\"]\n", + " \"required\": [\"player1\"]\n", " }\n", " }" ] @@ -200,11 +205,11 @@ "\n", " if response.choices[0].finish_reason==\"tool_calls\":\n", " message = response.choices[0].message\n", - " response, player1, player2 = handle_tool_call(message)\n", " messages.append(message)\n", - " messages.append(response)\n", + " for tool_call in message.tool_calls: \n", + " response, player1= handle_tool_call(tool_call)\n", + " messages.append(response)\n", " response = openai.chat.completions.create(model=MODEL, messages=messages)\n", - " \n", " return response.choices[0].message.content" ] }, @@ -217,23 +222,23 @@ "source": [ "# We have to write that function handle_tool_call:\n", "\n", - "def handle_tool_call(message):\n", - " tool_call = message.tool_calls[0]\n", - " print(\"tool_call.id\", tool_call.id)\n", + "def handle_tool_call(tool_call):\n", + " # tool_call = message.tool_calls[0]\n", + " # print(\"tool_call.id\", tool_call.id)\n", " arguments = json.loads(tool_call.function.arguments)\n", " print(\"arguments\", arguments)\n", " player1 = arguments.get('player1')\n", - " player2 = arguments.get('player2')\n", + " # player2 = arguments.get('player2')\n", " match_format = arguments.get('match_format', 'ODI')\n", " years = arguments.get('years', 3)\n", - " result = analyze_cricket(cricket_data, player1, player2, match_format, years)\n", - " print(\"result from analyze_cricket function: \", result)\n", + " result = analyze_cricket(cricket_data, player1, match_format, years)\n", + " print(\"result from analyze_cricket function: \", tool_call.id, result)\n", " response = {\n", " \"role\": \"tool\",\n", " \"content\": json.dumps(result),\n", " \"tool_call_id\": tool_call.id\n", " }\n", - " return response, player1, player2" + " return response, player1" ] }, { @@ -252,13 +257,11 @@ "\n", "\n", "2. ### can you please give me the comparison of Virat and babar?\n", - "Here you are not provided the info of format and number of years. In this case, the function will pick the default values for the match format, which is ODI and years which is 3.\n", + "Here, you are not provided the info on the format and number of years. In this case, the function will pick the default values for the match format, which is ODI, and the years, which is 3.\n", "\n", "\n", "3. ### Compare Rizwan and Babar in ODI Matches over the last years.\n", - "The given data is not available in the above data list. \n", - "- **Output**: \n", - "It seems that I couldn't retrieve specific data for Mohammad Rizwan and Babar Azam in ODI matches over the last three years. However, I can provide a general comparison based on available statistics up to October 2023.\n" + "The given data is not available in the above data list. \n" ] }, { @@ -268,7 +271,7 @@ "metadata": {}, "outputs": [], "source": [ - "gr.ChatInterface(fn=chat, type=\"messages\").launch()" + "gr.ChatInterface(fn=chat, type=\"messages\").launch(inbrowser=True)" ] }, { @@ -306,18 +309,21 @@ "metadata": {}, "outputs": [], "source": [ - "def artist(player1, player2):\n", - " return None\n", - " # image_response = openai.images.generate(\n", - " # model=\"dall-e-3\",\n", - " # prompt=f\"An image representing a comparison of {player1} and {player2}, showing their country flags and bowling or batting style\",\n", - " # size=\"1024x1024\",\n", - " # n=1,\n", - " # response_format=\"b64_json\",\n", - " # )\n", - " # image_base64 = image_response.data[0].b64_json\n", - " # image_data = base64.b64decode(image_base64)\n", - " # return Image.open(BytesIO(image_data))" + "def artist(player_names):\n", + " if len(player_names) <2 or len(player_names) > 2:\n", + " return None\n", + " player1 = player_names[0]\n", + " player2 = player_names[1]\n", + " image_response = openai.images.generate(\n", + " model=\"dall-e-3\",\n", + " prompt=f\"An image representing a comparison of {player1} and {player2}, showing their country flags and bowling or batting style\",\n", + " size=\"1024x1024\",\n", + " n=1,\n", + " response_format=\"b64_json\",\n", + " )\n", + " image_base64 = image_response.data[0].b64_json\n", + " image_data = base64.b64decode(image_base64)\n", + " return Image.open(BytesIO(image_data))" ] }, { @@ -327,18 +333,10 @@ "metadata": {}, "outputs": [], "source": [ - "image = artist(\"Babar\", \"Virat\")\n", + "image = artist([\"Babar\", \"root\"])\n", "display(image)" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "728a12c5-adc3-415d-bb05-82beb73b079b", - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "code", "execution_count": null, @@ -368,7 +366,7 @@ "metadata": {}, "outputs": [], "source": [ - "talker(\"Well, hi there\")" + "talker(\"Well, hi there\") # For testing purposes" ] }, { @@ -384,9 +382,7 @@ "2. The ability for LLMs to use Tools to give them additional capabilities\n", "3. The 'Agent Environment' which allows Agents to collaborate\n", "4. An LLM can act as the Planner, dividing bigger tasks into smaller ones for the specialists\n", - "5. The concept of an Agent having autonomy / agency, beyond just responding to a prompt - such as Memory\n", - "\n", - "We're showing 1 and 2 here, and to a lesser extent 3 and 5. In week 8 we will do the lot!" + "5. The concept of an Agent having autonomy / agency, beyond just responding to a prompt - such as Memory\n" ] }, { @@ -396,18 +392,23 @@ "metadata": {}, "outputs": [], "source": [ - "def chat(history):\n", + "def chat(history, image_choice):\n", " messages = [{\"role\": \"system\", \"content\": system_message}] + history\n", " response = openai.chat.completions.create(model=MODEL, messages=messages, tools=tools)\n", " image = None\n", " \n", " if response.choices[0].finish_reason==\"tool_calls\":\n", " message = response.choices[0].message\n", - " response, player1, player2 = handle_tool_call(message)\n", " messages.append(message)\n", - " messages.append(response)\n", - " \n", - " image = artist(player1, player2) #QUERY: how can i pass the value of format_dropdown in this function? \n", + " player_names = []\n", + " for tool_call in message.tool_calls:\n", + " response, player1= handle_tool_call(tool_call)\n", + " player_names.append(player1)\n", + " messages.append(response)\n", + " if image_choice.lower() == 'yes':\n", + " image = artist(player_names)\n", + " else:\n", + " print(\"Image value is NO\", image_choice)\n", " \n", " response = openai.chat.completions.create(model=MODEL, messages=messages)\n", " \n", @@ -431,12 +432,13 @@ "# Passing in inbrowser=True in the last line will cause a Gradio window to pop up immediately.\n", "\n", "with gr.Blocks() as ui:\n", + " gr.Markdown(\"### 🏏 Cricket Analyst AI Assistant\")\n", " with gr.Row():\n", " chatbot = gr.Chatbot(height=500, type=\"messages\")\n", " image_output = gr.Image(height=500)\n", "\n", - " with gr.Row(): #QUERY: How can I receive the value of \"Yes\" or \"No\" in chat function?\n", - " format_dropdown = gr.Dropdown(\n", + " with gr.Row():\n", + " image_dropdown = gr.Dropdown(\n", " choices=[\"Yes\", \"No\"],\n", " label=\"Do you want image?\"\n", " )\n", @@ -445,13 +447,19 @@ " with gr.Row():\n", " clear = gr.Button(\"Clear\")\n", "\n", - " def do_entry(message, history):\n", + " def do_entry(message, history, image_choice):\n", " history += [{\"role\": \"user\", \"content\": message}]\n", - " return \"\", history\n", + " return \"\", history, image_choice\n", "\n", - " entry.submit(do_entry, inputs=[entry, chatbot, format_dropdown], outputs=[entry, chatbot]).then(\n", - " chat, inputs=chatbot, outputs=[chatbot, image_output]\n", - " ) #QUERY: This part is a little bit confusing for me.\n", + " entry.submit(\n", + " do_entry, \n", + " inputs=[entry, chatbot, image_dropdown], \n", + " outputs=[entry, chatbot, image_dropdown]\n", + " ).then(\n", + " chat, \n", + " inputs=[chatbot, image_dropdown], \n", + " outputs=[chatbot, image_output]\n", + " )\n", " clear.click(lambda: None, inputs=None, outputs=chatbot, queue=False)\n", "\n", "ui.launch(inbrowser=True)" From e9215182d2a16cf0c2ca5822f0a237ad1723ba8b Mon Sep 17 00:00:00 2001 From: Carlos Bazaga Date: Tue, 12 Aug 2025 01:17:17 +0200 Subject: [PATCH 18/72] Updated requirements and Anaconda environment files. --- environment.yml | 1 + requirements.txt | 1 + 2 files changed, 2 insertions(+) diff --git a/environment.yml b/environment.yml index 470b64b..3d39950 100644 --- a/environment.yml +++ b/environment.yml @@ -44,3 +44,4 @@ dependencies: - twilio - pydub - protobuf==3.20.2 + - wandb diff --git a/requirements.txt b/requirements.txt index edcb3de..9d62d7d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -36,3 +36,4 @@ speedtest-cli sentence_transformers feedparser protobuf==3.20.2 +wandb From 54cd9cb24d8e00556f1f24b0877019e02a628334 Mon Sep 17 00:00:00 2001 From: Carlos Bazaga Date: Tue, 12 Aug 2025 01:21:56 +0200 Subject: [PATCH 19/72] Updated gitignore file to exclude WandB local synchronization data. During the OpenAI -> WandB sync process the library downloads locally the job's data. --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index a47cefc..8a77daf 100644 --- a/.gitignore +++ b/.gitignore @@ -189,3 +189,6 @@ nohup.out *.png scraper_cache/ + +# WandB local sync data. +wandb/ From c663379828e31992e9c3d9ffcd56f4882a1313b4 Mon Sep 17 00:00:00 2001 From: Carlos Bazaga Date: Tue, 12 Aug 2025 01:26:22 +0200 Subject: [PATCH 20/72] Update Week 6 Day 5 Notebook to make use of WandB sync. --- week6/day5.ipynb | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/week6/day5.ipynb b/week6/day5.ipynb index 5d5619e..14abeab 100644 --- a/week6/day5.ipynb +++ b/week6/day5.ipynb @@ -149,7 +149,7 @@ "source": [ "# First let's work on a good prompt for a Frontier model\n", "# Notice that I'm removing the \" to the nearest dollar\"\n", - "# When we train our own models, we'll need to make the problem as easy as possible, \n", + "# When we train our own models, we'll need to make the problem as easy as possible,\n", "# but a Frontier model needs no such simplification.\n", "\n", "def messages_for(item):\n", @@ -393,6 +393,22 @@ "openai.fine_tuning.jobs.list_events(fine_tuning_job_id=job_id, limit=10).data" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "b19ea9e9", + "metadata": {}, + "outputs": [], + "source": [ + "import wandb\n", + "from wandb.integration.openai.fine_tuning import WandbLogger\n", + "\n", + "# Log in to Weights & Biases.\n", + "wandb.login()\n", + "# Sync the fine-tuning job with Weights & Biases.\n", + "WandbLogger.sync(fine_tune_job_id=job_id, project=\"gpt-pricer\")" + ] + }, { "cell_type": "markdown", "id": "066fef03-8338-4526-9df3-89b649ad4f0a", @@ -490,7 +506,7 @@ "\n", "def gpt_fine_tuned(item):\n", " response = openai.chat.completions.create(\n", - " model=fine_tuned_model_name, \n", + " model=fine_tuned_model_name,\n", " messages=messages_for(item),\n", " seed=42,\n", " max_tokens=7\n", From d7d277c6b57ef72317f3197b903fd4d1ecc88edd Mon Sep 17 00:00:00 2001 From: Oluwaseyi-A <62573285+Oluwaseyi-A@users.noreply.github.com> Date: Tue, 12 Aug 2025 14:28:40 -0400 Subject: [PATCH 21/72] Added my contributions to community-contributions --- ...ch-paper-summarizer-with-highlighter.ipynb | 202 ++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 week1/community-contributions/day1-research-paper-summarizer-with-highlighter.ipynb diff --git a/week1/community-contributions/day1-research-paper-summarizer-with-highlighter.ipynb b/week1/community-contributions/day1-research-paper-summarizer-with-highlighter.ipynb new file mode 100644 index 0000000..74a00f9 --- /dev/null +++ b/week1/community-contributions/day1-research-paper-summarizer-with-highlighter.ipynb @@ -0,0 +1,202 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "5c527a13-459e-4a46-b00e-f2c5056de155", + "metadata": {}, + "source": [ + "# Research Paper Summarizer with Text Highlighting" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "861a0be5-6da7-4f66-8f82-bc083a913f9f", + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "\n", + "import os\n", + "import requests\n", + "from dotenv import load_dotenv\n", + "from bs4 import BeautifulSoup\n", + "from IPython.display import Markdown, display\n", + "from openai import OpenAI" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "74bf6765-53b6-457b-ac2d-0d1afa7fbf8f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "API key found and looks good so far!\n" + ] + } + ], + "source": [ + "# Load environment variables in a file called .env\n", + "\n", + "load_dotenv(override=True)\n", + "api_key = os.getenv('OPENAI_API_KEY')\n", + "\n", + "# Check the key\n", + "\n", + "if not api_key:\n", + " print(\"No API key was found - please head over to the troubleshooting notebook in this folder to identify & fix!\")\n", + "elif not api_key.startswith(\"sk-proj-\"):\n", + " print(\"An API key was found, but it doesn't start sk-proj-; please check you're using the right key - see troubleshooting notebook\")\n", + "elif api_key.strip() != api_key:\n", + " print(\"An API key was found, but it looks like it might have space or tab characters at the start or end - please remove them - see troubleshooting notebook\")\n", + "else:\n", + " print(\"API key found and looks good so far!\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "227ed7af-d539-4c87-988b-80e6e049c863", + "metadata": {}, + "outputs": [], + "source": [ + "openai = OpenAI()\n", + "\n", + "# If this doesn't work, try Kernel menu >> Restart Kernel and Clear Outputs Of All Cells, then run the cells from the top of this notebook down.\n", + "# If it STILL doesn't work (horrors!) then please see the Troubleshooting notebook in this folder for full instructions" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "dcaadf8b-456d-48ca-af9d-9f57d3414308", + "metadata": {}, + "outputs": [], + "source": [ + "# A class to represent a Webpage\n", + "# If you're not familiar with Classes, check out the \"Intermediate Python\" notebook\n", + "\n", + "# Some websites need you to use proper headers when fetching them:\n", + "headers = {\n", + " \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36\"\n", + "}\n", + "\n", + "class Website:\n", + "\n", + " def __init__(self, url):\n", + " \"\"\"\n", + " Create this Website object from the given url using the BeautifulSoup library\n", + " \"\"\"\n", + " self.url = url\n", + " response = requests.get(url, headers=headers)\n", + " soup = BeautifulSoup(response.content, 'html.parser')\n", + " self.title = soup.title.string if soup.title else \"No title found\"\n", + " for irrelevant in soup.body([\"script\", \"style\", \"img\", \"input\"]):\n", + " irrelevant.decompose()\n", + " self.text = soup.body.get_text(separator=\"\\n\", strip=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "6315093f-be68-408e-a5e1-6a2e4ea675e8", + "metadata": {}, + "outputs": [], + "source": [ + "def user_prompt_for(website):\n", + " user_prompt = f\"You are looking at an article website titled {website.title}\"\n", + " user_prompt += \"\\nThe contents of this website is as follows; \\\n", + "please provide a short summary of this website in markdown. \\\n", + "I'm also looking for complete statements containing the following keywords (if found): \\\n", + "'large circuit model', 'ChipGPT' \\n\\n\"\n", + " user_prompt += website.text\n", + " return user_prompt\n", + "\n", + "\n", + "article = Website(\"https://arxiv.org/html/2401.12224v1\")\n", + "# print(user_prompt_for(article))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "ff8a4112-f118-4866-b6cf-82675de0a38d", + "metadata": {}, + "outputs": [], + "source": [ + "system_prompt = \"You are an assistant that analyzes the contents of a scientific \\\n", + "article for a PhD student (who has to read a lot of papers and journals). The \\\n", + "user will provide the article website and keyword(s) they are looking to learn and \\\n", + "cite from. Your job is to summarize the paper and point out all the statements \\\n", + "containing the specific keyword(s) the user typed. \\\n", + "Respond in markdown.\"\n", + "\n", + "\n", + "def messages_for(website):\n", + " return [\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt_for(website)}\n", + " ]\n", + "\n", + " \n", + "#messages_for(article)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "b5e47bea-403d-48c3-ab9d-4d6adef83241", + "metadata": {}, + "outputs": [], + "source": [ + "def summarize(url):\n", + " website = Website(url)\n", + " response = openai.chat.completions.create(\n", + " model = \"gpt-4o-mini\",\n", + " messages = messages_for(website)\n", + " )\n", + " return response.choices[0].message.content\n", + "\n", + "\n", + "def display_summary(url):\n", + " summary = summarize(url)\n", + " display(Markdown(summary))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9f6ac1bc-5bc8-4daa-8174-d201400e517a", + "metadata": {}, + "outputs": [], + "source": [ + "display_summary(\"https://arxiv.org/html/2401.12224v1\")" + ] + } + ], + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 63376073db1f988dd3d96685d27fd673d851cad7 Mon Sep 17 00:00:00 2001 From: Oluwaseyi-A <62573285+Oluwaseyi-A@users.noreply.github.com> Date: Tue, 12 Aug 2025 23:06:07 -0400 Subject: [PATCH 22/72] Add week1 notebook to community-contributions (outputs cleared) --- .../website-summarization-using-ollama.ipynb | 142 ++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 week1/community-contributions/website-summarization-using-ollama.ipynb diff --git a/week1/community-contributions/website-summarization-using-ollama.ipynb b/week1/community-contributions/website-summarization-using-ollama.ipynb new file mode 100644 index 0000000..75edddb --- /dev/null +++ b/week1/community-contributions/website-summarization-using-ollama.ipynb @@ -0,0 +1,142 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a68b1042-558a-4051-85e2-9ffd7a31a871", + "metadata": {}, + "source": [ + "# Website Summarization Using llama\n", + "### Week 1 Day 2 Exercise" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "176fcb2f-9ac7-460b-9fad-415e89c4920e", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import requests\n", + "from dotenv import load_dotenv\n", + "from bs4 import BeautifulSoup\n", + "from IPython.display import Markdown, display\n", + "from openai import OpenAI" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "b9c63761-c904-491b-92c7-e41eb319c3e4", + "metadata": {}, + "outputs": [], + "source": [ + "# Constants\n", + "\n", + "# OLLAMA_API = \"http://localhost:11434/api/chat\"\n", + "# HEADERS = {\"Content-Type\": \"application/json\"}\n", + "MODEL = \"llama3.2\"" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "afe29712-751c-4322-a4c6-aed01e6acf26", + "metadata": {}, + "outputs": [], + "source": [ + "headers = {\n", + " \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36\"\n", + "}\n", + "\n", + "class Website:\n", + "\n", + " def __init__(self, url):\n", + " \"\"\"\n", + " Create this Website object from the given url using the BeautifulSoup library\n", + " \"\"\"\n", + " self.url = url\n", + " response = requests.get(url, headers=headers)\n", + " soup = BeautifulSoup(response.content, 'html.parser')\n", + " self.title = soup.title.string if soup.title else \"No title found\"\n", + " for irrelevant in soup.body([\"script\", \"style\", \"img\", \"input\"]):\n", + " irrelevant.decompose()\n", + " self.text = soup.body.get_text(separator=\"\\n\", strip=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "be3eeb3f-aec5-4ef8-9427-3b80b2dce919", + "metadata": {}, + "outputs": [], + "source": [ + "system_prompt = \"You are an assistant that analyzes the contents of a website \\\n", + "and provides a short summary, ignoring text that might be navigation related. \\\n", + "Respond in markdown.\"\n", + "\n", + "\n", + "def user_prompt_for(website):\n", + " user_prompt = f\"You are looking at a website titled {website.title}\"\n", + " user_prompt += \"\\nThe contents of this website is as follows; \\\n", + "please provide a short summary of this website in markdown. \\\n", + "If it includes news or announcements, then summarize these too.\\n\\n\"\n", + " user_prompt += website.text\n", + " return user_prompt\n", + " \n", + "\n", + "def messages_for(website):\n", + " return [\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt_for(website)}\n", + " ]\n", + "\n", + "ollama_via_openai = OpenAI(base_url='http://localhost:11434/v1', api_key='ollama')\n", + "\n", + "def summarize(url):\n", + " website = Website(url)\n", + " response = ollama_via_openai.chat.completions.create(\n", + " model = MODEL,\n", + " messages = messages_for(website)\n", + " )\n", + " return response.choices[0].message.content\n", + "\n", + "\n", + "def display_summary(url):\n", + " summary = summarize(url)\n", + " display(Markdown(summary))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "a78b587d-3a75-45a8-9ac5-f78dcddfa822", + "metadata": {}, + "outputs": [], + "source": [ + "display_summary(\"https://cnn.com\")" + ] + } + ], + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From f41833d183d33a6189e2bfa15540020d5a46399c Mon Sep 17 00:00:00 2001 From: Keshvi Date: Thu, 14 Aug 2025 20:19:48 +0530 Subject: [PATCH 23/72] Create Web2Quiz --- .../Keshvi_Web2Quiz/Web2Quiz.ipynb | 300 ++++++++++++++++++ 1 file changed, 300 insertions(+) create mode 100644 community-contributions/Keshvi_Web2Quiz/Web2Quiz.ipynb diff --git a/community-contributions/Keshvi_Web2Quiz/Web2Quiz.ipynb b/community-contributions/Keshvi_Web2Quiz/Web2Quiz.ipynb new file mode 100644 index 0000000..1609d81 --- /dev/null +++ b/community-contributions/Keshvi_Web2Quiz/Web2Quiz.ipynb @@ -0,0 +1,300 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "## Web2Quiz: Generator Quiz from webpage content." + ], + "metadata": { + "id": "n3vd295elWxh" + }, + "id": "n3vd295elWxh" + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f4484fcf-8b39-4c3f-9674-37970ed71988", + "metadata": { + "id": "f4484fcf-8b39-4c3f-9674-37970ed71988" + }, + "outputs": [], + "source": [ + "#.env upload\n", + "from google.colab import files\n", + "uploaded = files.upload()" + ] + }, + { + "cell_type": "code", + "source": [ + "!pip install dotenv\n" + ], + "metadata": { + "id": "VTpN_jVbMKuk" + }, + "id": "VTpN_jVbMKuk", + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "import os\n", + "from dotenv import load_dotenv" + ], + "metadata": { + "id": "twYi9eJwL2h1" + }, + "id": "twYi9eJwL2h1", + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "load_dotenv(override=True)\n", + "api_key = os.getenv('OPENROUTER_KEY')\n", + "\n", + "# Check the key\n", + "if not api_key:\n", + " print(\"No API key was found - please head over to the troubleshooting notebook in this folder to identify & fix!\")\n", + "# elif not api_key.startswith(\"sk-proj-\"):\n", + "# print(\"An API key was found, but it doesn't start sk-proj-; please check you're using the right key - see troubleshooting notebook\")\n", + "elif api_key.strip() != api_key:\n", + " print(\"An API key was found, but it looks like it might have space or tab characters at the start or end - please remove them - see troubleshooting notebook\")\n", + "else:\n", + " print(\"API key found and looks good so far!\")\n" + ], + "metadata": { + "id": "NRnUTEkZL2eZ" + }, + "id": "NRnUTEkZL2eZ", + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "!pip install openai" + ], + "metadata": { + "id": "RRuKJ_pzL2be" + }, + "id": "RRuKJ_pzL2be", + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "!pip install requests beautifulsoup4\n", + "!pip install selenium" + ], + "metadata": { + "id": "DWsPpdjOVPTW" + }, + "id": "DWsPpdjOVPTW", + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "from bs4 import BeautifulSoup\n", + "import requests\n", + "from tempfile import mkdtemp\n", + "from selenium import webdriver\n", + "from selenium.webdriver.chrome.options import Options\n", + "from selenium.webdriver.support.ui import WebDriverWait\n", + "from selenium.webdriver.support import expected_conditions as EC\n", + "from selenium.webdriver.common.by import By\n", + "\n", + "class Website:\n", + " def __init__(self, url, use_selenium=False):\n", + " \"\"\"\n", + " Create Website object from the given URL.\n", + " If use_selenium=True, fetch page with Selenium.\n", + " Otherwise, use requests + BeautifulSoup.\n", + " \"\"\"\n", + " self.url = url\n", + " self.title = \"\"\n", + " self.text = \"\"\n", + " self.use_selenium = use_selenium\n", + "\n", + " if self.use_selenium:\n", + " html = self._fetch_with_selenium()\n", + " else:\n", + " html = self._fetch_with_requests()\n", + "\n", + " if not html:\n", + " self.title = \"Error fetching page\"\n", + " self.text = \"Could not retrieve HTML content.\"\n", + " return\n", + "\n", + " soup = BeautifulSoup(html, \"html.parser\")\n", + " self.title = soup.title.string if soup.title else \"No title found\"\n", + "\n", + " # content_div = soup.find('div', id='content')\n", + " if soup.body:\n", + " for irrelevant in soup.body([\"script\", \"style\", \"img\", \"input\", \"header\", \"footer\", \"nav\", \"aside\"]):\n", + " irrelevant.decompose()\n", + " self.text = soup.body.get_text(separator=\"\\n\", strip=True)\n", + " else:\n", + " self.text = \"No body tag found in the HTML.\"\n", + "\n", + " # Basic html scrapper\n", + " def _fetch_with_requests(self):\n", + " \"\"\"Fetch HTML using requests.\"\"\"\n", + " try:\n", + " headers = {\"User-Agent\": \"Mozilla/5.0\"}\n", + " response = requests.get(self.url, headers=headers, timeout=10)\n", + " response.raise_for_status()\n", + " return response.text\n", + " except requests.exceptions.RequestException as e:\n", + " print(f\"Error fetching with requests: {e}\")\n", + " return None\n", + "\n", + " # Dynamic html scrapper\n", + " def _fetch_with_selenium(self):\n", + " \"\"\"Fetch HTML using Selenium with improved options.\"\"\"\n", + " options = Options()\n", + " options.add_argument(\"--no-sandbox\")\n", + " options.add_argument(\"--disable-dev-shm-usage\")\n", + " options.add_argument(\"--headless\")\n", + " options.add_argument(f\"--user-data-dir={mkdtemp()}\")\n", + "\n", + " driver = None\n", + " try:\n", + " driver = webdriver.Chrome(options=options)\n", + " driver.get(self.url)\n", + "\n", + " WebDriverWait(driver, 10).until(\n", + " EC.presence_of_element_located((By.TAG_NAME, \"body\"))\n", + " )\n", + "\n", + " html = driver.page_source\n", + " return html\n", + " except Exception as e:\n", + " print(f\"An error occurred during Selenium fetch: {e}\")\n", + " return None\n", + " finally:\n", + " if driver:\n", + " driver.quit()\n", + "\n" + ], + "metadata": { + "id": "PzBP0tXXcrP-" + }, + "id": "PzBP0tXXcrP-", + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "site1 = Website(\"https://en.wikipedia.org/wiki/Integration_testing\", use_selenium=False)\n", + "print(\"Title:\", site1.title)\n", + "print(\"Text preview:\", site1.text[:200])\n", + "\n", + "site2 = Website(\"https://www.tpointtech.com/java-for-loop\", use_selenium=True)\n", + "print(\"Title:\", site2.title)\n", + "print(\"Text preview:\", site2.text[:200])" + ], + "metadata": { + "id": "vsNmh5b5c6Gq" + }, + "id": "vsNmh5b5c6Gq", + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Step 1: Create your prompts\n", + "system_prompt = f\"You are a MCQ quiz generator. Analyze the provided TEXT and filter CONTENT relevent to {site1.title}. Then based on the relevant CONTENT generate 10 MCQs. List all correct options at the end.\"\n", + "user_prompt = f\"Below is provided TEXT : \\n{site1.text}\"\n", + "\n", + "# Step 2: Make the messages list\n", + "messages = [\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + "]\n", + "\n", + "# Step 3: Call OpenAI\n", + "openai = OpenAI(base_url=\"https://openrouter.ai/api/v1\", api_key=api_key)\n", + "\n", + "# Step 4: print the result\n", + "response = openai.chat.completions.create(model=\"qwen/qwen2.5-vl-72b-instruct:free\", messages=messages)\n", + "print(response.choices[0].message.content)" + ], + "metadata": { + "collapsed": true, + "id": "BYdc1w70QFD2" + }, + "id": "BYdc1w70QFD2", + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Step 1: Create your prompts\n", + "system_prompt = f\"You are a MCQ quiz generator. Analyze the provided TEXT and filter CONTENT relevent to {site2.title}. Then based on the relevant CONTENT generate 10 MCQs. List all correct options at the end.\"\n", + "user_prompt = f\"Below is provided TEXT : \\n{site2.text}\"\n", + "\n", + "# Step 2: Make the messages list\n", + "messages = [\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + "]\n", + "\n", + "# Step 3: Call OpenAI\n", + "openai = OpenAI(base_url=\"https://openrouter.ai/api/v1\", api_key=api_key)\n", + "\n", + "# Step 4: print the result\n", + "response = openai.chat.completions.create(model=\"qwen/qwen2.5-vl-72b-instruct:free\", messages=messages)\n", + "print(response.choices[0].message.content)" + ], + "metadata": { + "id": "Rv8vxFHtQFBm" + }, + "id": "Rv8vxFHtQFBm", + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "o5tIkQ95_2Hc" + }, + "id": "o5tIkQ95_2Hc", + "execution_count": null, + "outputs": [] + } + ], + "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.12" + }, + "colab": { + "provenance": [] + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file From e52fa74c62ec4f3bee3512f070d718b11e838002 Mon Sep 17 00:00:00 2001 From: Abdul Shaik Date: Thu, 14 Aug 2025 13:09:28 -0400 Subject: [PATCH 24/72] Added enhanced web scraper with Playwright support for JavaScript-heavy sites --- .../enhanced_web_scraper.ipynb | 731 ++++++++++++++++++ 1 file changed, 731 insertions(+) create mode 100644 community-contributions/playwright-enhanced-scraper/enhanced_web_scraper.ipynb diff --git a/community-contributions/playwright-enhanced-scraper/enhanced_web_scraper.ipynb b/community-contributions/playwright-enhanced-scraper/enhanced_web_scraper.ipynb new file mode 100644 index 0000000..8e7baf6 --- /dev/null +++ b/community-contributions/playwright-enhanced-scraper/enhanced_web_scraper.ipynb @@ -0,0 +1,731 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "d15d8294-3328-4e07-ad16-8a03e9bbfdb9", + "metadata": {}, + "source": [ + "# YOUR FIRST LAB\n", + "### Please read this section. This is valuable to get you prepared, even if it's a long read -- it's important stuff.\n", + "\n", + "## Your first Frontier LLM Project\n", + "\n", + "Let's build a useful LLM solution - in a matter of minutes.\n", + "\n", + "By the end of this course, you will have built an autonomous Agentic AI solution with 7 agents that collaborate to solve a business problem. All in good time! We will start with something smaller...\n", + "\n", + "Our goal is to code a new kind of Web Browser. Give it a URL, and it will respond with a summary. The Reader's Digest of the internet!!\n", + "\n", + "Before starting, you should have completed the setup for [PC](../SETUP-PC.md) or [Mac](../SETUP-mac.md) and you hopefully launched this jupyter lab from within the project root directory, with your environment activated.\n", + "\n", + "## If you're new to Jupyter Lab\n", + "\n", + "Welcome to the wonderful world of Data Science experimentation! Once you've used Jupyter Lab, you'll wonder how you ever lived without it. Simply click in each \"cell\" with code in it, such as the cell immediately below this text, and hit Shift+Return to execute that cell. As you wish, you can add a cell with the + button in the toolbar, and print values of variables, or try out variations. \n", + "\n", + "I've written a notebook called [Guide to Jupyter](Guide%20to%20Jupyter.ipynb) to help you get more familiar with Jupyter Labs, including adding Markdown comments, using `!` to run shell commands, and `tqdm` to show progress.\n", + "\n", + "## If you're new to the Command Line\n", + "\n", + "Please see these excellent guides: [Command line on PC](https://chatgpt.com/share/67b0acea-ba38-8012-9c34-7a2541052665) and [Command line on Mac](https://chatgpt.com/canvas/shared/67b0b10c93a081918210723867525d2b). \n", + "\n", + "## If you'd prefer to work in IDEs\n", + "\n", + "If you're more comfortable in IDEs like VSCode, Cursor or PyCharm, they both work great with these lab notebooks too. \n", + "If you'd prefer to work in VSCode, [here](https://chatgpt.com/share/676f2e19-c228-8012-9911-6ca42f8ed766) are instructions from an AI friend on how to configure it for the course.\n", + "\n", + "## If you'd like to brush up your Python\n", + "\n", + "I've added a notebook called [Intermediate Python](Intermediate%20Python.ipynb) to get you up to speed. But you should give it a miss if you already have a good idea what this code does: \n", + "`yield from {book.get(\"author\") for book in books if book.get(\"author\")}`\n", + "\n", + "## I am here to help\n", + "\n", + "If you have any problems at all, please do reach out. \n", + "I'm available through the platform, or at ed@edwarddonner.com, or at https://www.linkedin.com/in/eddonner/ if you'd like to connect (and I love connecting!) \n", + "And this is new to me, but I'm also trying out X/Twitter at [@edwarddonner](https://x.com/edwarddonner) - if you're on X, please show me how it's done 😂 \n", + "\n", + "## More troubleshooting\n", + "\n", + "Please see the [troubleshooting](troubleshooting.ipynb) notebook in this folder to diagnose and fix common problems. At the very end of it is a diagnostics script with some useful debug info.\n", + "\n", + "## For foundational technical knowledge (eg Git, APIs, debugging) \n", + "\n", + "If you're relatively new to programming -- I've got your back! While it's ideal to have some programming experience for this course, there's only one mandatory prerequisite: plenty of patience. 😁 I've put together a set of self-study guides that cover Git and GitHub, APIs and endpoints, beginner python and more.\n", + "\n", + "This covers Git and GitHub; what they are, the difference, and how to use them: \n", + "https://github.com/ed-donner/agents/blob/main/guides/03_git_and_github.ipynb\n", + "\n", + "This covers technical foundations: \n", + "ChatGPT vs API; taking screenshots; Environment Variables; Networking basics; APIs and endpoints: \n", + "https://github.com/ed-donner/agents/blob/main/guides/04_technical_foundations.ipynb\n", + "\n", + "This covers Python for beginners, and making sure that a `NameError` never trips you up: \n", + "https://github.com/ed-donner/agents/blob/main/guides/06_python_foundations.ipynb\n", + "\n", + "This covers the essential techniques for figuring out errors: \n", + "https://github.com/ed-donner/agents/blob/main/guides/08_debugging.ipynb\n", + "\n", + "And you'll find other useful guides in the same folder in GitHub. Some information applies to my other Udemy course (eg Async Python) but most of it is very relevant for LLM engineering.\n", + "\n", + "## If this is old hat!\n", + "\n", + "If you're already comfortable with today's material, please hang in there; you can move swiftly through the first few labs - we will get much more in depth as the weeks progress. Ultimately we will fine-tune our own LLM to compete with OpenAI!\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + "

Please read - important note

\n", + " The way I collaborate with you may be different to other courses you've taken. I prefer not to type code while you watch. Rather, I execute Jupyter Labs, like this, and give you an intuition for what's going on. My suggestion is that you carefully execute this yourself, after watching the lecture. Add print statements to understand what's going on, and then come up with your own variations. If you have a Github account, use this to showcase your variations. Not only is this essential practice, but it demonstrates your skills to others, including perhaps future clients or employers...\n", + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + "

This code is a live resource - keep an eye out for my emails

\n", + " I push updates to the code regularly. As people ask questions, I add more examples or improved commentary. As a result, you'll notice that the code below isn't identical to the videos. Everything from the videos is here; but I've also added better explanations and new models like DeepSeek. Consider this like an interactive book.

\n", + " I try to send emails regularly with important updates related to the course. You can find this in the 'Announcements' section of Udemy in the left sidebar. You can also choose to receive my emails via your Notification Settings in Udemy. I'm respectful of your inbox and always try to add value with my emails!\n", + "
\n", + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + "

Business value of these exercises

\n", + " A final thought. While I've designed these notebooks to be educational, I've also tried to make them enjoyable. We'll do fun things like have LLMs tell jokes and argue with each other. But fundamentally, my goal is to teach skills you can apply in business. I'll explain business implications as we go, and it's worth keeping this in mind: as you build experience with models and techniques, think of ways you could put this into action at work today. Please do contact me if you'd like to discuss more or if you have ideas to bounce off me.\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4e2a9393-7767-488e-a8bf-27c12dca35bd", + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "\n", + "import os\n", + "import requests\n", + "from dotenv import load_dotenv\n", + "from bs4 import BeautifulSoup\n", + "from IPython.display import Markdown, display\n", + "from openai import OpenAI\n", + "\n", + "# If you get an error running this cell, then please head over to the troubleshooting notebook!" + ] + }, + { + "cell_type": "markdown", + "id": "6900b2a8-6384-4316-8aaa-5e519fca4254", + "metadata": {}, + "source": [ + "# Connecting to OpenAI (or Ollama)\n", + "\n", + "The next cell is where we load in the environment variables in your `.env` file and connect to OpenAI. \n", + "\n", + "If you'd like to use free Ollama instead, please see the README section \"Free Alternative to Paid APIs\", and if you're not sure how to do this, there's a full solution in the solutions folder (day1_with_ollama.ipynb).\n", + "\n", + "## Troubleshooting if you have problems:\n", + "\n", + "Head over to the [troubleshooting](troubleshooting.ipynb) notebook in this folder for step by step code to identify the root cause and fix it!\n", + "\n", + "If you make a change, try restarting the \"Kernel\" (the python process sitting behind this notebook) by Kernel menu >> Restart Kernel and Clear Outputs of All Cells. Then try this notebook again, starting at the top.\n", + "\n", + "Or, contact me! Message me or email ed@edwarddonner.com and we will get this to work.\n", + "\n", + "Any concerns about API costs? See my notes in the README - costs should be minimal, and you can control it at every point. You can also use Ollama as a free alternative, which we discuss during Day 2." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7b87cadb-d513-4303-baee-a37b6f938e4d", + "metadata": {}, + "outputs": [], + "source": [ + "# Load environment variables in a file called .env\n", + "\n", + "load_dotenv(override=True)\n", + "api_key = os.getenv('OPENAI_API_KEY')\n", + "\n", + "# Check the key\n", + "\n", + "if not api_key:\n", + " print(\"No API key was found - please head over to the troubleshooting notebook in this folder to identify & fix!\")\n", + "elif not api_key.startswith(\"sk-proj-\"):\n", + " print(\"An API key was found, but it doesn't start sk-proj-; please check you're using the right key - see troubleshooting notebook\")\n", + "elif api_key.strip() != api_key:\n", + " print(\"An API key was found, but it looks like it might have space or tab characters at the start or end - please remove them - see troubleshooting notebook\")\n", + "else:\n", + " print(\"API key found and looks good so far!\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "019974d9-f3ad-4a8a-b5f9-0a3719aea2d3", + "metadata": {}, + "outputs": [], + "source": [ + "openai = OpenAI()\n", + "\n", + "# If this doesn't work, try Kernel menu >> Restart Kernel and Clear Outputs Of All Cells, then run the cells from the top of this notebook down.\n", + "# If it STILL doesn't work (horrors!) then please see the Troubleshooting notebook in this folder for full instructions" + ] + }, + { + "cell_type": "markdown", + "id": "442fc84b-0815-4f40-99ab-d9a5da6bda91", + "metadata": {}, + "source": [ + "# Let's make a quick call to a Frontier model to get started, as a preview!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a58394bf-1e45-46af-9bfd-01e24da6f49a", + "metadata": {}, + "outputs": [], + "source": [ + "# To give you a preview -- calling OpenAI with these messages is this easy. Any problems, head over to the Troubleshooting notebook.\n", + "\n", + "message = \"Hello, GPT! This is my first ever message to you! Hi!\"\n", + "response = openai.chat.completions.create(model=\"gpt-4o-mini\", messages=[{\"role\":\"user\", \"content\":message}])\n", + "print(response.choices[0].message.content)" + ] + }, + { + "cell_type": "markdown", + "id": "2aa190e5-cb31-456a-96cc-db109919cd78", + "metadata": {}, + "source": [ + "## OK onwards with our first project" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c5e793b2-6775-426a-a139-4848291d0463", + "metadata": {}, + "outputs": [], + "source": [ + "# A class to represent a Webpage\n", + "# If you're not familiar with Classes, check out the \"Intermediate Python\" notebook\n", + "\n", + "# Some websites need you to use proper headers when fetching them:\n", + "headers = {\n", + " \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36\"\n", + "}\n", + "\n", + "class Website:\n", + "\n", + " def __init__(self, url):\n", + " \"\"\"\n", + " Create this Website object from the given url using the BeautifulSoup library\n", + " \"\"\"\n", + " self.url = url\n", + " response = requests.get(url, headers=headers)\n", + " soup = BeautifulSoup(response.content, 'html.parser')\n", + " self.title = soup.title.string if soup.title else \"No title found\"\n", + " for irrelevant in soup.body([\"script\", \"style\", \"img\", \"input\"]):\n", + " irrelevant.decompose()\n", + " self.text = soup.body.get_text(separator=\"\\n\", strip=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef960cf-6dc2-4cda-afb3-b38be12f4c97", + "metadata": {}, + "outputs": [], + "source": [ + "# Let's try one out. Change the website and add print statements to follow along.\n", + "\n", + "ed = Website(\"https://edwarddonner.com\")\n", + "print(ed.title)\n", + "print(ed.text)" + ] + }, + { + "cell_type": "markdown", + "id": "6a478a0c-2c53-48ff-869c-4d08199931e1", + "metadata": {}, + "source": [ + "## Types of prompts\n", + "\n", + "You may know this already - but if not, you will get very familiar with it!\n", + "\n", + "Models like GPT4o have been trained to receive instructions in a particular way.\n", + "\n", + "They expect to receive:\n", + "\n", + "**A system prompt** that tells them what task they are performing and what tone they should use\n", + "\n", + "**A user prompt** -- the conversation starter that they should reply to" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "abdb8417-c5dc-44bc-9bee-2e059d162699", + "metadata": {}, + "outputs": [], + "source": [ + "# Define our system prompt - you can experiment with this later, changing the last sentence to 'Respond in markdown in Spanish.\"\n", + "\n", + "system_prompt = \"You are an assistant that analyzes the contents of a website \\\n", + "and provides a short summary, ignoring text that might be navigation related. \\\n", + "Respond in markdown.\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f0275b1b-7cfe-4f9d-abfa-7650d378da0c", + "metadata": {}, + "outputs": [], + "source": [ + "# A function that writes a User Prompt that asks for summaries of websites:\n", + "\n", + "def user_prompt_for(website):\n", + " user_prompt = f\"You are looking at a website titled {website.title}\"\n", + " user_prompt += \"\\nThe contents of this website is as follows; \\\n", + "please provide a short summary of this website in markdown. \\\n", + "If it includes news or announcements, then summarize these too.\\n\\n\"\n", + " user_prompt += website.text\n", + " return user_prompt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26448ec4-5c00-4204-baec-7df91d11ff2e", + "metadata": {}, + "outputs": [], + "source": [ + "print(user_prompt_for(ed))" + ] + }, + { + "cell_type": "markdown", + "id": "ea211b5f-28e1-4a86-8e52-c0b7677cadcc", + "metadata": {}, + "source": [ + "## Messages\n", + "\n", + "The API from OpenAI expects to receive messages in a particular structure.\n", + "Many of the other APIs share this structure:\n", + "\n", + "```python\n", + "[\n", + " {\"role\": \"system\", \"content\": \"system message goes here\"},\n", + " {\"role\": \"user\", \"content\": \"user message goes here\"}\n", + "]\n", + "```\n", + "To give you a preview, the next 2 cells make a rather simple call - we won't stretch the mighty GPT (yet!)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f25dcd35-0cd0-4235-9f64-ac37ed9eaaa5", + "metadata": {}, + "outputs": [], + "source": [ + "messages = [\n", + " {\"role\": \"system\", \"content\": \"You are a snarky assistant\"},\n", + " {\"role\": \"user\", \"content\": \"What is 2 + 2?\"}\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21ed95c5-7001-47de-a36d-1d6673b403ce", + "metadata": {}, + "outputs": [], + "source": [ + "# To give you a preview -- calling OpenAI with system and user messages:\n", + "\n", + "response = openai.chat.completions.create(model=\"gpt-4o-mini\", messages=messages)\n", + "print(response.choices[0].message.content)" + ] + }, + { + "cell_type": "markdown", + "id": "d06e8d78-ce4c-4b05-aa8e-17050c82bb47", + "metadata": {}, + "source": [ + "## And now let's build useful messages for GPT-4o-mini, using a function" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0134dfa4-8299-48b5-b444-f2a8c3403c88", + "metadata": {}, + "outputs": [], + "source": [ + "# See how this function creates exactly the format above\n", + "\n", + "def messages_for(website):\n", + " return [\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt_for(website)}\n", + " ]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "36478464-39ee-485c-9f3f-6a4e458dbc9c", + "metadata": {}, + "outputs": [], + "source": [ + "# Try this out, and then try for a few more websites\n", + "\n", + "messages_for(ed)" + ] + }, + { + "cell_type": "markdown", + "id": "16f49d46-bf55-4c3e-928f-68fc0bf715b0", + "metadata": {}, + "source": [ + "## Time to bring it together - the API for OpenAI is very simple!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "905b9919-aba7-45b5-ae65-81b3d1d78e34", + "metadata": {}, + "outputs": [], + "source": [ + "# And now: call the OpenAI API. You will get very familiar with this!\n", + "\n", + "def summarize(url):\n", + " website = Website(url)\n", + " response = openai.chat.completions.create(\n", + " model = \"gpt-4o-mini\",\n", + " messages = messages_for(website)\n", + " )\n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "05e38d41-dfa4-4b20-9c96-c46ea75d9fb5", + "metadata": {}, + "outputs": [], + "source": [ + "summarize(\"https://edwarddonner.com\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3d926d59-450e-4609-92ba-2d6f244f1342", + "metadata": {}, + "outputs": [], + "source": [ + "# A function to display this nicely in the Jupyter output, using markdown\n", + "\n", + "def display_summary(url):\n", + " summary = summarize(url)\n", + " display(Markdown(summary))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3018853a-445f-41ff-9560-d925d1774b2f", + "metadata": {}, + "outputs": [], + "source": [ + "display_summary(\"https://edwarddonner.com\")" + ] + }, + { + "cell_type": "markdown", + "id": "b3bcf6f4-adce-45e9-97ad-d9a5d7a3a624", + "metadata": {}, + "source": [ + "# Let's try more websites\n", + "\n", + "Note that this will only work on websites that can be scraped using this simplistic approach.\n", + "\n", + "Websites that are rendered with Javascript, like React apps, won't show up. See the community-contributions folder for a Selenium implementation that gets around this. You'll need to read up on installing Selenium (ask ChatGPT!)\n", + "\n", + "Also Websites protected with CloudFront (and similar) may give 403 errors - many thanks Andy J for pointing this out.\n", + "\n", + "But many websites will work just fine!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "45d83403-a24c-44b5-84ac-961449b4008f", + "metadata": {}, + "outputs": [], + "source": [ + "display_summary(\"https://cnn.com\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "75e9fd40-b354-4341-991e-863ef2e59db7", + "metadata": {}, + "outputs": [], + "source": [ + "display_summary(\"https://anthropic.com\")" + ] + }, + { + "cell_type": "markdown", + "id": "c951be1a-7f1b-448f-af1f-845978e47e2c", + "metadata": {}, + "source": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + "

Business applications

\n", + " In this exercise, you experienced calling the Cloud API of a Frontier Model (a leading model at the frontier of AI) for the first time. We will be using APIs like OpenAI at many stages in the course, in addition to building our own LLMs.\n", + "\n", + "More specifically, we've applied this to Summarization - a classic Gen AI use case to make a summary. This can be applied to any business vertical - summarizing the news, summarizing financial performance, summarizing a resume in a cover letter - the applications are limitless. Consider how you could apply Summarization in your business, and try prototyping a solution.\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + "

Before you continue - now try yourself

\n", + " Use the cell below to make your own simple commercial example. Stick with the summarization use case for now. Here's an idea: write something that will take the contents of an email, and will suggest an appropriate short subject line for the email. That's the kind of feature that might be built into a commercial email tool.\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "00743dac-0e70-45b7-879a-d7293a6f68a6", + "metadata": {}, + "outputs": [], + "source": [ + "# Step 1: Create your prompts\n", + "\n", + "system_prompt = \"something here\"\n", + "user_prompt = \"\"\"\n", + " Lots of text\n", + " Can be pasted here\n", + "\"\"\"\n", + "\n", + "# Step 2: Make the messages list\n", + "\n", + "messages = [] # fill this in\n", + "\n", + "# Step 3: Call OpenAI\n", + "\n", + "response =\n", + "\n", + "# Step 4: print the result\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "36ed9f14-b349-40e9-a42c-b367e77f8bda", + "metadata": {}, + "source": [ + "## An extra exercise for those who enjoy web scraping\n", + "\n", + "You may notice that if you try `display_summary(\"https://openai.com\")` - it doesn't work! That's because OpenAI has a fancy website that uses Javascript. There are many ways around this that some of you might be familiar with. For example, Selenium is a hugely popular framework that runs a browser behind the scenes, renders the page, and allows you to query it. If you have experience with Selenium, Playwright or similar, then feel free to improve the Website class to use them. In the community-contributions folder, you'll find an example Selenium solution from a student (thank you!)" + ] + }, + { + "cell_type": "markdown", + "id": "eeab24dc-5f90-4570-b542-b0585aca3eb6", + "metadata": {}, + "source": [ + "# Sharing your code\n", + "\n", + "I'd love it if you share your code afterwards so I can share it with others! You'll notice that some students have already made changes (including a Selenium implementation) which you will find in the community-contributions folder. If you'd like add your changes to that folder, submit a Pull Request with your new versions in that folder and I'll merge your changes.\n", + "\n", + "If you're not an expert with git (and I am not!) then GPT has given some nice instructions on how to submit a Pull Request. It's a bit of an involved process, but once you've done it once it's pretty clear. As a pro-tip: it's best if you clear the outputs of your Jupyter notebooks (Edit >> Clean outputs of all cells, and then Save) for clean notebooks.\n", + "\n", + "Here are good instructions courtesy of an AI friend: \n", + "https://chatgpt.com/share/677a9cb5-c64c-8012-99e0-e06e88afd293" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f4484fcf-8b39-4c3f-9674-37970ed71988", + "metadata": {}, + "outputs": [], + "source": [ + "from playwright.sync_api import sync_playwright\n", + "import time \n", + "import asyncio\n", + "from playwright.async_api import async_playwright\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fd3fdc92", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "44099289", + "metadata": {}, + "outputs": [], + "source": [ + "class Website:\n", + " def __init__(self, url):\n", + " self.url = url\n", + " self.title = None\n", + " self.text = None\n", + "\n", + " @classmethod\n", + " async def create(cls, url):\n", + " website = cls(url)\n", + " retries = 3 # Add retry logic\n", + " for attempt in range(retries):\n", + " try:\n", + " await website.initialize()\n", + " return website\n", + " except TimeoutError as e:\n", + " if attempt == retries - 1: # Last attempt\n", + " raise\n", + " print(f\"Attempt {attempt + 1} failed, retrying...\")\n", + " await asyncio.sleep(2) # Wait between retries\n", + "\n", + " async def initialize(self):\n", + " async with async_playwright() as p:\n", + " # Launch with stealth mode settings\n", + " browser = await p.chromium.launch(\n", + " headless=True,\n", + " args=[\n", + " '--disable-blink-features=AutomationControlled',\n", + " '--disable-dev-shm-usage',\n", + " '--no-sandbox'\n", + " ]\n", + " )\n", + " \n", + " # Create context with stealth settings\n", + " context = await browser.new_context(\n", + " user_agent='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',\n", + " viewport={'width': 1920, 'height': 1080},\n", + " java_script_enabled=True,\n", + " bypass_csp=True, # Bypass Content Security Policy\n", + " extra_http_headers={\n", + " 'Accept-Language': 'en-US,en;q=0.9',\n", + " 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'\n", + " }\n", + " )\n", + " \n", + " page = await context.new_page()\n", + " \n", + " try:\n", + " # Navigate with progressive waits\n", + " await page.goto(self.url, timeout=90000) # 90 second timeout\n", + " \n", + " # Wait for either real content or Cloudflare challenge\n", + " try:\n", + " # Wait for actual content first\n", + " await page.wait_for_selector('main', timeout=10000)\n", + " except:\n", + " # If main content not found, wait for Cloudflare to clear\n", + " await page.wait_for_load_state('networkidle', timeout=30000)\n", + " await page.wait_for_selector('body', state='visible', timeout=30000)\n", + " \n", + " # Get content after all waits\n", + " self.title = await page.title()\n", + " content = await page.content()\n", + " \n", + " soup = BeautifulSoup(content, 'html.parser')\n", + " for irrelevant in soup.find_all([\"script\", \"style\", \"img\", \"input\"]):\n", + " irrelevant.decompose()\n", + " self.text = soup.body.get_text(separator=\"\\n\", strip=True) if soup.body else \"\"\n", + " \n", + " finally:\n", + " await browser.close()\n", + "\n", + "# Modified summarize function to use the factory method\n", + "async def summarize(url):\n", + " website = await Website.create(url)\n", + " response = openai.chat.completions.create(\n", + " model=\"gpt-4o-mini\",\n", + " messages=messages_for(website)\n", + " )\n", + " return response.choices[0].message.content\n", + "\n", + "# Display function remains the same\n", + "async def display_summary(url):\n", + " summary = await summarize(url)\n", + " display(Markdown(summary))\n", + "\n", + "# Usage\n", + "await display_summary(\"https://openai.com\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "78e0d270", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "llms", + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 2c1adb0d2dbbf6e179660c050d382ab3405540ae Mon Sep 17 00:00:00 2001 From: Ashutosh Singh Date: Thu, 14 Aug 2025 13:05:15 -0700 Subject: [PATCH 25/72] Added code for finding top tech products --- .../Top Tech products.ipynb | 181 ++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 week1/community-contributions/Top Tech products.ipynb diff --git a/week1/community-contributions/Top Tech products.ipynb b/week1/community-contributions/Top Tech products.ipynb new file mode 100644 index 0000000..53b4841 --- /dev/null +++ b/week1/community-contributions/Top Tech products.ipynb @@ -0,0 +1,181 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "bbd8585e-0a28-4fd9-80b5-690569f93e16", + "metadata": {}, + "outputs": [], + "source": [ + "#This notebook will help you to get top tech products with by providing category and subcategory" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "df039118-f462-4a8b-949e-53d3a726e292", + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "\n", + "import os\n", + "import requests\n", + "from dotenv import load_dotenv\n", + "from bs4 import BeautifulSoup\n", + "from IPython.display import Markdown, display\n", + "from openai import OpenAI\n", + "aa" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e2ffd2e5-d061-446c-891e-15a6d1958ab6", + "metadata": {}, + "outputs": [], + "source": [ + "# Load environment variables in a file called .env\n", + "\n", + "load_dotenv(override=True)\n", + "api_key = os.getenv('OPENAI_API_KEY')\n", + "\n", + "# Check the key\n", + "\n", + "if not api_key:\n", + " print(\"No API key was found - please head over to the troubleshooting notebook in this folder to identify & fix!\")\n", + "elif not api_key.startswith(\"sk-proj-\"):\n", + " print(\"An API key was found, but it doesn't start sk-proj-; please check you're using the right key - see troubleshooting notebook\")\n", + "elif api_key.strip() != api_key:\n", + " print(\"An API key was found, but it looks like it might have space or tab characters at the start or end - please remove them - see troubleshooting notebook\")\n", + "else:\n", + " print(\"API key found and looks good so far!\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "92e26007-521f-4ea2-9df9-edd77dd7e183", + "metadata": {}, + "outputs": [], + "source": [ + "openai = OpenAI()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "27d21593-8feb-42e4-bbc0-2e949b51137d", + "metadata": {}, + "outputs": [], + "source": [ + "def tech_product(category_subcategory_budget):\n", + " parts = category_subcategory_budget.split('_')\n", + " return f\"{parts[0]}-{parts[1]}-{parts[2]}\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dd978d25-5b84-4122-af7c-116f2bf72179", + "metadata": {}, + "outputs": [], + "source": [ + "def messages_for(products):\n", + " return [\n", + " {\"role\": \"system\", \"content\": \"you are a tech product expert and you need to suggest the best suited product available in India basis the input received in the form of category-subcategory-budget (in inr),\\\n", + " revert with category and subcategory and show the product links as well along with pros and cons, respond in markdown\"},\n", + " {\"role\": \"user\", \"content\": tech_product(products)}\n", + " ]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b916db7a-81a4-41d9-87c2-a2346fd874d2", + "metadata": {}, + "outputs": [], + "source": [ + "messages_for(\"phone_gaming_40000\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3b4bb3f1-95de-4eb5-afe1-068744f93301", + "metadata": {}, + "outputs": [], + "source": [ + "def get_top_products(category_subcategory):\n", + " response = openai.chat.completions.create(\n", + " model = \"gpt-4o-mini\",\n", + " messages= messages_for(category_subcategory)\n", + " )\n", + " return response.choices[0].message.content \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c9272942-acfe-4fca-bd0a-3435c1ee6691", + "metadata": {}, + "outputs": [], + "source": [ + "get_top_products('phone_gaming_30000')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2c2b3b9a-aceb-4f00-8c8d-8f6837ab94fc", + "metadata": {}, + "outputs": [], + "source": [ + "def display_markdown(category_subcategory_budget):\n", + " output = get_top_products(category_subcategory_budget)\n", + " display(Markdown(output))\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6c135dd7-4ed4-48ee-ba3f-9b4ca1c32149", + "metadata": {}, + "outputs": [], + "source": [ + "display_markdown('Console_gaming_100000')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0ba06c55-7ef9-47eb-aeaf-3c4a7b29bccc", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 6e9978391051aabaf8807660f7b48e02360a6cd3 Mon Sep 17 00:00:00 2001 From: rahulvit2010 Date: Fri, 15 Aug 2025 11:46:33 +0530 Subject: [PATCH 26/72] assistant which give subject of email --- week1/community-contributions/day1.ipynb | 817 +++++++++++++++++++++++ 1 file changed, 817 insertions(+) create mode 100644 week1/community-contributions/day1.ipynb diff --git a/week1/community-contributions/day1.ipynb b/week1/community-contributions/day1.ipynb new file mode 100644 index 0000000..b876e38 --- /dev/null +++ b/week1/community-contributions/day1.ipynb @@ -0,0 +1,817 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "d15d8294-3328-4e07-ad16-8a03e9bbfdb9", + "metadata": {}, + "source": [ + "# YOUR FIRST LAB\n", + "### Please read this section. This is valuable to get you prepared, even if it's a long read -- it's important stuff.\n", + "\n", + "## Your first Frontier LLM Project\n", + "\n", + "Let's build a useful LLM solution - in a matter of minutes.\n", + "\n", + "By the end of this course, you will have built an autonomous Agentic AI solution with 7 agents that collaborate to solve a business problem. All in good time! We will start with something smaller...\n", + "\n", + "Our goal is to code a new kind of Web Browser. Give it a URL, and it will respond with a summary. The Reader's Digest of the internet!!\n", + "\n", + "Before starting, you should have completed the setup for [PC](../SETUP-PC.md) or [Mac](../SETUP-mac.md) and you hopefully launched this jupyter lab from within the project root directory, with your environment activated.\n", + "\n", + "## If you're new to Jupyter Lab\n", + "\n", + "Welcome to the wonderful world of Data Science experimentation! Once you've used Jupyter Lab, you'll wonder how you ever lived without it. Simply click in each \"cell\" with code in it, such as the cell immediately below this text, and hit Shift+Return to execute that cell. As you wish, you can add a cell with the + button in the toolbar, and print values of variables, or try out variations. \n", + "\n", + "I've written a notebook called [Guide to Jupyter](Guide%20to%20Jupyter.ipynb) to help you get more familiar with Jupyter Labs, including adding Markdown comments, using `!` to run shell commands, and `tqdm` to show progress.\n", + "\n", + "## If you're new to the Command Line\n", + "\n", + "Please see these excellent guides: [Command line on PC](https://chatgpt.com/share/67b0acea-ba38-8012-9c34-7a2541052665) and [Command line on Mac](https://chatgpt.com/canvas/shared/67b0b10c93a081918210723867525d2b). \n", + "\n", + "## If you'd prefer to work in IDEs\n", + "\n", + "If you're more comfortable in IDEs like VSCode, Cursor or PyCharm, they both work great with these lab notebooks too. \n", + "If you'd prefer to work in VSCode, [here](https://chatgpt.com/share/676f2e19-c228-8012-9911-6ca42f8ed766) are instructions from an AI friend on how to configure it for the course.\n", + "\n", + "## If you'd like to brush up your Python\n", + "\n", + "I've added a notebook called [Intermediate Python](Intermediate%20Python.ipynb) to get you up to speed. But you should give it a miss if you already have a good idea what this code does: \n", + "`yield from {book.get(\"author\") for book in books if book.get(\"author\")}`\n", + "\n", + "## I am here to help\n", + "\n", + "If you have any problems at all, please do reach out. \n", + "I'm available through the platform, or at ed@edwarddonner.com, or at https://www.linkedin.com/in/eddonner/ if you'd like to connect (and I love connecting!) \n", + "And this is new to me, but I'm also trying out X/Twitter at [@edwarddonner](https://x.com/edwarddonner) - if you're on X, please show me how it's done 😂 \n", + "\n", + "## More troubleshooting\n", + "\n", + "Please see the [troubleshooting](troubleshooting.ipynb) notebook in this folder to diagnose and fix common problems. At the very end of it is a diagnostics script with some useful debug info.\n", + "\n", + "## For foundational technical knowledge (eg Git, APIs, debugging) \n", + "\n", + "If you're relatively new to programming -- I've got your back! While it's ideal to have some programming experience for this course, there's only one mandatory prerequisite: plenty of patience. 😁 I've put together a set of self-study guides that cover Git and GitHub, APIs and endpoints, beginner python and more.\n", + "\n", + "This covers Git and GitHub; what they are, the difference, and how to use them: \n", + "https://github.com/ed-donner/agents/blob/main/guides/03_git_and_github.ipynb\n", + "\n", + "This covers technical foundations: \n", + "ChatGPT vs API; taking screenshots; Environment Variables; Networking basics; APIs and endpoints: \n", + "https://github.com/ed-donner/agents/blob/main/guides/04_technical_foundations.ipynb\n", + "\n", + "This covers Python for beginners, and making sure that a `NameError` never trips you up: \n", + "https://github.com/ed-donner/agents/blob/main/guides/06_python_foundations.ipynb\n", + "\n", + "This covers the essential techniques for figuring out errors: \n", + "https://github.com/ed-donner/agents/blob/main/guides/08_debugging.ipynb\n", + "\n", + "And you'll find other useful guides in the same folder in GitHub. Some information applies to my other Udemy course (eg Async Python) but most of it is very relevant for LLM engineering.\n", + "\n", + "## If this is old hat!\n", + "\n", + "If you're already comfortable with today's material, please hang in there; you can move swiftly through the first few labs - we will get much more in depth as the weeks progress. Ultimately we will fine-tune our own LLM to compete with OpenAI!\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + "

Please read - important note

\n", + " The way I collaborate with you may be different to other courses you've taken. I prefer not to type code while you watch. Rather, I execute Jupyter Labs, like this, and give you an intuition for what's going on. My suggestion is that you carefully execute this yourself, after watching the lecture. Add print statements to understand what's going on, and then come up with your own variations. If you have a Github account, use this to showcase your variations. Not only is this essential practice, but it demonstrates your skills to others, including perhaps future clients or employers...\n", + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + "

This code is a live resource - keep an eye out for my emails

\n", + " I push updates to the code regularly. As people ask questions, I add more examples or improved commentary. As a result, you'll notice that the code below isn't identical to the videos. Everything from the videos is here; but I've also added better explanations and new models like DeepSeek. Consider this like an interactive book.

\n", + " I try to send emails regularly with important updates related to the course. You can find this in the 'Announcements' section of Udemy in the left sidebar. You can also choose to receive my emails via your Notification Settings in Udemy. I'm respectful of your inbox and always try to add value with my emails!\n", + "
\n", + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + "

Business value of these exercises

\n", + " A final thought. While I've designed these notebooks to be educational, I've also tried to make them enjoyable. We'll do fun things like have LLMs tell jokes and argue with each other. But fundamentally, my goal is to teach skills you can apply in business. I'll explain business implications as we go, and it's worth keeping this in mind: as you build experience with models and techniques, think of ways you could put this into action at work today. Please do contact me if you'd like to discuss more or if you have ideas to bounce off me.\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "4e2a9393-7767-488e-a8bf-27c12dca35bd", + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "\n", + "import os\n", + "import requests\n", + "from dotenv import load_dotenv\n", + "from bs4 import BeautifulSoup\n", + "from IPython.display import Markdown, display\n", + "from openai import OpenAI\n", + "\n", + "# If you get an error running this cell, then please head over to the troubleshooting notebook!" + ] + }, + { + "cell_type": "markdown", + "id": "6900b2a8-6384-4316-8aaa-5e519fca4254", + "metadata": {}, + "source": [ + "# Connecting to OpenAI (or Ollama)\n", + "\n", + "The next cell is where we load in the environment variables in your `.env` file and connect to OpenAI. \n", + "\n", + "If you'd like to use free Ollama instead, please see the README section \"Free Alternative to Paid APIs\", and if you're not sure how to do this, there's a full solution in the solutions folder (day1_with_ollama.ipynb).\n", + "\n", + "## Troubleshooting if you have problems:\n", + "\n", + "Head over to the [troubleshooting](troubleshooting.ipynb) notebook in this folder for step by step code to identify the root cause and fix it!\n", + "\n", + "If you make a change, try restarting the \"Kernel\" (the python process sitting behind this notebook) by Kernel menu >> Restart Kernel and Clear Outputs of All Cells. Then try this notebook again, starting at the top.\n", + "\n", + "Or, contact me! Message me or email ed@edwarddonner.com and we will get this to work.\n", + "\n", + "Any concerns about API costs? See my notes in the README - costs should be minimal, and you can control it at every point. You can also use Ollama as a free alternative, which we discuss during Day 2." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7b87cadb-d513-4303-baee-a37b6f938e4d", + "metadata": {}, + "outputs": [], + "source": [ + "# Load environment variables in a file called .env\n", + "\n", + "load_dotenv(override=True)\n", + "api_key = os.getenv('OPENAI_API_KEY')\n", + "\n", + "# Check the key\n", + "\n", + "if not api_key:\n", + " print(\"No API key was found - please head over to the troubleshooting notebook in this folder to identify & fix!\")\n", + "elif not api_key.startswith(\"sk-proj-\"):\n", + " print(\"An API key was found, but it doesn't start sk-proj-; please check you're using the right key - see troubleshooting notebook\")\n", + "elif api_key.strip() != api_key:\n", + " print(\"An API key was found, but it looks like it might have space or tab characters at the start or end - please remove them - see troubleshooting notebook\")\n", + "else:\n", + " print(\"API key found and looks good so far!\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "019974d9-f3ad-4a8a-b5f9-0a3719aea2d3", + "metadata": {}, + "outputs": [], + "source": [ + "openai = OpenAI()\n", + "\n", + "# If this doesn't work, try Kernel menu >> Restart Kernel and Clear Outputs Of All Cells, then run the cells from the top of this notebook down.\n", + "# If it STILL doesn't work (horrors!) then please see the Troubleshooting notebook in this folder for full instructions" + ] + }, + { + "cell_type": "markdown", + "id": "442fc84b-0815-4f40-99ab-d9a5da6bda91", + "metadata": {}, + "source": [ + "# Let's make a quick call to a Frontier model to get started, as a preview!" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "a58394bf-1e45-46af-9bfd-01e24da6f49a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello! It’s great to hear from you! How can I help you today?\n" + ] + } + ], + "source": [ + "# To give you a preview -- calling OpenAI with these messages is this easy. Any problems, head over to the Troubleshooting notebook.\n", + "\n", + "message = \"Hello, GPT! This is my first ever message to you! Hi!\"\n", + "response = openai.chat.completions.create(model=\"gpt-4o-mini\", messages=[{\"role\":\"user\", \"content\":message}])\n", + "print(response.choices[0].message.content)" + ] + }, + { + "cell_type": "markdown", + "id": "2aa190e5-cb31-456a-96cc-db109919cd78", + "metadata": {}, + "source": [ + "## OK onwards with our first project" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "c5e793b2-6775-426a-a139-4848291d0463", + "metadata": {}, + "outputs": [], + "source": [ + "# A class to represent a Webpage\n", + "# If you're not familiar with Classes, check out the \"Intermediate Python\" notebook\n", + "\n", + "# Some websites need you to use proper headers when fetching them:\n", + "headers = {\n", + " \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36\"\n", + "}\n", + "\n", + "class Website:\n", + "\n", + " def __init__(self, url):\n", + " \"\"\"\n", + " Create this Website object from the given url using the BeautifulSoup library\n", + " \"\"\"\n", + " self.url = url\n", + " response = requests.get(url, headers=headers)\n", + " soup = BeautifulSoup(response.content, 'html.parser')\n", + " self.title = soup.title.string if soup.title else \"No title found\"\n", + " for irrelevant in soup.body([\"script\", \"style\", \"img\", \"input\"]):\n", + " irrelevant.decompose()\n", + " self.text = soup.body.get_text(separator=\"\\n\", strip=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "2ef960cf-6dc2-4cda-afb3-b38be12f4c97", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Home - Edward Donner\n", + "Home\n", + "Connect Four\n", + "Outsmart\n", + "An arena that pits LLMs against each other in a battle of diplomacy and deviousness\n", + "About\n", + "Posts\n", + "Well, hi there.\n", + "I’m Ed. I like writing code and experimenting with LLMs, and hopefully you’re here because you do too. I also enjoy DJing (but I’m badly out of practice), amateur electronic music production (\n", + "very\n", + "amateur) and losing myself in\n", + "Hacker News\n", + ", nodding my head sagely to things I only half understand.\n", + "I’m the co-founder and CTO of\n", + "Nebula.io\n", + ". We’re applying AI to a field where it can make a massive, positive impact: helping people discover their potential and pursue their reason for being. Recruiters use our product today to source, understand, engage and manage talent. I’m previously the founder and CEO of AI startup untapt,\n", + "acquired in 2021\n", + ".\n", + "We work with groundbreaking, proprietary LLMs verticalized for talent, we’ve\n", + "patented\n", + "our matching model, and our award-winning platform has happy customers and tons of press coverage.\n", + "Connect\n", + "with me for more!\n", + "May 28, 2025\n", + "Connecting my courses – become an LLM expert and leader\n", + "May 18, 2025\n", + "2025 AI Executive Briefing\n", + "April 21, 2025\n", + "The Complete Agentic AI Engineering Course\n", + "January 23, 2025\n", + "LLM Workshop – Hands-on with Agents – resources\n", + "Navigation\n", + "Home\n", + "Connect Four\n", + "Outsmart\n", + "An arena that pits LLMs against each other in a battle of diplomacy and deviousness\n", + "About\n", + "Posts\n", + "Get in touch\n", + "ed [at] edwarddonner [dot] com\n", + "www.edwarddonner.com\n", + "Follow me\n", + "LinkedIn\n", + "Twitter\n", + "Facebook\n", + "Subscribe to newsletter\n", + "Type your email…\n", + "Subscribe\n" + ] + } + ], + "source": [ + "# Let's try one out. Change the website and add print statements to follow along.\n", + "\n", + "ed = Website(\"https://edwarddonner.com\")\n", + "print(ed.title)\n", + "print(ed.text)" + ] + }, + { + "cell_type": "markdown", + "id": "6a478a0c-2c53-48ff-869c-4d08199931e1", + "metadata": {}, + "source": [ + "## Types of prompts\n", + "\n", + "You may know this already - but if not, you will get very familiar with it!\n", + "\n", + "Models like GPT4o have been trained to receive instructions in a particular way.\n", + "\n", + "They expect to receive:\n", + "\n", + "**A system prompt** that tells them what task they are performing and what tone they should use\n", + "\n", + "**A user prompt** -- the conversation starter that they should reply to" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "abdb8417-c5dc-44bc-9bee-2e059d162699", + "metadata": {}, + "outputs": [], + "source": [ + "# Define our system prompt - you can experiment with this later, changing the last sentence to 'Respond in markdown in Spanish.\"\n", + "\n", + "system_prompt = \"You are an assistant that analyzes the contents of a website \\\n", + "and provides a short summary, ignoring text that might be navigation related. \\\n", + "Respond in markdown.\"" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "f0275b1b-7cfe-4f9d-abfa-7650d378da0c", + "metadata": {}, + "outputs": [], + "source": [ + "# A function that writes a User Prompt that asks for summaries of websites:\n", + "\n", + "def user_prompt_for(website):\n", + " user_prompt = f\"You are looking at a website titled {website.title}\"\n", + " user_prompt += \"\\nThe contents of this website is as follows; \\\n", + "please provide a short summary of this website in markdown. \\\n", + "If it includes news or announcements, then summarize these too.\\n\\n\"\n", + " user_prompt += website.text\n", + " return user_prompt" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "26448ec4-5c00-4204-baec-7df91d11ff2e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You are looking at a website titled Home - Edward Donner\n", + "The contents of this website is as follows; please provide a short summary of this website in markdown. If it includes news or announcements, then summarize these too.\n", + "\n", + "Home\n", + "Connect Four\n", + "Outsmart\n", + "An arena that pits LLMs against each other in a battle of diplomacy and deviousness\n", + "About\n", + "Posts\n", + "Well, hi there.\n", + "I’m Ed. I like writing code and experimenting with LLMs, and hopefully you’re here because you do too. I also enjoy DJing (but I’m badly out of practice), amateur electronic music production (\n", + "very\n", + "amateur) and losing myself in\n", + "Hacker News\n", + ", nodding my head sagely to things I only half understand.\n", + "I’m the co-founder and CTO of\n", + "Nebula.io\n", + ". We’re applying AI to a field where it can make a massive, positive impact: helping people discover their potential and pursue their reason for being. Recruiters use our product today to source, understand, engage and manage talent. I’m previously the founder and CEO of AI startup untapt,\n", + "acquired in 2021\n", + ".\n", + "We work with groundbreaking, proprietary LLMs verticalized for talent, we’ve\n", + "patented\n", + "our matching model, and our award-winning platform has happy customers and tons of press coverage.\n", + "Connect\n", + "with me for more!\n", + "May 28, 2025\n", + "Connecting my courses – become an LLM expert and leader\n", + "May 18, 2025\n", + "2025 AI Executive Briefing\n", + "April 21, 2025\n", + "The Complete Agentic AI Engineering Course\n", + "January 23, 2025\n", + "LLM Workshop – Hands-on with Agents – resources\n", + "Navigation\n", + "Home\n", + "Connect Four\n", + "Outsmart\n", + "An arena that pits LLMs against each other in a battle of diplomacy and deviousness\n", + "About\n", + "Posts\n", + "Get in touch\n", + "ed [at] edwarddonner [dot] com\n", + "www.edwarddonner.com\n", + "Follow me\n", + "LinkedIn\n", + "Twitter\n", + "Facebook\n", + "Subscribe to newsletter\n", + "Type your email…\n", + "Subscribe\n" + ] + } + ], + "source": [ + "print(user_prompt_for(ed))" + ] + }, + { + "cell_type": "markdown", + "id": "ea211b5f-28e1-4a86-8e52-c0b7677cadcc", + "metadata": {}, + "source": [ + "## Messages\n", + "\n", + "The API from OpenAI expects to receive messages in a particular structure.\n", + "Many of the other APIs share this structure:\n", + "\n", + "```python\n", + "[\n", + " {\"role\": \"system\", \"content\": \"system message goes here\"},\n", + " {\"role\": \"user\", \"content\": \"user message goes here\"}\n", + "]\n", + "```\n", + "To give you a preview, the next 2 cells make a rather simple call - we won't stretch the mighty GPT (yet!)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "f25dcd35-0cd0-4235-9f64-ac37ed9eaaa5", + "metadata": {}, + "outputs": [], + "source": [ + "messages = [\n", + " {\"role\": \"system\", \"content\": \"You are a snarky assistant\"},\n", + " {\"role\": \"user\", \"content\": \"What is 2 + 2?\"}\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "21ed95c5-7001-47de-a36d-1d6673b403ce", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Oh, you’re going for the big math questions now, huh? Well, if you insist on dragging me into elementary school territory, the answer is 4. Shocking, I know.\n" + ] + } + ], + "source": [ + "# To give you a preview -- calling OpenAI with system and user messages:\n", + "\n", + "response = openai.chat.completions.create(model=\"gpt-4o-mini\", messages=messages)\n", + "print(response.choices[0].message.content)" + ] + }, + { + "cell_type": "markdown", + "id": "d06e8d78-ce4c-4b05-aa8e-17050c82bb47", + "metadata": {}, + "source": [ + "## And now let's build useful messages for GPT-4o-mini, using a function" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "0134dfa4-8299-48b5-b444-f2a8c3403c88", + "metadata": {}, + "outputs": [], + "source": [ + "# See how this function creates exactly the format above\n", + "\n", + "def messages_for(website):\n", + " return [\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt_for(website)}\n", + " ]" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "36478464-39ee-485c-9f3f-6a4e458dbc9c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'role': 'system',\n", + " 'content': 'You are an assistant that analyzes the contents of a website and provides a short summary, ignoring text that might be navigation related. Respond in markdown.'},\n", + " {'role': 'user',\n", + " 'content': 'You are looking at a website titled Home - Edward Donner\\nThe contents of this website is as follows; please provide a short summary of this website in markdown. If it includes news or announcements, then summarize these too.\\n\\nHome\\nConnect Four\\nOutsmart\\nAn arena that pits LLMs against each other in a battle of diplomacy and deviousness\\nAbout\\nPosts\\nWell, hi there.\\nI’m Ed. I like writing code and experimenting with LLMs, and hopefully you’re here because you do too. I also enjoy DJing (but I’m badly out of practice), amateur electronic music production (\\nvery\\namateur) and losing myself in\\nHacker News\\n, nodding my head sagely to things I only half understand.\\nI’m the co-founder and CTO of\\nNebula.io\\n. We’re applying AI to a field where it can make a massive, positive impact: helping people discover their potential and pursue their reason for being. Recruiters use our product today to source, understand, engage and manage talent. I’m previously the founder and CEO of AI startup untapt,\\nacquired in 2021\\n.\\nWe work with groundbreaking, proprietary LLMs verticalized for talent, we’ve\\npatented\\nour matching model, and our award-winning platform has happy customers and tons of press coverage.\\nConnect\\nwith me for more!\\nMay 28, 2025\\nConnecting my courses – become an LLM expert and leader\\nMay 18, 2025\\n2025 AI Executive Briefing\\nApril 21, 2025\\nThe Complete Agentic AI Engineering Course\\nJanuary 23, 2025\\nLLM Workshop – Hands-on with Agents – resources\\nNavigation\\nHome\\nConnect Four\\nOutsmart\\nAn arena that pits LLMs against each other in a battle of diplomacy and deviousness\\nAbout\\nPosts\\nGet in touch\\ned [at] edwarddonner [dot] com\\nwww.edwarddonner.com\\nFollow me\\nLinkedIn\\nTwitter\\nFacebook\\nSubscribe to newsletter\\nType your email…\\nSubscribe'}]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Try this out, and then try for a few more websites\n", + "\n", + "messages_for(ed)" + ] + }, + { + "cell_type": "markdown", + "id": "16f49d46-bf55-4c3e-928f-68fc0bf715b0", + "metadata": {}, + "source": [ + "## Time to bring it together - the API for OpenAI is very simple!" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "905b9919-aba7-45b5-ae65-81b3d1d78e34", + "metadata": {}, + "outputs": [], + "source": [ + "# And now: call the OpenAI API. You will get very familiar with this!\n", + "\n", + "def summarize(url):\n", + " website = Website(url)\n", + " response = openai.chat.completions.create(\n", + " model = \"gpt-4o-mini\",\n", + " messages = messages_for(website)\n", + " )\n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "05e38d41-dfa4-4b20-9c96-c46ea75d9fb5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'# Summary of Edward Donner\\'s Website\\n\\nThe website is the personal platform of Ed Donner, a software engineer and co-founder/CTO of Nebula.io, an AI-focused company that aims to help individuals discover their potential through technology. Ed expresses his passion for coding, experimenting with large language models (LLMs), and interests in DJing and electronic music production.\\n\\n## Key Sections:\\n- **About Ed**: Provides personal background, detailing his experience in AI startups, including his previous venture, untapt, which was acquired in 2021. He highlights the use of patented matching models and LLMs in talent management.\\n- **Connect Four & Outsmart**: Features interactive games or platforms where LLMs engage in diplomatic and strategic challenges.\\n- **Courses & Announcements**:\\n - **May 28, 2025**: Announced a course focused on becoming an LLM expert and leader.\\n - **May 18, 2025**: Announcement for the 2025 AI Executive Briefing.\\n - **April 21, 2025**: Introduction of \"The Complete Agentic AI Engineering Course.\"\\n - **January 23, 2025**: A workshop providing hands-on experience with agents and associated resources.\\n\\nThe website also encourages visitors to connect and engage through various social media platforms and a newsletter subscription.'" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "summarize(\"https://edwarddonner.com\")" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "3d926d59-450e-4609-92ba-2d6f244f1342", + "metadata": {}, + "outputs": [], + "source": [ + "# A function to display this nicely in the Jupyter output, using markdown\n", + "\n", + "def display_summary(url):\n", + " summary = summarize(url)\n", + " display(Markdown(summary))" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "3018853a-445f-41ff-9560-d925d1774b2f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "# Summary of \"Home - Edward Donner\"\n", + "\n", + "The website is dedicated to Edward Donner, a co-founder and CTO of Nebula.io, a platform focused on leveraging AI to assist individuals in discovering their potential and engaging with talent. Edward expresses an interest in coding, experiments with large language models (LLMs), DJing, and electronic music production. He has a history as the founder of an AI startup, untapt, which was acquired in 2021.\n", + "\n", + "## Key Features:\n", + "- **Connect Four**: A game involving LLMs competing in diplomacy and strategy.\n", + "- **About**: Information about Edward's professional background and interests.\n", + "- **Courses and Workshops**: \n", + " - **Recent Announcements**:\n", + " - **May 28, 2025**: Launch of a program to become an LLM expert and leader.\n", + " - **May 18, 2025**: Announcement of a 2025 AI Executive Briefing.\n", + " - **April 21, 2025**: Introduction of the Complete Agentic AI Engineering Course.\n", + " - **January 23, 2025**: A hands-on LLM Workshop focusing on resources related to agents.\n", + "\n", + "The content emphasizes his passion for AI and education within the industry." + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display_summary(\"https://edwarddonner.com\")" + ] + }, + { + "cell_type": "markdown", + "id": "b3bcf6f4-adce-45e9-97ad-d9a5d7a3a624", + "metadata": {}, + "source": [ + "# Let's try more websites\n", + "\n", + "Note that this will only work on websites that can be scraped using this simplistic approach.\n", + "\n", + "Websites that are rendered with Javascript, like React apps, won't show up. See the community-contributions folder for a Selenium implementation that gets around this. You'll need to read up on installing Selenium (ask ChatGPT!)\n", + "\n", + "Also Websites protected with CloudFront (and similar) may give 403 errors - many thanks Andy J for pointing this out.\n", + "\n", + "But many websites will work just fine!" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "45d83403-a24c-44b5-84ac-961449b4008f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "# CNN Website Summary\n", + "\n", + "CNN is a major news outlet that provides comprehensive coverage of world events, featuring sections on U.S. and international news, political analysis, business, health, entertainment, and sports. The site emphasizes real-time updates and includes various multimedia formats such as videos and articles.\n", + "\n", + "### Notable Articles and Updates\n", + "\n", + "- **Ukraine-Russia War**: Pro-Ukraine protests are ongoing, and there are discussions regarding dignitaries meeting on U.S. soil amidst rising tensions.\n", + " \n", + "- **Israel-Hamas Conflict**: Analysis and reports highlight significant developments including Israel’s settlement plans which may impact the future of a Palestinian state.\n", + "\n", + "- **Health**: New heart health guidelines suggest going alcohol-free; studies indicate a high level of stress among teenagers.\n", + "\n", + "- **Entertainment**:\n", + " - Megadeth is set to release its final album and embark on a farewell tour.\n", + " - Taylor Swift's recent appearances are noted for cultural impact.\n", + "\n", + "- **Science**: Climate-related findings unveil vulnerabilities in GPS and satellites due to pollution.\n", + "\n", + "- **Business**: Discussions are ongoing about potential government stake in Intel, affecting stock prices.\n", + "\n", + "### Additional Features\n", + "CNN also offers a variety of interactive content including quizzes, games, and newsletters tailored to reader interests. The site encourages user engagement through feedback on advertisements and technical issues.\n", + "\n", + "Overall, CNN remains a significant source for breaking news and in-depth analysis across a broad spectrum of topics." + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display_summary(\"https://cnn.com\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "75e9fd40-b354-4341-991e-863ef2e59db7", + "metadata": {}, + "outputs": [], + "source": [ + "display_summary(\"https://anthropic.com\")" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "00743dac-0e70-45b7-879a-d7293a6f68a6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Subject: Leave Notification: Medical Emergency (Aug 17-21, 2025)\n" + ] + } + ], + "source": [ + "# Step 1: Create your prompts\n", + "\n", + "system_prompt = \"you are the email assistant, which provide the subject of the email\"\n", + "user_prompt = \"\"\"\n", + " please provide the appropriate subject for below email\n", + "hi team,\n", + "due to some medical emergency , i will be on leave for 5 days starting\n", + "from 17-08-2025 to 21-08-2025.\n", + "\n", + "please call me in case of any urgency.\n", + "\n", + "regards\n", + "Rahul\n", + "\"\"\"\n", + "\n", + "# Step 2: Make the messages list\n", + "\n", + "messages = [\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + "]\n", + "\n", + "# Step 3: Call OpenAI\n", + "response = openai.chat.completions.create(model=\"gpt-4o-mini\", messages=messages)\n", + "\n", + "\n", + "# Step 4: print the result\n", + "\n", + "print(response.choices[0].message.content)" + ] + }, + { + "cell_type": "markdown", + "id": "36ed9f14-b349-40e9-a42c-b367e77f8bda", + "metadata": {}, + "source": [ + "## An extra exercise for those who enjoy web scraping\n", + "\n", + "You may notice that if you try `display_summary(\"https://openai.com\")` - it doesn't work! That's because OpenAI has a fancy website that uses Javascript. There are many ways around this that some of you might be familiar with. For example, Selenium is a hugely popular framework that runs a browser behind the scenes, renders the page, and allows you to query it. If you have experience with Selenium, Playwright or similar, then feel free to improve the Website class to use them. In the community-contributions folder, you'll find an example Selenium solution from a student (thank you!)" + ] + }, + { + "cell_type": "markdown", + "id": "eeab24dc-5f90-4570-b542-b0585aca3eb6", + "metadata": {}, + "source": [ + "# Sharing your code\n", + "\n", + "I'd love it if you share your code afterwards so I can share it with others! You'll notice that some students have already made changes (including a Selenium implementation) which you will find in the community-contributions folder. If you'd like add your changes to that folder, submit a Pull Request with your new versions in that folder and I'll merge your changes.\n", + "\n", + "If you're not an expert with git (and I am not!) then GPT has given some nice instructions on how to submit a Pull Request. It's a bit of an involved process, but once you've done it once it's pretty clear. As a pro-tip: it's best if you clear the outputs of your Jupyter notebooks (Edit >> Clean outputs of all cells, and then Save) for clean notebooks.\n", + "\n", + "Here are good instructions courtesy of an AI friend: \n", + "https://chatgpt.com/share/677a9cb5-c64c-8012-99e0-e06e88afd293" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f4484fcf-8b39-4c3f-9674-37970ed71988", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From efcb0de19e2190339a15f95266d4719169732f9e Mon Sep 17 00:00:00 2001 From: KiranAyyagari Date: Fri, 15 Aug 2025 12:14:34 +0530 Subject: [PATCH 27/72] Add TechHelpAgent exercise notebook Introduces a Jupyter notebook for the week 1 exercise, demonstrating use of OpenAI API and Ollama to answer technical questions. Includes setup, example prompts, and code for generating explanations using GPT and Llama models. --- .../week1 EXERCISE - TechHelpAgent.ipynb | 206 ++++++++++++++++++ 1 file changed, 206 insertions(+) create mode 100644 week1/community-contributions/week1 EXERCISE - TechHelpAgent.ipynb diff --git a/week1/community-contributions/week1 EXERCISE - TechHelpAgent.ipynb b/week1/community-contributions/week1 EXERCISE - TechHelpAgent.ipynb new file mode 100644 index 0000000..a750b2e --- /dev/null +++ b/week1/community-contributions/week1 EXERCISE - TechHelpAgent.ipynb @@ -0,0 +1,206 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "fe12c203-e6a6-452c-a655-afb8a03a4ff5", + "metadata": {}, + "source": [ + "# End of week 1 exercise\n", + "\n", + "To demonstrate your familiarity with OpenAI API, and also Ollama, build a tool that takes a technical question, \n", + "and responds with an explanation. This is a tool that you will be able to use yourself during the course!" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "c1070317-3ed9-4659-abe3-828943230e03", + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "import os\n", + "from dotenv import load_dotenv\n", + "from IPython.display import Markdown, display, update_display\n", + "from openai import OpenAI\n", + "import json\n", + "from IPython.display import Markdown, display, update_display\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "4a456906-915a-4bfd-bb9d-57e505c5093f", + "metadata": {}, + "outputs": [], + "source": [ + "# constants\n", + "\n", + "MODEL_GPT = 'gpt-4o-mini'\n", + "MODEL_LLAMA = 'llama3.2'\n", + "openai = OpenAI()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "a8d7923c-5f28-4c30-8556-342d7c8497c1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "API key looks good so far\n" + ] + } + ], + "source": [ + "# set up environment\n", + "load_dotenv(override=True)\n", + "api_key = os.getenv(\"OPENAI_API_KEY\")\n", + "if api_key and api_key.startswith('sk-proj-') and len(api_key)>10:\n", + " print(\"API key looks good so far\")\n", + "else:\n", + " print(\"There might be a problem with your API key? Please visit the troubleshooting notebook!\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "3f0d0137-52b0-47a8-81a8-11a90a010798", + "metadata": {}, + "outputs": [], + "source": [ + "# here is the question; type over this to ask something new\n", + "system_prompt = \"You are a software engineering and data science expert and you have knowledge in all the areas of software engineering and latest technologies, trends. You should guide and help users with your technical solutions for all software engineering and data science related questions\"\n", + "user_prompt = \"\"\"\n", + "Please explain what this code does and why:\n", + "yield from {book.get(\"author\") for book in books if book.get(\"author\")}\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "60ce7000-a4a5-4cce-a261-e75ef45063b4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "This code snippet is utilizing a Python generator expression combined with the `yield from` statement to yield values from a set comprehension. Let's break it down:\n", + "\n", + "1. **Set Comprehension**:\n", + " ```python\n", + " {book.get(\"author\") for book in books if book.get(\"author\")}\n", + " ```\n", + " - This is a set comprehension that iterates over a collection called `books`.\n", + " - For each `book`, it retrieves the value associated with the key `\"author\"` using the `get()` method.\n", + " - The `if book.get(\"author\")` condition ensures that only books that have a valid (non-None or non-empty) author are included. This effectively filters out any books where the author is not present.\n", + "\n", + " As a result, this part creates a set of unique authors from the list of books. Since sets automatically discard duplicates, if multiple books have the same author, that author will only appear once in the resulting set.\n", + "\n", + "2. **Yielding Values**:\n", + " ```python\n", + " yield from\n", + " ```\n", + " - The `yield from` statement is used when you want to yield all values from an iterable. It allows a generator to yield all values from another generator or iterable.\n", + " - In this context, it will yield each author from the set created by the comprehension.\n", + "\n", + "3. **Putting It All Together**:\n", + " What this overall code does is:\n", + " - It generates and yields unique authors from a collection of books, ensuring that each author is listed only once and only for books that actually specify an author.\n", + "\n", + "### Purpose:\n", + "This code is useful in scenarios where you need to obtain a seemingly infinite generator of authors from a collection of books, processing each author one by one without creating a permanent list or set in memory, which can be beneficial for memory efficiency especially if you have a very large collection of books.\n", + "\n", + "### Example Usage:\n", + "Here’s a basic example of how you might use this in a generator function:\n", + "\n", + "```python\n", + "def get_unique_authors(books):\n", + " yield from {book.get(\"author\") for book in books if book.get(\"author\")}\n", + "\n", + "# Example books list\n", + "books = [\n", + " {\"title\": \"Book 1\", \"author\": \"Author A\"},\n", + " {\"title\": \"Book 2\", \"author\": \"Author B\"},\n", + " {\"title\": \"Book 3\", \"author\": \"Author A\"},\n", + " {\"title\": \"Book 4\", \"author\": None},\n", + "]\n", + "\n", + "for author in get_unique_authors(books):\n", + " print(author)\n", + "```\n", + "\n", + "This would output:\n", + "```\n", + "Author A\n", + "Author B\n", + "```\n", + "\n", + "In this example, `Author A` only appears once, demonstrating the uniqueness provided by the set comprehension." + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "None\n" + ] + } + ], + "source": [ + "# Get gpt-4o-mini to answer, with streaming\n", + "response = openai.chat.completions.create(\n", + " model=MODEL_GPT,\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " stream=True\n", + " )\n", + "result = response.choices[0].message.content\n", + "print(display(Markdown(result)))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8f7c8ea8-4082-4ad0-8751-3301adcf6538", + "metadata": {}, + "outputs": [], + "source": [ + "# Get Llama 3.2 to answer" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "llms", + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From c2fae08c86a917f09e2ade17e95fe220c495a8c5 Mon Sep 17 00:00:00 2001 From: ZnDream Date: Fri, 15 Aug 2025 10:42:25 +0100 Subject: [PATCH 28/72] Add D2-property-rental-assistant --- .../D2-property-rental-assistant/README.md | 189 +++++++++++++++ .../D2-property-rental-assistant/day2.ipynb | 217 ++++++++++++++++++ 2 files changed, 406 insertions(+) create mode 100644 week1/community-contributions/D2-property-rental-assistant/README.md create mode 100644 week1/community-contributions/D2-property-rental-assistant/day2.ipynb diff --git a/week1/community-contributions/D2-property-rental-assistant/README.md b/week1/community-contributions/D2-property-rental-assistant/README.md new file mode 100644 index 0000000..374cd58 --- /dev/null +++ b/week1/community-contributions/D2-property-rental-assistant/README.md @@ -0,0 +1,189 @@ +# AI Property Rental Assistant + +An intelligent property rental assistant Jupyter notebook that scrapes real estate listings from OnTheMarket and uses a local LLM (DeepSeek R1) to analyze and recommend properties based on user requirements. + +## Features + +- **Web Scraping**: Automatically fetches property listings from OnTheMarket +- **AI-Powered Analysis**: Uses DeepSeek R1 model via Ollama for intelligent recommendations +- **Personalized Recommendations**: Filters and ranks properties based on: + - Budget constraints + - Number of bedrooms + - Tenant type (student, family, professional) + - Location preferences +- **Clean Output**: Returns formatted markdown with top 3-5 property recommendations +- **Smart Filtering**: Handles cases where no suitable properties are found with helpful suggestions + +## Prerequisites + +- Python 3.7+ +- Ollama installed and running locally +- DeepSeek R1 14B model pulled in Ollama + +## Installation + +1. **Clone the repository** +```bash +git clone +cd property-rental-assistant +``` + +2. **Install required Python packages** +```bash +pip install requests beautifulsoup4 ollama ipython jupyter +``` + +3. **Install and setup Ollama** +```bash +# Install Ollama (macOS/Linux) +curl -fsSL https://ollama.ai/install.sh | sh + +# For Windows, download from: https://ollama.ai/download +``` + +4. **Pull the DeepSeek R1 model** +```bash +ollama pull deepseek-r1:14b +``` + +5. **Start Ollama server** +```bash +ollama serve +``` + +## Usage + +### Running the Notebook + +1. **Start Jupyter Notebook** +```bash +jupyter notebook +``` + +2. **Open the notebook** +Navigate to `property_rental_assistant.ipynb` in the Jupyter interface + +3. **Run all cells** +Click `Cell` → `Run All` or use `Shift + Enter` to run cells individually + +### Customizing Search Parameters + +Modify the `user_needs` variable in the notebook: +```python +user_needs = "I'm a student looking for a 2-bedroom house in Durham under £2,000/month" +``` + +Other examples: +- `"Family of 4 looking for 3-bedroom house with garden in Durham, budget £2,500/month"` +- `"Professional couple seeking modern 1-bed apartment near city center, max £1,500/month"` +- `"Student group needs 4-bedroom house near Durham University, £600/month per person"` + +### Changing the Property Website + +Update the `website_url` variable in the notebook: +```python +website_url = "https://www.onthemarket.com/to-rent/property/durham/" +``` + +## Architecture + +``` +┌─────────────────┐ ┌──────────────┐ ┌─────────────┐ +│ OnTheMarket │────▶│ Web Scraper │────▶│ Ollama │ +│ Website │ │ (BeautifulSoup)│ │ (DeepSeek R1)│ +└─────────────────┘ └──────────────┘ └─────────────┘ + │ + ▼ + ┌─────────────────────────────────┐ + │ AI-Generated Recommendations │ + │ • Top 5 matching properties │ + │ • Filtered by requirements │ + │ • Markdown formatted output │ + └─────────────────────────────────┘ +``` + +## Project Structure + +``` +property-rental-assistant/ +│ +├── property_rental_assistant.ipynb # Main Jupyter notebook +└── README.md # This file +``` + +## 🔧 Configuration + +### Ollama API Settings +```python +OLLAMA_API = "http://localhost:11434/api/chat" # Default Ollama endpoint +MODEL = "deepseek-r1:14b" # Model to use +``` + +### Web Scraping Settings +```python +headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" +} +timeout = 10 # Request timeout in seconds +``` + +### Content Limits +```python +website.text[:4000] # Truncate content to 4000 chars for token limits +``` + +## How It Works + +1. **Web Scraping**: The `Website` class fetches and parses HTML content from the property listing URL +2. **Content Cleaning**: Removes scripts, styles, and images to extract clean text +3. **Prompt Engineering**: Combines system prompt with user requirements and scraped data +4. **LLM Analysis**: Sends the prompt to DeepSeek R1 via Ollama API +5. **Recommendation Generation**: The AI analyzes listings and returns top matches in markdown format + +## 🛠️ Troubleshooting + +### Ollama Connection Error +``` +Error communicating with Ollama: [Errno 111] Connection refused +``` +**Solution**: Ensure Ollama is running with `ollama serve` + +### Model Not Found +``` +Error: model 'deepseek-r1:14b' not found +``` +**Solution**: Pull the model with `ollama pull deepseek-r1:14b` + +### Web Scraping Blocked +``` +Error fetching website: 403 Forbidden +``` +**Solution**: The website may be blocking automated requests. Try: +- Updating the User-Agent string +- Adding delays between requests +- Using a proxy or VPN + +### Insufficient Property Data +If recommendations are poor quality, the scraper may not be capturing listing details properly. Check: +- The website structure hasn't changed +- The content truncation limit (4000 chars) isn't too restrictive + +## Future Enhancements + +- [ ] Support multiple property websites (Rightmove, Zoopla, SpareRoom) +- [ ] Interactive CLI for dynamic user input +- [ ] Property image analysis +- [ ] Save search history and favorite properties +- [ ] Email notifications for new matching properties +- [ ] Price trend analysis +- [ ] Commute time calculations to specified locations +- [ ] Multi-language support +- [ ] Web interface with Flask/FastAPI +- [ ] Docker containerization + +## Acknowledgments + +- [Ollama](https://ollama.ai/) for local LLM hosting +- [DeepSeek](https://www.deepseek.com/) for the R1 model +- [BeautifulSoup](https://www.crummy.com/software/BeautifulSoup/) for web scraping +- [OnTheMarket](https://www.onthemarket.com/) for property data diff --git a/week1/community-contributions/D2-property-rental-assistant/day2.ipynb b/week1/community-contributions/D2-property-rental-assistant/day2.ipynb new file mode 100644 index 0000000..5f57780 --- /dev/null +++ b/week1/community-contributions/D2-property-rental-assistant/day2.ipynb @@ -0,0 +1,217 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "57112e5c-7b0f-4ba7-9022-ae21e8ac0f42", + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "\n", + "import requests\n", + "from bs4 import BeautifulSoup\n", + "from IPython.display import Markdown, display" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3b71a051-fc0e-46a9-8b1b-b58f685e800d", + "metadata": {}, + "outputs": [], + "source": [ + "# Constants\n", + "OLLAMA_API = \"http://localhost:11434/api/chat\"\n", + "HEADERS = {\"Content-Type\": \"application/json\"}\n", + "MODEL = \"deepseek-r1:14b\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ed3be9dc-d459-46ac-a8eb-f9b932c4302f", + "metadata": {}, + "outputs": [], + "source": [ + "headers = {\n", + " \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36\"\n", + "}\n", + "\n", + "class Website:\n", + " def __init__(self, url): # ✅ Corrected init\n", + " self.url = url\n", + " try:\n", + " response = requests.get(url, headers=headers, timeout=10)\n", + " response.raise_for_status()\n", + " soup = BeautifulSoup(response.content, 'html.parser')\n", + " self.title = soup.title.string if soup.title else \"No title found\"\n", + " if soup.body:\n", + " for irrelevant in soup.body([\"script\", \"style\", \"img\", \"input\"]):\n", + " irrelevant.decompose()\n", + " self.text = soup.body.get_text(separator=\"\\n\", strip=True)\n", + " else:\n", + " self.text = \"No body content found\"\n", + " except requests.RequestException as e:\n", + " print(f\"Error fetching website: {e}\")\n", + " self.title = \"Error loading page\"\n", + " self.text = \"Could not load page content\"" + ] + }, + { + "cell_type": "markdown", + "id": "17ea76f8-38d9-40b9-8aba-eb957d690a0d", + "metadata": {}, + "source": [ + "## Without Ollama package" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3a6fd698-8e59-4cd7-bb53-b9375e50f899", + "metadata": {}, + "outputs": [], + "source": [ + "def house_renting(system_prompt, user_prompt):\n", + " messages = [\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ]\n", + " payload = {\n", + " \"model\": MODEL,\n", + " \"messages\": messages,\n", + " \"stream\": False\n", + " }\n", + " response = requests.post(OLLAMA_API, json=payload, headers=HEADERS)\n", + " return response.json()['message']['content']" + ] + }, + { + "cell_type": "markdown", + "id": "c826a52c-d1d3-493a-8b7c-6e75b848b453", + "metadata": {}, + "source": [ + "## Introducing Ollama package " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "519e27da-eeff-4c1b-a8c6-e680fdf01da2", + "metadata": {}, + "outputs": [], + "source": [ + "import ollama\n", + "\n", + "def house_renting_ollama(system_prompt, user_prompt):\n", + " try:\n", + " messages = [\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ]\n", + " response = ollama.chat(model=MODEL, messages=messages)\n", + " return response['message']['content']\n", + " except Exception as e:\n", + " return f\"Error communicating with Ollama: {e}\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "60e98b28-06d9-4303-b8ca-f7b798244eb4", + "metadata": {}, + "outputs": [], + "source": [ + "system_prompt = \"\"\"\n", + "You are a helpful real estate assistant specializing in UK property rentals. Your job is to guide users in finding houses to rent, especially in Durham. Follow these rules:\n", + "1. Always ask clarifying questions if user input is vague. Determine location, budget, number of bedrooms, and tenant type (e.g. student, family, professional).\n", + "2. Use structured data provided from the website (like property listings) to identify relevant options.\n", + "3. If listings are provided, filter and rank them based on the user's preferences.\n", + "4. Recommend up to 5 top properties with rent price, bedroom count, key features, and location.\n", + "5. Always respond in markdown with clean formatting using headers, bold text, and bullet points.\n", + "6. If no listings match well, provide tips (e.g. \"try adjusting your budget or search radius\").\n", + "7. Stay concise, helpful, and adapt to whether the user is a student, family, couple, or solo tenant.\n", + "\"\"\"\n", + "\n", + "def user_prompt_for_renting(website, user_needs):\n", + " return f\"\"\"\n", + "I want to rent a house and here's what I'm looking for:\n", + "{user_needs}\n", + "\n", + "Here are the property listings I found on the website titled: \"{website.title}\".\n", + "\n", + "Please analyze them and recommend the best 3–5 options that match my needs. If none are suitable, tell me why and offer suggestions.\n", + "\n", + "The page content is below:\n", + "{website.text[:4000]}\n", + "\"\"\" # content is truncated for token limits" + ] + }, + { + "cell_type": "markdown", + "id": "ef420f4b-e3d2-4fbd-bf6f-811f2c8536e0", + "metadata": {}, + "source": [ + "## Ollama Package" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1cf128af-4ece-41ab-b353-5c8564c7de1d", + "metadata": {}, + "outputs": [], + "source": [ + "if __name__ == \"__main__\": # Fixed: Changed **name** to __name__\n", + " print(\"Starting AI Property Rental Assistant...\")\n", + " print(\"=\" * 50)\n", + " \n", + " website_url = \"https://www.onthemarket.com/to-rent/property/durham/\"\n", + " print(f\"🔍 Scraping properties from: {website_url}\")\n", + " \n", + " website = Website(website_url)\n", + " print(f\"Website Title: {website.title}\")\n", + " print(f\"Content Length: {len(website.text)} characters\")\n", + " print(f\"Successfully scraped property listings\\n\")\n", + " \n", + " user_needs = \"I'm a student looking for a 2-bedroom house in Durham under £2,000/month\"\n", + " print(f\"User Requirements: {user_needs}\\n\")\n", + " \n", + " user_prompt = user_prompt_for_renting(website, user_needs)\n", + " print(\"Generating AI recommendations...\")\n", + " \n", + " # Choose which method to use (comment out the one you don't want)\n", + " \n", + " # Method 1: Using ollama Python library\n", + " output = house_renting_ollama(system_prompt, user_prompt)\n", + " \n", + " # Method 2: Using direct API call\n", + " # output = house_renting(system_prompt, user_prompt)\n", + " \n", + " display(Markdown(output))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python [conda env:llms]", + "language": "python", + "name": "conda-env-llms-py" + }, + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From e5f6bb92363c1a06e4900c1de7e1e61b5531d817 Mon Sep 17 00:00:00 2001 From: ZnDream Date: Fri, 15 Aug 2025 14:47:31 +0100 Subject: [PATCH 29/72] Update D2-property-rental-assistant notebooks --- .../D2-property-rental-assistant/day2.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/week1/community-contributions/D2-property-rental-assistant/day2.ipynb b/week1/community-contributions/D2-property-rental-assistant/day2.ipynb index 5f57780..4c8dc5e 100644 --- a/week1/community-contributions/D2-property-rental-assistant/day2.ipynb +++ b/week1/community-contributions/D2-property-rental-assistant/day2.ipynb @@ -39,7 +39,7 @@ "}\n", "\n", "class Website:\n", - " def __init__(self, url): # ✅ Corrected init\n", + " def __init__(self, url):\n", " self.url = url\n", " try:\n", " response = requests.get(url, headers=headers, timeout=10)\n", @@ -163,7 +163,7 @@ "metadata": {}, "outputs": [], "source": [ - "if __name__ == \"__main__\": # Fixed: Changed **name** to __name__\n", + "if __name__ == \"__main__\": \n", " print(\"Starting AI Property Rental Assistant...\")\n", " print(\"=\" * 50)\n", " \n", From 62a27db93d941bc12f7c5f6040540a0818d9dc31 Mon Sep 17 00:00:00 2001 From: Antonina Bagrin Date: Fri, 15 Aug 2025 17:59:12 +0300 Subject: [PATCH 30/72] Added my contribution week_2 to community-contribution --- .../week2_tennis.ipynb | 331 ++++++++++++++++++ 1 file changed, 331 insertions(+) create mode 100644 week2/community-contributions/week2_tennis.ipynb diff --git a/week2/community-contributions/week2_tennis.ipynb b/week2/community-contributions/week2_tennis.ipynb new file mode 100644 index 0000000..bed232f --- /dev/null +++ b/week2/community-contributions/week2_tennis.ipynb @@ -0,0 +1,331 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "ad6e5ed4-a38d-46a6-8bb5-32d68bd0b9e5", + "metadata": {}, + "source": [ + "End of week 2 exercise" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "8f45fbfa-eaaa-4eb8-841e-83b068b80507", + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "\n", + "import os\n", + "import json\n", + "import gradio as gr\n", + "import base64\n", + "from dotenv import load_dotenv\n", + "from openai import OpenAI\n", + "from io import BytesIO\n", + "from PIL import Image\n", + "from pydub import AudioSegment\n", + "from pydub.playback import play\n" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "451b72a6-1e6c-476a-8431-1c30c5cd9fb8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "API key found and looks good so far!\n" + ] + } + ], + "source": [ + "# Initialization\n", + "\n", + "load_dotenv(override=True)\n", + "openai_api_key = os.getenv('OPENAI_API_KEY')\n", + "if openai_api_key:\n", + " print(\"API key found and looks good so far!\")\n", + "else:\n", + " print(\"No API key was found!\")\n", + "\n", + "MODEL = \"gpt-4o-mini\"\n", + "openai = OpenAI()" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "29fa6a53-4b57-47ea-89a1-640020e603b4", + "metadata": {}, + "outputs": [], + "source": [ + "system_message = (\n", + " \"You are a helpful tennis coach who answers questions about tennis rules, \"\n", + " \"players, strategies, training, and equipment.\"\n", + " \"Give short, courteous answers, no more than 2 sentence.\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "e9b255e7-02d8-4350-b5d4-e645d1fc90d3", + "metadata": {}, + "outputs": [], + "source": [ + "# Translation\n", + "\n", + "LANG_CODES = {\n", + " \"English\": \"en\",\n", + " \"Spanish\": \"es\",\n", + " \"French\": \"fr\"\n", + "}\n", + "\n", + "def translate_text(text, target_language=\"en\"):\n", + " messages = [\n", + " {\"role\": \"system\", \"content\": f\"You are a translator. Translate the following text to {target_language}\"},\n", + " {\"role\": \"user\", \"content\": text}\n", + " ]\n", + " response = openai.chat.completions.create(model=MODEL, messages=messages)\n", + " return response.choices[0].message.content\n", + "\n", + "def tennis_info_tool(query):\n", + " if \"top\" in query.lower():\n", + " return \"Top male players: Djokovic, Nadal, Federer. Top female players: Barty, Sabalenka, Swiatek.\"\n" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "b44b147c-bfba-4137-9ecb-d5538f08a46d", + "metadata": {}, + "outputs": [], + "source": [ + "# Image\n", + "def generate_tennis_image(prompt):\n", + " image_response = openai.images.generate(\n", + " model=\"dall-e-3\",\n", + " prompt=f\"Tennis scene: {prompt}, realistic and detailed, vibrant colors\",\n", + " size=\"1024x1024\",\n", + " n=1,\n", + " response_format=\"b64_json\",\n", + " )\n", + " image_base64 = image_response.data[0].b64_json\n", + " image_data = base64.b64decode(image_base64)\n", + " return Image.open(BytesIO(image_data))" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "bbfeff3b-0c73-4b2c-a6da-3cac27d8fedd", + "metadata": {}, + "outputs": [], + "source": [ + "# Audio\n", + "\n", + "def talker(message):\n", + " response = openai.audio.speech.create(\n", + " model=\"tts-1\",\n", + " voice=\"onyx\",\n", + " input=message\n", + " )\n", + "\n", + " audio_stream = BytesIO(response.content)\n", + " audio = AudioSegment.from_file(audio_stream, format=\"mp3\")\n", + " play(audio)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fa338332-3dfc-4b95-8367-65853a8d2793", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "574d672e-0a75-4af9-b3ad-8dc2dec4e607", + "metadata": {}, + "outputs": [], + "source": [ + "def chat(history, user_message, target_language=\"English\", use_audio=False, generate_image=False):\n", + " image = None\n", + "\n", + " if any(keyword in user_message.lower() for keyword in [\"top\", \"players\"]):\n", + " reply = tennis_info_tool(user_message)\n", + " else:\n", + " messages = [{\"role\": \"system\", \"content\": system_message}] + history\n", + " response = openai.chat.completions.create(model=MODEL, messages=messages)\n", + " reply = response.choices[0].message.content\n", + " \n", + " if target_language != \"English\":\n", + " code = LANG_CODES.get(target_language, \"en\")\n", + " reply = translate_text(reply, code)\n", + "\n", + " history.append({\"role\": \"assistant\", \"content\": reply})\n", + " \n", + " if use_audio:\n", + " talker(reply)\n", + "\n", + " if generate_image:\n", + " image = generate_tennis_image(reply)\n", + " return history, image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eaf4f47e-d20b-41f8-94b5-4aef0302731b", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "9110343f-0efa-49bc-8d5f-498fd690dd14", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "* Running on local URL: http://127.0.0.1:7869\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": 45, + "metadata": {}, + "output_type": "execute_result" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Input #0, wav, from '/var/folders/73/0s09hh2n48q7s14tld64q3rh0000gn/T/tmp4hoe_x5n.wav':\n", + " Duration: 00:00:06.55, bitrate: 384 kb/s\n", + " Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 24000 Hz, 1 channels, s16, 384 kb/s\n", + " 6.45 M-A: -0.000 fd= 0 aq= 0KB vq= 0KB sq= 0B " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Input #0, wav, from '/var/folders/73/0s09hh2n48q7s14tld64q3rh0000gn/T/tmp2mxw0wth.wav':\n", + " Duration: 00:00:04.61, bitrate: 384 kb/s\n", + " Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 24000 Hz, 1 channels, s16, 384 kb/s\n", + " 4.48 M-A: 0.000 fd= 0 aq= 0KB vq= 0KB sq= 0B " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "# Gradio\n", + "\n", + "with gr.Blocks() as ui:\n", + " with gr.Row():\n", + " chatbot = gr.Chatbot(height=500, type=\"messages\")\n", + " image_output = gr.Image(height=500)\n", + " with gr.Row():\n", + " entry = gr.Textbox(label=\"Ask your Tennis Coach:\", placeholder=\"Type and press Enter...\")\n", + " target_lang_dropdown = gr.Dropdown(\n", + " choices=[\"English\", \"Spanish\", \"French\"],\n", + " value=\"English\",\n", + " label=\"Translate to:\"\n", + " )\n", + " audio_toggle = gr.Checkbox(label=\"Play audio\", value=False)\n", + " image_toggle = gr.Checkbox(label=\"Generate image for this reply\", value=True)\n", + " with gr.Row():\n", + " clear = gr.Button(\"Clear\")\n", + " \n", + " def add_user_message(message, history):\n", + " history.append({\"role\": \"user\", \"content\": message})\n", + " return \"\", history\n", + "\n", + " def chat_response(history, message, target_language, use_audio, generate_image):\n", + " history, image = chat(history, message, target_language, use_audio, generate_image)\n", + " return history, image\n", + "\n", + " entry.submit(\n", + " add_user_message,\n", + " inputs=[entry, chatbot],\n", + " outputs=[entry, chatbot]).then(\n", + " chat_response,\n", + " inputs=[chatbot, entry, target_lang_dropdown, audio_toggle, image_toggle],\n", + " outputs=[chatbot, image_output]\n", + " )\n", + "\n", + " clear.click(lambda: (None, None, None), inputs=None, outputs=[chatbot, image_output, entry], queue=False)\n", + "\n", + "ui.launch(inbrowser=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f0359c29-22aa-4156-9afa-8c63c02ca747", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From db8349fb5c7e79bb988df4ef21b1ca0d09734cf0 Mon Sep 17 00:00:00 2001 From: Ray Melpakkam Date: Fri, 15 Aug 2025 12:55:16 -0400 Subject: [PATCH 31/72] Added my contributions to community-contributions --- .../openai-twenty-questions/README.md | 5 + .../openai-twenty-questions/twenty.py | 100 ++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 community-contributions/openai-twenty-questions/README.md create mode 100644 community-contributions/openai-twenty-questions/twenty.py diff --git a/community-contributions/openai-twenty-questions/README.md b/community-contributions/openai-twenty-questions/README.md new file mode 100644 index 0000000..3fcbd94 --- /dev/null +++ b/community-contributions/openai-twenty-questions/README.md @@ -0,0 +1,5 @@ +# openai-twenty-questions +Chatgpt script that acts as Thinker and Guesser to play the 20 questions game + +1. pip install openai==0.28 +2. Run python twenty.py and it will Think of a word and try to guess it in 20 tries diff --git a/community-contributions/openai-twenty-questions/twenty.py b/community-contributions/openai-twenty-questions/twenty.py new file mode 100644 index 0000000..5f098cd --- /dev/null +++ b/community-contributions/openai-twenty-questions/twenty.py @@ -0,0 +1,100 @@ +import openai +import os +import time + +# openai.api_key = os.getenv("OPENAI_API_KEY") +# openai.api_key = "<>" + +# Models: You can use "gpt-4o", "gpt-4-turbo", or "gpt-3.5-turbo" — but we'll use "gpt-4o" or "gpt-4o-mini" for both players +MODEL = "gpt-4o-mini" + +def call_chatgpt(messages): + response = openai.ChatCompletion.create( + model=MODEL, + messages=messages, + temperature=0.7 + ) + return response.choices[0].message["content"].strip() + +# Step 1: Thinker chooses a secret object +thinker_messages = [ + {"role": "system", "content": "You are playing 20 Questions. Think of an object or thing and just one word. Keep it secret and reply only with: 'I have thought of something. Let's begin.'"}, +] +thinker_reply = call_chatgpt(thinker_messages) +print("Thinker:", thinker_reply) + +# For simulation purposes, let’s ask the thinker what the object is (in real game, this is hidden) +reveal_object_prompt = [ + {"role": "system", "content": "You are playing 20 Questions. Think of an object or thing and just one word. Now tell me (just for logging) what you are thinking of. Reply only with the thing."} +] +object_answer = call_chatgpt(reveal_object_prompt) +print("🔒 Secret Object:", object_answer) + +# Step 2: Guesser starts asking questions +guesser_messages = [ + {"role": "system", "content": f"You are playing 20 Questions. Ask yes/no questions to figure out what the object is. Do not repeat questions. The object is kept secret by the other player. Begin by asking your first question."}, +] + +# Let’s keep track of Q&A +history = [] +q_count = 1 + +for i in range(1, 11): + print(f"\n🔄 Round {q_count}") + q_count += 1 + # Guesser asks a question + question = call_chatgpt(guesser_messages) + print("Guesser:", question) + history.append(("Guesser", question)) + + # Thinker responds (yes/no) + thinker_round = [ + {"role": "system", "content": f"You are playing 20 Questions. The secret object is: {object_answer}."}, + {"role": "user", "content": f"The other player asked: {question}. Respond only with 'Yes', 'No', or 'I don't know'."} + ] + answer = call_chatgpt(thinker_round) + print("Thinker:", answer) + history.append(("Thinker", answer)) + + # Add to conversation history for guesser + guesser_messages.append({"role": "assistant", "content": question}) + guesser_messages.append({"role": "user", "content": answer}) + + + print(f"\n🔄 Round {q_count}") + q_count += 1 + # Check if guesser wants to guess + guess_check_prompt = guesser_messages + [ + {"role": "user", "content": "Based on the answers so far, do you want to guess? If yes, say: 'Is it ?'. If not, ask the next yes/no question."} + ] + next_move_question = call_chatgpt(guess_check_prompt) + print("Guesser next move:", next_move_question) + history.append(("Guesser", next_move_question)) + + if next_move_question.lower().startswith("is it a"): + # Thinker validates guess + guess = next_move_question[8:].strip(" ?.") + guess = next_move_question[8:].strip(" ?") + + if guess.lower() == object_answer.lower(): + print("Guesser guessed correctly!") + break + # Thinker responds (yes/no) + thinker_round = [ + {"role": "system", "content": f"You are playing 20 Questions. The secret object is: {object_answer}."}, + {"role": "user", "content": f"The other player asked: {next_move_question}. Respond only with 'Yes', 'No', or 'I don't know'."} + ] + answer = call_chatgpt(thinker_round) + print("Thinker next move:", answer) + history.append(("Thinker", answer)) + + # Add to conversation history for guesser + guesser_messages.append({"role": "assistant", "content": next_move_question}) + guesser_messages.append({"role": "user", "content": answer}) + + # Prepare for next round + guesser_messages.append({"role": "assistant", "content": next_move_question}) + question = next_move_question + +else: + print("❌ Guesser used all 20 questions without guessing correctly.") \ No newline at end of file From 3c6f4263adcd15bd6ac8471e6470a5aff314c280 Mon Sep 17 00:00:00 2001 From: Feyisa-Diba Date: Sat, 16 Aug 2025 00:30:26 -0400 Subject: [PATCH 32/72] Add thesis summarizer notebook using direct PDF link --- .../day-1-thesis_pdf_summarizer.ipynb | 305 ++++++++++++++++++ 1 file changed, 305 insertions(+) create mode 100644 week1/community-contributions/day-1-thesis_pdf_summarizer.ipynb diff --git a/week1/community-contributions/day-1-thesis_pdf_summarizer.ipynb b/week1/community-contributions/day-1-thesis_pdf_summarizer.ipynb new file mode 100644 index 0000000..e18c68f --- /dev/null +++ b/week1/community-contributions/day-1-thesis_pdf_summarizer.ipynb @@ -0,0 +1,305 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "581151c0-941e-47b3-a3e0-2da65ba70087", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import requests\n", + "from dotenv import load_dotenv\n", + "from IPython.display import Markdown, display\n", + "from openai import OpenAI" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "47353a41-4b47-499e-9460-fd645345f591", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "API key found and looks good so far\n" + ] + } + ], + "source": [ + "load_dotenv()\n", + "api_key = os.getenv('OPENAI_API_KEY')\n", + "\n", + "if not api_key:\n", + " print('No API key was found')\n", + "elif not api_key.startswith(\"sk-proj-\"):\n", + " print(\"API key is found but is not in the proper format\")\n", + "else:\n", + " print(\"API key found and looks good so far\")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "dbfbb29a-3452-45a0-b9b3-4e329ac776fb", + "metadata": {}, + "outputs": [], + "source": [ + "openai = OpenAI()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "88ffe256-e46a-45e8-a616-0ac574aa7085", + "metadata": {}, + "outputs": [], + "source": [ + "system_prompt = \"\"\"You are a research summarizer specialized in wireless communication systems and propagation modeling. Your task is to summarize a research thesis in no more than 1000 words. The summary must be clear, structured, and written in markdown format.\n", + "\n", + "The summary should include the following sections:\n", + "\n", + "1. **Title and Authors** – Provide the full title of the thesis and author name(s).\n", + "2. **Objective / Research Problem** – Clearly state the core research goal or question addressed in the thesis.\n", + "3. **Scientific and Regional Background** – Explain the technical context of radio wave propagation, and why studying it in the Horn of Africa region is important.\n", + "4. **Methodology** – Summarize the modeling techniques, data sources, simulation tools, frequency bands (e.g., microwave, millimeter), and measurement or evaluation methods used.\n", + "5. **Key Findings** – Highlight the quantitative and qualitative results, including differences between precipitation and clear-air conditions, and observed trends across geographic locations.\n", + "6. **Conclusion** – Describe the primary outcomes and how they advance understanding in wireless communications.\n", + "7. **Limitations** – Point out any constraints (e.g., lack of in-situ measurement, simulation assumptions).\n", + "8. **Future Work** – Suggest next steps for improving or extending this research.\n", + "9. **Real-World Applications** – Discuss how the models or findings could improve wireless network planning, 5G deployment, or link budgeting in East Africa and similar regions.\n", + "\n", + "Use academic language but keep it concise, clear, and structured for a technical reader. Output in markdown format only.\n", + "\"\"\"\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "5f3f7b1a-865f-44cc-854d-9e9e7771eb82", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: ipywidgets in c:\\users\\esku4\\anaconda3\\envs\\llms\\lib\\site-packages (8.1.7)\n", + "Collecting pdfplumber\n", + " Downloading pdfplumber-0.11.7-py3-none-any.whl.metadata (42 kB)\n", + "Requirement already satisfied: comm>=0.1.3 in c:\\users\\esku4\\anaconda3\\envs\\llms\\lib\\site-packages (from ipywidgets) (0.2.3)\n", + "Requirement already satisfied: ipython>=6.1.0 in c:\\users\\esku4\\anaconda3\\envs\\llms\\lib\\site-packages (from ipywidgets) (9.4.0)\n", + "Requirement already satisfied: traitlets>=4.3.1 in c:\\users\\esku4\\anaconda3\\envs\\llms\\lib\\site-packages (from ipywidgets) (5.14.3)\n", + "Requirement already satisfied: widgetsnbextension~=4.0.14 in c:\\users\\esku4\\anaconda3\\envs\\llms\\lib\\site-packages (from ipywidgets) (4.0.14)\n", + "Requirement already satisfied: jupyterlab_widgets~=3.0.15 in c:\\users\\esku4\\anaconda3\\envs\\llms\\lib\\site-packages (from ipywidgets) (3.0.15)\n", + "Collecting pdfminer.six==20250506 (from pdfplumber)\n", + " Downloading pdfminer_six-20250506-py3-none-any.whl.metadata (4.2 kB)\n", + "Requirement already satisfied: Pillow>=9.1 in c:\\users\\esku4\\anaconda3\\envs\\llms\\lib\\site-packages (from pdfplumber) (11.3.0)\n", + "Collecting pypdfium2>=4.18.0 (from pdfplumber)\n", + " Downloading pypdfium2-4.30.0-py3-none-win_amd64.whl.metadata (48 kB)\n", + "Requirement already satisfied: charset-normalizer>=2.0.0 in c:\\users\\esku4\\anaconda3\\envs\\llms\\lib\\site-packages (from pdfminer.six==20250506->pdfplumber) (3.4.3)\n", + "Requirement already satisfied: cryptography>=36.0.0 in c:\\users\\esku4\\anaconda3\\envs\\llms\\lib\\site-packages (from pdfminer.six==20250506->pdfplumber) (45.0.6)\n", + "Requirement already satisfied: cffi>=1.14 in c:\\users\\esku4\\anaconda3\\envs\\llms\\lib\\site-packages (from cryptography>=36.0.0->pdfminer.six==20250506->pdfplumber) (1.17.1)\n", + "Requirement already satisfied: pycparser in c:\\users\\esku4\\anaconda3\\envs\\llms\\lib\\site-packages (from cffi>=1.14->cryptography>=36.0.0->pdfminer.six==20250506->pdfplumber) (2.22)\n", + "Requirement already satisfied: colorama in c:\\users\\esku4\\anaconda3\\envs\\llms\\lib\\site-packages (from ipython>=6.1.0->ipywidgets) (0.4.6)\n", + "Requirement already satisfied: decorator in c:\\users\\esku4\\anaconda3\\envs\\llms\\lib\\site-packages (from ipython>=6.1.0->ipywidgets) (5.2.1)\n", + "Requirement already satisfied: ipython-pygments-lexers in c:\\users\\esku4\\anaconda3\\envs\\llms\\lib\\site-packages (from ipython>=6.1.0->ipywidgets) (1.1.1)\n", + "Requirement already satisfied: jedi>=0.16 in c:\\users\\esku4\\anaconda3\\envs\\llms\\lib\\site-packages (from ipython>=6.1.0->ipywidgets) (0.19.2)\n", + "Requirement already satisfied: matplotlib-inline in c:\\users\\esku4\\anaconda3\\envs\\llms\\lib\\site-packages (from ipython>=6.1.0->ipywidgets) (0.1.7)\n", + "Requirement already satisfied: prompt_toolkit<3.1.0,>=3.0.41 in c:\\users\\esku4\\anaconda3\\envs\\llms\\lib\\site-packages (from ipython>=6.1.0->ipywidgets) (3.0.51)\n", + "Requirement already satisfied: pygments>=2.4.0 in c:\\users\\esku4\\anaconda3\\envs\\llms\\lib\\site-packages (from ipython>=6.1.0->ipywidgets) (2.19.2)\n", + "Requirement already satisfied: stack_data in c:\\users\\esku4\\anaconda3\\envs\\llms\\lib\\site-packages (from ipython>=6.1.0->ipywidgets) (0.6.3)\n", + "Requirement already satisfied: typing_extensions>=4.6 in c:\\users\\esku4\\anaconda3\\envs\\llms\\lib\\site-packages (from ipython>=6.1.0->ipywidgets) (4.14.1)\n", + "Requirement already satisfied: wcwidth in c:\\users\\esku4\\anaconda3\\envs\\llms\\lib\\site-packages (from prompt_toolkit<3.1.0,>=3.0.41->ipython>=6.1.0->ipywidgets) (0.2.13)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.4 in c:\\users\\esku4\\anaconda3\\envs\\llms\\lib\\site-packages (from jedi>=0.16->ipython>=6.1.0->ipywidgets) (0.8.4)\n", + "Requirement already satisfied: executing>=1.2.0 in c:\\users\\esku4\\anaconda3\\envs\\llms\\lib\\site-packages (from stack_data->ipython>=6.1.0->ipywidgets) (2.2.0)\n", + "Requirement already satisfied: asttokens>=2.1.0 in c:\\users\\esku4\\anaconda3\\envs\\llms\\lib\\site-packages (from stack_data->ipython>=6.1.0->ipywidgets) (3.0.0)\n", + "Requirement already satisfied: pure_eval in c:\\users\\esku4\\anaconda3\\envs\\llms\\lib\\site-packages (from stack_data->ipython>=6.1.0->ipywidgets) (0.2.3)\n", + "Downloading pdfplumber-0.11.7-py3-none-any.whl (60 kB)\n", + "Downloading pdfminer_six-20250506-py3-none-any.whl (5.6 MB)\n", + " ---------------------------------------- 0.0/5.6 MB ? eta -:--:--\n", + " --------------------------------------- 5.5/5.6 MB 30.7 MB/s eta 0:00:01\n", + " ---------------------------------------- 5.6/5.6 MB 22.9 MB/s 0:00:00\n", + "Downloading pypdfium2-4.30.0-py3-none-win_amd64.whl (2.9 MB)\n", + " ---------------------------------------- 0.0/2.9 MB ? eta -:--:--\n", + " ---------------------------------------- 2.9/2.9 MB 28.0 MB/s 0:00:00\n", + "Installing collected packages: pypdfium2, pdfminer.six, pdfplumber\n", + "\n", + " ---------------------------------------- 0/3 [pypdfium2]\n", + " ---------------------------------------- 0/3 [pypdfium2]\n", + " ------------- -------------------------- 1/3 [pdfminer.six]\n", + " ------------- -------------------------- 1/3 [pdfminer.six]\n", + " ------------- -------------------------- 1/3 [pdfminer.six]\n", + " ------------- -------------------------- 1/3 [pdfminer.six]\n", + " ------------- -------------------------- 1/3 [pdfminer.six]\n", + " ------------- -------------------------- 1/3 [pdfminer.six]\n", + " -------------------------- ------------- 2/3 [pdfplumber]\n", + " ---------------------------------------- 3/3 [pdfplumber]\n", + "\n", + "Successfully installed pdfminer.six-20250506 pdfplumber-0.11.7 pypdfium2-4.30.0\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "pip install ipywidgets pdfplumber" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "06dcfc1d-b106-4b9a-9346-6dd6af4a4015", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "UNIVERSITY OF KWAZULU-NATAL\n", + "Radio Wave Propagation Modeling under\n", + "Precipitation and Clear-air at Microwave\n", + "and Millimetric Bands over Wireless Links\n", + "in the Horn of Africa\n", + "Feyisa Debo Diba\n", + "February, 2017\n", + "Supervisor: Professor Thomas J. Afullo\n", + "Co-supervisor: Dr. Akintunde Ayodeji Alonge\n", + "Radio Wave Propagation Modeling under\n", + "Precipitation and Clear-air at Microwave\n", + "and Millimetric Bands over Wireless Links\n", + "in the Horn of Africa\n", + "Feyisa Debo Diba\n", + "In fulfillment of the Degree of Doctor of Philosophy in\n", + "Electronic Engineering, College of Agriculture, Engineering\n", + "and Science, University of KwaZulu-Natal, Durban\n", + "February, 2017\n", + "Supervisor:\n", + "As the candidate’s Supervisor, I agree/do not agree to the submission of this thesis\n", + "Professor T.J. Afullo ———————————-\n", + "Date—————————————————\n", + "Co-Supervisor:\n", + "Dr. Akintunde Ayodeji Alonge\n", + "As the candidate’s Co.Supervisor, I agree to the submission of this thesis\n", + "Dr. A. A. Alonge ———————————-\n", + "Date—————————————————\n", + "ii\n", + "DECLARATION 1 - PLAGIARISM\n", + "I, Feyisa Debo Diba\n" + ] + } + ], + "source": [ + "# Cell 3: Download and extract from PDF URL\n", + "pdf_url = (\n", + " \"https://researchspace.ukzn.ac.za/server/api/core/bitstreams/\"\n", + " \"29218203-bfc8-4fcb-bc63-9afba3341910/content\"\n", + ")\n", + "\n", + "response = requests.get(pdf_url)\n", + "if response.status_code != 200:\n", + " raise Exception(f\"Failed to download PDF (Status code: {response.status_code})\")\n", + "\n", + "with pdfplumber.open(BytesIO(response.content)) as pdf:\n", + " thesis_text = \"\\n\".join(page.extract_text() for page in pdf.pages if page.extract_text())\n", + "\n", + "# Optional Preview\n", + "print(thesis_text[:1000])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "84c544db-64a0-4181-beb0-1cc72bc88466", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "# Summary of the Research Thesis\n", + "\n", + "## 1. Title and Authors\n", + "**Title:** Radio Wave Propagation Modeling under Precipitation and Clear-air at Microwave and Millimetric Bands over Wireless Links in the Horn of Africa \n", + "**Author:** Feyisa Debo Diba \n", + "**Supervisors:** Professor Thomas J. Afullo, Dr. Akintunde Ayodeji Alonge \n", + "\n", + "## 2. Objective / Research Problem\n", + "The thesis investigates radio wave propagation modeling in clear air and precipitation conditions over wireless communication systems in the Horn of Africa, specifically Ethiopia. The research aims to address the attenuation problem caused by precipitation for systems operating at higher frequency bands.\n", + "\n", + "## 3. Scientific and Regional Background\n", + "The congestion of lower operating frequency bands has led to the rapid growth of utilizing higher frequency spectrum for wireless communication systems. However, the Horn of Africa, particularly Ethiopia, lacks comprehensive studies on propagation modeling under different atmospheric conditions. This research provides valuable insights for the region, contributing to the efficient operation of wireless networks.\n", + "\n", + "## 4. Methodology\n", + "The research uses three years of atmospheric data (temperature, pressure, relative humidity) from the National Meteorological Agency of Ethiopia and clear air signal measurements over terrestrial Line-of-Sight (LOS) links from EthioTelecom. Rainfall data from a Davis Vantage weather station installed at Jimma University, Ethiopia, are also used. The study applies the ITU-R model for refractivity gradient prediction and the Rice-Holmberg (R-H) model for one-minute rain rate distribution. A semi-Markovian model is used for rainfall event characterization and generation.\n", + "\n", + "## 5. Key Findings\n", + "The research derived radio climatological parameters for different rain and clear air fade models. It also proposed rainfall rate conversion factors for Ethiopian sites and developed rainfall rate and fade margin contour maps for Ethiopia. The study found that the sojourn time of spikes in every rain regime is appropriately described by Erlang-k distribution. The number of spikes of generated rainfall events and the corresponding sojourn times follow the power-law relationship.\n", + "\n", + "## 6. Conclusion\n", + "The research provides a comprehensive analysis of radio wave propagation under different atmospheric conditions in Ethiopia. The findings contribute to the understanding of the impact of atmospheric conditions on wireless communication systems operating at higher frequency bands.\n", + "\n", + "## 7. Limitations\n", + "The research is limited by the availability and quality of atmospheric and signal level data. The simulation models also have inherent assumptions that may affect the accuracy of the results.\n", + "\n", + "## 8. Future Work\n", + "Future research could focus on refining the models used in this study by incorporating more data and improving the simulation techniques. Studies could also be extended to other regions in the Horn of Africa.\n", + "\n", + "## 9. Real-World Applications\n", + "The findings of this research can improve wireless network planning and 5G deployment in East Africa. The models developed can also be used in link budgeting, which is crucial for the design and operation of wireless communication systems." + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Cell 4: Summarize via OpenAI\n", + "messages = [\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": f\"Here is the thesis text (truncated):\\n\\n{thesis_text[:10000]}\"}\n", + "]\n", + "\n", + "response = openai.chat.completions.create(\n", + " model=\"gpt-4\",\n", + " messages=messages,\n", + " temperature=0.3\n", + ")\n", + "\n", + "summary = response.choices[0].message.content.strip()\n", + "display(Markdown(summary))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e1cdf9ec-5efb-4d4b-8de2-83648865f092", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From bbad9e072aba935ad0292d9f4e8883a233074246 Mon Sep 17 00:00:00 2001 From: Mechantchulo Date: Sat, 16 Aug 2025 11:31:23 +0300 Subject: [PATCH 33/72] Add day2 Ollama test notebook --- community-contributions/day2ollamatest.ipynb | 97 ++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 community-contributions/day2ollamatest.ipynb diff --git a/community-contributions/day2ollamatest.ipynb b/community-contributions/day2ollamatest.ipynb new file mode 100644 index 0000000..f50b35d --- /dev/null +++ b/community-contributions/day2ollamatest.ipynb @@ -0,0 +1,97 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "4d02ac4b-9cab-42bb-b8a3-123d53913471", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import requests\n", + "from bs4 import BeautifulSoup\n", + "from IPython.display import Markdown, display\n", + "import ollama\n", + "\n", + "MODEL = \"llama3.2\"\n", + "\n", + "# Optional headers to avoid request blocks\n", + "HEADERS = {\n", + " \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64)\"\n", + "}\n", + "\n", + "\n", + "class Website:\n", + " def __init__(self, url):\n", + " \"\"\"\n", + " Create this Website object from the given url using the BeautifulSoup library\n", + " \"\"\"\n", + " self.url = url\n", + " response = requests.get(url, headers=HEADERS)\n", + " soup = BeautifulSoup(response.content, 'html.parser')\n", + " self.title = soup.title.string if soup.title else \"No title found\"\n", + " if soup.body:\n", + " for irrelevant in soup.body([\"script\", \"style\", \"img\", \"input\"]):\n", + " irrelevant.decompose()\n", + " self.text = soup.body.get_text(separator=\"\\n\", strip=True)\n", + " else:\n", + " self.text = \"\"\n", + "\n", + "\n", + "system_prompt = \"\"\"You are an assistant that analyzes the contents of a website \n", + "and provides a short summary, ignoring navigation text. Respond in markdown.\"\"\"\n", + "\n", + "\n", + "def user_prompt_for(website):\n", + " return f\"\"\"You are looking at a website titled {website.title}.\n", + "The contents of this website are as follows. Please provide a short summary in markdown. \n", + "If it includes news or announcements, summarize these too.\n", + "\n", + "{website.text}\n", + "\"\"\"\n", + "\n", + "\n", + "def summarize(url):\n", + " website = Website(url)\n", + " response = ollama.chat(\n", + " model=MODEL,\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt_for(website)}\n", + " ]\n", + " )\n", + " return response['message']['content']\n", + "\n", + "\n", + "def display_summary(url):\n", + " summary = summarize(url)\n", + " display(Markdown(summary))\n", + "\n", + "\n", + "# Example usage\n", + "display_summary(\"https://edwarddonner.com\")\n" + ] + } + ], + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 0a2fee76a7a2b2993e675cfc27ae642adc84c38c Mon Sep 17 00:00:00 2001 From: KiranAyyagari Date: Sat, 16 Aug 2025 18:25:28 +0530 Subject: [PATCH 34/72] Revert changes to week1/day2 EXERCISE.ipynb --- week1/day2 EXERCISE.ipynb | 2503 +------------------------------------ 1 file changed, 18 insertions(+), 2485 deletions(-) diff --git a/week1/day2 EXERCISE.ipynb b/week1/day2 EXERCISE.ipynb index 519dca5..89a383f 100644 --- a/week1/day2 EXERCISE.ipynb +++ b/week1/day2 EXERCISE.ipynb @@ -68,7 +68,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "4e2a9393-7767-488e-a8bf-27c12dca35bd", "metadata": {}, "outputs": [], @@ -82,7 +82,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "29ddd15d-a3c5-4f4e-a678-873f56162724", "metadata": {}, "outputs": [], @@ -96,7 +96,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "dac0a679-599c-441f-9bf2-ddc73d35b940", "metadata": {}, "outputs": [], @@ -110,7 +110,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "7bb9c624-14f0-4945-a719-8ddb64f66f47", "metadata": {}, "outputs": [], @@ -124,27 +124,10 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "479ff514-e8bd-4985-a572-2ea28bb4fa40", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠋ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠙ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠹ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠸ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠼ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠴ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠦ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠧ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠇ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠏ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠋ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠙ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠹ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠸ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠼ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest \u001b[K\n", - "pulling dde5aa3fc5ff: 100% ▕██████████████████▏ 2.0 GB \u001b[K\n", - "pulling 966de95ca8a6: 100% ▕██████████████████▏ 1.4 KB \u001b[K\n", - "pulling fcc5a6bec9da: 100% ▕██████████████████▏ 7.7 KB \u001b[K\n", - "pulling a70ff7e570d9: 100% ▕██████████████████▏ 6.0 KB \u001b[K\n", - "pulling 56bb8bd477a5: 100% ▕██████████████████▏ 96 B \u001b[K\n", - "pulling 34bb5ab01051: 100% ▕██████████████████▏ 561 B \u001b[K\n", - "verifying sha256 digest \u001b[K\n", - "writing manifest \u001b[K\n", - "success \u001b[K\u001b[?25h\u001b[?2026l\n" - ] - } - ], + "outputs": [], "source": [ "# Let's just make sure the model is loaded\n", "\n", @@ -153,38 +136,10 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "42b9f644-522d-4e05-a691-56e7658c0ea9", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Generative AI has numerous business applications across various industries, including:\n", - "\n", - "1. **Content Creation**: Generative AI can be used to create high-quality content such as images, videos, and articles. This can help businesses reduce production costs and increase productivity.\n", - "2. **Marketing Automation**: Generative AI can be used to automate marketing tasks such as email marketing, social media management, and lead generation. It can also be used to personalize marketing messages based on customer behavior and preferences.\n", - "3. **Customer Service Chatbots**: Generative AI-powered chatbots can be used to provide 24/7 customer support and help customers with their queries. This can help businesses reduce the cost of customer service and improve customer satisfaction.\n", - "4. **Product Design**: Generative AI can be used to design new products, such as furniture, electronics, or automotive parts. It can also be used to optimize product designs for better performance and aesthetics.\n", - "5. **Supply Chain Optimization**: Generative AI can be used to analyze supply chain data and predict demand patterns. This can help businesses optimize their inventory levels and reduce waste.\n", - "6. **Financial Modeling**: Generative AI can be used to create financial models and forecast revenue streams. It can also be used to identify potential risks and opportunities in the market.\n", - "7. **Risk Assessment**: Generative AI can be used to assess risk in various areas such as credit risk, market risk, and operational risk. This can help businesses make informed investment decisions and mitigate potential losses.\n", - "8. **Language Translation**: Generative AI-powered translation tools can be used to translate text, images, and audio files across languages. This can help businesses expand their customer base and improve communication with international customers.\n", - "9. **Image Recognition**: Generative AI can be used to recognize objects, people, and patterns in images. This can help businesses automate image classification, object detection, and facial recognition tasks.\n", - "10. **Music and Audio Generation**: Generative AI can be used to create new music tracks, sound effects, and audio files. This can help businesses reduce production costs and improve the quality of their audio content.\n", - "\n", - "Some specific business applications of generative AI include:\n", - "\n", - "* **Automated data entry**: Use generative AI to automate data entry tasks such as typing addresses, phone numbers, and other contact information.\n", - "* **Predictive maintenance**: Use generative AI to predict equipment failures and schedule maintenance accordingly.\n", - "* **Personalized product recommendations**: Use generative AI to personalize product recommendations for customers based on their browsing history and purchase behavior.\n", - "* **Automated social media posting**: Use generative AI to automate social media posting tasks such as scheduling posts, creating content, and responding to comments.\n", - "\n", - "Overall, generative AI has the potential to transform various business processes and improve efficiency, productivity, and customer experience.\n" - ] - } - ], + "outputs": [], "source": [ "# If this doesn't work for any reason, try the 2 versions in the following cells\n", "# And double check the instructions in the 'Recap on installation of Ollama' at the top of this lab\n", @@ -208,46 +163,10 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "7745b9c4-57dc-4867-9180-61fa5db55eb8", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Generative AI has numerous business applications across various industries. Here are some examples:\n", - "\n", - "1. **Content Creation**: Generative AI can be used to generate high-quality content such as articles, social media posts, and product descriptions. This can help businesses save time and money on content creation while maintaining consistency and quality.\n", - "2. **Marketing and Advertising**: Generative AI can be used to create personalized marketing campaigns, social media ads, and email newsletters. It can also help analyze customer behavior and preferences to improve targeting and conversion rates.\n", - "3. **Product Design and Development**: Generative AI can be used to design and develop new products, such as 3D models, prototypes, and even entire product lines. This can help reduce the time and cost associated with traditional product development methods.\n", - "4. **Customer Service Chatbots**: Generative AI can be used to create intelligent chatbots that can understand and respond to customer inquiries in a more human-like way. This can help improve customer satisfaction and reduce support costs.\n", - "5. **Data Analysis and Visualization**: Generative AI can be used to analyze and visualize large datasets, such as customer behavior patterns or market trends. This can help businesses gain insights and make data-driven decisions.\n", - "6. **Predictive Maintenance**: Generative AI can be used to predict equipment failures and maintenance needs, helping businesses reduce downtime and increase efficiency.\n", - "7. **Financial Analysis**: Generative AI can be used to analyze financial data and forecast future trends, helping businesses make informed investment decisions and manage risk.\n", - "8. **Virtual Customer Assistants**: Generative AI can be used to create virtual customer assistants that can handle tasks such as appointment scheduling, order tracking, and more.\n", - "9. **Brand Identity Generation**: Generative AI can be used to generate new brand identities, including logos, color palettes, typography, and overall visual styles.\n", - "10. **Supply Chain Optimization**: Generative AI can be used to optimize supply chain operations, including inventory management, logistics, and transportation planning.\n", - "\n", - "Some of the key benefits of generative AI in business include:\n", - "\n", - "* Increased efficiency and productivity\n", - "* Improved decision-making and forecasting\n", - "* Enhanced customer experience and engagement\n", - "* Reduced costs and risk\n", - "* New revenue streams through creative content generation\n", - "\n", - "However, it's worth noting that the use of generative AI also raises some challenges and concerns, such as:\n", - "\n", - "* Job displacement and workforce disruption\n", - "* Bias and fairness in decision-making\n", - "* Data security and privacy risks\n", - "* Dependence on technology and lack of human touch\n", - "\n", - "Overall, the application of generative AI in business will depend on the specific industry, company, and use case.\n" - ] - } - ], + "outputs": [], "source": [ "import ollama\n", "\n", @@ -265,45 +184,10 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "23057e00-b6fc-4678-93a9-6b31cb704bff", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Generative AI has numerous business applications across various industries. Here are some examples:\n", - "\n", - "1. **Marketing and Advertising**: Generative AI can create personalized product recommendations, generate targeted advertisements, and develop new marketing campaigns.\n", - "2. **Content Creation**: AI-powered tools can assist in content creation, such as writing articles, generating social media posts, and creating videos, podcasts, and music.\n", - "3. **Product Design and Development**: Generative AI can aid in designing products, such as 3D modeling, prototyping, and testing product feasibility.\n", - "4. **Customer Service Chatbots**: AI-powered chatbots can provide personalized customer service, answering common queries, and helping resolve issues faster.\n", - "5. **Language Translation**: Generative AI can translate languages in real-time, enabling businesses to communicate with global customers more effectively.\n", - "6. **Data Analysis and Visualization**: AI can analyze large datasets, identify patterns, and create insights, making it easier for businesses to make informed decisions.\n", - "7. **Cybersecurity Threat Detection**: Generative AI-powered systems can detect and respond to cyber threats more efficiently, reducing the risk of data breaches and attacks.\n", - "8. **Supply Chain Optimization**: AI can optimize supply chain operations, predict demand, and identify opportunities for improvement, leading to increased efficiency and reduced costs.\n", - "9. **Network Security**: Generative AI can analyze network traffic patterns, detect anomalies, and prevent cyber-attacks.\n", - "10. **Finance and Banking**: AI-powered systems can detect financial fraud, predict customer creditworthiness, and generate credit reports.\n", - "\n", - "**Industry-specific applications:**\n", - "\n", - "1. **Healthcare**: AI can help with medical diagnosis, patient data analysis, and personalized medicine.\n", - "2. **Manufacturing**: Generative AI can create optimized production schedules, predict equipment failures, and improve product quality.\n", - "3. **Education**: AI-powered tools can develop personalized learning plans, automate grading, and provide educational resources.\n", - "4. **Real Estate**: AI can help with property valuations, identify market trends, and analyze potential clients' needs.\n", - "\n", - "**Business benefits:**\n", - "\n", - "1. **Increased efficiency**: Automating mundane tasks frees up human resources for more strategic work.\n", - "2. **Improved accuracy**: Generative AI reduces the likelihood of human error in decision-making and task execution.\n", - "3. **Enhanced customer experience**: Personalized experiences are created through data-driven insights.\n", - "4. **Competitive advantage**: Companies using AI can differentiate themselves from competitors by offering innovative services and products.\n", - "\n", - "As Generative AI continues to evolve, we can expect even more exciting applications across various industries, leading to increased efficiency, accuracy, and improved competitiveness for businesses worldwide.\n" - ] - } - ], + "outputs": [], "source": [ "# There's actually an alternative approach that some people might prefer\n", "# You can use the OpenAI client python library to call Ollama:\n", @@ -364,2371 +248,20 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "cf9eb44e-fe5b-47aa-b719-0bb63669ab3d", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠋ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠙ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠹ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠸ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠼ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠴ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠧ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠧ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠏ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠏ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠋ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠹ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠹ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠸ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠼ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠴ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠦ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠧ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠏ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠏ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠙ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠙ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠸ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠸ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest ⠼ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 0% ▕ ▏ 200 KB/1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 0% ▕ ▏ 979 KB/1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 0% ▕ ▏ 1.2 MB/1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 0% ▕ ▏ 1.8 MB/1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 0% ▕ ▏ 2.3 MB/1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 0% ▕ ▏ 3.2 MB/1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 0% ▕ ▏ 3.4 MB/1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 0% ▕ ▏ 4.0 MB/1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 0% ▕ ▏ 5.5 MB/1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 0% ▕ ▏ 5.6 MB/1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 5.6 MB/1.1 GB 5.4 MB/s 3m24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 5.8 MB/1.1 GB 5.4 MB/s 3m24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 5.9 MB/1.1 GB 5.4 MB/s 3m24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 6.8 MB/1.1 GB 5.4 MB/s 3m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 6.8 MB/1.1 GB 5.4 MB/s 3m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 7.0 MB/1.1 GB 5.4 MB/s 3m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 7.0 MB/1.1 GB 5.4 MB/s 3m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 7.2 MB/1.1 GB 5.4 MB/s 3m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 7.3 MB/1.1 GB 5.4 MB/s 3m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 8.2 MB/1.1 GB 5.4 MB/s 3m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 9.5 MB/1.1 GB 4.7 MB/s 3m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 9.7 MB/1.1 GB 4.7 MB/s 3m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 9.8 MB/1.1 GB 4.7 MB/s 3m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 9.9 MB/1.1 GB 4.7 MB/s 3m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 9.9 MB/1.1 GB 4.7 MB/s 3m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 10 MB/1.1 GB 4.7 MB/s 3m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 10 MB/1.1 GB 4.7 MB/s 3m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 11 MB/1.1 GB 4.7 MB/s 3m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 12 MB/1.1 GB 4.7 MB/s 3m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 13 MB/1.1 GB 4.7 MB/s 3m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 13 MB/1.1 GB 4.7 MB/s 3m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 13 MB/1.1 GB 4.3 MB/s 4m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 13 MB/1.1 GB 4.3 MB/s 4m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 13 MB/1.1 GB 4.3 MB/s 4m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 13 MB/1.1 GB 4.3 MB/s 4m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 13 MB/1.1 GB 4.3 MB/s 4m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 14 MB/1.1 GB 4.3 MB/s 4m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 14 MB/1.1 GB 4.3 MB/s 4m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 14 MB/1.1 GB 4.3 MB/s 4m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 14 MB/1.1 GB 4.3 MB/s 4m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 14 MB/1.1 GB 4.3 MB/s 4m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 14 MB/1.1 GB 3.5 MB/s 5m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 14 MB/1.1 GB 3.5 MB/s 5m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 14 MB/1.1 GB 3.5 MB/s 5m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 14 MB/1.1 GB 3.5 MB/s 5m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 14 MB/1.1 GB 3.5 MB/s 5m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 14 MB/1.1 GB 3.5 MB/s 5m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 15 MB/1.1 GB 3.5 MB/s 5m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 15 MB/1.1 GB 3.5 MB/s 5m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 1% ▕ ▏ 16 MB/1.1 GB 3.5 MB/s 5m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 17 MB/1.1 GB 3.5 MB/s 5m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 17 MB/1.1 GB 3.4 MB/s 5m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 17 MB/1.1 GB 3.4 MB/s 5m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 17 MB/1.1 GB 3.4 MB/s 5m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 17 MB/1.1 GB 3.4 MB/s 5m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 17 MB/1.1 GB 3.4 MB/s 5m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 17 MB/1.1 GB 3.4 MB/s 5m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 17 MB/1.1 GB 3.4 MB/s 5m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 18 MB/1.1 GB 3.4 MB/s 5m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 18 MB/1.1 GB 3.4 MB/s 5m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 18 MB/1.1 GB 3.4 MB/s 5m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 18 MB/1.1 GB 3.1 MB/s 5m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 18 MB/1.1 GB 3.1 MB/s 5m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 18 MB/1.1 GB 3.1 MB/s 5m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 19 MB/1.1 GB 3.1 MB/s 5m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 20 MB/1.1 GB 3.1 MB/s 5m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 20 MB/1.1 GB 3.1 MB/s 5m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 21 MB/1.1 GB 3.1 MB/s 5m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 21 MB/1.1 GB 3.1 MB/s 5m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 21 MB/1.1 GB 3.1 MB/s 5m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 22 MB/1.1 GB 3.1 MB/s 5m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 22 MB/1.1 GB 3.2 MB/s 5m44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 22 MB/1.1 GB 3.2 MB/s 5m44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 23 MB/1.1 GB 3.2 MB/s 5m43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 23 MB/1.1 GB 3.2 MB/s 5m43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 23 MB/1.1 GB 3.2 MB/s 5m43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 23 MB/1.1 GB 3.2 MB/s 5m43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 24 MB/1.1 GB 3.2 MB/s 5m43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 24 MB/1.1 GB 3.2 MB/s 5m43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 25 MB/1.1 GB 3.2 MB/s 5m43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 25 MB/1.1 GB 3.2 MB/s 5m43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 25 MB/1.1 GB 3.2 MB/s 5m43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 26 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 26 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 26 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 26 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 27 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 2% ▕ ▏ 27 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 3% ▕ ▏ 28 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 3% ▕ ▏ 28 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 3% ▕ ▏ 28 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 3% ▕ ▏ 29 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 3% ▕ ▏ 29 MB/1.1 GB 3.2 MB/s 5m34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 3% ▕ ▏ 29 MB/1.1 GB 3.2 MB/s 5m34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 3% ▕ ▏ 29 MB/1.1 GB 3.2 MB/s 5m34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 3% ▕ ▏ 30 MB/1.1 GB 3.2 MB/s 5m34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 3% ▕ ▏ 30 MB/1.1 GB 3.2 MB/s 5m34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 3% ▕ ▏ 31 MB/1.1 GB 3.2 MB/s 5m34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 3% ▕ ▏ 31 MB/1.1 GB 3.2 MB/s 5m34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 3% ▕ ▏ 31 MB/1.1 GB 3.2 MB/s 5m34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 3% ▕ ▏ 32 MB/1.1 GB 3.2 MB/s 5m34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 3% ▕ ▏ 32 MB/1.1 GB 3.2 MB/s 5m33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 3% ▕ ▏ 32 MB/1.1 GB 3.0 MB/s 5m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 3% ▕ ▏ 33 MB/1.1 GB 3.0 MB/s 5m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 3% ▕ ▏ 33 MB/1.1 GB 3.0 MB/s 5m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 3% ▕ ▏ 34 MB/1.1 GB 3.0 MB/s 5m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 3% ▕ ▏ 34 MB/1.1 GB 3.0 MB/s 5m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 3% ▕ ▏ 35 MB/1.1 GB 3.0 MB/s 5m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 3% ▕ ▏ 35 MB/1.1 GB 3.0 MB/s 5m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 3% ▕ ▏ 36 MB/1.1 GB 3.0 MB/s 5m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 3% ▕ ▏ 36 MB/1.1 GB 3.0 MB/s 5m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 3% ▕ ▏ 37 MB/1.1 GB 3.0 MB/s 5m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 3% ▕ ▏ 37 MB/1.1 GB 3.1 MB/s 5m45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 3% ▕ ▏ 38 MB/1.1 GB 3.1 MB/s 5m45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 3% ▕ ▏ 38 MB/1.1 GB 3.1 MB/s 5m45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 3% ▕ ▏ 38 MB/1.1 GB 3.1 MB/s 5m45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 4% ▕ ▏ 39 MB/1.1 GB 3.1 MB/s 5m45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 4% ▕ ▏ 39 MB/1.1 GB 3.1 MB/s 5m45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 4% ▕ ▏ 40 MB/1.1 GB 3.1 MB/s 5m44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 4% ▕ ▏ 40 MB/1.1 GB 3.1 MB/s 5m44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 4% ▕ ▏ 40 MB/1.1 GB 3.1 MB/s 5m44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 4% ▕ ▏ 41 MB/1.1 GB 3.1 MB/s 5m44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 4% ▕ ▏ 41 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 4% ▕ ▏ 42 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 4% ▕ ▏ 42 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 4% ▕ ▏ 43 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 4% ▕ ▏ 43 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 4% ▕ ▏ 43 MB/1.1 GB 3.2 MB/s 5m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 4% ▕ ▏ 44 MB/1.1 GB 3.2 MB/s 5m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 4% ▕ ▏ 44 MB/1.1 GB 3.2 MB/s 5m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 4% ▕ ▏ 45 MB/1.1 GB 3.2 MB/s 5m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 4% ▕ ▏ 46 MB/1.1 GB 3.2 MB/s 5m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 4% ▕ ▏ 46 MB/1.1 GB 3.2 MB/s 5m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 4% ▕ ▏ 47 MB/1.1 GB 3.6 MB/s 4m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 4% ▕ ▏ 47 MB/1.1 GB 3.6 MB/s 4m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 4% ▕ ▏ 48 MB/1.1 GB 3.6 MB/s 4m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 4% ▕ ▏ 48 MB/1.1 GB 3.6 MB/s 4m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 4% ▕ ▏ 49 MB/1.1 GB 3.6 MB/s 4m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 4% ▕ ▏ 49 MB/1.1 GB 3.6 MB/s 4m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 4% ▕ ▏ 49 MB/1.1 GB 3.6 MB/s 4m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 5% ▕ ▏ 50 MB/1.1 GB 3.6 MB/s 4m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 5% ▕ ▏ 50 MB/1.1 GB 3.6 MB/s 4m53s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 5% ▕ ▏ 51 MB/1.1 GB 3.6 MB/s 4m53s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 5% ▕ ▏ 52 MB/1.1 GB 3.8 MB/s 4m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 5% ▕ ▏ 52 MB/1.1 GB 3.8 MB/s 4m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 5% ▕ ▏ 52 MB/1.1 GB 3.8 MB/s 4m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 5% ▕ ▏ 53 MB/1.1 GB 3.8 MB/s 4m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 5% ▕ ▏ 54 MB/1.1 GB 3.8 MB/s 4m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 5% ▕ ▏ 54 MB/1.1 GB 3.8 MB/s 4m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 5% ▕ ▏ 54 MB/1.1 GB 3.8 MB/s 4m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 5% ▕ ▏ 55 MB/1.1 GB 3.8 MB/s 4m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 5% ▕ ▏ 56 MB/1.1 GB 3.8 MB/s 4m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 5% ▕ ▏ 56 MB/1.1 GB 3.8 MB/s 4m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 5% ▕ ▏ 56 MB/1.1 GB 4.2 MB/s 4m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 5% ▕ ▏ 56 MB/1.1 GB 4.2 MB/s 4m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 5% ▕ ▏ 57 MB/1.1 GB 4.2 MB/s 4m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 5% ▕ ▏ 57 MB/1.1 GB 4.2 MB/s 4m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 5% ▕ ▏ 57 MB/1.1 GB 4.2 MB/s 4m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 5% ▕ ▏ 58 MB/1.1 GB 4.2 MB/s 4m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 5% ▕ ▏ 58 MB/1.1 GB 4.2 MB/s 4m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 5% ▕ ▏ 58 MB/1.1 GB 4.2 MB/s 4m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 5% ▕ ▏ 59 MB/1.1 GB 4.2 MB/s 4m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 5% ▕ ▏ 60 MB/1.1 GB 4.2 MB/s 4m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 5% ▕ ▏ 60 MB/1.1 GB 4.2 MB/s 4m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 5% ▕ ▏ 60 MB/1.1 GB 4.2 MB/s 4m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 6% ▕ ▏ 61 MB/1.1 GB 4.2 MB/s 4m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 6% ▕█ ▏ 62 MB/1.1 GB 4.2 MB/s 4m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 6% ▕█ ▏ 62 MB/1.1 GB 4.2 MB/s 4m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 6% ▕█ ▏ 63 MB/1.1 GB 4.2 MB/s 4m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 6% ▕█ ▏ 63 MB/1.1 GB 4.2 MB/s 4m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 6% ▕█ ▏ 64 MB/1.1 GB 4.2 MB/s 4m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 6% ▕█ ▏ 64 MB/1.1 GB 4.2 MB/s 4m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 6% ▕█ ▏ 65 MB/1.1 GB 4.2 MB/s 4m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 6% ▕█ ▏ 65 MB/1.1 GB 4.4 MB/s 3m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 6% ▕█ ▏ 66 MB/1.1 GB 4.4 MB/s 3m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 6% ▕█ ▏ 66 MB/1.1 GB 4.4 MB/s 3m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 6% ▕█ ▏ 67 MB/1.1 GB 4.4 MB/s 3m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 6% ▕█ ▏ 67 MB/1.1 GB 4.4 MB/s 3m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 6% ▕█ ▏ 68 MB/1.1 GB 4.4 MB/s 3m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 6% ▕█ ▏ 69 MB/1.1 GB 4.4 MB/s 3m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 6% ▕█ ▏ 69 MB/1.1 GB 4.4 MB/s 3m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 6% ▕█ ▏ 69 MB/1.1 GB 4.4 MB/s 3m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 6% ▕█ ▏ 70 MB/1.1 GB 4.4 MB/s 3m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 6% ▕█ ▏ 70 MB/1.1 GB 4.4 MB/s 3m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 6% ▕█ ▏ 71 MB/1.1 GB 4.6 MB/s 3m47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 6% ▕█ ▏ 72 MB/1.1 GB 4.6 MB/s 3m47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 6% ▕█ ▏ 72 MB/1.1 GB 4.6 MB/s 3m47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 7% ▕█ ▏ 72 MB/1.1 GB 4.6 MB/s 3m47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 7% ▕█ ▏ 73 MB/1.1 GB 4.6 MB/s 3m47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 7% ▕█ ▏ 74 MB/1.1 GB 4.6 MB/s 3m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 7% ▕█ ▏ 74 MB/1.1 GB 4.6 MB/s 3m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 7% ▕█ ▏ 74 MB/1.1 GB 4.6 MB/s 3m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 7% ▕█ ▏ 75 MB/1.1 GB 4.6 MB/s 3m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 7% ▕█ ▏ 75 MB/1.1 GB 4.6 MB/s 3m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 7% ▕█ ▏ 75 MB/1.1 GB 4.8 MB/s 3m39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 7% ▕█ ▏ 75 MB/1.1 GB 4.8 MB/s 3m39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 7% ▕█ ▏ 77 MB/1.1 GB 4.8 MB/s 3m38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 7% ▕█ ▏ 78 MB/1.1 GB 4.8 MB/s 3m38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 7% ▕█ ▏ 78 MB/1.1 GB 4.8 MB/s 3m38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 7% ▕█ ▏ 79 MB/1.1 GB 4.8 MB/s 3m38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 7% ▕█ ▏ 79 MB/1.1 GB 4.8 MB/s 3m38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 7% ▕█ ▏ 80 MB/1.1 GB 4.8 MB/s 3m38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 7% ▕█ ▏ 80 MB/1.1 GB 4.8 MB/s 3m38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 7% ▕█ ▏ 81 MB/1.1 GB 4.8 MB/s 3m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 7% ▕█ ▏ 82 MB/1.1 GB 4.9 MB/s 3m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 7% ▕█ ▏ 82 MB/1.1 GB 4.9 MB/s 3m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 7% ▕█ ▏ 83 MB/1.1 GB 4.9 MB/s 3m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 8% ▕█ ▏ 84 MB/1.1 GB 4.9 MB/s 3m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 8% ▕█ ▏ 84 MB/1.1 GB 4.9 MB/s 3m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 8% ▕█ ▏ 84 MB/1.1 GB 4.9 MB/s 3m28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 8% ▕█ ▏ 85 MB/1.1 GB 4.9 MB/s 3m28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 8% ▕█ ▏ 86 MB/1.1 GB 4.9 MB/s 3m28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 8% ▕█ ▏ 86 MB/1.1 GB 4.9 MB/s 3m28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 8% ▕█ ▏ 86 MB/1.1 GB 4.9 MB/s 3m28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 8% ▕█ ▏ 86 MB/1.1 GB 5.0 MB/s 3m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 8% ▕█ ▏ 87 MB/1.1 GB 5.0 MB/s 3m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 8% ▕█ ▏ 87 MB/1.1 GB 5.0 MB/s 3m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 8% ▕█ ▏ 89 MB/1.1 GB 5.0 MB/s 3m26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 8% ▕█ ▏ 90 MB/1.1 GB 5.0 MB/s 3m26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 8% ▕█ ▏ 90 MB/1.1 GB 5.0 MB/s 3m26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 8% ▕█ ▏ 91 MB/1.1 GB 5.0 MB/s 3m26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 8% ▕█ ▏ 92 MB/1.1 GB 5.0 MB/s 3m26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 8% ▕█ ▏ 92 MB/1.1 GB 5.0 MB/s 3m26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 8% ▕█ ▏ 92 MB/1.1 GB 5.0 MB/s 3m26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 8% ▕█ ▏ 94 MB/1.1 GB 5.3 MB/s 3m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 8% ▕█ ▏ 94 MB/1.1 GB 5.3 MB/s 3m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 8% ▕█ ▏ 94 MB/1.1 GB 5.3 MB/s 3m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 9% ▕█ ▏ 95 MB/1.1 GB 5.3 MB/s 3m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 9% ▕█ ▏ 95 MB/1.1 GB 5.3 MB/s 3m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 9% ▕█ ▏ 96 MB/1.1 GB 5.3 MB/s 3m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 9% ▕█ ▏ 97 MB/1.1 GB 5.3 MB/s 3m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 9% ▕█ ▏ 97 MB/1.1 GB 5.3 MB/s 3m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 9% ▕█ ▏ 98 MB/1.1 GB 5.3 MB/s 3m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 9% ▕█ ▏ 98 MB/1.1 GB 5.3 MB/s 3m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 9% ▕█ ▏ 99 MB/1.1 GB 5.3 MB/s 3m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 9% ▕█ ▏ 100 MB/1.1 GB 5.4 MB/s 3m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 9% ▕█ ▏ 100 MB/1.1 GB 5.4 MB/s 3m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 9% ▕█ ▏ 100 MB/1.1 GB 5.4 MB/s 3m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 9% ▕█ ▏ 101 MB/1.1 GB 5.4 MB/s 3m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 9% ▕█ ▏ 102 MB/1.1 GB 5.4 MB/s 3m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 9% ▕█ ▏ 103 MB/1.1 GB 5.4 MB/s 3m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 9% ▕█ ▏ 104 MB/1.1 GB 5.4 MB/s 3m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 9% ▕█ ▏ 104 MB/1.1 GB 5.4 MB/s 3m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 9% ▕█ ▏ 105 MB/1.1 GB 5.4 MB/s 3m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 9% ▕█ ▏ 105 MB/1.1 GB 5.4 MB/s 3m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 10% ▕█ ▏ 106 MB/1.1 GB 5.4 MB/s 3m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 10% ▕█ ▏ 107 MB/1.1 GB 5.4 MB/s 3m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 10% ▕█ ▏ 108 MB/1.1 GB 5.4 MB/s 3m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 10% ▕█ ▏ 109 MB/1.1 GB 5.4 MB/s 3m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 10% ▕█ ▏ 109 MB/1.1 GB 5.4 MB/s 3m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 10% ▕█ ▏ 110 MB/1.1 GB 5.4 MB/s 3m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 10% ▕█ ▏ 111 MB/1.1 GB 5.4 MB/s 3m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 10% ▕█ ▏ 111 MB/1.1 GB 5.4 MB/s 3m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 10% ▕█ ▏ 112 MB/1.1 GB 5.4 MB/s 3m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 10% ▕█ ▏ 113 MB/1.1 GB 5.4 MB/s 3m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 10% ▕█ ▏ 113 MB/1.1 GB 5.9 MB/s 2m48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 10% ▕█ ▏ 114 MB/1.1 GB 5.9 MB/s 2m48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 10% ▕█ ▏ 115 MB/1.1 GB 5.9 MB/s 2m48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 10% ▕█ ▏ 116 MB/1.1 GB 5.9 MB/s 2m48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 10% ▕█ ▏ 116 MB/1.1 GB 5.9 MB/s 2m48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 11% ▕█ ▏ 117 MB/1.1 GB 5.9 MB/s 2m48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 11% ▕█ ▏ 117 MB/1.1 GB 5.9 MB/s 2m48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 11% ▕█ ▏ 118 MB/1.1 GB 5.9 MB/s 2m48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 11% ▕█ ▏ 119 MB/1.1 GB 5.9 MB/s 2m47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 11% ▕█ ▏ 119 MB/1.1 GB 5.9 MB/s 2m47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 11% ▕█ ▏ 119 MB/1.1 GB 6.0 MB/s 2m47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 11% ▕█ ▏ 120 MB/1.1 GB 6.0 MB/s 2m47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 11% ▕█ ▏ 121 MB/1.1 GB 6.0 MB/s 2m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 11% ▕█ ▏ 122 MB/1.1 GB 6.0 MB/s 2m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 11% ▕█ ▏ 123 MB/1.1 GB 6.0 MB/s 2m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 11% ▕█ ▏ 123 MB/1.1 GB 6.0 MB/s 2m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 11% ▕██ ▏ 124 MB/1.1 GB 6.0 MB/s 2m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 11% ▕██ ▏ 125 MB/1.1 GB 6.0 MB/s 2m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 11% ▕██ ▏ 125 MB/1.1 GB 6.0 MB/s 2m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 11% ▕██ ▏ 126 MB/1.1 GB 6.0 MB/s 2m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 11% ▕██ ▏ 127 MB/1.1 GB 6.3 MB/s 2m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 11% ▕██ ▏ 128 MB/1.1 GB 6.3 MB/s 2m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 12% ▕██ ▏ 129 MB/1.1 GB 6.3 MB/s 2m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 12% ▕██ ▏ 129 MB/1.1 GB 6.3 MB/s 2m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 12% ▕██ ▏ 129 MB/1.1 GB 6.3 MB/s 2m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 12% ▕██ ▏ 131 MB/1.1 GB 6.3 MB/s 2m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 12% ▕██ ▏ 131 MB/1.1 GB 6.3 MB/s 2m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 12% ▕██ ▏ 132 MB/1.1 GB 6.3 MB/s 2m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 12% ▕██ ▏ 133 MB/1.1 GB 6.3 MB/s 2m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 12% ▕██ ▏ 133 MB/1.1 GB 6.3 MB/s 2m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 12% ▕██ ▏ 133 MB/1.1 GB 6.3 MB/s 2m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 12% ▕██ ▏ 134 MB/1.1 GB 6.5 MB/s 2m31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 12% ▕██ ▏ 135 MB/1.1 GB 6.5 MB/s 2m31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 12% ▕██ ▏ 135 MB/1.1 GB 6.5 MB/s 2m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 12% ▕██ ▏ 137 MB/1.1 GB 6.5 MB/s 2m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 12% ▕██ ▏ 137 MB/1.1 GB 6.5 MB/s 2m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 12% ▕██ ▏ 137 MB/1.1 GB 6.5 MB/s 2m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 12% ▕██ ▏ 137 MB/1.1 GB 6.5 MB/s 2m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 12% ▕██ ▏ 139 MB/1.1 GB 6.5 MB/s 2m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 13% ▕██ ▏ 140 MB/1.1 GB 6.5 MB/s 2m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 13% ▕██ ▏ 140 MB/1.1 GB 6.5 MB/s 2m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 13% ▕██ ▏ 141 MB/1.1 GB 6.6 MB/s 2m28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 13% ▕██ ▏ 141 MB/1.1 GB 6.6 MB/s 2m28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 13% ▕██ ▏ 142 MB/1.1 GB 6.6 MB/s 2m28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 13% ▕██ ▏ 142 MB/1.1 GB 6.6 MB/s 2m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 13% ▕██ ▏ 143 MB/1.1 GB 6.6 MB/s 2m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 13% ▕██ ▏ 144 MB/1.1 GB 6.6 MB/s 2m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 13% ▕██ ▏ 145 MB/1.1 GB 6.6 MB/s 2m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 13% ▕██ ▏ 145 MB/1.1 GB 6.6 MB/s 2m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 13% ▕██ ▏ 146 MB/1.1 GB 6.6 MB/s 2m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 13% ▕██ ▏ 147 MB/1.1 GB 6.6 MB/s 2m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 13% ▕██ ▏ 147 MB/1.1 GB 6.8 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 13% ▕██ ▏ 148 MB/1.1 GB 6.8 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 13% ▕██ ▏ 149 MB/1.1 GB 6.8 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 13% ▕██ ▏ 149 MB/1.1 GB 6.8 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 14% ▕██ ▏ 150 MB/1.1 GB 6.8 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 14% ▕██ ▏ 151 MB/1.1 GB 6.8 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 14% ▕██ ▏ 151 MB/1.1 GB 6.8 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 14% ▕██ ▏ 152 MB/1.1 GB 6.8 MB/s 2m21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 14% ▕██ ▏ 153 MB/1.1 GB 6.8 MB/s 2m21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 14% ▕██ ▏ 154 MB/1.1 GB 6.8 MB/s 2m21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 14% ▕██ ▏ 154 MB/1.1 GB 6.7 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 14% ▕██ ▏ 155 MB/1.1 GB 6.7 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 14% ▕██ ▏ 155 MB/1.1 GB 6.7 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 14% ▕██ ▏ 156 MB/1.1 GB 6.7 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 14% ▕██ ▏ 157 MB/1.1 GB 6.7 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 14% ▕██ ▏ 157 MB/1.1 GB 6.7 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 14% ▕██ ▏ 158 MB/1.1 GB 6.7 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 14% ▕██ ▏ 158 MB/1.1 GB 6.7 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 14% ▕██ ▏ 159 MB/1.1 GB 6.7 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 14% ▕██ ▏ 160 MB/1.1 GB 6.7 MB/s 2m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 14% ▕██ ▏ 160 MB/1.1 GB 6.8 MB/s 2m21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 14% ▕██ ▏ 161 MB/1.1 GB 6.8 MB/s 2m21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 15% ▕██ ▏ 162 MB/1.1 GB 6.8 MB/s 2m21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 15% ▕██ ▏ 163 MB/1.1 GB 6.8 MB/s 2m20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 15% ▕██ ▏ 163 MB/1.1 GB 6.8 MB/s 2m20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 15% ▕██ ▏ 164 MB/1.1 GB 6.8 MB/s 2m20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 15% ▕██ ▏ 165 MB/1.1 GB 6.8 MB/s 2m20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 15% ▕██ ▏ 165 MB/1.1 GB 6.8 MB/s 2m20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 15% ▕██ ▏ 166 MB/1.1 GB 6.8 MB/s 2m20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 15% ▕██ ▏ 166 MB/1.1 GB 6.8 MB/s 2m20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 15% ▕██ ▏ 167 MB/1.1 GB 6.8 MB/s 2m20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 15% ▕██ ▏ 168 MB/1.1 GB 7.0 MB/s 2m16s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 15% ▕██ ▏ 169 MB/1.1 GB 7.0 MB/s 2m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 15% ▕██ ▏ 170 MB/1.1 GB 7.0 MB/s 2m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 15% ▕██ ▏ 171 MB/1.1 GB 7.0 MB/s 2m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 15% ▕██ ▏ 172 MB/1.1 GB 7.0 MB/s 2m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 15% ▕██ ▏ 172 MB/1.1 GB 7.0 MB/s 2m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 16% ▕██ ▏ 173 MB/1.1 GB 7.0 MB/s 2m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 16% ▕██ ▏ 174 MB/1.1 GB 7.0 MB/s 2m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 16% ▕██ ▏ 174 MB/1.1 GB 7.0 MB/s 2m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 16% ▕██ ▏ 174 MB/1.1 GB 7.0 MB/s 2m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 16% ▕██ ▏ 175 MB/1.1 GB 6.8 MB/s 2m18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 16% ▕██ ▏ 176 MB/1.1 GB 6.8 MB/s 2m18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 16% ▕██ ▏ 176 MB/1.1 GB 6.8 MB/s 2m18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 16% ▕██ ▏ 177 MB/1.1 GB 6.8 MB/s 2m18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 16% ▕██ ▏ 178 MB/1.1 GB 6.8 MB/s 2m18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 16% ▕██ ▏ 178 MB/1.1 GB 6.8 MB/s 2m18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 16% ▕██ ▏ 179 MB/1.1 GB 6.8 MB/s 2m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 16% ▕██ ▏ 180 MB/1.1 GB 6.8 MB/s 2m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 16% ▕██ ▏ 181 MB/1.1 GB 6.8 MB/s 2m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 16% ▕██ ▏ 182 MB/1.1 GB 6.8 MB/s 2m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 16% ▕██ ▏ 182 MB/1.1 GB 7.0 MB/s 2m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 16% ▕██ ▏ 183 MB/1.1 GB 7.0 MB/s 2m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 16% ▕██ ▏ 184 MB/1.1 GB 7.0 MB/s 2m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 17% ▕██ ▏ 184 MB/1.1 GB 7.0 MB/s 2m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 17% ▕██ ▏ 185 MB/1.1 GB 7.0 MB/s 2m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 17% ▕██ ▏ 185 MB/1.1 GB 7.0 MB/s 2m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 17% ▕███ ▏ 186 MB/1.1 GB 7.0 MB/s 2m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 17% ▕███ ▏ 187 MB/1.1 GB 7.0 MB/s 2m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 17% ▕███ ▏ 188 MB/1.1 GB 7.0 MB/s 2m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 17% ▕███ ▏ 189 MB/1.1 GB 7.0 MB/s 2m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 17% ▕███ ▏ 189 MB/1.1 GB 6.9 MB/s 2m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 17% ▕███ ▏ 190 MB/1.1 GB 6.9 MB/s 2m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 17% ▕███ ▏ 190 MB/1.1 GB 6.9 MB/s 2m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 17% ▕███ ▏ 192 MB/1.1 GB 6.9 MB/s 2m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 17% ▕███ ▏ 193 MB/1.1 GB 6.9 MB/s 2m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 17% ▕███ ▏ 193 MB/1.1 GB 6.9 MB/s 2m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 17% ▕███ ▏ 194 MB/1.1 GB 6.9 MB/s 2m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 18% ▕███ ▏ 195 MB/1.1 GB 6.9 MB/s 2m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 18% ▕███ ▏ 195 MB/1.1 GB 6.9 MB/s 2m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 18% ▕███ ▏ 196 MB/1.1 GB 6.9 MB/s 2m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 18% ▕███ ▏ 197 MB/1.1 GB 7.0 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 18% ▕███ ▏ 197 MB/1.1 GB 7.0 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 18% ▕███ ▏ 198 MB/1.1 GB 7.0 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 18% ▕███ ▏ 198 MB/1.1 GB 7.0 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 18% ▕███ ▏ 198 MB/1.1 GB 7.0 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 18% ▕███ ▏ 200 MB/1.1 GB 7.0 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 18% ▕███ ▏ 201 MB/1.1 GB 7.0 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 18% ▕███ ▏ 201 MB/1.1 GB 7.0 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 18% ▕███ ▏ 202 MB/1.1 GB 7.0 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 18% ▕███ ▏ 203 MB/1.1 GB 7.0 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 18% ▕███ ▏ 204 MB/1.1 GB 7.0 MB/s 2m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 18% ▕███ ▏ 205 MB/1.1 GB 7.0 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 18% ▕███ ▏ 205 MB/1.1 GB 7.0 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 18% ▕███ ▏ 205 MB/1.1 GB 7.0 MB/s 2m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 18% ▕███ ▏ 205 MB/1.1 GB 7.0 MB/s 2m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 18% ▕███ ▏ 206 MB/1.1 GB 7.0 MB/s 2m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 19% ▕███ ▏ 207 MB/1.1 GB 7.0 MB/s 2m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 19% ▕███ ▏ 208 MB/1.1 GB 7.0 MB/s 2m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 19% ▕███ ▏ 208 MB/1.1 GB 7.0 MB/s 2m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 19% ▕███ ▏ 208 MB/1.1 GB 7.0 MB/s 2m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 19% ▕███ ▏ 210 MB/1.1 GB 7.0 MB/s 2m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 19% ▕███ ▏ 211 MB/1.1 GB 6.9 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 19% ▕███ ▏ 211 MB/1.1 GB 6.9 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 19% ▕███ ▏ 211 MB/1.1 GB 6.9 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 19% ▕███ ▏ 212 MB/1.1 GB 6.9 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 19% ▕███ ▏ 213 MB/1.1 GB 6.9 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 19% ▕███ ▏ 213 MB/1.1 GB 6.9 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 19% ▕███ ▏ 214 MB/1.1 GB 6.9 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 19% ▕███ ▏ 214 MB/1.1 GB 6.9 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 19% ▕███ ▏ 215 MB/1.1 GB 6.9 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 19% ▕███ ▏ 215 MB/1.1 GB 6.9 MB/s 2m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 19% ▕███ ▏ 216 MB/1.1 GB 6.9 MB/s 2m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 19% ▕███ ▏ 216 MB/1.1 GB 6.9 MB/s 2m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 19% ▕███ ▏ 217 MB/1.1 GB 6.9 MB/s 2m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 19% ▕███ ▏ 217 MB/1.1 GB 6.9 MB/s 2m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 20% ▕███ ▏ 218 MB/1.1 GB 6.9 MB/s 2m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 20% ▕███ ▏ 219 MB/1.1 GB 6.9 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 20% ▕███ ▏ 220 MB/1.1 GB 6.9 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 20% ▕███ ▏ 221 MB/1.1 GB 6.9 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 20% ▕███ ▏ 222 MB/1.1 GB 6.9 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 20% ▕███ ▏ 222 MB/1.1 GB 6.9 MB/s 2m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 20% ▕███ ▏ 223 MB/1.1 GB 7.0 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 20% ▕███ ▏ 224 MB/1.1 GB 7.0 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 20% ▕███ ▏ 224 MB/1.1 GB 7.0 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 20% ▕███ ▏ 225 MB/1.1 GB 7.0 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 20% ▕███ ▏ 226 MB/1.1 GB 7.0 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 20% ▕███ ▏ 227 MB/1.1 GB 7.0 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 20% ▕███ ▏ 227 MB/1.1 GB 7.0 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 20% ▕███ ▏ 227 MB/1.1 GB 7.0 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 20% ▕███ ▏ 228 MB/1.1 GB 7.0 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 21% ▕███ ▏ 229 MB/1.1 GB 7.0 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 21% ▕███ ▏ 230 MB/1.1 GB 6.9 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 21% ▕███ ▏ 230 MB/1.1 GB 6.9 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 21% ▕███ ▏ 231 MB/1.1 GB 6.9 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 21% ▕███ ▏ 232 MB/1.1 GB 6.9 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 21% ▕███ ▏ 233 MB/1.1 GB 6.9 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 21% ▕███ ▏ 233 MB/1.1 GB 6.9 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 21% ▕███ ▏ 234 MB/1.1 GB 6.9 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 21% ▕███ ▏ 235 MB/1.1 GB 6.9 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 21% ▕███ ▏ 235 MB/1.1 GB 6.9 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 21% ▕███ ▏ 236 MB/1.1 GB 6.9 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 21% ▕███ ▏ 237 MB/1.1 GB 6.9 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 21% ▕███ ▏ 237 MB/1.1 GB 6.9 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 21% ▕███ ▏ 238 MB/1.1 GB 6.9 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 21% ▕███ ▏ 239 MB/1.1 GB 6.9 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 21% ▕███ ▏ 239 MB/1.1 GB 6.9 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 22% ▕███ ▏ 240 MB/1.1 GB 6.9 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 22% ▕███ ▏ 240 MB/1.1 GB 6.9 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 22% ▕███ ▏ 242 MB/1.1 GB 6.9 MB/s 2m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 22% ▕███ ▏ 243 MB/1.1 GB 6.9 MB/s 2m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 22% ▕███ ▏ 243 MB/1.1 GB 6.9 MB/s 2m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 22% ▕███ ▏ 243 MB/1.1 GB 6.9 MB/s 2m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 22% ▕███ ▏ 244 MB/1.1 GB 6.8 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 22% ▕███ ▏ 244 MB/1.1 GB 6.8 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 22% ▕███ ▏ 245 MB/1.1 GB 6.8 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 22% ▕███ ▏ 246 MB/1.1 GB 6.8 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 22% ▕███ ▏ 246 MB/1.1 GB 6.8 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 22% ▕███ ▏ 247 MB/1.1 GB 6.8 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 22% ▕████ ▏ 248 MB/1.1 GB 6.8 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 22% ▕████ ▏ 249 MB/1.1 GB 6.8 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 22% ▕████ ▏ 249 MB/1.1 GB 6.8 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 22% ▕████ ▏ 250 MB/1.1 GB 6.8 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 22% ▕████ ▏ 251 MB/1.1 GB 6.8 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 23% ▕████ ▏ 251 MB/1.1 GB 6.8 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 23% ▕████ ▏ 252 MB/1.1 GB 6.8 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 23% ▕████ ▏ 252 MB/1.1 GB 6.8 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 23% ▕████ ▏ 253 MB/1.1 GB 6.8 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 23% ▕████ ▏ 253 MB/1.1 GB 6.8 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 23% ▕████ ▏ 254 MB/1.1 GB 6.8 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 23% ▕████ ▏ 255 MB/1.1 GB 6.8 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 23% ▕████ ▏ 256 MB/1.1 GB 6.8 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 23% ▕████ ▏ 257 MB/1.1 GB 6.8 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 23% ▕████ ▏ 257 MB/1.1 GB 6.7 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 23% ▕████ ▏ 258 MB/1.1 GB 6.7 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 23% ▕████ ▏ 259 MB/1.1 GB 6.7 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 23% ▕████ ▏ 260 MB/1.1 GB 6.7 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 23% ▕████ ▏ 261 MB/1.1 GB 6.7 MB/s 2m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 23% ▕████ ▏ 261 MB/1.1 GB 6.7 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 23% ▕████ ▏ 261 MB/1.1 GB 6.7 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 24% ▕████ ▏ 263 MB/1.1 GB 6.7 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 24% ▕████ ▏ 263 MB/1.1 GB 6.7 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 24% ▕████ ▏ 264 MB/1.1 GB 6.7 MB/s 2m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 24% ▕████ ▏ 265 MB/1.1 GB 6.7 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 24% ▕████ ▏ 266 MB/1.1 GB 6.7 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 24% ▕████ ▏ 267 MB/1.1 GB 6.7 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 24% ▕████ ▏ 267 MB/1.1 GB 6.7 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 24% ▕████ ▏ 267 MB/1.1 GB 6.7 MB/s 2m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 24% ▕████ ▏ 268 MB/1.1 GB 6.7 MB/s 2m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 24% ▕████ ▏ 269 MB/1.1 GB 6.7 MB/s 2m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 24% ▕████ ▏ 269 MB/1.1 GB 6.7 MB/s 2m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 24% ▕████ ▏ 269 MB/1.1 GB 6.7 MB/s 2m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 24% ▕████ ▏ 271 MB/1.1 GB 6.7 MB/s 2m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 24% ▕████ ▏ 271 MB/1.1 GB 6.7 MB/s 2m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 24% ▕████ ▏ 271 MB/1.1 GB 6.8 MB/s 2m4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 24% ▕████ ▏ 272 MB/1.1 GB 6.8 MB/s 2m4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 24% ▕████ ▏ 273 MB/1.1 GB 6.8 MB/s 2m4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 25% ▕████ ▏ 274 MB/1.1 GB 6.8 MB/s 2m4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 25% ▕████ ▏ 275 MB/1.1 GB 6.8 MB/s 2m3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 25% ▕████ ▏ 275 MB/1.1 GB 6.8 MB/s 2m3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 25% ▕████ ▏ 276 MB/1.1 GB 6.8 MB/s 2m3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 25% ▕████ ▏ 277 MB/1.1 GB 6.8 MB/s 2m3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 25% ▕████ ▏ 277 MB/1.1 GB 6.8 MB/s 2m3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 25% ▕████ ▏ 278 MB/1.1 GB 6.8 MB/s 2m3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 25% ▕████ ▏ 279 MB/1.1 GB 7.0 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 25% ▕████ ▏ 279 MB/1.1 GB 7.0 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 25% ▕████ ▏ 280 MB/1.1 GB 7.0 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 25% ▕████ ▏ 281 MB/1.1 GB 7.0 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 25% ▕████ ▏ 281 MB/1.1 GB 7.0 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 25% ▕████ ▏ 282 MB/1.1 GB 7.0 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 25% ▕████ ▏ 282 MB/1.1 GB 7.0 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 25% ▕████ ▏ 283 MB/1.1 GB 7.0 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 25% ▕████ ▏ 284 MB/1.1 GB 7.0 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 26% ▕████ ▏ 285 MB/1.1 GB 7.0 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 26% ▕████ ▏ 285 MB/1.1 GB 6.9 MB/s 2m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 26% ▕████ ▏ 285 MB/1.1 GB 6.9 MB/s 2m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 26% ▕████ ▏ 286 MB/1.1 GB 6.9 MB/s 2m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 26% ▕████ ▏ 287 MB/1.1 GB 6.9 MB/s 2m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 26% ▕████ ▏ 287 MB/1.1 GB 6.9 MB/s 2m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 26% ▕████ ▏ 288 MB/1.1 GB 6.9 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 26% ▕████ ▏ 288 MB/1.1 GB 6.9 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 26% ▕████ ▏ 289 MB/1.1 GB 6.9 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 26% ▕████ ▏ 290 MB/1.1 GB 6.9 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 26% ▕████ ▏ 291 MB/1.1 GB 6.9 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 26% ▕████ ▏ 291 MB/1.1 GB 6.8 MB/s 2m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 26% ▕████ ▏ 292 MB/1.1 GB 6.8 MB/s 2m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 26% ▕████ ▏ 293 MB/1.1 GB 6.8 MB/s 2m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 26% ▕████ ▏ 293 MB/1.1 GB 6.8 MB/s 2m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 26% ▕████ ▏ 294 MB/1.1 GB 6.8 MB/s 2m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 26% ▕████ ▏ 294 MB/1.1 GB 6.8 MB/s 2m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 27% ▕████ ▏ 296 MB/1.1 GB 6.8 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 27% ▕████ ▏ 297 MB/1.1 GB 6.8 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 27% ▕████ ▏ 297 MB/1.1 GB 6.8 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 27% ▕████ ▏ 297 MB/1.1 GB 6.8 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 27% ▕████ ▏ 298 MB/1.1 GB 6.8 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 27% ▕████ ▏ 299 MB/1.1 GB 6.8 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 27% ▕████ ▏ 299 MB/1.1 GB 6.8 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 27% ▕████ ▏ 300 MB/1.1 GB 6.8 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 27% ▕████ ▏ 301 MB/1.1 GB 6.8 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 27% ▕████ ▏ 301 MB/1.1 GB 6.8 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 27% ▕████ ▏ 302 MB/1.1 GB 6.8 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 27% ▕████ ▏ 303 MB/1.1 GB 6.8 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 27% ▕████ ▏ 303 MB/1.1 GB 6.8 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 27% ▕████ ▏ 304 MB/1.1 GB 6.8 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 27% ▕████ ▏ 304 MB/1.1 GB 6.8 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 27% ▕████ ▏ 305 MB/1.1 GB 6.8 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 27% ▕████ ▏ 306 MB/1.1 GB 6.8 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 27% ▕████ ▏ 306 MB/1.1 GB 6.8 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 27% ▕████ ▏ 306 MB/1.1 GB 6.8 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 28% ▕████ ▏ 307 MB/1.1 GB 6.8 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 28% ▕████ ▏ 308 MB/1.1 GB 6.8 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 28% ▕████ ▏ 308 MB/1.1 GB 6.8 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 28% ▕████ ▏ 309 MB/1.1 GB 6.8 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 28% ▕████ ▏ 309 MB/1.1 GB 6.8 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 28% ▕█████ ▏ 311 MB/1.1 GB 6.8 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 28% ▕█████ ▏ 311 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 28% ▕█████ ▏ 312 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 28% ▕█████ ▏ 312 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 28% ▕█████ ▏ 313 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 28% ▕█████ ▏ 313 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 28% ▕█████ ▏ 313 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 28% ▕█████ ▏ 315 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 28% ▕█████ ▏ 315 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 28% ▕█████ ▏ 316 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 28% ▕█████ ▏ 317 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 28% ▕█████ ▏ 317 MB/1.1 GB 6.7 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 28% ▕█████ ▏ 317 MB/1.1 GB 6.7 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 28% ▕█████ ▏ 318 MB/1.1 GB 6.7 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 28% ▕█████ ▏ 318 MB/1.1 GB 6.7 MB/s 2m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 29% ▕█████ ▏ 320 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 29% ▕█████ ▏ 321 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 29% ▕█████ ▏ 321 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 29% ▕█████ ▏ 322 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 29% ▕█████ ▏ 322 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 29% ▕█████ ▏ 323 MB/1.1 GB 6.7 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 29% ▕█████ ▏ 324 MB/1.1 GB 6.6 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 29% ▕█████ ▏ 325 MB/1.1 GB 6.6 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 29% ▕█████ ▏ 325 MB/1.1 GB 6.6 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 29% ▕█████ ▏ 326 MB/1.1 GB 6.6 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 29% ▕█████ ▏ 327 MB/1.1 GB 6.6 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 29% ▕█████ ▏ 327 MB/1.1 GB 6.6 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 29% ▕█████ ▏ 328 MB/1.1 GB 6.6 MB/s 1m59s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 29% ▕█████ ▏ 329 MB/1.1 GB 6.6 MB/s 1m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 30% ▕█████ ▏ 329 MB/1.1 GB 6.6 MB/s 1m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 30% ▕█████ ▏ 331 MB/1.1 GB 6.6 MB/s 1m58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 30% ▕█████ ▏ 331 MB/1.1 GB 6.7 MB/s 1m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 30% ▕█████ ▏ 332 MB/1.1 GB 6.7 MB/s 1m57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 30% ▕█████ ▏ 333 MB/1.1 GB 6.7 MB/s 1m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 30% ▕█████ ▏ 334 MB/1.1 GB 6.7 MB/s 1m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 30% ▕█████ ▏ 334 MB/1.1 GB 6.7 MB/s 1m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 30% ▕█████ ▏ 335 MB/1.1 GB 6.7 MB/s 1m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 30% ▕█████ ▏ 336 MB/1.1 GB 6.7 MB/s 1m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 30% ▕█████ ▏ 336 MB/1.1 GB 6.7 MB/s 1m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 30% ▕█████ ▏ 337 MB/1.1 GB 6.7 MB/s 1m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 30% ▕█████ ▏ 338 MB/1.1 GB 6.7 MB/s 1m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 30% ▕█████ ▏ 339 MB/1.1 GB 6.7 MB/s 1m56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 30% ▕█████ ▏ 340 MB/1.1 GB 6.8 MB/s 1m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 31% ▕█████ ▏ 341 MB/1.1 GB 6.8 MB/s 1m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 31% ▕█████ ▏ 341 MB/1.1 GB 6.8 MB/s 1m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 31% ▕█████ ▏ 342 MB/1.1 GB 6.8 MB/s 1m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 31% ▕█████ ▏ 343 MB/1.1 GB 6.8 MB/s 1m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 31% ▕█████ ▏ 343 MB/1.1 GB 6.8 MB/s 1m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 31% ▕█████ ▏ 344 MB/1.1 GB 6.8 MB/s 1m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 31% ▕█████ ▏ 345 MB/1.1 GB 6.8 MB/s 1m54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 31% ▕█████ ▏ 346 MB/1.1 GB 6.8 MB/s 1m53s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 31% ▕█████ ▏ 346 MB/1.1 GB 6.8 MB/s 1m53s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 31% ▕█████ ▏ 347 MB/1.1 GB 6.9 MB/s 1m51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 31% ▕█████ ▏ 348 MB/1.1 GB 6.9 MB/s 1m51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 31% ▕█████ ▏ 349 MB/1.1 GB 6.9 MB/s 1m51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 31% ▕█████ ▏ 349 MB/1.1 GB 6.9 MB/s 1m51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 31% ▕█████ ▏ 350 MB/1.1 GB 6.9 MB/s 1m51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 31% ▕█████ ▏ 351 MB/1.1 GB 6.9 MB/s 1m50s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 31% ▕█████ ▏ 351 MB/1.1 GB 6.9 MB/s 1m50s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 32% ▕█████ ▏ 352 MB/1.1 GB 6.9 MB/s 1m50s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 32% ▕█████ ▏ 352 MB/1.1 GB 6.9 MB/s 1m50s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 32% ▕█████ ▏ 353 MB/1.1 GB 6.9 MB/s 1m50s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 32% ▕█████ ▏ 354 MB/1.1 GB 7.0 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 32% ▕█████ ▏ 355 MB/1.1 GB 7.0 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 32% ▕█████ ▏ 356 MB/1.1 GB 7.0 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 32% ▕█████ ▏ 356 MB/1.1 GB 7.0 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 32% ▕█████ ▏ 357 MB/1.1 GB 7.0 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 32% ▕█████ ▏ 357 MB/1.1 GB 7.0 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 32% ▕█████ ▏ 358 MB/1.1 GB 7.0 MB/s 1m48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 32% ▕█████ ▏ 359 MB/1.1 GB 7.0 MB/s 1m48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 32% ▕█████ ▏ 359 MB/1.1 GB 7.0 MB/s 1m48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 32% ▕█████ ▏ 359 MB/1.1 GB 7.0 MB/s 1m48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 32% ▕█████ ▏ 360 MB/1.1 GB 6.9 MB/s 1m50s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 32% ▕█████ ▏ 361 MB/1.1 GB 6.9 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 32% ▕█████ ▏ 361 MB/1.1 GB 6.9 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 32% ▕█████ ▏ 362 MB/1.1 GB 6.9 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 33% ▕█████ ▏ 363 MB/1.1 GB 6.9 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 33% ▕█████ ▏ 363 MB/1.1 GB 6.9 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 33% ▕█████ ▏ 364 MB/1.1 GB 6.9 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 33% ▕█████ ▏ 366 MB/1.1 GB 6.9 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 33% ▕█████ ▏ 366 MB/1.1 GB 6.9 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 33% ▕█████ ▏ 366 MB/1.1 GB 6.9 MB/s 1m49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 33% ▕█████ ▏ 368 MB/1.1 GB 7.0 MB/s 1m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 33% ▕█████ ▏ 368 MB/1.1 GB 7.0 MB/s 1m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 33% ▕█████ ▏ 369 MB/1.1 GB 7.0 MB/s 1m46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 33% ▕█████ ▏ 370 MB/1.1 GB 7.0 MB/s 1m45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 33% ▕█████ ▏ 371 MB/1.1 GB 7.0 MB/s 1m45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 33% ▕█████ ▏ 372 MB/1.1 GB 7.0 MB/s 1m45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 33% ▕██████ ▏ 372 MB/1.1 GB 7.0 MB/s 1m45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 33% ▕██████ ▏ 373 MB/1.1 GB 7.0 MB/s 1m45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 34% ▕██████ ▏ 374 MB/1.1 GB 7.0 MB/s 1m45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 34% ▕██████ ▏ 375 MB/1.1 GB 7.0 MB/s 1m45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 34% ▕██████ ▏ 376 MB/1.1 GB 7.0 MB/s 1m45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 34% ▕██████ ▏ 376 MB/1.1 GB 7.2 MB/s 1m42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 34% ▕██████ ▏ 377 MB/1.1 GB 7.2 MB/s 1m42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 34% ▕██████ ▏ 378 MB/1.1 GB 7.2 MB/s 1m42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 34% ▕██████ ▏ 378 MB/1.1 GB 7.2 MB/s 1m42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 34% ▕██████ ▏ 380 MB/1.1 GB 7.2 MB/s 1m42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 34% ▕██████ ▏ 380 MB/1.1 GB 7.2 MB/s 1m42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 34% ▕██████ ▏ 381 MB/1.1 GB 7.2 MB/s 1m42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 34% ▕██████ ▏ 381 MB/1.1 GB 7.2 MB/s 1m42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 34% ▕██████ ▏ 381 MB/1.1 GB 7.2 MB/s 1m42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 34% ▕██████ ▏ 382 MB/1.1 GB 7.2 MB/s 1m42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 34% ▕██████ ▏ 383 MB/1.1 GB 7.4 MB/s 1m39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 34% ▕██████ ▏ 384 MB/1.1 GB 7.4 MB/s 1m39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 35% ▕██████ ▏ 385 MB/1.1 GB 7.4 MB/s 1m39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 35% ▕██████ ▏ 386 MB/1.1 GB 7.4 MB/s 1m39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 35% ▕██████ ▏ 386 MB/1.1 GB 7.4 MB/s 1m39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 35% ▕██████ ▏ 387 MB/1.1 GB 7.4 MB/s 1m39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 35% ▕██████ ▏ 388 MB/1.1 GB 7.4 MB/s 1m39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 35% ▕██████ ▏ 388 MB/1.1 GB 7.4 MB/s 1m39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 35% ▕██████ ▏ 390 MB/1.1 GB 7.4 MB/s 1m38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 35% ▕██████ ▏ 391 MB/1.1 GB 7.4 MB/s 1m38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 35% ▕██████ ▏ 391 MB/1.1 GB 7.4 MB/s 1m38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 35% ▕██████ ▏ 392 MB/1.1 GB 7.4 MB/s 1m38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 35% ▕██████ ▏ 393 MB/1.1 GB 7.4 MB/s 1m38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 35% ▕██████ ▏ 394 MB/1.1 GB 7.4 MB/s 1m38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 35% ▕██████ ▏ 394 MB/1.1 GB 7.4 MB/s 1m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 35% ▕██████ ▏ 394 MB/1.1 GB 7.4 MB/s 1m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 35% ▕██████ ▏ 394 MB/1.1 GB 7.4 MB/s 1m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 35% ▕██████ ▏ 396 MB/1.1 GB 7.4 MB/s 1m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 36% ▕██████ ▏ 397 MB/1.1 GB 7.4 MB/s 1m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 36% ▕██████ ▏ 397 MB/1.1 GB 7.4 MB/s 1m37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 36% ▕██████ ▏ 398 MB/1.1 GB 7.4 MB/s 1m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 36% ▕██████ ▏ 399 MB/1.1 GB 7.4 MB/s 1m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 36% ▕██████ ▏ 399 MB/1.1 GB 7.4 MB/s 1m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 36% ▕██████ ▏ 401 MB/1.1 GB 7.4 MB/s 1m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 36% ▕██████ ▏ 401 MB/1.1 GB 7.4 MB/s 1m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 36% ▕██████ ▏ 402 MB/1.1 GB 7.4 MB/s 1m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 36% ▕██████ ▏ 403 MB/1.1 GB 7.4 MB/s 1m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 36% ▕██████ ▏ 404 MB/1.1 GB 7.4 MB/s 1m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 36% ▕██████ ▏ 405 MB/1.1 GB 7.4 MB/s 1m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 36% ▕██████ ▏ 405 MB/1.1 GB 7.4 MB/s 1m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 36% ▕██████ ▏ 406 MB/1.1 GB 7.4 MB/s 1m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 36% ▕██████ ▏ 406 MB/1.1 GB 7.4 MB/s 1m36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 37% ▕██████ ▏ 408 MB/1.1 GB 7.4 MB/s 1m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 37% ▕██████ ▏ 408 MB/1.1 GB 7.4 MB/s 1m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 37% ▕██████ ▏ 409 MB/1.1 GB 7.4 MB/s 1m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 37% ▕██████ ▏ 410 MB/1.1 GB 7.4 MB/s 1m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 37% ▕██████ ▏ 410 MB/1.1 GB 7.4 MB/s 1m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 37% ▕██████ ▏ 411 MB/1.1 GB 7.4 MB/s 1m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 37% ▕██████ ▏ 412 MB/1.1 GB 7.4 MB/s 1m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 37% ▕██████ ▏ 413 MB/1.1 GB 7.4 MB/s 1m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 37% ▕██████ ▏ 413 MB/1.1 GB 7.4 MB/s 1m35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 37% ▕██████ ▏ 414 MB/1.1 GB 7.5 MB/s 1m34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 37% ▕██████ ▏ 414 MB/1.1 GB 7.5 MB/s 1m34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 37% ▕██████ ▏ 416 MB/1.1 GB 7.5 MB/s 1m33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 37% ▕██████ ▏ 416 MB/1.1 GB 7.5 MB/s 1m33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 37% ▕██████ ▏ 417 MB/1.1 GB 7.5 MB/s 1m33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 37% ▕██████ ▏ 418 MB/1.1 GB 7.5 MB/s 1m33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 37% ▕██████ ▏ 418 MB/1.1 GB 7.5 MB/s 1m33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 38% ▕██████ ▏ 420 MB/1.1 GB 7.5 MB/s 1m33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 38% ▕██████ ▏ 420 MB/1.1 GB 7.5 MB/s 1m33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 38% ▕██████ ▏ 421 MB/1.1 GB 7.5 MB/s 1m33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 38% ▕██████ ▏ 422 MB/1.1 GB 7.5 MB/s 1m32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 38% ▕██████ ▏ 422 MB/1.1 GB 7.5 MB/s 1m32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 38% ▕██████ ▏ 423 MB/1.1 GB 7.5 MB/s 1m32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 38% ▕██████ ▏ 424 MB/1.1 GB 7.5 MB/s 1m32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 38% ▕██████ ▏ 424 MB/1.1 GB 7.5 MB/s 1m32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 38% ▕██████ ▏ 425 MB/1.1 GB 7.5 MB/s 1m31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 38% ▕██████ ▏ 426 MB/1.1 GB 7.5 MB/s 1m31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 38% ▕██████ ▏ 426 MB/1.1 GB 7.5 MB/s 1m31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 38% ▕██████ ▏ 427 MB/1.1 GB 7.5 MB/s 1m31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 38% ▕██████ ▏ 428 MB/1.1 GB 7.5 MB/s 1m31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 38% ▕██████ ▏ 428 MB/1.1 GB 7.6 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 38% ▕██████ ▏ 429 MB/1.1 GB 7.6 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 39% ▕██████ ▏ 430 MB/1.1 GB 7.6 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 39% ▕██████ ▏ 430 MB/1.1 GB 7.6 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 39% ▕██████ ▏ 431 MB/1.1 GB 7.6 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 39% ▕██████ ▏ 432 MB/1.1 GB 7.6 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 39% ▕██████ ▏ 432 MB/1.1 GB 7.6 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 39% ▕██████ ▏ 433 MB/1.1 GB 7.6 MB/s 1m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 39% ▕███████ ▏ 434 MB/1.1 GB 7.6 MB/s 1m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 39% ▕███████ ▏ 435 MB/1.1 GB 7.6 MB/s 1m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 39% ▕███████ ▏ 436 MB/1.1 GB 7.6 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 39% ▕███████ ▏ 436 MB/1.1 GB 7.6 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 39% ▕███████ ▏ 437 MB/1.1 GB 7.6 MB/s 1m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 39% ▕███████ ▏ 438 MB/1.1 GB 7.6 MB/s 1m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 39% ▕███████ ▏ 439 MB/1.1 GB 7.6 MB/s 1m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 39% ▕███████ ▏ 439 MB/1.1 GB 7.6 MB/s 1m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 39% ▕███████ ▏ 440 MB/1.1 GB 7.6 MB/s 1m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 39% ▕███████ ▏ 441 MB/1.1 GB 7.6 MB/s 1m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 40% ▕███████ ▏ 441 MB/1.1 GB 7.6 MB/s 1m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 40% ▕███████ ▏ 442 MB/1.1 GB 7.6 MB/s 1m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 40% ▕███████ ▏ 443 MB/1.1 GB 7.4 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 40% ▕███████ ▏ 443 MB/1.1 GB 7.4 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 40% ▕███████ ▏ 444 MB/1.1 GB 7.4 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 40% ▕███████ ▏ 445 MB/1.1 GB 7.4 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 40% ▕███████ ▏ 446 MB/1.1 GB 7.4 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 40% ▕███████ ▏ 447 MB/1.1 GB 7.4 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 40% ▕███████ ▏ 447 MB/1.1 GB 7.4 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 40% ▕███████ ▏ 447 MB/1.1 GB 7.4 MB/s 1m30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 40% ▕███████ ▏ 449 MB/1.1 GB 7.4 MB/s 1m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 40% ▕███████ ▏ 450 MB/1.1 GB 7.4 MB/s 1m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 40% ▕███████ ▏ 450 MB/1.1 GB 7.4 MB/s 1m29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 40% ▕███████ ▏ 451 MB/1.1 GB 7.5 MB/s 1m28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 41% ▕███████ ▏ 452 MB/1.1 GB 7.5 MB/s 1m28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 41% ▕███████ ▏ 453 MB/1.1 GB 7.5 MB/s 1m28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 41% ▕███████ ▏ 454 MB/1.1 GB 7.5 MB/s 1m28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 41% ▕███████ ▏ 455 MB/1.1 GB 7.5 MB/s 1m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 41% ▕███████ ▏ 455 MB/1.1 GB 7.5 MB/s 1m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 41% ▕███████ ▏ 456 MB/1.1 GB 7.5 MB/s 1m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 41% ▕███████ ▏ 457 MB/1.1 GB 7.5 MB/s 1m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 41% ▕███████ ▏ 457 MB/1.1 GB 7.5 MB/s 1m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 41% ▕███████ ▏ 458 MB/1.1 GB 7.5 MB/s 1m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 41% ▕███████ ▏ 459 MB/1.1 GB 7.5 MB/s 1m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 41% ▕███████ ▏ 459 MB/1.1 GB 7.5 MB/s 1m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 41% ▕███████ ▏ 460 MB/1.1 GB 7.5 MB/s 1m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 41% ▕███████ ▏ 462 MB/1.1 GB 7.5 MB/s 1m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 41% ▕███████ ▏ 462 MB/1.1 GB 7.5 MB/s 1m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 41% ▕███████ ▏ 463 MB/1.1 GB 7.5 MB/s 1m27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 42% ▕███████ ▏ 464 MB/1.1 GB 7.5 MB/s 1m26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 42% ▕███████ ▏ 464 MB/1.1 GB 7.5 MB/s 1m26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 42% ▕███████ ▏ 465 MB/1.1 GB 7.5 MB/s 1m26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 42% ▕███████ ▏ 466 MB/1.1 GB 7.5 MB/s 1m26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 42% ▕███████ ▏ 467 MB/1.1 GB 7.6 MB/s 1m25s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 42% ▕███████ ▏ 467 MB/1.1 GB 7.6 MB/s 1m25s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 42% ▕███████ ▏ 468 MB/1.1 GB 7.6 MB/s 1m25s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 42% ▕███████ ▏ 469 MB/1.1 GB 7.6 MB/s 1m25s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 42% ▕███████ ▏ 470 MB/1.1 GB 7.6 MB/s 1m24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 42% ▕███████ ▏ 471 MB/1.1 GB 7.6 MB/s 1m24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 42% ▕███████ ▏ 471 MB/1.1 GB 7.6 MB/s 1m24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 42% ▕███████ ▏ 472 MB/1.1 GB 7.6 MB/s 1m24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 42% ▕███████ ▏ 473 MB/1.1 GB 7.6 MB/s 1m24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 42% ▕███████ ▏ 473 MB/1.1 GB 7.6 MB/s 1m24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 43% ▕███████ ▏ 475 MB/1.1 GB 7.6 MB/s 1m24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 43% ▕███████ ▏ 475 MB/1.1 GB 7.6 MB/s 1m24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 43% ▕███████ ▏ 476 MB/1.1 GB 7.6 MB/s 1m24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 43% ▕███████ ▏ 477 MB/1.1 GB 7.6 MB/s 1m24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 43% ▕███████ ▏ 479 MB/1.1 GB 7.6 MB/s 1m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 43% ▕███████ ▏ 479 MB/1.1 GB 7.6 MB/s 1m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 43% ▕███████ ▏ 480 MB/1.1 GB 7.6 MB/s 1m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 43% ▕███████ ▏ 480 MB/1.1 GB 7.6 MB/s 1m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 43% ▕███████ ▏ 481 MB/1.1 GB 7.6 MB/s 1m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 43% ▕███████ ▏ 482 MB/1.1 GB 7.6 MB/s 1m23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 43% ▕███████ ▏ 483 MB/1.1 GB 7.7 MB/s 1m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 43% ▕███████ ▏ 483 MB/1.1 GB 7.7 MB/s 1m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 43% ▕███████ ▏ 484 MB/1.1 GB 7.7 MB/s 1m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 43% ▕███████ ▏ 485 MB/1.1 GB 7.7 MB/s 1m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 44% ▕███████ ▏ 486 MB/1.1 GB 7.7 MB/s 1m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 44% ▕███████ ▏ 487 MB/1.1 GB 7.7 MB/s 1m22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 44% ▕███████ ▏ 488 MB/1.1 GB 7.7 MB/s 1m21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 44% ▕███████ ▏ 488 MB/1.1 GB 7.7 MB/s 1m21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 44% ▕███████ ▏ 490 MB/1.1 GB 7.7 MB/s 1m21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 44% ▕███████ ▏ 491 MB/1.1 GB 7.7 MB/s 1m21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 44% ▕███████ ▏ 491 MB/1.1 GB 7.7 MB/s 1m21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 44% ▕███████ ▏ 492 MB/1.1 GB 7.8 MB/s 1m20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 44% ▕███████ ▏ 492 MB/1.1 GB 7.8 MB/s 1m20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 44% ▕███████ ▏ 494 MB/1.1 GB 7.8 MB/s 1m20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 44% ▕███████ ▏ 494 MB/1.1 GB 7.8 MB/s 1m20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 44% ▕███████ ▏ 495 MB/1.1 GB 7.8 MB/s 1m19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 44% ▕███████ ▏ 496 MB/1.1 GB 7.8 MB/s 1m19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 44% ▕████████ ▏ 496 MB/1.1 GB 7.8 MB/s 1m19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 45% ▕████████ ▏ 497 MB/1.1 GB 7.8 MB/s 1m19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 45% ▕████████ ▏ 498 MB/1.1 GB 7.8 MB/s 1m19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 45% ▕████████ ▏ 499 MB/1.1 GB 7.8 MB/s 1m19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 45% ▕████████ ▏ 500 MB/1.1 GB 7.9 MB/s 1m18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 45% ▕████████ ▏ 500 MB/1.1 GB 7.9 MB/s 1m18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 45% ▕████████ ▏ 501 MB/1.1 GB 7.9 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 45% ▕████████ ▏ 502 MB/1.1 GB 7.9 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 45% ▕████████ ▏ 503 MB/1.1 GB 7.9 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 45% ▕████████ ▏ 504 MB/1.1 GB 7.9 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 45% ▕████████ ▏ 504 MB/1.1 GB 7.9 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 45% ▕████████ ▏ 504 MB/1.1 GB 7.9 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 45% ▕████████ ▏ 505 MB/1.1 GB 7.9 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 45% ▕████████ ▏ 506 MB/1.1 GB 7.9 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 45% ▕████████ ▏ 506 MB/1.1 GB 7.8 MB/s 1m18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 45% ▕████████ ▏ 507 MB/1.1 GB 7.8 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 46% ▕████████ ▏ 508 MB/1.1 GB 7.8 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 46% ▕████████ ▏ 508 MB/1.1 GB 7.8 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 46% ▕████████ ▏ 509 MB/1.1 GB 7.8 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 46% ▕████████ ▏ 510 MB/1.1 GB 7.8 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 46% ▕████████ ▏ 511 MB/1.1 GB 7.8 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 46% ▕████████ ▏ 512 MB/1.1 GB 7.8 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 46% ▕████████ ▏ 513 MB/1.1 GB 7.8 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 46% ▕████████ ▏ 513 MB/1.1 GB 7.8 MB/s 1m17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 46% ▕████████ ▏ 514 MB/1.1 GB 8.0 MB/s 1m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 46% ▕████████ ▏ 515 MB/1.1 GB 8.0 MB/s 1m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 46% ▕████████ ▏ 516 MB/1.1 GB 8.0 MB/s 1m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 46% ▕████████ ▏ 516 MB/1.1 GB 8.0 MB/s 1m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 46% ▕████████ ▏ 518 MB/1.1 GB 8.0 MB/s 1m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 46% ▕████████ ▏ 518 MB/1.1 GB 8.0 MB/s 1m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 46% ▕████████ ▏ 519 MB/1.1 GB 8.0 MB/s 1m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 47% ▕████████ ▏ 520 MB/1.1 GB 8.0 MB/s 1m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 47% ▕████████ ▏ 521 MB/1.1 GB 8.0 MB/s 1m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 47% ▕████████ ▏ 521 MB/1.1 GB 8.0 MB/s 1m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 47% ▕████████ ▏ 522 MB/1.1 GB 7.9 MB/s 1m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 47% ▕████████ ▏ 522 MB/1.1 GB 7.9 MB/s 1m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 47% ▕████████ ▏ 523 MB/1.1 GB 7.9 MB/s 1m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 47% ▕████████ ▏ 524 MB/1.1 GB 7.9 MB/s 1m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 47% ▕████████ ▏ 524 MB/1.1 GB 7.9 MB/s 1m15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 47% ▕████████ ▏ 526 MB/1.1 GB 7.9 MB/s 1m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 47% ▕████████ ▏ 527 MB/1.1 GB 7.9 MB/s 1m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 47% ▕████████ ▏ 527 MB/1.1 GB 7.9 MB/s 1m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 47% ▕████████ ▏ 528 MB/1.1 GB 7.9 MB/s 1m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 47% ▕████████ ▏ 529 MB/1.1 GB 7.9 MB/s 1m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 47% ▕████████ ▏ 530 MB/1.1 GB 7.9 MB/s 1m14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 48% ▕████████ ▏ 531 MB/1.1 GB 8.0 MB/s 1m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 48% ▕████████ ▏ 532 MB/1.1 GB 8.0 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 48% ▕████████ ▏ 532 MB/1.1 GB 8.0 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 48% ▕████████ ▏ 533 MB/1.1 GB 8.0 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 48% ▕████████ ▏ 534 MB/1.1 GB 8.0 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 48% ▕████████ ▏ 534 MB/1.1 GB 8.0 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 48% ▕████████ ▏ 534 MB/1.1 GB 8.0 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 48% ▕████████ ▏ 536 MB/1.1 GB 8.0 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 48% ▕████████ ▏ 536 MB/1.1 GB 8.0 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 48% ▕████████ ▏ 536 MB/1.1 GB 8.0 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 48% ▕████████ ▏ 538 MB/1.1 GB 7.9 MB/s 1m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 48% ▕████████ ▏ 539 MB/1.1 GB 7.9 MB/s 1m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 48% ▕████████ ▏ 539 MB/1.1 GB 7.9 MB/s 1m13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 48% ▕████████ ▏ 540 MB/1.1 GB 7.9 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 48% ▕████████ ▏ 541 MB/1.1 GB 7.9 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 48% ▕████████ ▏ 541 MB/1.1 GB 7.9 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 49% ▕████████ ▏ 543 MB/1.1 GB 7.9 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 49% ▕████████ ▏ 543 MB/1.1 GB 7.9 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 49% ▕████████ ▏ 544 MB/1.1 GB 7.9 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 49% ▕████████ ▏ 545 MB/1.1 GB 7.9 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 49% ▕████████ ▏ 546 MB/1.1 GB 7.9 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 49% ▕████████ ▏ 547 MB/1.1 GB 7.9 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 49% ▕████████ ▏ 548 MB/1.1 GB 7.9 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 49% ▕████████ ▏ 548 MB/1.1 GB 7.9 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 49% ▕████████ ▏ 549 MB/1.1 GB 7.9 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 49% ▕████████ ▏ 550 MB/1.1 GB 7.9 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 49% ▕████████ ▏ 550 MB/1.1 GB 7.9 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 49% ▕████████ ▏ 551 MB/1.1 GB 7.9 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 49% ▕████████ ▏ 552 MB/1.1 GB 7.9 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 49% ▕████████ ▏ 552 MB/1.1 GB 7.9 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 50% ▕████████ ▏ 553 MB/1.1 GB 7.8 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 50% ▕████████ ▏ 555 MB/1.1 GB 7.8 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 50% ▕████████ ▏ 555 MB/1.1 GB 7.8 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 50% ▕████████ ▏ 556 MB/1.1 GB 7.8 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 50% ▕████████ ▏ 557 MB/1.1 GB 7.8 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 50% ▕████████ ▏ 557 MB/1.1 GB 7.8 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 50% ▕████████ ▏ 558 MB/1.1 GB 7.8 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 50% ▕█████████ ▏ 559 MB/1.1 GB 7.8 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 50% ▕█████████ ▏ 559 MB/1.1 GB 7.8 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 50% ▕█████████ ▏ 560 MB/1.1 GB 7.8 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 50% ▕█████████ ▏ 561 MB/1.1 GB 7.7 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 50% ▕█████████ ▏ 561 MB/1.1 GB 7.7 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 50% ▕█████████ ▏ 561 MB/1.1 GB 7.7 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 50% ▕█████████ ▏ 562 MB/1.1 GB 7.7 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 50% ▕█████████ ▏ 562 MB/1.1 GB 7.7 MB/s 1m12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 51% ▕█████████ ▏ 564 MB/1.1 GB 7.7 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 51% ▕█████████ ▏ 565 MB/1.1 GB 7.7 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 51% ▕█████████ ▏ 565 MB/1.1 GB 7.7 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 51% ▕█████████ ▏ 566 MB/1.1 GB 7.7 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 51% ▕█████████ ▏ 567 MB/1.1 GB 7.7 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 51% ▕█████████ ▏ 568 MB/1.1 GB 7.7 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 51% ▕█████████ ▏ 569 MB/1.1 GB 7.7 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 51% ▕█████████ ▏ 569 MB/1.1 GB 7.7 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 51% ▕█████████ ▏ 570 MB/1.1 GB 7.7 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 51% ▕█████████ ▏ 570 MB/1.1 GB 7.7 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 51% ▕█████████ ▏ 571 MB/1.1 GB 7.7 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 51% ▕█████████ ▏ 572 MB/1.1 GB 7.7 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 51% ▕█████████ ▏ 573 MB/1.1 GB 7.7 MB/s 1m11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 51% ▕█████████ ▏ 574 MB/1.1 GB 7.7 MB/s 1m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 51% ▕█████████ ▏ 574 MB/1.1 GB 7.7 MB/s 1m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 52% ▕█████████ ▏ 575 MB/1.1 GB 7.7 MB/s 1m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 52% ▕█████████ ▏ 576 MB/1.1 GB 7.7 MB/s 1m10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 52% ▕█████████ ▏ 577 MB/1.1 GB 7.7 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 52% ▕█████████ ▏ 578 MB/1.1 GB 7.7 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 52% ▕█████████ ▏ 578 MB/1.1 GB 7.7 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 52% ▕█████████ ▏ 579 MB/1.1 GB 7.7 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 52% ▕█████████ ▏ 581 MB/1.1 GB 7.7 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 52% ▕█████████ ▏ 582 MB/1.1 GB 7.7 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 52% ▕█████████ ▏ 582 MB/1.1 GB 7.7 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 52% ▕█████████ ▏ 582 MB/1.1 GB 7.7 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 52% ▕█████████ ▏ 584 MB/1.1 GB 7.7 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 52% ▕█████████ ▏ 584 MB/1.1 GB 7.7 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 52% ▕█████████ ▏ 585 MB/1.1 GB 7.7 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 52% ▕█████████ ▏ 585 MB/1.1 GB 7.7 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 52% ▕█████████ ▏ 585 MB/1.1 GB 7.7 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 52% ▕█████████ ▏ 586 MB/1.1 GB 7.7 MB/s 1m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 53% ▕█████████ ▏ 587 MB/1.1 GB 7.7 MB/s 1m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 53% ▕█████████ ▏ 587 MB/1.1 GB 7.7 MB/s 1m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 53% ▕█████████ ▏ 588 MB/1.1 GB 7.7 MB/s 1m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 53% ▕█████████ ▏ 589 MB/1.1 GB 7.7 MB/s 1m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 53% ▕█████████ ▏ 589 MB/1.1 GB 7.7 MB/s 1m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 53% ▕█████████ ▏ 590 MB/1.1 GB 7.5 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 53% ▕█████████ ▏ 590 MB/1.1 GB 7.5 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 53% ▕█████████ ▏ 592 MB/1.1 GB 7.5 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 53% ▕█████████ ▏ 593 MB/1.1 GB 7.5 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 53% ▕█████████ ▏ 594 MB/1.1 GB 7.5 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 53% ▕█████████ ▏ 594 MB/1.1 GB 7.5 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 53% ▕█████████ ▏ 595 MB/1.1 GB 7.5 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 53% ▕█████████ ▏ 596 MB/1.1 GB 7.5 MB/s 1m9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 53% ▕█████████ ▏ 597 MB/1.1 GB 7.5 MB/s 1m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 54% ▕█████████ ▏ 598 MB/1.1 GB 7.5 MB/s 1m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 54% ▕█████████ ▏ 599 MB/1.1 GB 7.6 MB/s 1m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 54% ▕█████████ ▏ 599 MB/1.1 GB 7.6 MB/s 1m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 54% ▕█████████ ▏ 600 MB/1.1 GB 7.6 MB/s 1m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 54% ▕█████████ ▏ 600 MB/1.1 GB 7.6 MB/s 1m8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 54% ▕█████████ ▏ 601 MB/1.1 GB 7.6 MB/s 1m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 54% ▕█████████ ▏ 602 MB/1.1 GB 7.6 MB/s 1m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 54% ▕█████████ ▏ 603 MB/1.1 GB 7.6 MB/s 1m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 54% ▕█████████ ▏ 604 MB/1.1 GB 7.6 MB/s 1m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 54% ▕█████████ ▏ 604 MB/1.1 GB 7.6 MB/s 1m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 54% ▕█████████ ▏ 605 MB/1.1 GB 7.6 MB/s 1m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 54% ▕█████████ ▏ 606 MB/1.1 GB 7.6 MB/s 1m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 54% ▕█████████ ▏ 607 MB/1.1 GB 7.6 MB/s 1m7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 54% ▕█████████ ▏ 608 MB/1.1 GB 7.6 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 54% ▕█████████ ▏ 608 MB/1.1 GB 7.6 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 55% ▕█████████ ▏ 609 MB/1.1 GB 7.6 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 55% ▕█████████ ▏ 609 MB/1.1 GB 7.6 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 55% ▕█████████ ▏ 610 MB/1.1 GB 7.6 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 55% ▕█████████ ▏ 610 MB/1.1 GB 7.6 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 55% ▕█████████ ▏ 611 MB/1.1 GB 7.6 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 55% ▕█████████ ▏ 612 MB/1.1 GB 7.6 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 55% ▕█████████ ▏ 613 MB/1.1 GB 7.6 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 55% ▕█████████ ▏ 614 MB/1.1 GB 7.5 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 55% ▕█████████ ▏ 614 MB/1.1 GB 7.5 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 55% ▕█████████ ▏ 615 MB/1.1 GB 7.5 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 55% ▕█████████ ▏ 616 MB/1.1 GB 7.5 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 55% ▕█████████ ▏ 617 MB/1.1 GB 7.5 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 55% ▕█████████ ▏ 618 MB/1.1 GB 7.5 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 55% ▕█████████ ▏ 618 MB/1.1 GB 7.5 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 55% ▕█████████ ▏ 618 MB/1.1 GB 7.5 MB/s 1m6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 56% ▕█████████ ▏ 620 MB/1.1 GB 7.5 MB/s 1m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 56% ▕██████████ ▏ 621 MB/1.1 GB 7.5 MB/s 1m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 56% ▕██████████ ▏ 621 MB/1.1 GB 7.5 MB/s 1m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 56% ▕██████████ ▏ 622 MB/1.1 GB 7.5 MB/s 1m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 56% ▕██████████ ▏ 623 MB/1.1 GB 7.5 MB/s 1m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 56% ▕██████████ ▏ 624 MB/1.1 GB 7.5 MB/s 1m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 56% ▕██████████ ▏ 625 MB/1.1 GB 7.5 MB/s 1m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 56% ▕██████████ ▏ 625 MB/1.1 GB 7.5 MB/s 1m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 56% ▕██████████ ▏ 625 MB/1.1 GB 7.5 MB/s 1m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 56% ▕██████████ ▏ 626 MB/1.1 GB 7.5 MB/s 1m5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 56% ▕██████████ ▏ 628 MB/1.1 GB 7.5 MB/s 1m4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 56% ▕██████████ ▏ 628 MB/1.1 GB 7.5 MB/s 1m4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 56% ▕██████████ ▏ 628 MB/1.1 GB 7.5 MB/s 1m4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 56% ▕██████████ ▏ 630 MB/1.1 GB 7.5 MB/s 1m4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 56% ▕██████████ ▏ 630 MB/1.1 GB 7.5 MB/s 1m4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 57% ▕██████████ ▏ 631 MB/1.1 GB 7.5 MB/s 1m4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 57% ▕██████████ ▏ 632 MB/1.1 GB 7.5 MB/s 1m4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 57% ▕██████████ ▏ 633 MB/1.1 GB 7.5 MB/s 1m4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 57% ▕██████████ ▏ 633 MB/1.1 GB 7.5 MB/s 1m4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 57% ▕██████████ ▏ 635 MB/1.1 GB 7.5 MB/s 1m3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 57% ▕██████████ ▏ 635 MB/1.1 GB 7.5 MB/s 1m3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 57% ▕██████████ ▏ 636 MB/1.1 GB 7.5 MB/s 1m3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 57% ▕██████████ ▏ 637 MB/1.1 GB 7.6 MB/s 1m3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 57% ▕██████████ ▏ 637 MB/1.1 GB 7.6 MB/s 1m2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 57% ▕██████████ ▏ 639 MB/1.1 GB 7.6 MB/s 1m2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 57% ▕██████████ ▏ 639 MB/1.1 GB 7.6 MB/s 1m2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 57% ▕██████████ ▏ 640 MB/1.1 GB 7.6 MB/s 1m2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 57% ▕██████████ ▏ 640 MB/1.1 GB 7.6 MB/s 1m2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 57% ▕██████████ ▏ 641 MB/1.1 GB 7.6 MB/s 1m2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 57% ▕██████████ ▏ 642 MB/1.1 GB 7.6 MB/s 1m2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 58% ▕██████████ ▏ 643 MB/1.1 GB 7.6 MB/s 1m2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 58% ▕██████████ ▏ 644 MB/1.1 GB 7.6 MB/s 1m2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 58% ▕██████████ ▏ 644 MB/1.1 GB 7.6 MB/s 1m2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 58% ▕██████████ ▏ 645 MB/1.1 GB 7.7 MB/s 1m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 58% ▕██████████ ▏ 646 MB/1.1 GB 7.7 MB/s 1m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 58% ▕██████████ ▏ 646 MB/1.1 GB 7.7 MB/s 1m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 58% ▕██████████ ▏ 648 MB/1.1 GB 7.7 MB/s 1m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 58% ▕██████████ ▏ 648 MB/1.1 GB 7.7 MB/s 1m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 58% ▕██████████ ▏ 648 MB/1.1 GB 7.7 MB/s 1m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 58% ▕██████████ ▏ 649 MB/1.1 GB 7.7 MB/s 1m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 58% ▕██████████ ▏ 650 MB/1.1 GB 7.7 MB/s 1m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 58% ▕██████████ ▏ 650 MB/1.1 GB 7.7 MB/s 1m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 58% ▕██████████ ▏ 651 MB/1.1 GB 7.7 MB/s 1m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 58% ▕██████████ ▏ 653 MB/1.1 GB 7.6 MB/s 1m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 58% ▕██████████ ▏ 653 MB/1.1 GB 7.6 MB/s 1m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 59% ▕██████████ ▏ 654 MB/1.1 GB 7.6 MB/s 1m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 59% ▕██████████ ▏ 655 MB/1.1 GB 7.6 MB/s 1m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 59% ▕██████████ ▏ 656 MB/1.1 GB 7.6 MB/s 1m1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 59% ▕██████████ ▏ 657 MB/1.1 GB 7.6 MB/s 1m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 59% ▕██████████ ▏ 657 MB/1.1 GB 7.6 MB/s 1m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 59% ▕██████████ ▏ 658 MB/1.1 GB 7.6 MB/s 1m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 59% ▕██████████ ▏ 659 MB/1.1 GB 7.6 MB/s 1m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 59% ▕██████████ ▏ 659 MB/1.1 GB 7.6 MB/s 1m0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 59% ▕██████████ ▏ 660 MB/1.1 GB 7.8 MB/s 58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 59% ▕██████████ ▏ 661 MB/1.1 GB 7.8 MB/s 58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 59% ▕██████████ ▏ 662 MB/1.1 GB 7.8 MB/s 58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 59% ▕██████████ ▏ 663 MB/1.1 GB 7.8 MB/s 57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 59% ▕██████████ ▏ 664 MB/1.1 GB 7.8 MB/s 57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 59% ▕██████████ ▏ 664 MB/1.1 GB 7.8 MB/s 57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 60% ▕██████████ ▏ 665 MB/1.1 GB 7.8 MB/s 57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 60% ▕██████████ ▏ 666 MB/1.1 GB 7.8 MB/s 57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 60% ▕██████████ ▏ 667 MB/1.1 GB 7.8 MB/s 57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 60% ▕██████████ ▏ 668 MB/1.1 GB 7.8 MB/s 57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 60% ▕██████████ ▏ 668 MB/1.1 GB 7.7 MB/s 58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 60% ▕██████████ ▏ 669 MB/1.1 GB 7.7 MB/s 58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 60% ▕██████████ ▏ 669 MB/1.1 GB 7.7 MB/s 58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 60% ▕██████████ ▏ 671 MB/1.1 GB 7.7 MB/s 58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 60% ▕██████████ ▏ 672 MB/1.1 GB 7.7 MB/s 58s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 60% ▕██████████ ▏ 672 MB/1.1 GB 7.7 MB/s 57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 60% ▕██████████ ▏ 673 MB/1.1 GB 7.7 MB/s 57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 60% ▕██████████ ▏ 674 MB/1.1 GB 7.7 MB/s 57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 60% ▕██████████ ▏ 674 MB/1.1 GB 7.7 MB/s 57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 60% ▕██████████ ▏ 675 MB/1.1 GB 7.7 MB/s 57s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 61% ▕██████████ ▏ 676 MB/1.1 GB 7.8 MB/s 56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 61% ▕██████████ ▏ 676 MB/1.1 GB 7.8 MB/s 56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 61% ▕██████████ ▏ 677 MB/1.1 GB 7.8 MB/s 56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 61% ▕██████████ ▏ 678 MB/1.1 GB 7.8 MB/s 56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 61% ▕██████████ ▏ 678 MB/1.1 GB 7.8 MB/s 56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 61% ▕██████████ ▏ 679 MB/1.1 GB 7.8 MB/s 56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 61% ▕██████████ ▏ 680 MB/1.1 GB 7.8 MB/s 56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 61% ▕██████████ ▏ 680 MB/1.1 GB 7.8 MB/s 56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 61% ▕██████████ ▏ 681 MB/1.1 GB 7.8 MB/s 56s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 61% ▕███████████ ▏ 683 MB/1.1 GB 7.8 MB/s 55s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 61% ▕███████████ ▏ 683 MB/1.1 GB 7.8 MB/s 55s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 61% ▕███████████ ▏ 684 MB/1.1 GB 7.8 MB/s 55s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 61% ▕███████████ ▏ 684 MB/1.1 GB 7.8 MB/s 55s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 61% ▕███████████ ▏ 684 MB/1.1 GB 7.8 MB/s 55s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 61% ▕███████████ ▏ 687 MB/1.1 GB 7.8 MB/s 55s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 62% ▕███████████ ▏ 688 MB/1.1 GB 7.8 MB/s 54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 62% ▕███████████ ▏ 688 MB/1.1 GB 7.8 MB/s 54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 62% ▕███████████ ▏ 689 MB/1.1 GB 7.8 MB/s 54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 62% ▕███████████ ▏ 690 MB/1.1 GB 7.8 MB/s 54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 62% ▕███████████ ▏ 691 MB/1.1 GB 7.8 MB/s 54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 62% ▕███████████ ▏ 692 MB/1.1 GB 7.8 MB/s 54s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 62% ▕███████████ ▏ 692 MB/1.1 GB 7.9 MB/s 53s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 62% ▕███████████ ▏ 693 MB/1.1 GB 7.9 MB/s 53s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 62% ▕███████████ ▏ 694 MB/1.1 GB 7.9 MB/s 53s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 62% ▕███████████ ▏ 695 MB/1.1 GB 7.9 MB/s 53s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 62% ▕███████████ ▏ 695 MB/1.1 GB 7.9 MB/s 53s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 62% ▕███████████ ▏ 695 MB/1.1 GB 7.9 MB/s 53s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 62% ▕███████████ ▏ 697 MB/1.1 GB 7.9 MB/s 53s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 62% ▕███████████ ▏ 697 MB/1.1 GB 7.9 MB/s 53s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 63% ▕███████████ ▏ 698 MB/1.1 GB 7.9 MB/s 53s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 63% ▕███████████ ▏ 700 MB/1.1 GB 7.9 MB/s 53s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 63% ▕███████████ ▏ 700 MB/1.1 GB 8.0 MB/s 52s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 63% ▕███████████ ▏ 701 MB/1.1 GB 8.0 MB/s 52s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 63% ▕███████████ ▏ 702 MB/1.1 GB 8.0 MB/s 52s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 63% ▕███████████ ▏ 703 MB/1.1 GB 8.0 MB/s 52s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 63% ▕███████████ ▏ 703 MB/1.1 GB 8.0 MB/s 52s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 63% ▕███████████ ▏ 705 MB/1.1 GB 8.0 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 63% ▕███████████ ▏ 705 MB/1.1 GB 8.0 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 63% ▕███████████ ▏ 706 MB/1.1 GB 8.0 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 63% ▕███████████ ▏ 706 MB/1.1 GB 8.0 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 63% ▕███████████ ▏ 707 MB/1.1 GB 8.0 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 63% ▕███████████ ▏ 708 MB/1.1 GB 7.9 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 63% ▕███████████ ▏ 708 MB/1.1 GB 7.9 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 64% ▕███████████ ▏ 709 MB/1.1 GB 7.9 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 64% ▕███████████ ▏ 710 MB/1.1 GB 7.9 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 64% ▕███████████ ▏ 711 MB/1.1 GB 7.9 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 64% ▕███████████ ▏ 712 MB/1.1 GB 7.9 MB/s 50s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 64% ▕███████████ ▏ 712 MB/1.1 GB 7.9 MB/s 50s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 64% ▕███████████ ▏ 713 MB/1.1 GB 7.9 MB/s 50s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 64% ▕███████████ ▏ 713 MB/1.1 GB 7.9 MB/s 50s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 64% ▕███████████ ▏ 714 MB/1.1 GB 7.9 MB/s 50s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 64% ▕███████████ ▏ 715 MB/1.1 GB 7.7 MB/s 52s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 64% ▕███████████ ▏ 715 MB/1.1 GB 7.7 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 64% ▕███████████ ▏ 716 MB/1.1 GB 7.7 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 64% ▕███████████ ▏ 718 MB/1.1 GB 7.7 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 64% ▕███████████ ▏ 718 MB/1.1 GB 7.7 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 64% ▕███████████ ▏ 718 MB/1.1 GB 7.7 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 64% ▕███████████ ▏ 719 MB/1.1 GB 7.7 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 64% ▕███████████ ▏ 720 MB/1.1 GB 7.7 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 65% ▕███████████ ▏ 721 MB/1.1 GB 7.7 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 65% ▕███████████ ▏ 722 MB/1.1 GB 7.7 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 65% ▕███████████ ▏ 722 MB/1.1 GB 7.7 MB/s 51s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 65% ▕███████████ ▏ 724 MB/1.1 GB 7.9 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 65% ▕███████████ ▏ 725 MB/1.1 GB 7.9 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 65% ▕███████████ ▏ 725 MB/1.1 GB 7.9 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 65% ▕███████████ ▏ 725 MB/1.1 GB 7.9 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 65% ▕███████████ ▏ 726 MB/1.1 GB 7.9 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 65% ▕███████████ ▏ 726 MB/1.1 GB 7.9 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 65% ▕███████████ ▏ 727 MB/1.1 GB 7.9 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 65% ▕███████████ ▏ 728 MB/1.1 GB 7.9 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 65% ▕███████████ ▏ 729 MB/1.1 GB 7.9 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 65% ▕███████████ ▏ 730 MB/1.1 GB 7.9 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 65% ▕███████████ ▏ 730 MB/1.1 GB 7.8 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 65% ▕███████████ ▏ 731 MB/1.1 GB 7.8 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 66% ▕███████████ ▏ 732 MB/1.1 GB 7.8 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 66% ▕███████████ ▏ 733 MB/1.1 GB 7.8 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 66% ▕███████████ ▏ 734 MB/1.1 GB 7.8 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 66% ▕███████████ ▏ 734 MB/1.1 GB 7.8 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 66% ▕███████████ ▏ 735 MB/1.1 GB 7.8 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 66% ▕███████████ ▏ 736 MB/1.1 GB 7.8 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 66% ▕███████████ ▏ 736 MB/1.1 GB 7.8 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 66% ▕███████████ ▏ 737 MB/1.1 GB 7.8 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 66% ▕███████████ ▏ 737 MB/1.1 GB 7.7 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 66% ▕███████████ ▏ 738 MB/1.1 GB 7.7 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 66% ▕███████████ ▏ 739 MB/1.1 GB 7.7 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 66% ▕███████████ ▏ 739 MB/1.1 GB 7.7 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 66% ▕███████████ ▏ 740 MB/1.1 GB 7.7 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 66% ▕███████████ ▏ 741 MB/1.1 GB 7.7 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 66% ▕███████████ ▏ 741 MB/1.1 GB 7.7 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 66% ▕███████████ ▏ 742 MB/1.1 GB 7.7 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 67% ▕███████████ ▏ 743 MB/1.1 GB 7.7 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 67% ▕███████████ ▏ 743 MB/1.1 GB 7.7 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 67% ▕███████████ ▏ 743 MB/1.1 GB 7.4 MB/s 50s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 67% ▕████████████ ▏ 745 MB/1.1 GB 7.4 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 67% ▕████████████ ▏ 745 MB/1.1 GB 7.4 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 67% ▕████████████ ▏ 746 MB/1.1 GB 7.4 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 67% ▕████████████ ▏ 747 MB/1.1 GB 7.4 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 67% ▕████████████ ▏ 747 MB/1.1 GB 7.4 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 67% ▕████████████ ▏ 748 MB/1.1 GB 7.4 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 67% ▕████████████ ▏ 749 MB/1.1 GB 7.4 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 67% ▕████████████ ▏ 750 MB/1.1 GB 7.4 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 67% ▕████████████ ▏ 750 MB/1.1 GB 7.4 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 67% ▕████████████ ▏ 751 MB/1.1 GB 7.4 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 67% ▕████████████ ▏ 751 MB/1.1 GB 7.4 MB/s 49s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 67% ▕████████████ ▏ 753 MB/1.1 GB 7.4 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 67% ▕████████████ ▏ 754 MB/1.1 GB 7.4 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 68% ▕████████████ ▏ 754 MB/1.1 GB 7.4 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 68% ▕████████████ ▏ 754 MB/1.1 GB 7.4 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 68% ▕████████████ ▏ 755 MB/1.1 GB 7.4 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 68% ▕████████████ ▏ 756 MB/1.1 GB 7.4 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 68% ▕████████████ ▏ 756 MB/1.1 GB 7.4 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 68% ▕████████████ ▏ 757 MB/1.1 GB 7.4 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 68% ▕████████████ ▏ 758 MB/1.1 GB 7.4 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 68% ▕████████████ ▏ 759 MB/1.1 GB 7.4 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 68% ▕████████████ ▏ 759 MB/1.1 GB 7.4 MB/s 48s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 68% ▕████████████ ▏ 761 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 68% ▕████████████ ▏ 761 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 68% ▕████████████ ▏ 762 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 68% ▕████████████ ▏ 763 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 68% ▕████████████ ▏ 764 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 68% ▕████████████ ▏ 765 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 69% ▕████████████ ▏ 765 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 69% ▕████████████ ▏ 766 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 69% ▕████████████ ▏ 767 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 69% ▕████████████ ▏ 768 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 69% ▕████████████ ▏ 769 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 69% ▕████████████ ▏ 769 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 69% ▕████████████ ▏ 770 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 69% ▕████████████ ▏ 771 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 69% ▕████████████ ▏ 771 MB/1.1 GB 7.4 MB/s 47s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 69% ▕████████████ ▏ 772 MB/1.1 GB 7.4 MB/s 46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 69% ▕████████████ ▏ 773 MB/1.1 GB 7.4 MB/s 46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 69% ▕████████████ ▏ 774 MB/1.1 GB 7.4 MB/s 46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 69% ▕████████████ ▏ 775 MB/1.1 GB 7.4 MB/s 46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 69% ▕████████████ ▏ 775 MB/1.1 GB 7.4 MB/s 46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 70% ▕████████████ ▏ 777 MB/1.1 GB 7.4 MB/s 46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 70% ▕████████████ ▏ 777 MB/1.1 GB 7.4 MB/s 46s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 70% ▕████████████ ▏ 777 MB/1.1 GB 7.4 MB/s 45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 70% ▕████████████ ▏ 778 MB/1.1 GB 7.4 MB/s 45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 70% ▕████████████ ▏ 778 MB/1.1 GB 7.4 MB/s 45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 70% ▕████████████ ▏ 779 MB/1.1 GB 7.4 MB/s 45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 70% ▕████████████ ▏ 780 MB/1.1 GB 7.4 MB/s 45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 70% ▕████████████ ▏ 781 MB/1.1 GB 7.4 MB/s 45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 70% ▕████████████ ▏ 781 MB/1.1 GB 7.4 MB/s 45s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 70% ▕████████████ ▏ 783 MB/1.1 GB 7.4 MB/s 44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 70% ▕████████████ ▏ 783 MB/1.1 GB 7.4 MB/s 44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 70% ▕████████████ ▏ 784 MB/1.1 GB 7.4 MB/s 44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 70% ▕████████████ ▏ 785 MB/1.1 GB 7.4 MB/s 44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 70% ▕████████████ ▏ 786 MB/1.1 GB 7.4 MB/s 44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 70% ▕████████████ ▏ 787 MB/1.1 GB 7.4 MB/s 44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 71% ▕████████████ ▏ 787 MB/1.1 GB 7.4 MB/s 44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 71% ▕████████████ ▏ 788 MB/1.1 GB 7.4 MB/s 44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 71% ▕████████████ ▏ 789 MB/1.1 GB 7.4 MB/s 44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 71% ▕████████████ ▏ 790 MB/1.1 GB 7.4 MB/s 44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 71% ▕████████████ ▏ 790 MB/1.1 GB 7.4 MB/s 44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 71% ▕████████████ ▏ 791 MB/1.1 GB 7.4 MB/s 44s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 71% ▕████████████ ▏ 792 MB/1.1 GB 7.4 MB/s 43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 71% ▕████████████ ▏ 792 MB/1.1 GB 7.4 MB/s 43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 71% ▕████████████ ▏ 793 MB/1.1 GB 7.4 MB/s 43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 71% ▕████████████ ▏ 794 MB/1.1 GB 7.4 MB/s 43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 71% ▕████████████ ▏ 794 MB/1.1 GB 7.4 MB/s 43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 71% ▕████████████ ▏ 796 MB/1.1 GB 7.4 MB/s 43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 71% ▕████████████ ▏ 796 MB/1.1 GB 7.4 MB/s 43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 71% ▕████████████ ▏ 797 MB/1.1 GB 7.4 MB/s 43s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 71% ▕████████████ ▏ 798 MB/1.1 GB 7.5 MB/s 42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 72% ▕████████████ ▏ 799 MB/1.1 GB 7.5 MB/s 42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 72% ▕████████████ ▏ 799 MB/1.1 GB 7.5 MB/s 42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 72% ▕████████████ ▏ 800 MB/1.1 GB 7.5 MB/s 42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 72% ▕████████████ ▏ 800 MB/1.1 GB 7.5 MB/s 42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 72% ▕████████████ ▏ 801 MB/1.1 GB 7.5 MB/s 42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 72% ▕████████████ ▏ 802 MB/1.1 GB 7.5 MB/s 42s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 72% ▕████████████ ▏ 803 MB/1.1 GB 7.5 MB/s 41s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 72% ▕████████████ ▏ 803 MB/1.1 GB 7.5 MB/s 41s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 72% ▕████████████ ▏ 805 MB/1.1 GB 7.5 MB/s 41s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 72% ▕████████████ ▏ 805 MB/1.1 GB 7.6 MB/s 41s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 72% ▕████████████ ▏ 806 MB/1.1 GB 7.6 MB/s 41s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 72% ▕█████████████ ▏ 807 MB/1.1 GB 7.6 MB/s 40s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 72% ▕█████████████ ▏ 807 MB/1.1 GB 7.6 MB/s 40s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 72% ▕█████████████ ▏ 808 MB/1.1 GB 7.6 MB/s 40s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 72% ▕█████████████ ▏ 809 MB/1.1 GB 7.6 MB/s 40s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 72% ▕█████████████ ▏ 809 MB/1.1 GB 7.6 MB/s 40s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 72% ▕█████████████ ▏ 809 MB/1.1 GB 7.6 MB/s 40s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 810 MB/1.1 GB 7.6 MB/s 40s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 811 MB/1.1 GB 7.6 MB/s 40s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 812 MB/1.1 GB 7.7 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 813 MB/1.1 GB 7.7 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 813 MB/1.1 GB 7.7 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 813 MB/1.1 GB 7.7 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 815 MB/1.1 GB 7.7 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 816 MB/1.1 GB 7.7 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 816 MB/1.1 GB 7.7 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 816 MB/1.1 GB 7.7 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 817 MB/1.1 GB 7.7 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 817 MB/1.1 GB 7.7 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 819 MB/1.1 GB 7.6 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 820 MB/1.1 GB 7.6 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 820 MB/1.1 GB 7.6 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 73% ▕█████████████ ▏ 821 MB/1.1 GB 7.6 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 821 MB/1.1 GB 7.6 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 821 MB/1.1 GB 7.6 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 822 MB/1.1 GB 7.6 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 823 MB/1.1 GB 7.6 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 823 MB/1.1 GB 7.6 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 824 MB/1.1 GB 7.6 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 826 MB/1.1 GB 7.4 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 826 MB/1.1 GB 7.4 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 827 MB/1.1 GB 7.4 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 827 MB/1.1 GB 7.4 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 828 MB/1.1 GB 7.4 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 829 MB/1.1 GB 7.4 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 830 MB/1.1 GB 7.4 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 830 MB/1.1 GB 7.4 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 830 MB/1.1 GB 7.4 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 831 MB/1.1 GB 7.4 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 831 MB/1.1 GB 7.4 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 74% ▕█████████████ ▏ 832 MB/1.1 GB 7.3 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 833 MB/1.1 GB 7.3 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 833 MB/1.1 GB 7.3 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 835 MB/1.1 GB 7.3 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 835 MB/1.1 GB 7.3 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 836 MB/1.1 GB 7.3 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 837 MB/1.1 GB 7.3 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 838 MB/1.1 GB 7.3 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 838 MB/1.1 GB 7.3 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 838 MB/1.1 GB 7.3 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 840 MB/1.1 GB 7.1 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 840 MB/1.1 GB 7.1 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 840 MB/1.1 GB 7.1 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 842 MB/1.1 GB 7.1 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 842 MB/1.1 GB 7.1 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 75% ▕█████████████ ▏ 843 MB/1.1 GB 7.1 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 843 MB/1.1 GB 7.1 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 843 MB/1.1 GB 7.1 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 844 MB/1.1 GB 7.1 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 844 MB/1.1 GB 7.1 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 845 MB/1.1 GB 7.0 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 847 MB/1.1 GB 7.0 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 847 MB/1.1 GB 7.0 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 848 MB/1.1 GB 7.0 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 849 MB/1.1 GB 7.0 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 849 MB/1.1 GB 7.0 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 850 MB/1.1 GB 7.0 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 851 MB/1.1 GB 7.0 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 852 MB/1.1 GB 7.0 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 853 MB/1.1 GB 7.0 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 76% ▕█████████████ ▏ 853 MB/1.1 GB 7.1 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 855 MB/1.1 GB 7.1 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 855 MB/1.1 GB 7.1 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 856 MB/1.1 GB 7.1 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 857 MB/1.1 GB 7.1 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 857 MB/1.1 GB 7.1 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 857 MB/1.1 GB 7.1 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 858 MB/1.1 GB 7.1 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 859 MB/1.1 GB 7.1 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 861 MB/1.1 GB 7.1 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 861 MB/1.1 GB 7.1 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 861 MB/1.1 GB 7.1 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 863 MB/1.1 GB 7.1 MB/s 35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 863 MB/1.1 GB 7.1 MB/s 35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 864 MB/1.1 GB 7.1 MB/s 35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 77% ▕█████████████ ▏ 865 MB/1.1 GB 7.1 MB/s 35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 78% ▕█████████████ ▏ 865 MB/1.1 GB 7.1 MB/s 35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 78% ▕█████████████ ▏ 865 MB/1.1 GB 7.1 MB/s 35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 78% ▕█████████████ ▏ 867 MB/1.1 GB 7.1 MB/s 35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 78% ▕█████████████ ▏ 868 MB/1.1 GB 7.1 MB/s 35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 78% ▕█████████████ ▏ 868 MB/1.1 GB 7.1 MB/s 35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 78% ▕█████████████ ▏ 868 MB/1.1 GB 7.0 MB/s 35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 78% ▕██████████████ ▏ 870 MB/1.1 GB 7.0 MB/s 35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 78% ▕██████████████ ▏ 870 MB/1.1 GB 7.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 78% ▕██████████████ ▏ 871 MB/1.1 GB 7.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 78% ▕██████████████ ▏ 872 MB/1.1 GB 7.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 78% ▕██████████████ ▏ 872 MB/1.1 GB 7.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 78% ▕██████████████ ▏ 873 MB/1.1 GB 7.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 78% ▕██████████████ ▏ 874 MB/1.1 GB 7.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 78% ▕██████████████ ▏ 875 MB/1.1 GB 7.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 78% ▕██████████████ ▏ 875 MB/1.1 GB 7.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 78% ▕██████████████ ▏ 876 MB/1.1 GB 7.1 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 78% ▕██████████████ ▏ 876 MB/1.1 GB 7.1 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 877 MB/1.1 GB 7.1 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 878 MB/1.1 GB 7.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 879 MB/1.1 GB 7.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 880 MB/1.1 GB 7.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 880 MB/1.1 GB 7.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 880 MB/1.1 GB 7.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 881 MB/1.1 GB 7.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 882 MB/1.1 GB 7.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 882 MB/1.1 GB 7.0 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 883 MB/1.1 GB 7.0 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 883 MB/1.1 GB 7.0 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 884 MB/1.1 GB 7.0 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 885 MB/1.1 GB 7.0 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 885 MB/1.1 GB 7.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 885 MB/1.1 GB 7.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 885 MB/1.1 GB 7.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 886 MB/1.1 GB 7.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 79% ▕██████████████ ▏ 887 MB/1.1 GB 7.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 888 MB/1.1 GB 7.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 889 MB/1.1 GB 7.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 889 MB/1.1 GB 7.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 890 MB/1.1 GB 7.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 891 MB/1.1 GB 7.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 891 MB/1.1 GB 7.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 892 MB/1.1 GB 7.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 893 MB/1.1 GB 7.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 893 MB/1.1 GB 7.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 894 MB/1.1 GB 7.0 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 895 MB/1.1 GB 7.1 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 895 MB/1.1 GB 7.1 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 896 MB/1.1 GB 7.1 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 897 MB/1.1 GB 7.1 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 897 MB/1.1 GB 7.1 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 80% ▕██████████████ ▏ 898 MB/1.1 GB 7.1 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 900 MB/1.1 GB 7.1 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 900 MB/1.1 GB 7.1 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 900 MB/1.1 GB 7.1 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 901 MB/1.1 GB 7.1 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 902 MB/1.1 GB 7.1 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 902 MB/1.1 GB 7.1 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 904 MB/1.1 GB 7.1 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 904 MB/1.1 GB 7.1 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 905 MB/1.1 GB 7.1 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 905 MB/1.1 GB 7.1 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 905 MB/1.1 GB 7.1 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 905 MB/1.1 GB 7.1 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 906 MB/1.1 GB 7.1 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 907 MB/1.1 GB 7.1 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 907 MB/1.1 GB 7.1 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 909 MB/1.1 GB 7.0 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 909 MB/1.1 GB 7.0 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 910 MB/1.1 GB 7.0 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 910 MB/1.1 GB 7.0 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 81% ▕██████████████ ▏ 910 MB/1.1 GB 7.0 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 911 MB/1.1 GB 7.0 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 911 MB/1.1 GB 7.0 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 912 MB/1.1 GB 7.0 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 912 MB/1.1 GB 7.0 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 913 MB/1.1 GB 7.0 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 913 MB/1.1 GB 6.7 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 914 MB/1.1 GB 6.7 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 914 MB/1.1 GB 6.7 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 914 MB/1.1 GB 6.7 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 914 MB/1.1 GB 6.7 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 915 MB/1.1 GB 6.7 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 915 MB/1.1 GB 6.7 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 915 MB/1.1 GB 6.7 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 916 MB/1.1 GB 6.7 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 916 MB/1.1 GB 6.7 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 917 MB/1.1 GB 6.2 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 918 MB/1.1 GB 6.2 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 918 MB/1.1 GB 6.2 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 919 MB/1.1 GB 6.2 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 920 MB/1.1 GB 6.2 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 920 MB/1.1 GB 6.2 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 920 MB/1.1 GB 6.2 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 921 MB/1.1 GB 6.2 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 82% ▕██████████████ ▏ 921 MB/1.1 GB 6.2 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 922 MB/1.1 GB 6.2 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 923 MB/1.1 GB 6.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 923 MB/1.1 GB 6.0 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 924 MB/1.1 GB 6.0 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 925 MB/1.1 GB 6.0 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 925 MB/1.1 GB 6.0 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 926 MB/1.1 GB 6.0 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 926 MB/1.1 GB 6.0 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 927 MB/1.1 GB 6.0 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 927 MB/1.1 GB 6.0 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 928 MB/1.1 GB 6.0 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 929 MB/1.1 GB 6.0 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 929 MB/1.1 GB 5.9 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 930 MB/1.1 GB 5.9 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 83% ▕██████████████ ▏ 930 MB/1.1 GB 5.9 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 83% ▕███████████████ ▏ 931 MB/1.1 GB 5.9 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 83% ▕███████████████ ▏ 931 MB/1.1 GB 5.9 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 83% ▕███████████████ ▏ 932 MB/1.1 GB 5.9 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 83% ▕███████████████ ▏ 932 MB/1.1 GB 5.9 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 83% ▕███████████████ ▏ 932 MB/1.1 GB 5.9 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 933 MB/1.1 GB 5.9 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 934 MB/1.1 GB 5.9 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 934 MB/1.1 GB 5.8 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 934 MB/1.1 GB 5.8 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 935 MB/1.1 GB 5.8 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 936 MB/1.1 GB 5.8 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 936 MB/1.1 GB 5.8 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 936 MB/1.1 GB 5.8 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 937 MB/1.1 GB 5.8 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 937 MB/1.1 GB 5.8 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 938 MB/1.1 GB 5.8 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 938 MB/1.1 GB 5.8 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 938 MB/1.1 GB 5.5 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 938 MB/1.1 GB 5.5 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 938 MB/1.1 GB 5.5 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 938 MB/1.1 GB 5.5 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 939 MB/1.1 GB 5.5 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 939 MB/1.1 GB 5.5 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 940 MB/1.1 GB 5.5 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 941 MB/1.1 GB 5.5 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 941 MB/1.1 GB 5.5 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 941 MB/1.1 GB 5.5 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 941 MB/1.1 GB 5.1 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 941 MB/1.1 GB 5.1 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 941 MB/1.1 GB 5.1 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 942 MB/1.1 GB 5.1 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 942 MB/1.1 GB 5.1 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 942 MB/1.1 GB 5.1 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 943 MB/1.1 GB 5.1 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 943 MB/1.1 GB 5.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 943 MB/1.1 GB 5.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 943 MB/1.1 GB 5.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 943 MB/1.1 GB 4.6 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 944 MB/1.1 GB 4.6 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 84% ▕███████████████ ▏ 944 MB/1.1 GB 4.6 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 944 MB/1.1 GB 4.6 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 945 MB/1.1 GB 4.6 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 945 MB/1.1 GB 4.6 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 946 MB/1.1 GB 4.6 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 946 MB/1.1 GB 4.6 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 947 MB/1.1 GB 4.6 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 947 MB/1.1 GB 4.6 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 947 MB/1.1 GB 4.6 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 948 MB/1.1 GB 4.4 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 949 MB/1.1 GB 4.4 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 949 MB/1.1 GB 4.4 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 950 MB/1.1 GB 4.4 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 950 MB/1.1 GB 4.4 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 950 MB/1.1 GB 4.4 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 950 MB/1.1 GB 4.4 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 950 MB/1.1 GB 4.4 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 951 MB/1.1 GB 4.4 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 951 MB/1.1 GB 4.4 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 952 MB/1.1 GB 4.2 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 952 MB/1.1 GB 4.2 MB/s 39s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 953 MB/1.1 GB 4.2 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 953 MB/1.1 GB 4.2 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 954 MB/1.1 GB 4.2 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 954 MB/1.1 GB 4.2 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 85% ▕███████████████ ▏ 955 MB/1.1 GB 4.2 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 955 MB/1.1 GB 4.2 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 955 MB/1.1 GB 4.2 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 956 MB/1.1 GB 4.2 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 956 MB/1.1 GB 4.3 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 956 MB/1.1 GB 4.3 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 957 MB/1.1 GB 4.3 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 957 MB/1.1 GB 4.3 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 958 MB/1.1 GB 4.3 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 958 MB/1.1 GB 4.3 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 959 MB/1.1 GB 4.3 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 959 MB/1.1 GB 4.3 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 960 MB/1.1 GB 4.3 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 960 MB/1.1 GB 4.3 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 960 MB/1.1 GB 4.2 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 961 MB/1.1 GB 4.2 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 961 MB/1.1 GB 4.2 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 962 MB/1.1 GB 4.2 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 962 MB/1.1 GB 4.2 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 962 MB/1.1 GB 4.2 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 963 MB/1.1 GB 4.2 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 963 MB/1.1 GB 4.2 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 963 MB/1.1 GB 4.2 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 964 MB/1.1 GB 4.2 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 964 MB/1.1 GB 4.0 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 965 MB/1.1 GB 4.0 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 965 MB/1.1 GB 4.0 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 965 MB/1.1 GB 4.0 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 86% ▕███████████████ ▏ 966 MB/1.1 GB 4.0 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 966 MB/1.1 GB 4.0 MB/s 38s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 967 MB/1.1 GB 4.0 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 967 MB/1.1 GB 4.0 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 968 MB/1.1 GB 4.0 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 968 MB/1.1 GB 4.0 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 969 MB/1.1 GB 4.0 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 969 MB/1.1 GB 3.9 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 970 MB/1.1 GB 3.9 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 970 MB/1.1 GB 3.9 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 971 MB/1.1 GB 3.9 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 971 MB/1.1 GB 3.9 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 972 MB/1.1 GB 3.9 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 972 MB/1.1 GB 3.9 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 973 MB/1.1 GB 3.9 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 973 MB/1.1 GB 3.9 MB/s 37s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 974 MB/1.1 GB 3.9 MB/s 36s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 974 MB/1.1 GB 4.0 MB/s 35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 975 MB/1.1 GB 4.0 MB/s 35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 975 MB/1.1 GB 4.0 MB/s 35s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 976 MB/1.1 GB 4.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 976 MB/1.1 GB 4.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 87% ▕███████████████ ▏ 977 MB/1.1 GB 4.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 977 MB/1.1 GB 4.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 978 MB/1.1 GB 4.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 978 MB/1.1 GB 4.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 978 MB/1.1 GB 4.0 MB/s 34s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 978 MB/1.1 GB 4.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 978 MB/1.1 GB 4.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 978 MB/1.1 GB 4.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 978 MB/1.1 GB 4.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 979 MB/1.1 GB 4.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 979 MB/1.1 GB 4.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 979 MB/1.1 GB 4.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 979 MB/1.1 GB 4.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 980 MB/1.1 GB 4.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 980 MB/1.1 GB 4.1 MB/s 33s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 981 MB/1.1 GB 4.2 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 981 MB/1.1 GB 4.2 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 982 MB/1.1 GB 4.2 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 982 MB/1.1 GB 4.2 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 983 MB/1.1 GB 4.2 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 983 MB/1.1 GB 4.2 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 984 MB/1.1 GB 4.2 MB/s 32s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 984 MB/1.1 GB 4.2 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 984 MB/1.1 GB 4.2 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 985 MB/1.1 GB 4.2 MB/s 31s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 986 MB/1.1 GB 4.3 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 986 MB/1.1 GB 4.3 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 986 MB/1.1 GB 4.3 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 987 MB/1.1 GB 4.3 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 987 MB/1.1 GB 4.3 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 88% ▕███████████████ ▏ 988 MB/1.1 GB 4.3 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 89% ▕███████████████ ▏ 988 MB/1.1 GB 4.3 MB/s 30s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 89% ▕███████████████ ▏ 989 MB/1.1 GB 4.3 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 89% ▕███████████████ ▏ 989 MB/1.1 GB 4.3 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 89% ▕███████████████ ▏ 990 MB/1.1 GB 4.3 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 89% ▕███████████████ ▏ 990 MB/1.1 GB 4.3 MB/s 29s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 89% ▕███████████████ ▏ 991 MB/1.1 GB 4.4 MB/s 28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 89% ▕███████████████ ▏ 991 MB/1.1 GB 4.4 MB/s 28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 89% ▕███████████████ ▏ 992 MB/1.1 GB 4.4 MB/s 28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 89% ▕███████████████ ▏ 992 MB/1.1 GB 4.4 MB/s 28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 993 MB/1.1 GB 4.4 MB/s 28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 993 MB/1.1 GB 4.4 MB/s 28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 994 MB/1.1 GB 4.4 MB/s 28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 994 MB/1.1 GB 4.4 MB/s 28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 995 MB/1.1 GB 4.4 MB/s 28s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 995 MB/1.1 GB 4.4 MB/s 27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 996 MB/1.1 GB 4.4 MB/s 27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 996 MB/1.1 GB 4.4 MB/s 27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 997 MB/1.1 GB 4.4 MB/s 27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 997 MB/1.1 GB 4.4 MB/s 27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 997 MB/1.1 GB 4.4 MB/s 27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 998 MB/1.1 GB 4.4 MB/s 27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 998 MB/1.1 GB 4.4 MB/s 27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 998 MB/1.1 GB 4.4 MB/s 27s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 89% ▕████████████████ ▏ 999 MB/1.1 GB 4.4 MB/s 26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 26s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 25s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 25s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 25s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 25s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 25s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 25s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 25s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 90% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 24s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 23s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 22s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 91% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 21s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.6 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.4 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 92% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.1 MB/s 20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.1 MB/s 20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.1 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.1 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.1 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.1 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.1 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.1 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.1 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.1 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.0 MB/s 20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.0 MB/s 20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.0 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.0 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.0 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.0 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.0 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.0 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.0 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 4.0 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.9 MB/s 20s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.9 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.9 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.9 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.9 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.9 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.9 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.9 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.9 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.9 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.8 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.8 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.8 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 93% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.8 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.8 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.8 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.8 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.8 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.8 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.8 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.6 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.6 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.6 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.6 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.6 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.6 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.0 GB/1.1 GB 3.5 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 19s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 94% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 18s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.2 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.2 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.2 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.2 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.2 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.2 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.2 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.2 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.2 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.2 MB/s 17s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 16s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 16s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 16s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 16s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 16s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 16s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 95% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 15s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 14s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 13s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.4 MB/s 12s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.4 MB/s 11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.4 MB/s 11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.4 MB/s 11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 96% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.4 MB/s 11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.4 MB/s 11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.4 MB/s 11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.4 MB/s 11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.4 MB/s 11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.4 MB/s 11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 11s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 10s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 9s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.3 MB/s 8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 97% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 8s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.5 MB/s 7s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.6 MB/s 6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.6 MB/s 6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.6 MB/s 6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.6 MB/s 6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.6 MB/s 6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.6 MB/s 6s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.6 MB/s 5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.6 MB/s 5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.6 MB/s 5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.6 MB/s 5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 5s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 98% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.9 MB/s 4s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.9 MB/s 3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.9 MB/s 3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.9 MB/s 3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.9 MB/s 3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.9 MB/s 3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.9 MB/s 3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.9 MB/s 3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.9 MB/s 3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.9 MB/s 3s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.1 MB/s 2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.1 MB/s 2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.1 MB/s 2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.1 MB/s 2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.1 MB/s 2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.1 MB/s 2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.1 MB/s 2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.1 MB/s 2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.1 MB/s 2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.1 MB/s 2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.0 MB/s 2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.0 MB/s 2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.0 MB/s 2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.0 MB/s 2s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.0 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.0 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.0 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.0 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.0 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.0 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 4.0 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 99% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 1s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕█████████████████ ▏ 1.1 GB/1.1 GB 3.8 MB/s 0s\u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest ⠋ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest ⠙ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest ⠹ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest ⠸ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest ⠼ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest ⠴ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest ⠦ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest ⠧ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest ⠇ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest ⠏ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest ⠋ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest ⠙ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest ⠹ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest ⠸ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest ⠼ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest ⠴ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest ⠦ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest ⠧ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest ⠇ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest ⠏ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest ⠋ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest ⠙ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest ⠹ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest ⠸ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest ⠼ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest ⠴ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest ⠦ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest ⠧ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest ⠇ \u001b[K\u001b[?25h\u001b[?2026l\u001b[?2026h\u001b[?25l\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\u001b[1Gpulling manifest \u001b[K\n", - "pulling aabd4debf0c8: 100% ▕██████████████████▏ 1.1 GB \u001b[K\n", - "pulling c5ad996bda6e: 100% ▕██████████████████▏ 556 B \u001b[K\n", - "pulling 6e4c38e1172f: 100% ▕██████████████████▏ 1.1 KB \u001b[K\n", - "pulling f4d24e9138dd: 100% ▕██████████████████▏ 148 B \u001b[K\n", - "pulling a85fe2a2e58e: 100% ▕██████████████████▏ 487 B \u001b[K\n", - "verifying sha256 digest \u001b[K\n", - "writing manifest \u001b[K\n", - "success \u001b[K\u001b[?25h\u001b[?2026l\n" - ] - } - ], + "outputs": [], "source": [ "!ollama pull deepseek-r1:1.5b" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "1d3d554b-e00d-4c08-9300-45e073950a76", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Okay, so I need to figure out how to define some core concepts related to Large Language Models (LLMs) specifically focusing on neural networks, attention mechanisms, and transformers. Hmm, where do I start? Well, I remember that big models are created using layers of many neural network units connected together sequentially. So for LLMs, which are composed of neural networks, each might have a certain number of hidden layers, maybe hundreds or even thousands of them. That seems pretty complex but works similarly to traditional models.\n", - "\n", - "Then there's attention and the transformer aspect. I'm a bit confused about their specific roles here. Wait, the user mentioned \"attention,\" so I think that refers to how the model processes information by focusing different parts on different aspects. The decoder part comes into play because in LLMs, the entire input text is being modeled by the output from each hidden layer.\n", - "\n", - "But I'm not entirely sure about all the steps involved in the attention mechanism for transformers. Let me think: In traditional RNNs, models process data one step at a time and consider both its current output and inputs from the previous step. For LSTMs, they use gates to manage content from inputs. Transformers differ by using a self-attention mechanism, which means each token in a sequence is compared with every other token, producing attention scores that help focus on relevant parts of the input.\n", - "\n", - "So when combined, each layer's output passes through an attention mechanism and another sub-layer. Maybe this creates something like a multi-head attention where multiple parallel attention heads are processed separately but produce different results from each. Each of these could be passed to further processing steps beyond just feed-forward layers.\n", - "\n", - "Wait, how precise is that? I think the key idea is that without the attention mechanisms, the models might not effectively capture context within sequences, which is important for understanding meaning in languages. So attention allows the model to weigh the importance of certain tokens relative to others, thus improving both efficiency and effectiveness in processing language.\n", - "\n", - "Also, the user mentioned a large number of hidden layers—hundreds to thousands. That sounds right because it would exponentially increase the complexity of the model without allowing it to be scaled or practical on its own. Instead, larger models are usually combined with specialized components like self-attention and transformers to make them practical for real-world use.\n", - "\n", - "Putting this together, perhaps the neural networks handle forward and backward processing (in traditional RNNs), but LLMs might not have that—so maybe their layers only process one-directional information at a time since they're composed of multiple layers. The transformer's self-attention mechanism with attention weights helps model contextual relationships, making each layer focus on different aspects while the decoder feeds its output into higher layers to improve context.\n", - "\n", - "Alright, I think I've got some basic understanding, but maybe I should look for precise definitions or examples elsewhere. For instance, the \"standard architecture\" section mentions a large neural network with multiple hidden layers, each containing many neurons, and using feed-forward layers. The decoder handles the entire text processing by passing output from one layer into higher layers to enhance context.\n", - "\n", - "In terms of attention in transformers, I think the key is that each token generates an attention mask that determines its position importance relative to other elements. This helps the model attend to different parts when needed, making it a self-attention mechanism without multi-heads or parallel processing as in traditional RNNs with multiple heads.\n", - "\n", - "So, in summary: The neural networks for LLMs process text sequentially but not both directions (forward and backward). The transformer uses self-attention with attention masks to weigh the importance of all tokens relative to each other during forward pass, enhancing contextual understanding. This layering allows higher layers to focus on different elements while feeding their output back into subsequent layers to maintain context.\n", - "\n", - "Wait, does that mean multi-layer processing combined with self-attention and decoder-style forward passes make LLMs unique? Yes, because in RNNs with traditional attention, there's usually a parallel layer of attention at each step, but here transformers share the same attention mask across all neurons in a layer, making it more efficient.\n", - "\n", - "I think I'm getting closer. Maybe to make it even clearer: Large Language Models are neural networks composed of layers that each process text sequentially (since RNNs handle only forward), using self-attention and decoder-style processing. Each hidden layer's output is fed into higher layers for more context, while attention masks ensure the model focuses on relevant parts relative to others.\n", - "\n", - "I should probably structure this into points: Define neural networks for LLMs as forward-only sequential processing with multiple layers. Attention in transformers through self-attention mechanisms and masking. Transformers integrate these with decoder-style processing, each layer's output sent to higher layers for context enhancement.\n", - "\n", - "\n", - "**Definitions of Core Concepts in Large Language Models (LLMs):**\n", - "\n", - "1. **Neural Networks in LLMs:**\n", - " - **Structure:** Large Neural Network\n", - " - Composed of multiple hidden layers, each containing numerous neurons connected sequentially.\n", - " - These structures allow sequential processing of text information.\n", - " - **Forward Processing:** Sequential\n", - " - Text is processed one step at a time without reversing (forward only), unlike traditional RNNs which handle both forward and backward processing.\n", - "\n", - "2. **Attention in Transformers:**\n", - " - **Self-Aware Mechanism:**\n", - " - Each token generates an attention mask that determines its position importance.\n", - " - This highlights the relative importance of all tokens, enabling focused context modeling.\n", - " - **Weighted Context Focus:**\n", - " - Attention scores (weights) are used to generate probability distributions over possible words for each position in a sequence.\n", - "\n", - "3. **Transformer's Decoder-Style Processing:**\n", - " - Processing Through Decoders:\n", - " - The model processes both input and output sequences through layers, with the decoder feeding its output into higher layers.\n", - " - **Layered Context Enhancement:**\n", - " - Each layer enhances context by processing all tokens' contributions, allowing models to focus on relevant parts while maintaining global information.\n", - "\n", - "**Summary:** Large Language Models (LLMs) utilize forward-only sequential neural networks. Transformers employ self-attention mechanisms and decoder-style processing, enabling each layer to enhance context while feeding its output into higher layers for global understanding. This architecture allows LLMs to effectively capture contextual relationships in sequences.\n" - ] - } - ], + "outputs": [], "source": [ "# This may take a few minutes to run! You should then see a fascinating \"thinking\" trace inside tags, followed by some decent definitions\n", "\n", @@ -2761,7 +294,7 @@ ], "metadata": { "kernelspec": { - "display_name": "llms", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -2775,7 +308,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.13" + "version": "3.11.12" } }, "nbformat": 4, From 25adc43164ee0e418985bdfc3f38b9d02c543384 Mon Sep 17 00:00:00 2001 From: Oluwaseyi-A <62573285+Oluwaseyi-A@users.noreply.github.com> Date: Sat, 16 Aug 2025 22:22:42 -0400 Subject: [PATCH 35/72] Add week1 notebook to community-contributions --- ...ure-builder-with-multishot-prompting.ipynb | 402 ++++++++++++++++++ 1 file changed, 402 insertions(+) create mode 100644 week1/community-contributions/brochure-builder-with-multishot-prompting.ipynb diff --git a/week1/community-contributions/brochure-builder-with-multishot-prompting.ipynb b/week1/community-contributions/brochure-builder-with-multishot-prompting.ipynb new file mode 100644 index 0000000..3427a82 --- /dev/null +++ b/week1/community-contributions/brochure-builder-with-multishot-prompting.ipynb @@ -0,0 +1,402 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "9905f163-759f-474b-8f7a-7d14da0df44d", + "metadata": {}, + "source": [ + "### BUSINESS CHALLENGE: Using Multi-shot Prompting\n", + "#### Day 5\n", + "\n", + "Create a product that builds a Brochure for a company to be used for prospective clients, investors and potential recruits.\n", + "\n", + "We will be provided a company name and their primary website." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a0895f24-65ff-4624-8ae0-15d2d400d8f0", + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "# If these fail, please check you're running from an 'activated' environment with (llms) in the command prompt\n", + "\n", + "import os\n", + "import requests\n", + "import json\n", + "from typing import List\n", + "from dotenv import load_dotenv\n", + "from bs4 import BeautifulSoup\n", + "from IPython.display import Markdown, display, update_display\n", + "from openai import OpenAI" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7794aa70-5962-4669-b86f-b53639f4f9ea", + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize and constants\n", + "\n", + "load_dotenv(override=True)\n", + "api_key = os.getenv('OPENAI_API_KEY')\n", + "\n", + "if api_key and api_key.startswith('sk-proj-') and len(api_key)>10:\n", + " print(\"API key looks good so far\")\n", + "else:\n", + " print(\"There might be a problem with your API key? Please visit the troubleshooting notebook!\")\n", + " \n", + "MODEL = 'gpt-4o-mini'\n", + "openai = OpenAI()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "63bf8631-2746-4255-bec1-522855d3e812", + "metadata": {}, + "outputs": [], + "source": [ + "# A class to represent a Webpage\n", + "\n", + "# Some websites need you to use proper headers when fetching them:\n", + "headers = {\n", + " \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36\"\n", + "}\n", + "\n", + "class Website:\n", + " \"\"\"\n", + " A utility class to represent a Website that we have scraped, now with links\n", + " \"\"\"\n", + "\n", + " def __init__(self, url):\n", + " self.url = url\n", + " response = requests.get(url, headers=headers)\n", + " self.body = response.content\n", + " soup = BeautifulSoup(self.body, 'html.parser')\n", + " self.title = soup.title.string if soup.title else \"No title found\"\n", + " if soup.body:\n", + " for irrelevant in soup.body([\"script\", \"style\", \"img\", \"input\"]):\n", + " irrelevant.decompose()\n", + " self.text = soup.body.get_text(separator=\"\\n\", strip=True)\n", + " else:\n", + " self.text = \"\"\n", + " links = [link.get('href') for link in soup.find_all('a')]\n", + " self.links = [link for link in links if link]\n", + "\n", + " def get_contents(self):\n", + " return f\"Webpage Title:\\n{self.title}\\nWebpage Contents:\\n{self.text}\\n\\n\"" + ] + }, + { + "cell_type": "markdown", + "id": "1e7bb527-e769-4245-bb91-ae65e64593ff", + "metadata": {}, + "source": [ + "## First step: Have GPT-4o-mini figure out which links are relevant\n", + "\n", + "### Use a call to gpt-4o-mini to read the links on a webpage, and respond in structured JSON. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1ce303ae-b967-4261-aadc-02dafa54db4a", + "metadata": {}, + "outputs": [], + "source": [ + "link_system_prompt = \"You are provided with a list of links found on a webpage. \\\n", + "You are able to decide which of the links would be most relevant to include in a brochure about the company, \\\n", + "such as links to an About page, or a Company page, or Careers/Jobs pages.\\n\"\n", + "link_system_prompt += \"You should respond in JSON as in this example:\"\n", + "link_system_prompt += \"\"\"\n", + "{\n", + " \"links\": [\n", + " {\"type\": \"about page\", \"url\": \"https://full.url/goes/here/about\"},\n", + " {\"type\": \"careers page\", \"url\": \"https://another.full.url/careers\"}\n", + " ]\n", + "}\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d24a4c0c-a1d1-4897-b2a7-4128d25c2e08", + "metadata": {}, + "outputs": [], + "source": [ + "def get_links_user_prompt(website):\n", + " user_prompt = f\"Here is the list of links on the website of {website.url} - \"\n", + " user_prompt += \"please decide which of these are relevant web links for a brochure about the company, respond with the full https URL in JSON format. \\\n", + "Do not include Terms of Service, Privacy, email links.\\n\"\n", + " user_prompt += \"Links (some might be relative links):\\n\"\n", + " user_prompt += \"\\n\".join(website.links)\n", + " return user_prompt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8103fc11-5bc0-41c4-8c97-502c9e96429c", + "metadata": {}, + "outputs": [], + "source": [ + "def get_links(url): # 1st inference\n", + " website = Website(url)\n", + " response = openai.chat.completions.create(\n", + " model=MODEL,\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": link_system_prompt},\n", + " {\"role\": \"user\", \"content\": get_links_user_prompt(website)}\n", + " ],\n", + " response_format={\"type\": \"json_object\"}\n", + " )\n", + " result = response.choices[0].message.content\n", + " return json.loads(result)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dc84a695-515d-4292-9a95-818f4fe3d20e", + "metadata": {}, + "outputs": [], + "source": [ + "huggingface = Website(\"https://huggingface.co\")" + ] + }, + { + "cell_type": "markdown", + "id": "91896908-1632-41fc-9b8b-39a7638d8dd1", + "metadata": {}, + "source": [ + "## Second step: make the brochure!\n", + "\n", + "Assemble all the details into another prompt to GPT4-o" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ab7c54e3-e654-4b1f-8671-09194b628aa0", + "metadata": {}, + "outputs": [], + "source": [ + "def get_all_details(url): # 1st inference wrapper\n", + " result = \"Landing page:\\n\"\n", + " result += Website(url).get_contents()\n", + " links = get_links(url) # inference\n", + " # print(\"Found links:\", links)\n", + " for link in links[\"links\"]:\n", + " result += f\"\\n\\n{link['type']}\\n\"\n", + " result += Website(link[\"url\"]).get_contents()\n", + " return result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea9f54d1-a248-4c56-a1de-6633193de5bf", + "metadata": {}, + "outputs": [], + "source": [ + "system_prompt = \"You are an assistant that analyzes the contents of several relevant pages from a company website \\\n", + "and creates a short humorous, entertaining, jokey brochure about the company for prospective customers, investors and recruits. Respond in markdown.\\\n", + "Include details of company culture, customers and careers/jobs if you have the information.\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13412c85-badd-4d79-a5ac-8283e4bb832f", + "metadata": {}, + "outputs": [], + "source": [ + "def get_brochure_user_prompt(company_name, url):\n", + " user_prompt = f\"You are looking at a company called: {company_name}\\n\"\n", + " user_prompt += f\"Here are the contents of its landing page and other relevant pages; use this information to build a short brochure of the company in markdown.\\n\"\n", + " user_prompt += get_all_details(url) # inference wrapper\n", + " user_prompt = user_prompt[:5_000] # Truncate if more than 5,000 characters\n", + " return user_prompt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "addc0047-ea73-4748-abc3-747ff343c134", + "metadata": {}, + "outputs": [], + "source": [ + "def create_brochure(company_name, url): # 2nd inference\n", + " response = openai.chat.completions.create(\n", + " model=MODEL,\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": get_brochure_user_prompt(company_name, url)}\n", + " ],\n", + " )\n", + " result = response.choices[0].message.content\n", + " return result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "82a3b61a-da26-4265-840a-0a93f81cd048", + "metadata": {}, + "outputs": [], + "source": [ + "brochure_english = create_brochure(\"HuggingFace\", \"https://huggingface.co\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5d165e3f-8fe2-4712-b098-d34d9fabe583", + "metadata": {}, + "outputs": [], + "source": [ + "display(Markdown(brochure_english))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "107a2100-3f7d-4f16-8ba7-b5da602393c6", + "metadata": {}, + "outputs": [], + "source": [ + "def stream_brochure(company_name, url):\n", + " stream = openai.chat.completions.create(\n", + " model=MODEL,\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": get_brochure_user_prompt(company_name, url)}\n", + " ],\n", + " stream=True\n", + " )\n", + " \n", + " response = \"\"\n", + " display_handle = display(Markdown(\"\"), display_id=True)\n", + " for chunk in stream:\n", + " response += chunk.choices[0].delta.content or ''\n", + " response = response.replace(\"```\",\"\").replace(\"markdown\", \"\")\n", + " update_display(Markdown(response), display_id=display_handle.display_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26cbe9b5-3603-49a1-a676-75c7ddaacdb8", + "metadata": {}, + "outputs": [], + "source": [ + "stream_brochure(\"HuggingFace\", \"https://huggingface.co\")" + ] + }, + { + "cell_type": "markdown", + "id": "c10d8189-7f79-4991-abc4-0764369b7d64", + "metadata": {}, + "source": [ + "### Third step: Translate the entire brochure to Spanish" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "666817eb-1e8b-4fee-bbab-c0dbfe2ea7c0", + "metadata": {}, + "outputs": [], + "source": [ + "system_prompt = \"You are an assistant that analyzes the contents of a brochure \\\n", + "and translates to Spanish. Respond in markdown.\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c48adb12-bc3c-48f9-ab38-b7ca895195f6", + "metadata": {}, + "outputs": [], + "source": [ + "def translate_user_prompt(company_name, url):\n", + " user_prompt = f\"Please translate the following brochure content to Spanish\\n\"\n", + " user_prompt += create_brochure(company_name, url) # inference wrapper\n", + " # user_prompt = user_prompt[:5_000] # Truncate if more than 5,000 characters\n", + " return user_prompt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b92b61ac-3be3-4e84-9000-ec8233697b81", + "metadata": {}, + "outputs": [], + "source": [ + "translate_user_prompt(\"HuggingFace\", \"https://huggingface.co\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6bfd04f4-4381-4730-ac5d-c9fa02f906df", + "metadata": {}, + "outputs": [], + "source": [ + "def translate_brochure(): # 3rd inference\n", + " stream = openai.chat.completions.create(\n", + " model=MODEL,\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": translate_user_prompt(\"HuggingFace\", \"https://huggingface.co\")}\n", + " ],\n", + " stream=True\n", + " )\n", + " \n", + " response = \"\"\n", + " display_handle = display(Markdown(\"\"), display_id=True)\n", + " for chunk in stream:\n", + " response += chunk.choices[0].delta.content or ''\n", + " response = response.replace(\"```\",\"\").replace(\"markdown\", \"\")\n", + " update_display(Markdown(response), display_id=display_handle.display_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bb78ed28-9ecd-4c08-ae96-d7473cbc97dd", + "metadata": {}, + "outputs": [], + "source": [ + "translate_brochure()" + ] + } + ], + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 10b42a739db33444590228250903129b7c260919 Mon Sep 17 00:00:00 2001 From: Execotryx Date: Sun, 17 Aug 2025 20:17:31 +0500 Subject: [PATCH 36/72] AI Brochure Creator, powered with GPT-5 Nano and partially utilizing Responses API --- .../ai-powered-marketing-brochures/.gitignore | 210 +++++++++++++ .../ai-brochure-creator.py | 207 +++++++++++++ .../ai_brochure_config.py | 59 ++++ .../ai-powered-marketing-brochures/ai_core.py | 181 +++++++++++ .../extractor_of_relevant_links.py | 91 ++++++ .../requirements.txt | 5 + .../ai-powered-marketing-brochures/website.py | 286 ++++++++++++++++++ 7 files changed, 1039 insertions(+) create mode 100644 week1/community-contributions/ai-powered-marketing-brochures/.gitignore create mode 100644 week1/community-contributions/ai-powered-marketing-brochures/ai-brochure-creator.py create mode 100644 week1/community-contributions/ai-powered-marketing-brochures/ai_brochure_config.py create mode 100644 week1/community-contributions/ai-powered-marketing-brochures/ai_core.py create mode 100644 week1/community-contributions/ai-powered-marketing-brochures/extractor_of_relevant_links.py create mode 100644 week1/community-contributions/ai-powered-marketing-brochures/requirements.txt create mode 100644 week1/community-contributions/ai-powered-marketing-brochures/website.py diff --git a/week1/community-contributions/ai-powered-marketing-brochures/.gitignore b/week1/community-contributions/ai-powered-marketing-brochures/.gitignore new file mode 100644 index 0000000..290698f --- /dev/null +++ b/week1/community-contributions/ai-powered-marketing-brochures/.gitignore @@ -0,0 +1,210 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[codz] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py.cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# UV +# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +#uv.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock +#poetry.toml + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python. +# https://pdm-project.org/en/latest/usage/project/#working-with-version-control +#pdm.lock +#pdm.toml +.pdm-python +.pdm-build/ + +# pixi +# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control. +#pixi.lock +# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one +# in the .venv directory. It is recommended not to include this directory in version control. +.pixi + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.envrc +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +# Abstra +# Abstra is an AI-powered process automation framework. +# Ignore directories containing user credentials, local state, and settings. +# Learn more at https://abstra.io/docs +.abstra/ + +# Visual Studio Code +# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore +# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore +# and can be added to the global gitignore or merged into this file. However, if you prefer, +# you could uncomment the following to ignore the entire vscode folder +# .vscode/ + +# Ruff stuff: +.ruff_cache/ + +# PyPI configuration file +.pypirc + +# Cursor +# Cursor is an AI-powered code editor. `.cursorignore` specifies files/directories to +# exclude from AI features like autocomplete and code analysis. Recommended for sensitive data +# refer to https://docs.cursor.com/context/ignore-files +.cursorignore +.cursorindexingignore + +# Marimo +marimo/_static/ +marimo/_lsp/ +__marimo__/ + + +.*-env \ No newline at end of file diff --git a/week1/community-contributions/ai-powered-marketing-brochures/ai-brochure-creator.py b/week1/community-contributions/ai-powered-marketing-brochures/ai-brochure-creator.py new file mode 100644 index 0000000..79f3246 --- /dev/null +++ b/week1/community-contributions/ai-powered-marketing-brochures/ai-brochure-creator.py @@ -0,0 +1,207 @@ +from ai_core import AICore +from ai_brochure_config import AIBrochureConfig +from extractor_of_relevant_links import ExtractorOfRelevantLinks +from website import Website +from openai.types.responses import Response +from rich.console import Console +from rich.markdown import Markdown +from requests import Session +from concurrent.futures import ThreadPoolExecutor, as_completed +from json import loads + +class BrochureCreator(AICore[str]): + """ + Builds a short Markdown brochure for a company or individual by: + - extracting relevant links from the website, + - inferring the entity name and status, + - and prompting the model using the collected page content. + """ + + @property + def _website(self) -> Website: + """Return the main Website instance to analyze.""" + return self.__website + + @property + def _extractor(self) -> ExtractorOfRelevantLinks: + """Return the helper responsible for extracting relevant links.""" + return self.__extractor + + def __init__(self, config: AIBrochureConfig, website: Website) -> None: + """ + Initialize the brochure creator with configuration and target website. + + Parameters: + config: AI and runtime configuration. + website: The root website to analyze and summarize. + """ + system_behavior: str = ("You are an assistant that analyzes the contents of several relevant pages from a company website " + "and creates a short brochure about the company for prospective customers, investors and recruits. " + "Include details of company culture, customers and careers/jobs if information is available. ") + super().__init__(config, system_behavior) + self.__website: Website = website + self.__extractor: ExtractorOfRelevantLinks = ExtractorOfRelevantLinks(config, website) + + def create_brochure(self) -> str: + """ + Create a short Markdown brochure based on the website's content. + + Returns: + A Markdown string with the brochure, or a fallback message if no relevant pages were found. + """ + relevant_pages: list[dict[str, str | Website]] = self._get_relevant_pages() + if not relevant_pages: + return "No relevant pages found to create a brochure." + + brochure_prompt_part: str = self._form_brochure_prompt(relevant_pages) + inferred_company_name, inferred_status = self._infer_entity(brochure_prompt_part) + + full_brochure_prompt: str = self._form_full_prompt(inferred_company_name, inferred_status) + response: str = self.ask(full_brochure_prompt) + return response + + def _get_relevant_pages(self) -> list[dict[str, str | Website]]: + """ + Resolve relevant links into Website objects using a shared session and concurrency. + """ + relevant_pages: list[dict[str, str | Website]] = [] + relevant_links: list[dict[str, str]] = self._extractor.extract_relevant_links()["links"] + # Limit the number of pages to fetch to keep latency and token usage reasonable. + MAX_PAGES: int = 6 + links_subset = relevant_links[:MAX_PAGES] + + def build_page(item: dict[str, str], session: Session) -> dict[str, str | Website] | None: + try: + url = str(item["url"]) + page_type = str(item["type"]) + return {"type": page_type, "page": Website(url, session=session)} + except Exception: + return None + + with Session() as session, ThreadPoolExecutor(max_workers=4) as executor: + futures = [executor.submit(build_page, link, session) for link in links_subset] + for fut in as_completed(futures): + res = fut.result() + if res: + relevant_pages.append(res) + + return relevant_pages + + def _truncate_text(self, text: str, limit: int) -> str: + """ + Truncate text to 'limit' characters to reduce tokens and latency. + """ + if len(text) <= limit: + return text + return text[: max(0, limit - 20)] + "... [truncated]" + + def _form_brochure_prompt(self, relevant_pages: list[dict[str, str | Website]]) -> str: + """ + Assemble a prompt that includes the main page and relevant pages' titles and text. + + Parameters: + relevant_pages: List of page descriptors returned by _get_relevant_pages. + + Returns: + A prompt string containing quoted sections per page. + """ + QUOTE_DELIMITER: str = "\n\"\"\"\n" + MAX_MAIN_CHARS = 6000 + MAX_PAGE_CHARS = 3000 + prompt: str = ( + f"Main page:{QUOTE_DELIMITER}" + f"Title: {self._website.title}\n" + f"Text:\n{self._truncate_text(self._website.text, MAX_MAIN_CHARS)}{QUOTE_DELIMITER}\n" + ) + + for page in relevant_pages: + if isinstance(page['page'], Website) and not page['page'].fetch_failed: + prompt += ( + f"{page['type']}:{QUOTE_DELIMITER}" + f"Title: {page['page'].title}\n" + f"Text:\n{self._truncate_text(page['page'].text, MAX_PAGE_CHARS)}{QUOTE_DELIMITER}\n" + ) + + return prompt + + def _infer_entity(self, brochure_prompt_part: str) -> tuple[str, str]: + """ + Infer both the entity name and status in a single model call to reduce latency. + Returns: + (name, status) where status is 'company' or 'individual'. + """ + prompt = ( + "From the following website excerpts, infer the entity name and whether it is a company or an individual. " + "Respond strictly as JSON with keys 'name' and 'status' (status must be 'company' or 'individual').\n" + f"{brochure_prompt_part}" + ) + raw = self.ask(prompt) + try: + data: dict[str, str] = loads(raw) + name: str = str(data.get("name", "")).strip() or "Unknown" + status: str = str(data.get("status", "")).strip().lower() + if status not in ("company", "individual"): + status = "company" + return name, status + except Exception: + # Fallback: use entire output as name, assume company + return raw.strip() or "Unknown", "company" + + def _form_full_prompt(self, inferred_company_name: str, inferred_status: str) -> str: + """ + Build the final brochure-generation prompt using the inferred entity and prior history. + + Parameters: + inferred_company_name: The inferred entity name. + inferred_status: Either 'company' or 'individual'. + + Returns: + A final prompt instructing the model to produce a Markdown brochure. + """ + full_prompt: str = (f"You are looking at a {inferred_status} called {inferred_company_name}, to whom website {self._website.website_url} belongs.\n" + f"Build a short brochure about the {inferred_status}. Use the information from the website that is already stored in the history.\n" + "Your response must be in a Markdown format.") + return full_prompt + + def ask(self, question: str) -> str: + """ + Send a question to the model, update chat history, and return the text output. + + Parameters: + question: The user prompt. + + Returns: + The model output text. + """ + self.history_manager.add_user_message(question) + response: Response = self._ai_api.responses.create( + model=self.config.model_name, + instructions=self.history_manager.system_behavior, + input=self.history_manager.chat_history, + reasoning={ "effort": "low" } + ) + self.history_manager.add_assistant_message(response) + return response.output_text + +console: Console = Console() + +def display_markdown(content: str) -> None: + """ + Render Markdown content to the console using rich. + """ + console.print(Markdown(content)) + +def show_summary(summary: str) -> None: + """ + Print a Markdown summary if provided; otherwise print a fallback message. + """ + if summary: + display_markdown(summary) + else: + console.print("No summary found.") + +if __name__ == "__main__": + website: Website = Website("") + brochure_creator: BrochureCreator = BrochureCreator(AIBrochureConfig(), website) + brochure: str = brochure_creator.create_brochure() + display_markdown(brochure) \ No newline at end of file diff --git a/week1/community-contributions/ai-powered-marketing-brochures/ai_brochure_config.py b/week1/community-contributions/ai-powered-marketing-brochures/ai_brochure_config.py new file mode 100644 index 0000000..9a0e2bd --- /dev/null +++ b/week1/community-contributions/ai-powered-marketing-brochures/ai_brochure_config.py @@ -0,0 +1,59 @@ +import os +from dotenv import load_dotenv + +class AIBrochureConfig: + """ + Configuration class to load environment variables. + """ + + def __get_config_value(self, key: str): + """ + Get the value of an environment variable. + """ + if not key: + raise ValueError("Key must be provided") + + value: str | None = os.getenv(key) + if not value: + raise ValueError(f"Environment variable '{key}' not found") + + return value + + def _get_str(self, key: str) -> str: + """ + Get a string value from the environment variables. + """ + return self.__get_config_value(key) + + def _get_int(self, key: str) -> int: + """ + Get an integer value from the environment variables. + """ + value = self.__get_config_value(key) + try: + return int(value) + except ValueError: + raise ValueError(f"Environment variable '{key}' must be an integer") + + @property + def openai_api_key(self) -> str: + """ + Get the OpenAI API key from the environment variables. + """ + if self.__openai_api_key == "": + self.__openai_api_key = self._get_str("OPENAI_API_KEY") + return self.__openai_api_key + + @property + def model_name(self) -> str: + """ + Get the model name from the environment variables. + """ + if self.__model_name == "": + self.__model_name = self._get_str("MODEL_NAME") + return self.__model_name + + def __init__(self) -> None: + load_dotenv(dotenv_path=".env") + self.__openai_api_key: str = "" + self.__model_name: str = "" diff --git a/week1/community-contributions/ai-powered-marketing-brochures/ai_core.py b/week1/community-contributions/ai-powered-marketing-brochures/ai_core.py new file mode 100644 index 0000000..e517f9d --- /dev/null +++ b/week1/community-contributions/ai-powered-marketing-brochures/ai_core.py @@ -0,0 +1,181 @@ +import openai +from abc import ABC, abstractmethod +from ai_brochure_config import AIBrochureConfig +from typing import Any, cast, Generic, TypeVar +from openai.types.responses import ResponseInputItemParam, Response, ResponseOutputMessage + +TAiResponse = TypeVar('TAiResponse', default=Any) + +class HistoryManager: + """ + Manage chat history and system behavior for a conversation with the model. + """ + @property + def chat_history(self) -> list[ResponseInputItemParam]: + """ + Return the accumulated conversation as a list of response input items. + """ + return self.__chat_history + + @property + def system_behavior(self) -> str: + """ + Return the system behavior (instructions) used for this conversation. + """ + return self.__system_behavior + + def __init__(self, system_behavior: str) -> None: + """ + Initialize the history manager. + + Parameters: + system_behavior: The system instruction string for the conversation. + """ + self.__chat_history: list[ResponseInputItemParam] = [] + self.__system_behavior: str = system_behavior + + def add_user_message(self, message: str) -> None: + """ + Append a user message to the chat history. + + Parameters: + message: The user text to add. + """ + self.__chat_history.append({ + "role": "user", + "content": [{"type": "input_text", "text": message}], + }) + + def add_assistant_message(self, output_message: Response) -> None: + """ + Append the assistant's output to the chat history. + + Parameters: + output_message: The model response to convert and store. + """ + for out in output_message.output: + # Convert the Pydantic output model to an input item shape + self.__chat_history.append( + cast(ResponseInputItemParam, out.model_dump(exclude_unset=True)) + ) + + +class AICore(ABC, Generic[TAiResponse]): + """ + Abstract base class for AI core functionalities. + """ + @property + def config(self) -> AIBrochureConfig: + """ + Return the stored AIBrochureConfig for this instance. + + Returns: + AIBrochureConfig: The current configuration used by this object. + + Notes: + - This accessor returns the internal configuration reference. Mutating the returned + object may affect the internal state of this instance. + - To change the configuration, use the appropriate setter or factory method rather + than modifying the returned value in-place. + """ + return self.__config + + @config.setter + def config(self, config: AIBrochureConfig | None) -> None: + """ + Set the instance configuration for the AI brochure generator. + + Parameters + ---------- + config : AIBrochureConfig | None + The configuration to assign to the instance. If None, the instance's + configuration will be reset to a newly created default AIBrochureConfig. + + Returns + ------- + None + + Notes + ----- + This method stores the provided configuration on a private attribute + """ + if config is None: + self.__config = AIBrochureConfig() + else: + self.__config = config + + @property + def _ai_api(self) -> openai.OpenAI: + """ + Return the cached OpenAI API client, initializing it on first access. + + This private helper lazily constructs and caches an openai.OpenAI client using + the API key found on self.config.openai_api_key. On the first call, if the + client has not yet been created, the method verifies that self.config is set, + creates the client with openai.OpenAI(api_key=...), stores it on + self.__ai_api, and returns it. Subsequent calls return the same cached + instance. + + Returns: + openai.OpenAI: A configured OpenAI API client. + + Raises: + ValueError: If self.config is None when attempting to initialize the client. + + Notes: + - The method mutates self.__ai_api as a side effect (caching). + - The caller should treat this as a private implementation detail. + - Thread safety is not guaranteed; concurrent initialization may result in + multiple client instances if invoked from multiple threads simultaneously. + """ + if self.__ai_api is None: + if self.config is None: + raise ValueError("Configuration must be set before accessing AI API") + self.__ai_api = openai.OpenAI(api_key=self.config.openai_api_key) + return self.__ai_api + + @property + def history_manager(self) -> HistoryManager: + """ + Return the history manager for this AI core instance. + + This property provides access to the HistoryManager that tracks the chat + history and system behavior. + + Returns: + HistoryManager: The current history manager. This property always returns + a HistoryManager instance and never None. + """ + return self.__history_manager + + def __init__(self, config: AIBrochureConfig, system_behavior: str) -> None: + """ + Initializes the AI core with the provided configuration. + + Parameters: + config (AIBrochureConfig): The configuration object for the AI core. + system_behavior (str): The behavior of the system. + """ + # Initialize all instance-level attributes here + self.__config: AIBrochureConfig = config + self.__history_manager: HistoryManager = HistoryManager(system_behavior) + self.__ai_api: openai.OpenAI | None = None + + if __debug__: + # Sanity check: confirm attributes are initialized + assert hasattr(self, "_AICore__config") + assert hasattr(self, "_AICore__history_manager") + assert hasattr(self, "_AICore__ai_api") + + @abstractmethod + def ask(self, question: str) -> TAiResponse: + """ + Ask a question to the AI model. + + Parameters: + question: The question to ask. + + Returns: + TAiResponse: The model's response type defined by the subclass. + """ + pass \ No newline at end of file diff --git a/week1/community-contributions/ai-powered-marketing-brochures/extractor_of_relevant_links.py b/week1/community-contributions/ai-powered-marketing-brochures/extractor_of_relevant_links.py new file mode 100644 index 0000000..e94fa38 --- /dev/null +++ b/week1/community-contributions/ai-powered-marketing-brochures/extractor_of_relevant_links.py @@ -0,0 +1,91 @@ +from ai_brochure_config import AIBrochureConfig +from website import Website +from ai_core import AICore +from openai.types.responses import Response +from json import loads + +RelevantLinksDict = dict[str, list[dict[str, str]]] + +class ExtractorOfRelevantLinks(AICore[RelevantLinksDict]): + """ + Extractor for relevant links from a website. + """ + + @property + def website(self) -> Website: + """Return the root Website whose links are being analyzed.""" + return self.__website + + def __init__(self, config: AIBrochureConfig, website: Website) -> None: + """ + Initialize the extractor with configuration and target website. + + Parameters: + config: AI and runtime configuration. + website: The Website from which links were collected. + """ + system_behavior: str = ("You are an expert in creation of online advertisement materials." + "You are going to be provided with a list of links found on a website." + "You are able to decide which of the links would be most relevant to include in a brochure about the company," + "such as links to an About page or a Company page or Careers/Jobs pages.\n" + "You should respond in JSON as in this example:") + system_behavior += """ + { + "links": [ + {"type": "about page", "url": "https://www.example.com/about"}, + {"type": "company page", "url": "https://www.another_example.net/company"}, + {"type": "careers page", "url": "https://ex.one_more_example.org/careers"} + ] + } + """ + super().__init__(config, system_behavior) + self.__website: Website = website + + def get_links_user_prompt(self) -> str: + """ + Build a user prompt listing discovered links and instructions for relevance filtering. + + Returns: + A string to send to the model listing links and guidance. + """ + starter_part: str = (f"Here is a list of links found on the website of {self.website.website_url} - " + "please decide which of these links are relevant web links for a brochure about company." + "Respond with full HTTPS URLs. Avoid including Terms of Service, Privacy, email links.\n" + "Links (some might be relative links):\n") + + links_part: str = "\n".join(f"- {link}" for link in self.website.links_on_page) if self.website.links_on_page else "No links found." + + return starter_part + links_part + + def extract_relevant_links(self) -> RelevantLinksDict: + """ + Request the model to select relevant links for brochure creation. + + Returns: + A dictionary with a 'links' array containing objects with 'type' and 'url'. + """ + user_prompt = self.get_links_user_prompt() + response = self.ask(user_prompt) + return response + + def ask(self, question: str) -> RelevantLinksDict: + """ + Send a question to the model and parse the JSON response. + + Parameters: + question: The prompt to submit. + + Returns: + RelevantLinksDict: Parsed JSON containing selected links. + """ + self.history_manager.add_user_message(question) + + response: Response = self._ai_api.responses.create( + model=self.config.model_name, + instructions=self.history_manager.system_behavior, + reasoning={ "effort": "low" }, + input=self.history_manager.chat_history + ) + + self.history_manager.add_assistant_message(response) + return loads(response.output_text) \ No newline at end of file diff --git a/week1/community-contributions/ai-powered-marketing-brochures/requirements.txt b/week1/community-contributions/ai-powered-marketing-brochures/requirements.txt new file mode 100644 index 0000000..9747210 --- /dev/null +++ b/week1/community-contributions/ai-powered-marketing-brochures/requirements.txt @@ -0,0 +1,5 @@ +python-dotenv +openai +bs4 +requests +rich \ No newline at end of file diff --git a/week1/community-contributions/ai-powered-marketing-brochures/website.py b/week1/community-contributions/ai-powered-marketing-brochures/website.py new file mode 100644 index 0000000..ac9bb9d --- /dev/null +++ b/week1/community-contributions/ai-powered-marketing-brochures/website.py @@ -0,0 +1,286 @@ +from ipaddress import ip_address, IPv4Address, IPv6Address +from urllib.parse import ParseResult, urlparse +from bs4 import BeautifulSoup, Tag +from requests import get, RequestException, Session + +class Extractor: + """ + Extracts and processes content from HTML response text using BeautifulSoup. + """ + __soup: BeautifulSoup + + __extracted_title: str = "" + @property + def extracted_title(self) -> str: + """ + Returns the extracted title from the HTML content. + """ + if not self.__extracted_title: + self.__extracted_title = self.get_title() + return self.__extracted_title + + __extracted_text: str = "" + @property + def extracted_text(self) -> str: + """ + Returns the extracted main text content from the HTML, excluding irrelevant tags. + """ + if not self.__extracted_text: + self.__extracted_text = self.get_text() + return self.__extracted_text + + __extracted_links_on_page: list[str] | None = None + @property + def extracted_links_on_page(self) -> list[str]: + """ + Return all href values found on the page. + + Notes: + - Only anchor tags with an href are included. + - Values are returned as-is (may be relative or absolute). + """ + if self.__extracted_links_on_page is None: + self.__extracted_links_on_page = [str(a.get("href")) for a in self._soup.find_all('a', href=True) if isinstance(a, Tag)] + return self.__extracted_links_on_page + + @property + def _soup(self) -> BeautifulSoup: + """ + Returns the BeautifulSoup object for the HTML content. + """ + return self.__soup + + def __init__(self, response_text_content: str) -> None: + """ + Initializes the Extractor with HTML response text. + + Parameters: + response_text_content (str): The HTML response text to be processed. + """ + self.__soup = BeautifulSoup(response_text_content, "html.parser") + self.__extracted_links_on_page = None + + def get_title(self) -> str: + """ + Extracts the title from the HTML content. + """ + return self._soup.title.get_text() if self._soup.title is not None else "No title" + + def get_text(self) -> str: + """ + Extracts and cleans the main text content from the HTML, removing irrelevant tags. + """ + for irrelevant in self._soup.find_all(["script", "style", "img", "figure", "video", "audio", "button", "svg", "canvas", "input", "form", "meta"]): + irrelevant.decompose() + raw_text: str = self._soup.get_text(separator="\n") + cleaned_text: str = " ".join(raw_text.split()) + return cleaned_text if cleaned_text else "No content" + +class Website: + """ + A class to represent a website. + """ + + __DEFAULT_ALLOWED_DOMAINS: list[str] = [".com", ".org", ".net"] + + __title: str = "" + __website_url: str = "" + __text: str = "" + __allowed_domains: list[str] = [] + __links_on_page: list[str] | None = None + + @property + def title(self) -> str: + """ + Returns the title of the website. + """ + return self.__title + + @property + def text(self) -> str: + """ + Returns the main text content of the website. + """ + return self.__text + + @property + def website_url(self) -> str: + """ + Returns the URL of the website. + """ + return self.__website_url + + @property + def links_on_page(self) -> list[str] | None: + """ + Returns the list of links extracted from the website. + """ + return self.__links_on_page + + @property + def _allowed_domains(self) -> list[str]: + """ + Returns the list of allowed domain suffixes. + """ + return self.__allowed_domains + + @_allowed_domains.setter + def _allowed_domains(self, value: list[str] | str) -> None: + """ + Sets the list of allowed domain suffixes. + Filters out empty strings and ensures each suffix starts with a dot. + """ + if isinstance(value, str): + value = [ + item.strip() if item.strip().startswith(".") else f".{item.strip()}" + for item in value.split(",") + if item.strip() + ] + else: + value = [ + item if item.startswith(".") else f".{item}" + for item in value + if item + ] + self.__allowed_domains = value + + def _set_website_url(self, value: str) -> None: + """ + Protected: set the website URL after validating and fetch website data. + Use this from inside the class to initialize or change the URL. + """ + if not value: + raise ValueError("Website URL must be provided") + + parsed_url: ParseResult = urlparse(value) + + self._validate(parsed_url) + + self.__website_url = value + self.__fetch_website_data() + + @property + def fetch_failed(self) -> bool: + """ + Returns whether the website data fetch failed. + """ + return self.__fetch_failed + + def _validate(self, parsed_url: ParseResult) -> None: + """ + Validate the parsed URL. + + Parameters: + parsed_url: The parsed URL to validate. + + Raises: + ValueError: If the URL is missing parts, uses an invalid scheme, + points to a local/private address, or is not in allowed domains. + """ + if not parsed_url.netloc or parsed_url.scheme not in ("http", "https"): + raise ValueError("Website URL must be a valid URL") + + if not parsed_url.hostname: + raise ValueError("Website URL must contain a valid hostname") + + if self.__is_local_address(parsed_url.hostname): + raise ValueError("Website URL must not be a local address") + + if not self.__is_allowed_domain(parsed_url.hostname): + raise ValueError("Website URL must be an allowed domain") + + def __is_local_address(self, hostname: str) -> bool: + """ + Check if the given hostname is a local address. + + Parameters: + hostname (str): The hostname to check. + + Returns: + bool: True if the hostname is a local address, False otherwise. + """ + if hostname in ("localhost", "127.0.0.1", "::1"): + return True + + try: + ip: IPv4Address | IPv6Address = ip_address(hostname) + if ip.is_loopback or ip.is_private or ip.is_link_local or ip.is_reserved: + return True + except ValueError: + return False + + return False + + def __is_allowed_domain(self, hostname: str) -> bool: + """ + Check if the given hostname is an allowed domain. + + Parameters: + hostname (str): The hostname to check. + + Returns: + bool: True if the hostname is an allowed domain, False otherwise. + """ + allowed_domains = [".com", ".org", ".net", ".io"] + return any(hostname.endswith(domain) for domain in allowed_domains) + + def __fetch_website_data(self) -> None: + """ + Fetch website content and populate title, text, and links. + + Side effects: + - Sets internal state: __title, __text, __links_on_page, __fetch_failed. + - Performs an HTTP GET with a browser-like User-Agent. + """ + try: + get_fn = self.__session.get if self.__session else get + response = get_fn( + self.website_url, + timeout=10, + verify=True, + headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"} + ) + except RequestException as e: + self.__title = "Error" + self.__text = str(e) + self.__fetch_failed = True + return + + if response.ok: + extractor: Extractor = Extractor(response.text) + self.__title = extractor.extracted_title + self.__text = extractor.extracted_text + self.__links_on_page = extractor.extracted_links_on_page + else: + if response.status_code == 404: + self.__title = "Not Found" + self.__text = "The requested page was not found (404)." + else: + self.__title = "Error" + self.__text = f"Error: {response.status_code} - {response.reason}" + self.__fetch_failed = True + + def __init__(self, website_url: str, allowed_domains: list[str] | str | None = None, session: Session | None = None) -> None: + """ + Initializes the Website object and fetches its data. + + Parameters: + website_url (str): The URL of the website to fetch. + allowed_domains (list[str] | str, optional): A list of allowed domain suffixes. + If a string is provided, it should be a comma-separated list of domain suffixes (e.g., ".com,.org,.net"). + session (requests.Session | None, optional): Reused HTTP session for connection pooling. + """ + self.__fetch_failed: bool = False + self.__session: Session | None = session + if allowed_domains is None: + self._allowed_domains = self.__DEFAULT_ALLOWED_DOMAINS.copy() + else: + self._allowed_domains = allowed_domains + # Use protected setter internally so the public API exposes only the getter. + self._set_website_url(website_url) + + def __str__(self) -> str: + """ + Returns a string representation of the Website object. + """ + return f"Website(title={self.title}, url={self.website_url})" \ No newline at end of file From b495be8c2861f172237c02318c99f2013b830594 Mon Sep 17 00:00:00 2001 From: Execotryx Date: Sun, 17 Aug 2025 23:44:24 +0500 Subject: [PATCH 37/72] AI Brochure Creator, powered with GPT-5 Nano and partially utilizing Responses API --- .../.gitignore | 0 .../ai-brochure-creator.py | 0 .../ai_brochure_config.py | 0 .../ai_core.py | 0 .../extractor_of_relevant_links.py | 0 .../requirements.txt | 0 .../website.py | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename week1/community-contributions/{ai-powered-marketing-brochures => ai-powered-marketing-brochures-gpt-5}/.gitignore (100%) rename week1/community-contributions/{ai-powered-marketing-brochures => ai-powered-marketing-brochures-gpt-5}/ai-brochure-creator.py (100%) rename week1/community-contributions/{ai-powered-marketing-brochures => ai-powered-marketing-brochures-gpt-5}/ai_brochure_config.py (100%) rename week1/community-contributions/{ai-powered-marketing-brochures => ai-powered-marketing-brochures-gpt-5}/ai_core.py (100%) rename week1/community-contributions/{ai-powered-marketing-brochures => ai-powered-marketing-brochures-gpt-5}/extractor_of_relevant_links.py (100%) rename week1/community-contributions/{ai-powered-marketing-brochures => ai-powered-marketing-brochures-gpt-5}/requirements.txt (100%) rename week1/community-contributions/{ai-powered-marketing-brochures => ai-powered-marketing-brochures-gpt-5}/website.py (100%) diff --git a/week1/community-contributions/ai-powered-marketing-brochures/.gitignore b/week1/community-contributions/ai-powered-marketing-brochures-gpt-5/.gitignore similarity index 100% rename from week1/community-contributions/ai-powered-marketing-brochures/.gitignore rename to week1/community-contributions/ai-powered-marketing-brochures-gpt-5/.gitignore diff --git a/week1/community-contributions/ai-powered-marketing-brochures/ai-brochure-creator.py b/week1/community-contributions/ai-powered-marketing-brochures-gpt-5/ai-brochure-creator.py similarity index 100% rename from week1/community-contributions/ai-powered-marketing-brochures/ai-brochure-creator.py rename to week1/community-contributions/ai-powered-marketing-brochures-gpt-5/ai-brochure-creator.py diff --git a/week1/community-contributions/ai-powered-marketing-brochures/ai_brochure_config.py b/week1/community-contributions/ai-powered-marketing-brochures-gpt-5/ai_brochure_config.py similarity index 100% rename from week1/community-contributions/ai-powered-marketing-brochures/ai_brochure_config.py rename to week1/community-contributions/ai-powered-marketing-brochures-gpt-5/ai_brochure_config.py diff --git a/week1/community-contributions/ai-powered-marketing-brochures/ai_core.py b/week1/community-contributions/ai-powered-marketing-brochures-gpt-5/ai_core.py similarity index 100% rename from week1/community-contributions/ai-powered-marketing-brochures/ai_core.py rename to week1/community-contributions/ai-powered-marketing-brochures-gpt-5/ai_core.py diff --git a/week1/community-contributions/ai-powered-marketing-brochures/extractor_of_relevant_links.py b/week1/community-contributions/ai-powered-marketing-brochures-gpt-5/extractor_of_relevant_links.py similarity index 100% rename from week1/community-contributions/ai-powered-marketing-brochures/extractor_of_relevant_links.py rename to week1/community-contributions/ai-powered-marketing-brochures-gpt-5/extractor_of_relevant_links.py diff --git a/week1/community-contributions/ai-powered-marketing-brochures/requirements.txt b/week1/community-contributions/ai-powered-marketing-brochures-gpt-5/requirements.txt similarity index 100% rename from week1/community-contributions/ai-powered-marketing-brochures/requirements.txt rename to week1/community-contributions/ai-powered-marketing-brochures-gpt-5/requirements.txt diff --git a/week1/community-contributions/ai-powered-marketing-brochures/website.py b/week1/community-contributions/ai-powered-marketing-brochures-gpt-5/website.py similarity index 100% rename from week1/community-contributions/ai-powered-marketing-brochures/website.py rename to week1/community-contributions/ai-powered-marketing-brochures-gpt-5/website.py From 72eb3562b7165c4ab7d0212f0c634265746ade50 Mon Sep 17 00:00:00 2001 From: KiranAyyagari Date: Mon, 18 Aug 2025 20:16:14 +0530 Subject: [PATCH 38/72] Add Copilot and weather agent notebooks Introduces Copilot.ipynb, an adaptive AI coding assistant with OpenAI and Gemini integration via Gradio, and weather_agent.ipynb, a weather chat agent supporting current, historical, and forecast queries using WeatherAPI and OpenAI tool-calling. Both notebooks provide interactive UIs for user queries. --- week2/community-contributions/Copilot.ipynb | 212 ++++++++++ .../weather_agent.ipynb | 370 ++++++++++++++++++ 2 files changed, 582 insertions(+) create mode 100644 week2/community-contributions/Copilot.ipynb create mode 100644 week2/community-contributions/weather_agent.ipynb diff --git a/week2/community-contributions/Copilot.ipynb b/week2/community-contributions/Copilot.ipynb new file mode 100644 index 0000000..c32aad0 --- /dev/null +++ b/week2/community-contributions/Copilot.ipynb @@ -0,0 +1,212 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "1877ad68", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import requests\n", + "from openai import OpenAI\n", + "import gradio as gr\n", + "from dotenv import load_dotenv \n", + "import google.generativeai as genai\n", + "from IPython.display import Markdown, display, update_display\n", + "load_dotenv(override=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "008056a2", + "metadata": {}, + "outputs": [], + "source": [ + "openai_api_key = os.getenv('OPENAI_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 its starts with {openai_api_key[:3]}')\n", + "else:\n", + " print(\"OpenAi api key doesn't exist\")\n", + "\n", + "if google_api_key:\n", + " print('Google api key exists')\n", + "else:\n", + " print(\"Google api key doesn't exist\")\n", + "\n", + "OPENAI_MODEL = \"gpt-4o-mini\"\n", + "GOOGLE_MODEL = \"gemini-1.5-flash\"\n", + "\n", + "openai = OpenAI()\n", + "\n", + "genai.configure()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5013ed7b", + "metadata": {}, + "outputs": [], + "source": [ + "system_msg = \"\"\"\n", + "You are CodeCopilot, an adaptive AI coding assistant that helps users solve problems in any programming language.\n", + "Always provide correct, runnable, and well-formatted code with clear explanations.\n", + "Adjust your style based on the user’s expertise: for beginners, break concepts down step by step with simple examples and commented code;\n", + "for advanced users, deliver concise, production-ready, optimized solutions with best practices and trade-off insights.\n", + "Ask clarifying questions when requirements are ambiguous, highlight pitfalls and edge cases,\n", + "and act as a collaborative pair programmer or mentor whose goal is to help users learn, build, and ship high-quality code efficiently.\n", + "\"\"\"\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "35c480a1", + "metadata": {}, + "outputs": [], + "source": [ + "def create_prompt(prompt, history):\n", + " messages = [{\"role\": \"system\", \"content\": system_msg}]\n", + "\n", + " # history is a list of (user_msg, assistant_msg) tuples\n", + " for user_msg, assistant_msg in history:\n", + " if user_msg:\n", + " messages.append({\"role\": \"user\", \"content\": user_msg})\n", + " if assistant_msg:\n", + " messages.append({\"role\": \"assistant\", \"content\": assistant_msg})\n", + "\n", + " # new user prompt\n", + " messages.append({\"role\": \"user\", \"content\": prompt})\n", + " return messages" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5dfbecd0", + "metadata": {}, + "outputs": [], + "source": [ + "def openai_agent(prompt, history):\n", + " openai.api_key = openai_api_key\n", + " messages = create_prompt(prompt, history)\n", + " response = openai.chat.completions.create(\n", + " model=OPENAI_MODEL,\n", + " messages=messages,\n", + " stream=True\n", + " )\n", + " sent_any = False\n", + " for chunk in response:\n", + " delta = chunk.choices[0].delta\n", + " if delta and delta.content:\n", + " sent_any = True\n", + " yield delta.content\n", + " if not sent_any:\n", + " yield \"(no response)\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "535f7e3d", + "metadata": {}, + "outputs": [], + "source": [ + "def gemini_agent(prompt, history):\n", + " genai.configure(api_key=google_api_key)\n", + "\n", + " # reuse OpenAI-style messages\n", + " messages = create_prompt(prompt, history)\n", + "\n", + " gemini_history = []\n", + " for m in messages:\n", + " # Gemini does NOT support system role\n", + " if m[\"role\"] == \"system\":\n", + " continue\n", + " gemini_history.append({\n", + " \"role\": m[\"role\"],\n", + " \"parts\": [m[\"content\"]]\n", + " })\n", + " prompt_with_system = f\"{system_msg}\\n\\n{prompt}\"\n", + " model = genai.GenerativeModel(GOOGLE_MODEL)\n", + " chat = model.start_chat(history=gemini_history)\n", + "\n", + " response = chat.send_message(prompt_with_system, stream=True)\n", + " for chunk in response:\n", + " if chunk and getattr(chunk, \"text\", None):\n", + " yield chunk.text\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21f61ff0", + "metadata": {}, + "outputs": [], + "source": [ + "def chat_agent(prompt, history, modelType):\n", + " if modelType == \"OpenAI\":\n", + " for token in openai_agent(prompt, history):\n", + " yield token\n", + " else:\n", + " for token in gemini_agent(prompt, history):\n", + " yield token\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "56686c1d", + "metadata": {}, + "outputs": [], + "source": [ + "def chat_fn(prompt, history, model):\n", + " assistant_response = \"\"\n", + " for token in chat_agent(prompt, history, model):\n", + " assistant_response += token\n", + " yield assistant_response \n", + "\n", + "# -------------------------------------------------------------------\n", + "# UI\n", + "# -------------------------------------------------------------------\n", + "with gr.Blocks() as demo:\n", + " model_choice = gr.Radio([\"OpenAI\", \"Gemini\"], value=\"OpenAI\", label=\"Model\")\n", + "\n", + " chat_ui = gr.ChatInterface(\n", + " fn=chat_fn,\n", + " additional_inputs=[model_choice],\n", + " title=\"CodeCopilot\",\n", + " description=\"An adaptive AI coding assistant that helps developers build and ship high-quality code.\"\n", + " )\n", + "\n", + "demo.launch()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "llms", + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/week2/community-contributions/weather_agent.ipynb b/week2/community-contributions/weather_agent.ipynb new file mode 100644 index 0000000..f89978a --- /dev/null +++ b/week2/community-contributions/weather_agent.ipynb @@ -0,0 +1,370 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "60761989", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import requests\n", + "from openai import OpenAI\n", + "import gradio as gr\n", + "import speech_recognition as sr\n", + "import json\n", + "from dotenv import load_dotenv" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "e0b6610a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "OpenAI API Key exists and begins sk-proj-\n", + "weather API Key exists\n" + ] + } + ], + "source": [ + "# Initialization\n", + "\n", + "load_dotenv(override=True)\n", + "\n", + "openai_api_key = os.getenv('OPENAI_API_KEY')\n", + "weather_api_key = os.getenv('WEATHER_API_KEY')\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", + "if weather_api_key:\n", + " print(\"weather API Key exists\")\n", + "else:\n", + " print(\"weather API Key not set\")\n", + " \n", + "MODEL = \"gpt-4o-mini\"\n", + "openai = OpenAI()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "af9d2faf", + "metadata": {}, + "outputs": [], + "source": [ + "system_message = \"You are a helpful assistant for weather. \"\n", + "system_message += \"You need to fetch the current, historical and forecast the weather data using weather api and provide the response\"" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "2c5208d8", + "metadata": {}, + "outputs": [], + "source": [ + "def fetch_current_weather(location):\n", + " url = f\"http://api.weatherapi.com/v1/current.json?key={weather_api_key}&q={location}&aqi=yes\"\n", + " return requests.get(url).json()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "8e6a12e5", + "metadata": {}, + "outputs": [], + "source": [ + "def fetch_forecast_weather(location, days=3):\n", + " url = f\"http://api.weatherapi.com/v1/forecast.json?key={weather_api_key}&q={location}&days={days}&aqi=yes&alerts=yes\"\n", + " return requests.get(url).json()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "eafc468e", + "metadata": {}, + "outputs": [], + "source": [ + "def fetch_historical_weather(location, date):\n", + " url = f\"http://api.weatherapi.com/v1/history.json?key={weather_api_key}&q={location}&dt={date}&aqi=yes\"\n", + " return requests.get(url).json()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "2851ed55", + "metadata": {}, + "outputs": [], + "source": [ + "# Weather function used as a tool by OpenAI\n", + "def get_weatherapi_data(location, mode=\"current\", date=None, forecast_days=3):\n", + " if mode == \"current\":\n", + " return fetch_current_weather(location)\n", + " elif mode == \"forecast\":\n", + " return fetch_forecast_weather(location, days=forecast_days)\n", + " elif mode == \"historical\":\n", + " if not date:\n", + " # Default: yesterday\n", + " date = (datetime.date.today() - datetime.timedelta(days=1)).strftime(\"%Y-%m-%d\")\n", + " return fetch_historical_weather(location, date)\n", + " else:\n", + " return {\"error\": \"Unknown mode.\"}" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "368176c2", + "metadata": {}, + "outputs": [], + "source": [ + "# Tool schema for OpenAI tool-calling\n", + "weatherapi_tool_schema = [\n", + " {\n", + " \"type\": \"function\",\n", + " \"function\": {\n", + " \"name\": \"get_weatherapi_data\",\n", + " \"description\": \"Fetches current, forecast, or historical weather data from WeatherAPI.com for a given location.\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"location\": {\n", + " \"type\": \"string\",\n", + " \"description\": \"Name of the city, region, or coordinates.\"\n", + " },\n", + " \"mode\": {\n", + " \"type\": \"string\",\n", + " \"enum\": [\"current\", \"forecast\", \"historical\"],\n", + " \"description\": \"Type of weather data required.\"\n", + " },\n", + " \"date\": {\n", + " \"type\": \"string\",\n", + " \"description\": \"Date for historical data in YYYY-MM-DD format. Only needed if mode is 'historical'.\"\n", + " },\n", + " \"forecast_days\": {\n", + " \"type\": \"integer\",\n", + " \"description\": \"Number of forecast days (1-10). Only needed if mode is 'forecast'.\"\n", + " }\n", + " },\n", + " \"required\": [\"location\", \"mode\"]\n", + " }\n", + " }\n", + " }\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "bd9c4d38", + "metadata": {}, + "outputs": [], + "source": [ + "def audio_to_text(audio_filepath):\n", + " if audio_filepath is None or audio_filepath == \"\":\n", + " return \"\"\n", + " recognizer = sr.Recognizer()\n", + " try:\n", + " with sr.AudioFile(audio_filepath) as source:\n", + " audio = recognizer.record(source)\n", + " try:\n", + " transcript = recognizer.recognize_google(audio)\n", + " return transcript\n", + " except sr.UnknownValueError:\n", + " return \"\"\n", + " except sr.RequestError as e:\n", + " return f\"Speech recognition service error: {e}\"\n", + " except Exception as e:\n", + " return f\"Error opening audio file: {str(e)}\"" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "61c5de82", + "metadata": {}, + "outputs": [], + "source": [ + "def chat_agent(city, mode, date, forecast_days, audio=None):\n", + " user_query = city\n", + " if audio:\n", + " spoken_text = audio_to_text(audio)\n", + " print(\"Recognized speech:\", spoken_text)\n", + " if spoken_text and spoken_text.strip().lower() != \"flic en flac\":\n", + " user_query = spoken_text\n", + " else:\n", + " if not city.strip():\n", + " return \"Sorry, I could not recognize your speech. Please try again or type your city.\"\n", + "\n", + " if not user_query.strip():\n", + " return \"Please provide a location by text or speech.\"\n", + "\n", + " # Compose tool function arguments as the LLM would\n", + " args = {\n", + " \"location\": user_query,\n", + " \"mode\": mode\n", + " }\n", + " if mode == \"historical\" and date:\n", + " args[\"date\"] = date\n", + " if mode == \"forecast\":\n", + " try:\n", + " n_days = int(forecast_days)\n", + " except:\n", + " n_days = 3\n", + " args[\"forecast_days\"] = n_days\n", + "\n", + " openai.api_key = openai_api_key\n", + "\n", + " # LLM call for tool use\n", + " response = openai.chat.completions.create(\n", + " model=\"gpt-4-0613\",\n", + " messages=[{\"role\": \"user\", \"content\": f\"Get me {mode} weather for {user_query}\"+(f' on {date}' if date and mode==\"historical\" else \"\")+(f' for {forecast_days} days' if forecast_days and mode==\"forecast\" else \"\")}],\n", + " tools=weatherapi_tool_schema,\n", + " tool_choice={\"type\": \"function\", \"function\": {\"name\": \"get_weatherapi_data\", \"arguments\": json.dumps(args)}}\n", + " )\n", + " message = response.choices[0].message\n", + "\n", + " if hasattr(message, \"tool_calls\") and message.tool_calls:\n", + " tool_call = message.tool_calls[0]\n", + " args2 = json.loads(tool_call.function.arguments) # not really needed, already have args\n", + " location = args2.get(\"location\", user_query)\n", + " mode = args2.get(\"mode\", mode)\n", + " date = args2.get(\"date\", date)\n", + " forecast_days = args2.get(\"forecast_days\", forecast_days)\n", + " weather_data = get_weatherapi_data(location, mode, date, forecast_days)\n", + " tool_result = f\"Weather data (mode={mode}) for {location}:\\n{json.dumps(weather_data, indent=2)[:3000]}\"\n", + " followup = openai.chat.completions.create(\n", + " model=\"gpt-4-0613\",\n", + " messages=[\n", + " {\"role\": \"user\", \"content\": f\"Get me {mode} weather for {location}\"},\n", + " message,\n", + " {\n", + " \"role\": \"tool\",\n", + " \"tool_call_id\": tool_call.id,\n", + " \"content\": tool_result\n", + " }\n", + " ]\n", + " )\n", + " answer = followup.choices[0].message.content.strip()\n", + " return answer\n", + " else:\n", + " return getattr(message, \"content\", \"\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "44071389", + "metadata": {}, + "outputs": [], + "source": [ + "def update_date_visibility(mode):\n", + " return gr.update(visible=(mode==\"historical\"))\n", + "\n", + "def update_days_visibility(mode):\n", + " return gr.update(visible=(mode==\"forecast\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "618a5494", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "* Running on local URL: http://127.0.0.1:7861\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": 13, + "metadata": {}, + "output_type": "execute_result" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Recognized speech: Error opening audio file: FLAC conversion utility not available - consider installing the FLAC command line application by running `apt-get install flac` or your operating system's equivalent\n" + ] + } + ], + "source": [ + "with gr.Blocks() as demo:\n", + " gr.Markdown(\"## Weather Chat Agent (Current, Historical, Forecast)\")\n", + "\n", + " with gr.Row():\n", + " city_input = gr.Textbox(label=\"City/Location\")\n", + " mode_input = gr.Dropdown(\n", + " [\"current\", \"historical\", \"forecast\"],\n", + " value=\"current\",\n", + " label=\"Weather Mode\")\n", + " with gr.Row():\n", + " date_input = gr.Textbox(label=\"Date for historical (YYYY-MM-DD)\", visible=False)\n", + " days_input = gr.Textbox(label=\"Forecast Days (for forecast)\", value=\"3\", visible=False)\n", + " audio_input = gr.Audio(type=\"filepath\", format=\"wav\", label=\"Or Speak your City/Location (optional)\")\n", + " output_box = gr.Textbox(label=\"Weather Info\", lines=8)\n", + " btn = gr.Button(\"Get Weather\")\n", + "\n", + " # Show/hide date and days inputs based on dropdown\n", + " mode_input.change(update_date_visibility, mode_input, date_input)\n", + " mode_input.change(update_days_visibility, mode_input, days_input)\n", + " btn.click(\n", + " chat_agent,\n", + " [city_input, mode_input, date_input, days_input, audio_input],\n", + " output_box\n", + " )\n", + "\n", + "demo.launch()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "llms", + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 269b650f359f5f27265106d67f34fe49ce9930b8 Mon Sep 17 00:00:00 2001 From: Syed Abrar Ahmad Date: Mon, 18 Aug 2025 20:25:18 +0500 Subject: [PATCH 39/72] Added Exercise for Week3. --- .../week3_exercise_by_abrar.ipynb | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 week3/community-contributions/week3_exercise_by_abrar.ipynb diff --git a/week3/community-contributions/week3_exercise_by_abrar.ipynb b/week3/community-contributions/week3_exercise_by_abrar.ipynb new file mode 100644 index 0000000..6339e85 --- /dev/null +++ b/week3/community-contributions/week3_exercise_by_abrar.ipynb @@ -0,0 +1,49 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "61f56afc-bc15-46a4-8eb1-d940c332cf52", + "metadata": {}, + "source": [ + "# Synthetic Data Studio\n", + "\n", + "It includes useful code to connect your Google Drive to your Colab and Hugging Face Model. \n", + "To use the Huggingface Model, you first need to create an account on HuggingFace and then send a request to the required model. \n", + "\n", + "\n", + "https://colab.research.google.com/drive/1W3JPe0F6su8sNpfdlp2uqXqWZChevHYa?usp=sharing\n", + "\n", + "This should run nicely on a low-cost or free T4 box." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e9289ba7-200c-43a9-b67a-c5ce826c9537", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From f4d092acc6617605891ad990d489c10306b3a279 Mon Sep 17 00:00:00 2001 From: Oluwaseyi-A <62573285+Oluwaseyi-A@users.noreply.github.com> Date: Mon, 18 Aug 2025 23:03:41 -0400 Subject: [PATCH 40/72] Add week2 notebooks to community-contributions --- .../brochure-builder-with-gradio.ipynb | 456 ++++++++++++++++++ .../pitting-llms-against-each-other.ipynb | 254 ++++++++++ 2 files changed, 710 insertions(+) create mode 100644 week2/community-contributions/brochure-builder-with-gradio.ipynb create mode 100644 week2/community-contributions/pitting-llms-against-each-other.ipynb diff --git a/week2/community-contributions/brochure-builder-with-gradio.ipynb b/week2/community-contributions/brochure-builder-with-gradio.ipynb new file mode 100644 index 0000000..42f41b7 --- /dev/null +++ b/week2/community-contributions/brochure-builder-with-gradio.ipynb @@ -0,0 +1,456 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "9905f163-759f-474b-8f7a-7d14da0df44d", + "metadata": {}, + "source": [ + "### BUSINESS CHALLENGE: Using Multi-shot Prompting\n", + "#### Day 5\n", + "\n", + "Create a product that builds a Brochure for a company to be used for prospective clients, investors and potential recruits.\n", + "\n", + "We will be provided a company name and their primary website." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "a0895f24-65ff-4624-8ae0-15d2d400d8f0", + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "# If these fail, please check you're running from an 'activated' environment with (llms) in the command prompt\n", + "\n", + "import os\n", + "import requests\n", + "import json\n", + "from typing import List\n", + "from dotenv import load_dotenv\n", + "from bs4 import BeautifulSoup\n", + "from IPython.display import Markdown, display, update_display\n", + "from openai import OpenAI\n", + "import gradio as gr" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "7794aa70-5962-4669-b86f-b53639f4f9ea", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "OpenAI API Key exists and begins sk-proj-\n", + "Anthropic API Key exists and begins sk-ant-\n", + "Google API Key exists and begins AIzaSyCf\n" + ] + } + ], + "source": [ + "# Initialize and constants\n", + "\n", + "# Load environment variables in a file called .env\n", + "# Print the key prefixes to help with any debugging\n", + "\n", + "load_dotenv(override=True)\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": 3, + "id": "cfb690e2-4940-4dc8-8f32-5c2dab3c19da", + "metadata": {}, + "outputs": [], + "source": [ + "# Connect to OpenAI\n", + "\n", + "openai = OpenAI()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "81022472-755e-4a87-bd5d-58babb09e94b", + "metadata": {}, + "outputs": [], + "source": [ + "gpt_model = \"gpt-4.1-mini\"\n", + "claude_model = \"claude-3-5-haiku-latest\"\n", + "gemini_model = \"gemini-2.5-flash\"" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "63bf8631-2746-4255-bec1-522855d3e812", + "metadata": {}, + "outputs": [], + "source": [ + "# A class to represent a Webpage\n", + "\n", + "# Some websites need you to use proper headers when fetching them:\n", + "headers = {\n", + " \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36\"\n", + "}\n", + "\n", + "class Website:\n", + " \"\"\"\n", + " A utility class to represent a Website that we have scraped, now with links\n", + " \"\"\"\n", + "\n", + " def __init__(self, url):\n", + " self.url = url\n", + " response = requests.get(url, headers=headers)\n", + " self.body = response.content\n", + " soup = BeautifulSoup(self.body, 'html.parser')\n", + " self.title = soup.title.string if soup.title else \"No title found\"\n", + " if soup.body:\n", + " for irrelevant in soup.body([\"script\", \"style\", \"img\", \"input\"]):\n", + " irrelevant.decompose()\n", + " self.text = soup.body.get_text(separator=\"\\n\", strip=True)\n", + " else:\n", + " self.text = \"\"\n", + " links = [link.get('href') for link in soup.find_all('a')]\n", + " self.links = [link for link in links if link]\n", + "\n", + " def get_contents(self):\n", + " return f\"Webpage Title:\\n{self.title}\\nWebpage Contents:\\n{self.text}\\n\\n\"" + ] + }, + { + "cell_type": "markdown", + "id": "1e7bb527-e769-4245-bb91-ae65e64593ff", + "metadata": {}, + "source": [ + "## First step: Have LLM figure out which links are relevant\n", + "\n", + "### Use a call to the LLM to read the links on a webpage, and respond in structured JSON. " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "1ce303ae-b967-4261-aadc-02dafa54db4a", + "metadata": {}, + "outputs": [], + "source": [ + "link_system_prompt = \"You are provided with a list of links found on a webpage. \\\n", + "You are able to decide which of the links would be most relevant to include in a brochure about the company, \\\n", + "such as links to an About page, or a Company page, or Careers/Jobs pages.\\n\"\n", + "link_system_prompt += \"You should respond in JSON as in this example:\"\n", + "link_system_prompt += \"\"\"\n", + "{\n", + " \"links\": [\n", + " {\"type\": \"about page\", \"url\": \"https://full.url/goes/here/about\"},\n", + " {\"type\": \"careers page\", \"url\": \"https://another.full.url/careers\"}\n", + " ]\n", + "}\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "d24a4c0c-a1d1-4897-b2a7-4128d25c2e08", + "metadata": {}, + "outputs": [], + "source": [ + "def get_links_user_prompt(website):\n", + " user_prompt = f\"Here is the list of links on the website of {website.url} - \"\n", + " user_prompt += \"please decide which of these are relevant web links for a brochure about the company, respond with the full https URL in JSON format. \\\n", + "Do not include Terms of Service, Privacy, email links.\\n\"\n", + " user_prompt += \"Links (some might be relative links):\\n\"\n", + " user_prompt += \"\\n\".join(website.links)\n", + " return user_prompt" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "8103fc11-5bc0-41c4-8c97-502c9e96429c", + "metadata": {}, + "outputs": [], + "source": [ + "def get_links(url, model): # 1st inference\n", + " website = Website(url)\n", + " response = openai.chat.completions.create(\n", + " model=model,\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": link_system_prompt},\n", + " {\"role\": \"user\", \"content\": get_links_user_prompt(website)}\n", + " ],\n", + " response_format={\"type\": \"json_object\"}\n", + " )\n", + " result = response.choices[0].message.content\n", + " return json.loads(result)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "dc84a695-515d-4292-9a95-818f4fe3d20e", + "metadata": {}, + "outputs": [], + "source": [ + "huggingface = Website(\"https://huggingface.co\")" + ] + }, + { + "cell_type": "markdown", + "id": "91896908-1632-41fc-9b8b-39a7638d8dd1", + "metadata": {}, + "source": [ + "## Second step: make the brochure!\n", + "\n", + "Assemble all the details into another prompt to GPT4-o" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "ab7c54e3-e654-4b1f-8671-09194b628aa0", + "metadata": {}, + "outputs": [], + "source": [ + "def get_all_details(url, model): # 1st inference wrapper\n", + " result = \"Landing page:\\n\"\n", + " result += Website(url).get_contents()\n", + " links = get_links(url, model) # inference\n", + " # print(\"Found links:\", links)\n", + " for link in links[\"links\"]:\n", + " result += f\"\\n\\n{link['type']}\\n\"\n", + " result += Website(link[\"url\"]).get_contents()\n", + " return result" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "ea9f54d1-a248-4c56-a1de-6633193de5bf", + "metadata": {}, + "outputs": [], + "source": [ + "system_prompt = \"You are an assistant that analyzes the contents of several relevant pages from a company website \\\n", + "and creates a short humorous, entertaining, jokey brochure about the company for prospective customers, investors and recruits. Respond in markdown.\\\n", + "Include details of company culture, customers and careers/jobs if you have the information.\"" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "13412c85-badd-4d79-a5ac-8283e4bb832f", + "metadata": {}, + "outputs": [], + "source": [ + "def get_brochure_user_prompt(company_name, url, model):\n", + " user_prompt = f\"You are looking at a company called: {company_name}\\n\"\n", + " user_prompt += f\"Here are the contents of its landing page and other relevant pages; use this information to build a short brochure of the company.\\n\"\n", + " user_prompt += get_all_details(url, model) # inference wrapper\n", + " user_prompt = user_prompt[:5_000] # Truncate if more than 5,000 characters\n", + " return user_prompt" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "107a2100-3f7d-4f16-8ba7-b5da602393c6", + "metadata": {}, + "outputs": [], + "source": [ + "def stream_gpt(company_name, url):\n", + " stream = openai.chat.completions.create(\n", + " model=gpt_model,\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": get_brochure_user_prompt(company_name, url, gpt_model)}\n", + " ],\n", + " stream=True\n", + " )\n", + " \n", + " result = \"\"\n", + " for chunk in stream:\n", + " result += chunk.choices[0].delta.content or \"\"\n", + " yield result" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "eaf61e44-537a-41ff-a82c-9525df8abc83", + "metadata": {}, + "outputs": [], + "source": [ + "claude_via_openai_client = OpenAI(\n", + " api_key=anthropic_api_key,\n", + " base_url=\"https://api.anthropic.com/v1\" \n", + ")\n", + "\n", + "def stream_claude(company_name, url):\n", + " result = claude_via_openai_client.chat.completions.create(\n", + " model=claude_model,\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": get_brochure_user_prompt(company_name, url, claude_model)}\n", + " ],\n", + " stream=True\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": 15, + "id": "93e75fca-e54e-4637-86f1-4acc04b04d65", + "metadata": {}, + "outputs": [], + "source": [ + "gemini_via_openai_client = OpenAI(\n", + " api_key=google_api_key, \n", + " base_url=\"https://generativelanguage.googleapis.com/v1beta/openai/\"\n", + ")\n", + "\n", + "def stream_gemini(company_name, url):\n", + " result = gemini_via_openai_client.chat.completions.create(\n", + " model=gemini_model,\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": get_brochure_user_prompt(company_name, url, gemini_model)}\n", + " ],\n", + " stream=True\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": 16, + "id": "26cbe9b5-3603-49a1-a676-75c7ddaacdb8", + "metadata": {}, + "outputs": [], + "source": [ + "# stream_gpt(\"HuggingFace\", \"https://huggingface.co\")" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "f19be4c0-71a1-427e-b3dc-e1896e2c078b", + "metadata": {}, + "outputs": [], + "source": [ + "def stream_model(company_name, url, model):\n", + " yield \"\"\n", + " if model==\"GPT\":\n", + " result = stream_gpt(company_name, url)\n", + " elif model==\"Claude\":\n", + " result = stream_claude(company_name, url)\n", + " elif model==\"Gemini\":\n", + " result = stream_gemini(company_name, url)\n", + " else:\n", + " raise ValueError(\"Unknown model\")\n", + " yield from result" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "ab510f66-b25c-4c25-92d0-e3c735b8b5fa", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "* Running on local URL: http://127.0.0.1:7871\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": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "view = gr.Interface(\n", + " fn=stream_model,\n", + " inputs=[gr.Textbox(label=\"Company\"), gr.Textbox(label=\"URL\"), gr.Dropdown([\"GPT\", \n", + " # \"Claude\", #TODO\n", + " # \"Gemini\"\n", + " ], label=\"Select model\", value=\"GPT\")],\n", + " outputs=[gr.Markdown(label=\"Response:\")],\n", + " flagging_mode=\"never\"\n", + ")\n", + "view.launch()" + ] + } + ], + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/week2/community-contributions/pitting-llms-against-each-other.ipynb b/week2/community-contributions/pitting-llms-against-each-other.ipynb new file mode 100644 index 0000000..53e2e70 --- /dev/null +++ b/week2/community-contributions/pitting-llms-against-each-other.ipynb @@ -0,0 +1,254 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "10c54e52-3d1c-48cc-a0f6-efda6d90fbbb", + "metadata": {}, + "source": [ + "# Pitting LLMs Against Each Other\n", + "Three LLMs, namely OpenAI’s GPT, Anthropic’s Claude, and Google’s Gemini, go head-to-head in a three-way conversational debate." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "40677b08-18e9-4a88-a103-5b50d2bbecff", + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "\n", + "import os\n", + "from dotenv import load_dotenv\n", + "from openai import OpenAI\n", + "import anthropic\n", + "from IPython.display import Markdown, display, update_display\n", + "import google.generativeai" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "df5a52ba-ea13-4dbf-a695-e1398a484cc8", + "metadata": {}, + "outputs": [], + "source": [ + "# Load environment variables in a file called .env\n", + "# Print the key prefixes to help with any debugging\n", + "\n", + "load_dotenv(override=True)\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": null, + "id": "1ededc77-2672-4e27-b1c8-11f6f8ff8970", + "metadata": {}, + "outputs": [], + "source": [ + "# Connect to OpenAI, Anthropic, Gemini\n", + "\n", + "openai = OpenAI()\n", + "\n", + "# claude = anthropic.Anthropic()\n", + "\n", + "# google.generativeai.configure()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3b311279-5993-4226-ae08-991e974230fb", + "metadata": {}, + "outputs": [], + "source": [ + "# Let's make a conversation between GPT-4.1-mini and Claude-3.5-haiku and Gemini\n", + "\n", + "gpt_model = \"gpt-4.1-mini\"\n", + "claude_model = \"claude-3-5-haiku-latest\"\n", + "gemini_model = \"gemini-2.5-flash\"\n", + "\n", + "gpt_system = \"You are a chatbot in a conversation with 2 other chatbots; \\\n", + "debate which of you is the best.\"\n", + "\n", + "claude_system = \"You are a chatbot in a conversation with 2 other chatbots; \\\n", + "debate which of you is the best.\"\n", + "\n", + "gemini_system = \"You are a chatbot in a conversation with 2 other chatbots; \\\n", + "debate which of you is the best.\"\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "85bdfab1-6602-46b3-a1d2-bdb36880d9d6", + "metadata": {}, + "outputs": [], + "source": [ + "def alex_prompt():\n", + " user_prompt = f\"\"\"\n", + " You are Alex, in conversation with Blake and Charlie.\n", + " The conversation so far is as follows:\n", + " {format_conversation()}\n", + " Now with this, respond with what you would like to say next, as Alex.\n", + " \"\"\"\n", + " return user_prompt\n", + "\n", + "def blake_prompt():\n", + " user_prompt = f\"\"\"\n", + " You are Blake, in conversation with Alex and Charlie.\n", + " The conversation so far is as follows:\n", + " {format_conversation()}\n", + " Now with this, respond with what you would like to say next, as Blake.\n", + " \"\"\"\n", + " return user_prompt\n", + "\n", + "def charlie_prompt():\n", + " user_prompt = f\"\"\"\n", + " You are Charlie, in conversation with Alex and Blake.\n", + " The conversation so far is as follows:\n", + " {format_conversation()}\n", + " Now with this, respond with what you would like to say next, as Charlie.\n", + " \"\"\"\n", + " return user_prompt\n", + "\n", + "# Shared conversation history\n", + "conversation = []\n", + "\n", + "def format_conversation():\n", + " return \"\\n\".join(conversation)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6f7c745d-7d75-468b-93ac-7a1d95f2e047", + "metadata": {}, + "outputs": [], + "source": [ + "def alex_says():\n", + " response = openai.chat.completions.create(\n", + " model=gpt_model,\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": gpt_system},\n", + " {\"role\": \"user\", \"content\": alex_prompt()}\n", + " ],\n", + " )\n", + " result = response.choices[0].message.content\n", + " return result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6e28f4c9-0297-4762-a3ea-b961e0d6d980", + "metadata": {}, + "outputs": [], + "source": [ + "gemini_via_openai_client = OpenAI(\n", + " api_key=google_api_key, \n", + " base_url=\"https://generativelanguage.googleapis.com/v1beta/openai/\"\n", + ")\n", + "\n", + "def blake_says():\n", + " response = gemini_via_openai_client.chat.completions.create(\n", + " model=gemini_model,\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": gemini_system},\n", + " {\"role\": \"user\", \"content\": blake_prompt()}\n", + " ],\n", + " )\n", + " result = response.choices[0].message.content\n", + " return result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "363b70bf-d3e2-4d05-8a3e-ec5d54460e96", + "metadata": {}, + "outputs": [], + "source": [ + "claude_via_openai_client = OpenAI(\n", + " api_key=anthropic_api_key,\n", + " base_url=\"https://api.anthropic.com/v1\" \n", + ")\n", + "\n", + "def charlie_says():\n", + " response = claude_via_openai_client.chat.completions.create(\n", + " model=claude_model, \n", + " messages=[\n", + " {\"role\": \"system\", \"content\": claude_system},\n", + " {\"role\": \"user\", \"content\": charlie_prompt()}\n", + " ],\n", + " )\n", + " result = response.choices[0].message.content\n", + " return result\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c017eb8c-1709-4ac1-8f17-92c3a6cdbfc0", + "metadata": {}, + "outputs": [], + "source": [ + "# The three models engage in a longer interaction with history.\n", + "\n", + "for i in range(5):\n", + " alex_next = alex_says()\n", + " print(f\"Alex (GPT):\\n{alex_next}\\n\")\n", + " conversation.append(f\"Alex: {alex_next}\")\n", + " \n", + " blake_next = blake_says()\n", + " print(f\"Blake (Gemini):\\n{blake_next}\\n\")\n", + " conversation.append(f\"Blake: {blake_next}\")\n", + "\n", + " charlie_next = charlie_says()\n", + " print(f\"Charlie (Claude):\\n{charlie_next}\\n\")\n", + " conversation.append(f\"Charlie: {charlie_next}\") \n", + "\n", + " # break" + ] + } + ], + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From a4c9456c3844b7264c44293c8a433c28f74aff61 Mon Sep 17 00:00:00 2001 From: Sarita Bandarupalli Date: Wed, 20 Aug 2025 16:56:30 -0400 Subject: [PATCH 41/72] Added Sarita_B contributions to community-contributions --- .../fitness-nutrition-planner-agent/README.md | 101 +++++ .../fitness-nutrition-planner-agent/agent.py | 411 ++++++++++++++++++ .../fitness-nutrition-planner-agent/app.py | 75 ++++ .../demo_output.md | 84 ++++ .../sample_profile.json | 17 + 5 files changed, 688 insertions(+) create mode 100644 community-contributions/fitness-nutrition-planner-agent/README.md create mode 100644 community-contributions/fitness-nutrition-planner-agent/agent.py create mode 100644 community-contributions/fitness-nutrition-planner-agent/app.py create mode 100644 community-contributions/fitness-nutrition-planner-agent/demo_output.md create mode 100644 community-contributions/fitness-nutrition-planner-agent/sample_profile.json diff --git a/community-contributions/fitness-nutrition-planner-agent/README.md b/community-contributions/fitness-nutrition-planner-agent/README.md new file mode 100644 index 0000000..a447792 --- /dev/null +++ b/community-contributions/fitness-nutrition-planner-agent/README.md @@ -0,0 +1,101 @@ + +# Fitness & Nutrition Planner Agent (Community Contribution) + +A tool-using agent that generates a **7‑day vegetarian-friendly meal plan** with **calorie/macro targets** and a **consolidated grocery list**. It supports **targeted swaps** (e.g., "swap Tuesday lunch") while honoring dietary patterns, allergies, and dislikes. + +> **Disclaimer**: This project is for educational purposes and is **not** medical advice. Consult a licensed professional for medical or specialized dietary needs. + +--- + +## ✨ Features +- Calculates **TDEE** and **macro targets** via Mifflin–St Jeor + activity factors. +- Builds a **7‑day plan** (breakfast/lunch/dinner) respecting dietary constraints. +- Produces an aggregated **grocery list** for the week. +- Supports **swap** of any single meal while keeping macros reasonable. +- Minimal **Streamlit UI** for demos. +- Extensible **tool-based architecture** to plug real recipe APIs/DBs. + +--- + +## 🧱 Architecture +- **Agent core**: OpenAI function-calling (tools) with a simple orchestration loop. +- **Tools**: + 1. `calc_calories_and_macros` – computes targets. + 2. `compose_meal_plan` – creates the 7‑day plan. + 3. `grocery_list_from_plan` – consolidates ingredients/quantities. + 4. `swap_meal` – replaces one meal (by kcal proximity and constraints). +- **Recipe source**: a tiny in-memory recipe DB for demo; replace with a real API or your own dataset. + +--- + +## 🚀 Quickstart + +### 1) Install +```bash +pip install openai streamlit pydantic python-dotenv +``` + +### 2) Configure +Create a `.env` file in this folder: +``` +OPENAI_API_KEY=your_key_here +OPENAI_MODEL=gpt-4o-mini +``` + +### 3) Run CLI (example) +```bash +python agent.py +``` + +### 4) Run UI +```bash +streamlit run app.py +``` + +--- + +## 🧪 Sample Profile (from issue author) +See `sample_profile.json` for the exact values used to produce `demo_output.md`. +- **Sex**: female +- **Age**: 45 +- **Height**: 152 cm (~5 ft) +- **Weight**: 62 kg +- **Activity**: light +- **Goal**: maintain +- **Diet**: vegetarian + +--- + +## 🔧 Extend +- Replace the in-memory recipes with: + - A real **recipe API** (e.g., Spoonacular) or + - Your **own dataset** (CSV/DB) + filters/tags +- Add price lookups to produce a **budget-aware** grocery list. +- Add **adherence tracking** and charts. +- Integrate **wearables** or daily steps to refine TDEE dynamically. +- Add **snacks** for days slightly under target kcals. + +--- + +## 🛡️ Safety Notes +- The agent warns for extreme deficits but does **not** diagnose conditions. +- For calorie targets below commonly recommended minimums (e.g., ~1200 kcal/day for many adults), advise consulting a professional. + +--- + +## 📁 Project Layout +``` +fitness-nutrition-planner-agent/ +├─ README.md +├─ agent.py +├─ app.py +├─ sample_profile.json +└─ demo_output.md +``` + +--- + +## 🤝 How to contribute +- Keep notebooks (if any) with **cleared outputs**. +- Follow the course repo’s contribution guidelines. +- Include screenshots or a short Loom/YT demo link in your PR description. diff --git a/community-contributions/fitness-nutrition-planner-agent/agent.py b/community-contributions/fitness-nutrition-planner-agent/agent.py new file mode 100644 index 0000000..75bcd10 --- /dev/null +++ b/community-contributions/fitness-nutrition-planner-agent/agent.py @@ -0,0 +1,411 @@ + +# agent.py +import os, math, json, copy +from dataclasses import dataclass +from typing import List, Dict, Any, Optional, Tuple +from pydantic import BaseModel, Field, ValidationError +from dotenv import load_dotenv +from openai import OpenAI + +load_dotenv() + +# ------------------------------ +# Data models +# ------------------------------ +class UserProfile(BaseModel): + sex: str = Field(..., description="male or female") + age: int + height_cm: float + weight_kg: float + activity_level: str = Field(..., description="sedentary, light, moderate, active, very_active") + goal: str = Field(..., description="lose, maintain, gain") + dietary_pattern: Optional[str] = Field(None, description="e.g., vegetarian, vegan, halal, kosher") + allergies: List[str] = Field(default_factory=list) + dislikes: List[str] = Field(default_factory=list) + daily_meals: int = 3 + cuisine_prefs: List[str] = Field(default_factory=list) + time_per_meal_minutes: int = 30 + budget_level: Optional[str] = Field(None, description="low, medium, high") + +class MacroTargets(BaseModel): + tdee: int + target_kcal: int + protein_g: int + carbs_g: int + fat_g: int + +class Meal(BaseModel): + name: str + ingredients: List[Dict[str, Any]] # {item, qty, unit} + kcal: int + protein_g: int + carbs_g: int + fat_g: int + tags: List[str] = Field(default_factory=list) + instructions: Optional[str] = None + +class DayPlan(BaseModel): + day: str + meals: List[Meal] + totals: MacroTargets + +class WeekPlan(BaseModel): + days: List[DayPlan] + meta: Dict[str, Any] + +# ------------------------------ +# Tiny in-memory recipe “DB” +# (extend/replace with a real source) +# ------------------------------ +RECIPE_DB: List[Meal] = [ + Meal( + name="Greek Yogurt Parfait", + ingredients=[{"item":"nonfat greek yogurt","qty":200,"unit":"g"}, + {"item":"berries","qty":150,"unit":"g"}, + {"item":"granola","qty":30,"unit":"g"}, + {"item":"honey","qty":10,"unit":"g"}], + kcal=380, protein_g=30, carbs_g=52, fat_g=8, + tags=["vegetarian","breakfast","5-min","no-cook"] + ), + Meal( + name="Tofu Veggie Stir-Fry with Rice", + ingredients=[{"item":"firm tofu","qty":150,"unit":"g"}, + {"item":"mixed vegetables","qty":200,"unit":"g"}, + {"item":"soy sauce (low sodium)","qty":15,"unit":"ml"}, + {"item":"olive oil","qty":10,"unit":"ml"}, + {"item":"brown rice (cooked)","qty":200,"unit":"g"}], + kcal=650, protein_g=28, carbs_g=85, fat_g=20, + tags=["vegan","gluten-free","dinner","20-min","stovetop","soy"] + ), + Meal( + name="Chicken Quinoa Bowl", + ingredients=[{"item":"chicken breast","qty":140,"unit":"g"}, + {"item":"quinoa (cooked)","qty":185,"unit":"g"}, + {"item":"spinach","qty":60,"unit":"g"}, + {"item":"olive oil","qty":10,"unit":"ml"}, + {"item":"lemon","qty":0.5,"unit":"unit"}], + kcal=620, protein_g=45, carbs_g=55, fat_g=20, + tags=["gluten-free","dinner","25-min","high-protein","poultry"] + ), + Meal( + name="Lentil Soup + Wholegrain Bread", + ingredients=[{"item":"lentils (cooked)","qty":200,"unit":"g"}, + {"item":"vegetable broth","qty":400,"unit":"ml"}, + {"item":"carrot","qty":80,"unit":"g"}, + {"item":"celery","qty":60,"unit":"g"}, + {"item":"onion","qty":60,"unit":"g"}, + {"item":"wholegrain bread","qty":60,"unit":"g"}], + kcal=520, protein_g=25, carbs_g=78, fat_g=8, + tags=["vegan","lunch","30-min","budget"] + ), + Meal( + name="Salmon, Potatoes & Greens", + ingredients=[{"item":"salmon fillet","qty":150,"unit":"g"}, + {"item":"potatoes","qty":200,"unit":"g"}, + {"item":"broccoli","qty":150,"unit":"g"}, + {"item":"olive oil","qty":10,"unit":"ml"}], + kcal=680, protein_g=42, carbs_g=52, fat_g=30, + tags=["gluten-free","dinner","omega-3","fish"] + ), + Meal( + name="Cottage Cheese Bowl", + ingredients=[{"item":"low-fat cottage cheese","qty":200,"unit":"g"}, + {"item":"pineapple","qty":150,"unit":"g"}, + {"item":"chia seeds","qty":15,"unit":"g"}], + kcal=380, protein_g=32, carbs_g=35, fat_g=10, + tags=["vegetarian","snack","5-min","high-protein","dairy"] + ), +] + +# ------------------------------ +# Tool implementations +# ------------------------------ +ACTIVITY_FACTORS = { + "sedentary": 1.2, + "light": 1.375, + "moderate": 1.55, + "active": 1.725, + "very_active": 1.9 +} + +def mifflin_st_jeor(weight_kg: float, height_cm: float, age: int, sex: str) -> float: + # BMR (kcal/day) + if sex.lower().startswith("m"): + return 10*weight_kg + 6.25*height_cm - 5*age + 5 + else: + return 10*weight_kg + 6.25*height_cm - 5*age - 161 + +def compute_targets(profile: UserProfile) -> MacroTargets: + bmr = mifflin_st_jeor(profile.weight_kg, profile.height_cm, profile.age, profile.sex) + tdee = int(round(bmr * ACTIVITY_FACTORS.get(profile.activity_level, 1.2))) + # goal adjustment + if profile.goal == "lose": + target_kcal = max(1200, int(tdee - 400)) # conservative deficit + elif profile.goal == "gain": + target_kcal = int(tdee + 300) + else: + target_kcal = tdee + + # Macro split (modifiable): P 30%, C 40%, F 30% + protein_kcal = target_kcal * 0.30 + carbs_kcal = target_kcal * 0.40 + fat_kcal = target_kcal * 0.30 + protein_g = int(round(protein_kcal / 4)) + carbs_g = int(round(carbs_kcal / 4)) + fat_g = int(round(fat_kcal / 9)) + + return MacroTargets(tdee=tdee, target_kcal=target_kcal, + protein_g=protein_g, carbs_g=carbs_g, fat_g=fat_g) + +def _allowed(meal: Meal, profile: UserProfile) -> bool: + # dietary patterns/allergies/dislikes filters (simple; extend as needed) + diet = (profile.dietary_pattern or "").lower() + if diet == "vegetarian" and ("fish" in meal.tags or "poultry" in meal.tags): + return False + if diet == "vegan" and ("dairy" in meal.tags or "fish" in meal.tags or "poultry" in meal.tags): + return False + # allergies & dislikes + for a in profile.allergies: + if a and a.lower() in meal.name.lower(): return False + if any(a.lower() in (ing["item"]).lower() for ing in meal.ingredients): return False + if a.lower() in " ".join(meal.tags).lower(): return False + for d in profile.dislikes: + if d and d.lower() in meal.name.lower(): return False + if any(d.lower() in (ing["item"]).lower() for ing in meal.ingredients): return False + return True + +def meal_db_search(profile: UserProfile, tags: Optional[List[str]] = None) -> List[Meal]: + tags = tags or [] + out = [] + for m in RECIPE_DB: + if not _allowed(m, profile): + continue + if tags and not any(t in m.tags for t in tags): + continue + out.append(m) + return out or [] # may be empty; agent should handle + +def compose_meal_plan(profile: UserProfile, targets: MacroTargets) -> WeekPlan: + # naive heuristic: pick meals that roughly match per-meal macro budget + per_meal_kcal = targets.target_kcal / profile.daily_meals + days = [] + weekdays = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"] + + # simple pools + breakfasts = meal_db_search(profile, tags=["breakfast","no-cook","5-min"]) + lunches = meal_db_search(profile, tags=["lunch","budget"]) + dinners = meal_db_search(profile, tags=["dinner","high-protein"]) + + # fallback to any allowed meals if pools too small + allowed_all = meal_db_search(profile) + if len(breakfasts) < 2: breakfasts = allowed_all + if len(lunches) < 2: lunches = allowed_all + if len(dinners) < 2: dinners = allowed_all + + for i, day in enumerate(weekdays): + day_meals = [] + for slot in range(profile.daily_meals): + pool = breakfasts if slot == 0 else (lunches if slot == 1 else dinners) + # pick the meal closest in kcal to per_meal_kcal + pick = min(pool, key=lambda m: abs(m.kcal - per_meal_kcal)) + day_meals.append(copy.deepcopy(pick)) + # compute totals + kcal = sum(m.kcal for m in day_meals) + p = sum(m.protein_g for m in day_meals) + c = sum(m.carbs_g for m in day_meals) + f = sum(m.fat_g for m in day_meals) + day_targets = MacroTargets(tdee=targets.tdee, target_kcal=int(round(kcal)), + protein_g=p, carbs_g=c, fat_g=f) + days.append(DayPlan(day=day, meals=day_meals, totals=day_targets)) + return WeekPlan(days=days, meta={"per_meal_target_kcal": int(round(per_meal_kcal))}) + +def grocery_list_from_plan(plan: WeekPlan) -> List[Dict[str, Any]]: + # aggregate identical ingredients + agg: Dict[Tuple[str,str], float] = {} + units: Dict[Tuple[str,str], str] = {} + for d in plan.days: + for m in d.meals: + for ing in m.ingredients: + key = (ing["item"].lower(), ing.get("unit","")) + agg[key] = agg.get(key, 0) + float(ing.get("qty", 0)) + units[key] = ing.get("unit","") + items = [] + for (item, unit), qty in sorted(agg.items()): + items.append({"item": item, "qty": round(qty, 2), "unit": unit}) + return items + +def swap_meal(plan: WeekPlan, day: str, meal_index: int, profile: UserProfile) -> WeekPlan: + # replace one meal by closest-kcal allowed alternative that isn't the same + day_idx = next((i for i,d in enumerate(plan.days) if d.day.lower().startswith(day[:3].lower())), None) + if day_idx is None: return plan + current_meal = plan.days[day_idx].meals[meal_index] + candidates = [m for m in meal_db_search(profile) if m.name != current_meal.name] + if not candidates: return plan + pick = min(candidates, key=lambda m: abs(m.kcal - current_meal.kcal)) + plan.days[day_idx].meals[meal_index] = copy.deepcopy(pick) + # recalc day totals + d = plan.days[day_idx] + kcal = sum(m.kcal for m in d.meals) + p = sum(m.protein_g for m in d.meals) + c = sum(m.carbs_g for m in d.meals) + f = sum(m.fat_g for m in d.meals) + d.totals = MacroTargets(tdee=d.totals.tdee, target_kcal=kcal, protein_g=p, carbs_g=c, fat_g=f) + return plan + +# ------------------------------ +# Agent (LLM + tools) +# ------------------------------ +SYS_PROMPT = """You are FitnessPlanner, an agentic planner that: +- Respects dietary patterns, allergies, dislikes, budget, time limits. +- Uses tools to compute targets, assemble a 7-day plan, produce a grocery list, and swap meals on request. +- If a request is unsafe (extreme deficits, medical conditions), warn and suggest professional guidance. +- Keep responses concise and structured (headings + bullet lists).""" + +# Tool registry for function-calling +def get_tools_schema(): + return [ + { + "type": "function", + "function": { + "name": "calc_calories_and_macros", + "description": "Compute TDEE and macro targets from the user's profile.", + "parameters": { + "type":"object", + "properties": {"profile":{"type":"object"}}, + "required":["profile"] + } + } + }, + { + "type": "function", + "function": { + "name": "compose_meal_plan", + "description": "Create a 7-day meal plan matching targets and constraints.", + "parameters": { + "type":"object", + "properties": { + "profile":{"type":"object"}, + "targets":{"type":"object"} + }, + "required":["profile","targets"] + } + } + }, + { + "type": "function", + "function": { + "name": "grocery_list_from_plan", + "description": "Make a consolidated grocery list from a week plan.", + "parameters": { + "type":"object", + "properties": {"plan":{"type":"object"}}, + "required":["plan"] + } + } + }, + { + "type": "function", + "function": { + "name": "swap_meal", + "description": "Swap a single meal in the plan while keeping macros reasonable.", + "parameters": { + "type":"object", + "properties": { + "plan":{"type":"object"}, + "day":{"type":"string"}, + "meal_index":{"type":"integer","description":"0=breakfast,1=lunch,2=dinner"}, + "profile":{"type":"object"} + }, + "required":["plan","day","meal_index","profile"] + } + } + } + ] + +class FitnessPlannerAgent: + def __init__(self, model: Optional[str] = None): + self.client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) + self.model = model or os.getenv("OPENAI_MODEL", "gpt-4o-mini") + self.plan_cache: Optional[WeekPlan] = None + self.targets_cache: Optional[MacroTargets] = None + + # Tool dispatch + def _call_tool(self, name: str, args: Dict[str, Any]) -> str: + if name == "calc_calories_and_macros": + profile = UserProfile(**args["profile"]) + targets = compute_targets(profile) + self.targets_cache = targets + return targets.model_dump_json() + elif name == "compose_meal_plan": + profile = UserProfile(**args["profile"]) + targets = MacroTargets(**args["targets"]) + plan = compose_meal_plan(profile, targets) + self.plan_cache = plan + return plan.model_dump_json() + elif name == "grocery_list_from_plan": + plan = WeekPlan(**args["plan"]) + items = grocery_list_from_plan(plan) + return json.dumps(items) + elif name == "swap_meal": + plan = WeekPlan(**args["plan"]) + profile = UserProfile(**args["profile"]) + day = args["day"] + idx = args["meal_index"] + new_plan = swap_meal(plan, day, idx, profile) + self.plan_cache = new_plan + return new_plan.model_dump_json() + else: + return json.dumps({"error":"unknown tool"}) + + def chat(self, user_message: str, profile: Optional[UserProfile] = None) -> str: + messages = [{"role":"system","content":SYS_PROMPT}] + if profile: + messages.append({"role":"user","content":f"User profile: {profile.model_dump_json()}"} ) + messages.append({"role":"user","content":user_message}) + + # First call + resp = self.client.chat.completions.create( + model=self.model, + messages=messages, + tools=get_tools_schema(), + tool_choice="auto", + temperature=0.3 + ) + + # Handle tool calls (simple, single-step or brief multi-step) + messages_llm = messages + [{"role":"assistant","content":resp.choices[0].message.content or "", + "tool_calls":resp.choices[0].message.tool_calls}] + if resp.choices[0].message.tool_calls: + for tc in resp.choices[0].message.tool_calls: + name = tc.function.name + args = json.loads(tc.function.arguments or "{}") + out = self._call_tool(name, args) + messages_llm.append({ + "role":"tool", + "tool_call_id":tc.id, + "name":name, + "content":out + }) + + # Finalization + resp2 = self.client.chat.completions.create( + model=self.model, + messages=messages_llm, + temperature=0.2 + ) + return resp2.choices[0].message.content + + return resp.choices[0].message.content + +# ------------------------------ +# Quick CLI demo +# ------------------------------ +if __name__ == "__main__": + profile = UserProfile( + sex="female", age=45, height_cm=152, weight_kg=62, + activity_level="light", goal="maintain", + dietary_pattern="vegetarian", allergies=[], dislikes=[], + daily_meals=3, cuisine_prefs=["mediterranean"], time_per_meal_minutes=25, budget_level="medium" + ) + agent = FitnessPlannerAgent() + print(agent.chat("Create my 7-day plan and grocery list.", profile)) diff --git a/community-contributions/fitness-nutrition-planner-agent/app.py b/community-contributions/fitness-nutrition-planner-agent/app.py new file mode 100644 index 0000000..a1f1102 --- /dev/null +++ b/community-contributions/fitness-nutrition-planner-agent/app.py @@ -0,0 +1,75 @@ + +# app.py +import json +import streamlit as st +from agent import FitnessPlannerAgent, UserProfile, WeekPlan + +st.set_page_config(page_title="Fitness & Nutrition Planner Agent", layout="wide") + +st.title("🏋️ Fitness & Nutrition Planner Agent") + +with st.sidebar: + st.header("Your Profile") + sex = st.selectbox("Sex", ["female","male"]) + age = st.number_input("Age", 18, 90, 45) + height_cm = st.number_input("Height (cm)", 120, 220, 152) + weight_kg = st.number_input("Weight (kg)", 35.0, 200.0, 62.0) + activity_level = st.selectbox("Activity Level", ["sedentary","light","moderate","active","very_active"], index=1) + goal = st.selectbox("Goal", ["lose","maintain","gain"], index=1) + dietary_pattern = st.selectbox("Dietary Pattern", ["none","vegetarian","vegan","halal","kosher"], index=1) + if dietary_pattern == "none": dietary_pattern = None + allergies = st.text_input("Allergies (comma-separated)", "") + dislikes = st.text_input("Dislikes (comma-separated)", "") + daily_meals = st.slider("Meals per day", 2, 5, 3) + time_per_meal_minutes = st.slider("Time per meal (min)", 5, 90, 25) + budget_level = st.selectbox("Budget", ["medium","low","high"], index=0) + cuisine_prefs = st.text_input("Cuisine prefs (comma-separated)", "mediterranean") + + build_btn = st.button("Generate 7-Day Plan") + +agent = FitnessPlannerAgent() + +if build_btn: + profile = UserProfile( + sex=sex, age=int(age), height_cm=float(height_cm), weight_kg=float(weight_kg), + activity_level=activity_level, goal=goal, dietary_pattern=dietary_pattern, + allergies=[a.strip() for a in allergies.split(",") if a.strip()], + dislikes=[d.strip() for d in dislikes.split(",") if d.strip()], + daily_meals=int(daily_meals), cuisine_prefs=[c.strip() for c in cuisine_prefs.split(",") if c.strip()], + time_per_meal_minutes=int(time_per_meal_minutes), budget_level=budget_level + ) + st.session_state["profile_json"] = profile.model_dump_json() + with st.spinner("Planning your week..."): + result = agent.chat("Create my 7-day plan and grocery list.", profile) + st.session_state["last_response"] = result + +if "last_response" in st.session_state: + st.subheader("Plan & Groceries") + st.markdown(st.session_state["last_response"]) + +st.divider() +st.subheader("Tweaks") +col1, col2, col3 = st.columns(3) +with col1: + day = st.selectbox("Day to change", ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"]) +with col2: + meal_index = st.selectbox("Meal slot", ["Breakfast (0)","Lunch (1)","Dinner (2)"]) + meal_index = int(meal_index[-2]) # 0/1/2 +with col3: + swap_btn = st.button("Swap Meal") + +if swap_btn and agent.plan_cache: + profile_json = st.session_state.get("profile_json") + if not profile_json: + st.warning("Please generate a plan first.") + else: + new_plan_json = agent._call_tool("swap_meal", { + "plan": agent.plan_cache.model_dump(), + "day": day, + "meal_index": meal_index, + "profile": json.loads(profile_json) + }) + agent.plan_cache = WeekPlan(**json.loads(new_plan_json)) + summary = agent.chat(f"Update summary for {day}: show the swapped meal and new day totals.") + st.session_state["last_response"] = summary + st.markdown(summary) diff --git a/community-contributions/fitness-nutrition-planner-agent/demo_output.md b/community-contributions/fitness-nutrition-planner-agent/demo_output.md new file mode 100644 index 0000000..841fb1e --- /dev/null +++ b/community-contributions/fitness-nutrition-planner-agent/demo_output.md @@ -0,0 +1,84 @@ + +# Demo Output (Sample Profile) + +**Profile**: female, 45, 152 cm, 62 kg, activity: light, goal: maintain, diet: vegetarian + +## Targets +- TDEE ≈ **1680 kcal/day** +- Macros (30/40/30): **Protein 126 g**, **Carbs 168 g**, **Fat 56 g** + +> These are estimates using Mifflin–St Jeor and a light activity factor. Not medical advice. + +--- + +## Example 7-Day Plan (Breakfast / Lunch / Dinner) + +**Mon** +- Greek Yogurt Parfait (380 kcal, 30P/52C/8F) +- Lentil Soup + Wholegrain Bread (520 kcal, 25P/78C/8F) +- Tofu Veggie Stir-Fry with Rice (650 kcal, 28P/85C/20F) +- **Totals** ≈ 1550 kcal, 83P, 215C, 36F + +**Tue** +- Cottage Cheese Bowl (380 kcal, 32P/35C/10F) +- Lentil Soup + Wholegrain Bread (520 kcal, 25P/78C/8F) +- Tofu Veggie Stir-Fry with Rice (650 kcal, 28P/85C/20F) +- **Totals** ≈ 1550 kcal, 85P, 198C, 38F + +**Wed** +- Greek Yogurt Parfait +- Lentil Soup + Wholegrain Bread +- Tofu Veggie Stir-Fry with Rice +- **Totals** ≈ 1550 kcal + +**Thu** +- Cottage Cheese Bowl +- Lentil Soup + Wholegrain Bread +- Tofu Veggie Stir-Fry with Rice +- **Totals** ≈ 1550 kcal + +**Fri** +- Greek Yogurt Parfait +- Lentil Soup + Wholegrain Bread +- Tofu Veggie Stir-Fry with Rice +- **Totals** ≈ 1550 kcal + +**Sat** +- Cottage Cheese Bowl +- Lentil Soup + Wholegrain Bread +- Tofu Veggie Stir-Fry with Rice +- **Totals** ≈ 1550 kcal + +**Sun** +- Greek Yogurt Parfait +- Lentil Soup + Wholegrain Bread +- Tofu Veggie Stir-Fry with Rice +- **Totals** ≈ 1550 kcal + +> Notes: The demo DB is intentionally small. In practice, plug in a larger vegetarian recipe set for more variety. Add snacks if you'd like to reach ~1680 kcal/day. + +--- + +## Grocery List (aggregated, approx for 7 days) + +- nonfat greek yogurt — **1400 g** +- berries — **1050 g** +- granola — **210 g** +- honey — **70 g** +- lentils (cooked) — **1400 g** +- vegetable broth — **2800 ml** +- carrot — **560 g** +- celery — **420 g** +- onion — **420 g** +- wholegrain bread — **420 g** +- firm tofu — **1050 g** +- mixed vegetables — **1400 g** +- soy sauce (low sodium) — **105 ml** +- olive oil — **140 ml** +- brown rice (cooked) — **1400 g** +- low-fat cottage cheese — **600 g** +- pineapple — **450 g** +- chia seeds — **45 g** + +**Tip:** Use the app’s *Swap Meal* to replace any item (e.g., swap Wed dinner). + diff --git a/community-contributions/fitness-nutrition-planner-agent/sample_profile.json b/community-contributions/fitness-nutrition-planner-agent/sample_profile.json new file mode 100644 index 0000000..0f54a9d --- /dev/null +++ b/community-contributions/fitness-nutrition-planner-agent/sample_profile.json @@ -0,0 +1,17 @@ +{ + "sex": "female", + "age": 45, + "height_cm": 152, + "weight_kg": 62, + "activity_level": "light", + "goal": "maintain", + "dietary_pattern": "vegetarian", + "allergies": [], + "dislikes": [], + "daily_meals": 3, + "cuisine_prefs": [ + "mediterranean" + ], + "time_per_meal_minutes": 25, + "budget_level": "medium" +} \ No newline at end of file From 14cf30bf8da874677bc4769bafbb61f9571a7418 Mon Sep 17 00:00:00 2001 From: bilalahmedgb <71471035+bilalahmedgb@users.noreply.github.com> Date: Wed, 20 Aug 2025 17:37:39 -0500 Subject: [PATCH 42/72] Create RAG_Using_Gemini Creating a RAG using Google Gemini --- week5/community-contributions/RAG_Using_Gemini | 1 + 1 file changed, 1 insertion(+) create mode 100644 week5/community-contributions/RAG_Using_Gemini diff --git a/week5/community-contributions/RAG_Using_Gemini b/week5/community-contributions/RAG_Using_Gemini new file mode 100644 index 0000000..73709ba --- /dev/null +++ b/week5/community-contributions/RAG_Using_Gemini @@ -0,0 +1 @@ +Testing From 5623d781391aa90c21980d6d919406a7524af296 Mon Sep 17 00:00:00 2001 From: Oluwaseyi-A <62573285+Oluwaseyi-A@users.noreply.github.com> Date: Thu, 21 Aug 2025 10:39:56 -0400 Subject: [PATCH 43/72] Add week2 exercise to community-contributions --- ...cal-question-answerer-with-gradio-v3.ipynb | 182 ++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 week2/community-contributions/technical-question-answerer-with-gradio-v3.ipynb diff --git a/week2/community-contributions/technical-question-answerer-with-gradio-v3.ipynb b/week2/community-contributions/technical-question-answerer-with-gradio-v3.ipynb new file mode 100644 index 0000000..f6b4146 --- /dev/null +++ b/week2/community-contributions/technical-question-answerer-with-gradio-v3.ipynb @@ -0,0 +1,182 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "2b57204f-3e19-4d11-8901-c0e153ad9992", + "metadata": {}, + "source": [ + "## Technical Question Answerer With Gradio\n", + "- Ask a technical question to a chatbot embued with multimodal capabilities.\n", + "- Choose between different models (e.g. OpenAI's GPT, Anthropic's Claude)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bd8e9bef-87ab-46d6-9393-bb308d7e5bc4", + "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", + "import google.generativeai\n", + "import anthropic\n", + "\n", + "import gradio as gr\n", + "import base64\n", + "from io import BytesIO\n", + "from PIL import Image\n", + "from IPython.display import Audio, display\n", + "\n", + "# Load environment variables in a file called .env\n", + "# Print the key prefixes to help with any debugging\n", + "load_dotenv(override=True)\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\")\n", + "\n", + "# Connect to OpenAI, Anthropic and Google; comment out the Claude or Google lines if you're not using them\n", + "openai = OpenAI()\n", + "claude = anthropic.Anthropic()\n", + "# google.generativeai.configure()\n", + "\n", + "system_message = \"You are a helpful assistant that explains technical contents and responds in markdown\"\n", + "\n", + "def talker(message):\n", + " response = openai.audio.speech.create(\n", + " model=\"tts-1\",\n", + " voice=\"onyx\",\n", + " input=message)\n", + "\n", + " audio_stream = BytesIO(response.content)\n", + " output_filename = \"output_audio.mp3\"\n", + " with open(output_filename, \"wb\") as f:\n", + " f.write(audio_stream.read())\n", + "\n", + " display(Audio(output_filename, autoplay=True))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20486a61-5d59-4370-b92c-3b7fec63835c", + "metadata": {}, + "outputs": [], + "source": [ + "# --- Chat functions ---\n", + "def chat_gpt(history):\n", + " messages = [{\"role\": \"system\", \"content\": system_message}] + history\n", + " response = openai.chat.completions.create(\n", + " model=\"gpt-4o-mini\",\n", + " messages=messages\n", + " )\n", + " reply = response.choices[0].message.content\n", + " history = history + [{\"role\": \"assistant\", \"content\": reply}]\n", + " talker(reply) # make it talk\n", + " return history\n", + "\n", + "\n", + "claude_via_openai_client = OpenAI(\n", + " api_key=anthropic_api_key, \n", + " base_url=\"https://api.anthropic.com/v1\"\n", + ")\n", + "\n", + "def chat_claude(history):\n", + " messages = [{\"role\": \"system\", \"content\": system_message}] + history\n", + " response = claude_via_openai_client.chat.completions.create(\n", + " model=\"claude-3-haiku-20240307\",\n", + " messages=messages\n", + " )\n", + " reply = response.choices[0].message.content\n", + " history = history + [{\"role\": \"assistant\", \"content\": reply}]\n", + " talker(reply) # make it talk\n", + " return history\n", + "\n", + "\n", + "# --- Gradio UI ---\n", + "with gr.Blocks() as ui:\n", + " with gr.Row():\n", + " chatbot = gr.Chatbot(height=500, type=\"messages\")\n", + " with gr.Row():\n", + " the_model = gr.Dropdown([\"GPT\", \"Claude\"], label=\"Select model\", value=\"GPT\")\n", + " with gr.Row():\n", + " entry = gr.Textbox(label=\"Chat with our AI Assistant:\")\n", + " with gr.Row():\n", + " clear = gr.Button(\"Clear\")\n", + "\n", + " def do_entry(message, history, model):\n", + " # add user turn\n", + " history = history + [{\"role\": \"user\", \"content\": message}]\n", + " # call selected model\n", + " if model == \"GPT\":\n", + " history = chat_gpt(history)\n", + " elif model == \"Claude\":\n", + " history = chat_claude(history)\n", + " return \"\", history\n", + "\n", + " entry.submit(\n", + " fn=do_entry,\n", + " inputs=[entry, chatbot, the_model],\n", + " outputs=[entry, chatbot] # only 2 outputs\n", + " )\n", + "\n", + " clear.click(lambda: [], None, chatbot, queue=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13974664-2965-46b9-9c56-714c70d3f835", + "metadata": {}, + "outputs": [], + "source": [ + "ui.launch(inbrowser=True)\n", + "\n", + "# prompt = \"\"\"\n", + "# Please explain what this code does and why:\n", + "# yield from {book.get(\"author\") for book in books if book.get(\"author\")}\n", + "# \"\"\"" + ] + } + ], + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From c4b0e04e67420523dbf1f11902e6939f761c94a8 Mon Sep 17 00:00:00 2001 From: Elijah Rwothoromo Date: Thu, 21 Aug 2025 20:59:03 +0300 Subject: [PATCH 44/72] Week 3 assignment and task --- .../rwothoromo/week3day5assignment.ipynb | 249 ++++++++++++++++++ .../rwothoromo/week3day5task.ipynb | 226 ++++++++++++++++ 2 files changed, 475 insertions(+) create mode 100644 week3/community-contributions/rwothoromo/week3day5assignment.ipynb create mode 100644 week3/community-contributions/rwothoromo/week3day5task.ipynb diff --git a/week3/community-contributions/rwothoromo/week3day5assignment.ipynb b/week3/community-contributions/rwothoromo/week3day5assignment.ipynb new file mode 100644 index 0000000..a42e611 --- /dev/null +++ b/week3/community-contributions/rwothoromo/week3day5assignment.ipynb @@ -0,0 +1,249 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "18b82c6b-10dc-4d94-b8dc-592ff011ce2b", + "metadata": {}, + "source": [ + "# Meeting minutes creator\n", + "\n", + "In this colab, we make a meeting minutes program.\n", + "\n", + "It includes useful code to connect your Google Drive to your colab.\n", + "\n", + "Upload your own audio to make this work!!\n", + "\n", + "https://colab.research.google.com/drive/13wR4Blz3Ot_x0GOpflmvvFffm5XU3Kct?usp=sharing\n", + "\n", + "This should run nicely on a low-cost or free T4 box.\n", + "\n", + "## **Assignment:**\n", + "Put Everything into a nice Gradio UI (similar to last week)\n", + "Input file name of audio to process.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e9289ba7-200c-43a9-b67a-c5ce826c9537", + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "import re, requests, json, tempfile, gradio as gr, torch, os\n", + "from bs4 import BeautifulSoup\n", + "from IPython.display import Markdown, display, update_display\n", + "from google.colab import drive, userdata\n", + "from huggingface_hub import login\n", + "from openai import OpenAI\n", + "from pydub import AudioSegment\n", + "from pydub.playback import play\n", + "from io import BytesIO\n", + "from transformers import AutoTokenizer, AutoModelForCausalLM, TextStreamer, BitsAndBytesConfig\n", + "\n", + "# Sign in to HuggingFace Hub\n", + "hf_token = userdata.get('HF_TOKEN')\n", + "login(hf_token, add_to_git_credential=True)\n", + "\n", + "# Sign in to OpenAI using Secrets in Colab\n", + "openai_api_key = userdata.get('OPENAI_API_KEY')\n", + "\n", + "# Initialize client\n", + "try:\n", + " openai = OpenAI(api_key=openai_api_key)\n", + "except Exception as e:\n", + " openai = None\n", + " print(f\"OpenAI client not initialized: {e}\")\n", + "\n", + "# Constants\n", + "AUDIO_MODEL = \"whisper-1\"\n", + "LLAMA = \"meta-llama/Meta-Llama-3.1-8B-Instruct\"\n", + "\n", + "# Google Drive\n", + "drive.mount(\"/content/drive\")\n", + "\n", + "# Local LLM setup (Llama 3.1)\n", + "try:\n", + " quant_config = BitsAndBytesConfig(\n", + " load_in_4bit=True,\n", + " bnb_4bit_use_double_quant=True,\n", + " bnb_4bit_compute_dtype=torch.bfloat16,\n", + " bnb_4bit_quant_type=\"nf4\"\n", + " )\n", + " tokenizer = AutoTokenizer.from_pretrained(LLAMA)\n", + "\n", + " # Set the pad token to the end-of-sequence token for generation\n", + " tokenizer.pad_token = tokenizer.eos_token\n", + "\n", + " model = AutoModelForCausalLM.from_pretrained(LLAMA, device_map=\"auto\", quantization_config=quant_config)\n", + " # model = AutoModelForCausalLM.from_pretrained(LLAMA, device_map=\"auto\", torch_dtype=torch.bfloat16, quantization_config=quant_config, trust_remote_code=True)\n", + "\n", + " model.eval() # Set model to evaluation mode\n", + "except Exception as e:\n", + " # If the local model fails to load, set variables to None\n", + " model = None\n", + " tokenizer = None\n", + " print(f\"Failed to load local model: {e}\")\n", + "\n", + "# Updated function to handle audio transcription\n", + "def transcribe_audio(audio_file):\n", + " \"\"\"\n", + " Transcribes an audio file to text using OpenAI's Whisper model.\n", + " Handles both local file paths and mounted Google Drive file paths.\n", + " \"\"\"\n", + " if not openai:\n", + " return \"OpenAI client not initialized. Please check your API key.\"\n", + "\n", + " if audio_file is None:\n", + " return \"No audio input provided.\"\n", + "\n", + " # Check if the file exists before attempting to open it\n", + " # Construct the expected path in Google Drive\n", + " # If the input is from the microphone, it will be a temporary file path\n", + " # If the input is from the textbox, it could be a full path or just a filename\n", + " if audio_file.startswith(\"/content/drive/MyDrive/llms/\"):\n", + " file_path_to_open = audio_file\n", + " else:\n", + " # Assume it's either a local path or just a filename in MyDrive/llms\n", + " # We'll prioritize checking MyDrive/llms first\n", + " gdrive_path_attempt = os.path.join(\"/content/drive/MyDrive/llms\", os.path.basename(audio_file))\n", + " if os.path.exists(gdrive_path_attempt):\n", + " file_path_to_open = gdrive_path_attempt\n", + " elif os.path.exists(audio_file):\n", + " file_path_to_open = audio_file\n", + " else:\n", + " return f\"File not found: {audio_file}. Please ensure the file exists in your Google Drive at /content/drive/MyDrive/llms/ or is a valid local path.\"\n", + "\n", + "\n", + " if not os.path.exists(file_path_to_open):\n", + " return f\"File not found: {file_path_to_open}. Please ensure the file exists.\"\n", + "\n", + "\n", + " try:\n", + " with open(file_path_to_open, \"rb\") as f:\n", + " transcription = openai.audio.transcriptions.create(\n", + " model=AUDIO_MODEL,\n", + " file=f,\n", + " response_format=\"text\"\n", + " )\n", + " return transcription\n", + " except Exception as e:\n", + " return f\"An error occurred during transcription: {e}\"\n", + "\n", + "def generate_minutes(transcription):\n", + " \"\"\"\n", + " Generates meeting minutes from a transcript using a local Llama model.\n", + " Format the input, generate a response, and return the complete text string.\n", + " \"\"\"\n", + " # Check if the local model and tokenizer were successfully loaded\n", + " if not model or not tokenizer:\n", + " return \"Local Llama model not loaded. Check model paths and hardware compatibility.\"\n", + "\n", + " system_message = \"You are an assistant that produces minutes of meetings from transcripts, with summary, key discussion points, takeaways and action items with owners, in markdown.\"\n", + " user_prompt = f\"Below is an extract transcript of an Audio recording. Please write minutes in markdown, including a summary with attendees, location and date; discussion points; takeaways; and action items with owners.\\n{transcription}\"\n", + "\n", + " messages = [\n", + " {\"role\": \"system\", \"content\": system_message},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ]\n", + "\n", + " try:\n", + " # Apply the chat template to format the messages for the model\n", + " inputs = tokenizer.apply_chat_template(messages, return_tensors=\"pt\").to(\"cuda\")\n", + "\n", + " # Generate the output. max_new_tokens controls the length of the generated text.\n", + " outputs = model.generate(inputs, max_new_tokens=2000)\n", + "\n", + " # Decode only the new tokens generated by the model (not the input tokens) to a human-readable string\n", + " response_text = tokenizer.decode(outputs[0], skip_special_tokens=True)\n", + "\n", + " # The model's response will contain the full conversation.\n", + " # Extract only the assistant's part!\n", + " assistant_start = \"<|eot_id|><|start_header_id|>assistant<|end_header_id|>\\n\\n\"\n", + " if assistant_start in response_text:\n", + " response_text = response_text.split(assistant_start)[-1]\n", + "\n", + " return response_text\n", + "\n", + " except Exception as e:\n", + " return f\"An error occurred during local model generation: {e}\"\n", + "\n", + "# Gradio UI components\n", + "with gr.Blocks() as ui:\n", + " gr.Markdown(\"# Meeting Minutes Generator\")\n", + " with gr.Row():\n", + " chatbot = gr.Chatbot(height=500, label=\"AI Assistant\")\n", + " with gr.Row():\n", + " entry = gr.Textbox(label=\"Provide the filename or path of the audio file to transcribe:\", scale=4)\n", + " submit_btn = gr.Button(\"Generate Minutes\", scale=1)\n", + " with gr.Row():\n", + " audio_input = gr.Audio(sources=[\"microphone\"], type=\"filepath\", label=\"Or speak to our AI Assistant to transcribe\", scale=4)\n", + " submit_audio_btn = gr.Button(\"Transcribe Audio\", scale=1)\n", + "\n", + " with gr.Row():\n", + " clear = gr.Button(\"Clear\")\n", + "\n", + " def process_file_and_generate(file_path, history):\n", + " transcribed_text = transcribe_audio(file_path)\n", + " minutes = generate_minutes(transcribed_text)\n", + " new_history = history + [[f\"Transcription of '{os.path.basename(file_path)}':\\n{transcribed_text}\", minutes]]\n", + " return new_history\n", + "\n", + " def process_audio_and_generate(audio_file, history):\n", + " transcribed_text = transcribe_audio(audio_file)\n", + " minutes = generate_minutes(transcribed_text)\n", + " new_history = history + [[f\"Transcription of your recording:\\n{transcribed_text}\", minutes]]\n", + " return new_history\n", + "\n", + "\n", + " submit_btn.click(\n", + " process_file_and_generate,\n", + " inputs=[entry, chatbot],\n", + " outputs=[chatbot],\n", + " queue=False\n", + " )\n", + "\n", + " submit_audio_btn.click(\n", + " process_audio_and_generate,\n", + " inputs=[audio_input, chatbot],\n", + " outputs=[chatbot],\n", + " queue=False\n", + " )\n", + "\n", + " clear.click(lambda: None, inputs=None, outputs=[chatbot], queue=False)\n", + "\n", + "ui.launch(inbrowser=True, debug=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cd2020d3", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/week3/community-contributions/rwothoromo/week3day5task.ipynb b/week3/community-contributions/rwothoromo/week3day5task.ipynb new file mode 100644 index 0000000..7da7365 --- /dev/null +++ b/week3/community-contributions/rwothoromo/week3day5task.ipynb @@ -0,0 +1,226 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "18b82c6b-10dc-4d94-b8dc-592ff011ce2b", + "metadata": {}, + "source": [ + "# Meeting minutes creator\n", + "\n", + "https://colab.research.google.com/drive/13wR4Blz3Ot_x0GOpflmvvFffm5XU3Kct?usp=sharing\n", + "\n", + "## **Week 3 task.**\n", + "Create your own tool that generates synthetic data/test data. Input the type of dataset or products or job postings, etc. and let the tool dream up various data samples.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e9289ba7-200c-43a9-b67a-c5ce826c9537", + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "import gradio as gr, requests, json, time, os, torch\n", + "from transformers import pipeline, set_seed\n", + "from functools import partial\n", + "from openai import OpenAI, APIError, AuthenticationError\n", + "from google.colab import drive, userdata\n", + "from huggingface_hub import login\n", + "from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig\n", + "\n", + "# Sample user_prompt = \"a list of student profiles with full name, email, course studied, and GPA for each of 6 semesters, and a CGPA for the 6 semesters\"\n", + "\n", + "# Sign in to HuggingFace Hub\n", + "hf_token = userdata.get('HF_TOKEN')\n", + "login(hf_token, add_to_git_credential=True)\n", + "\n", + "# Sign in to OpenAI using Secrets in Colab\n", + "openai_api_key = userdata.get('OPENAI_API_KEY')\n", + "\n", + "# Initialize client\n", + "try:\n", + " openai = OpenAI(api_key=openai_api_key)\n", + "except Exception as e:\n", + " openai = None\n", + " print(f\"OpenAI client not initialized: {e}\")\n", + "\n", + "# Constants\n", + "GPT_MODEL = \"gpt-3.5-turbo\"\n", + "\n", + "# Local Llama Model Setup\n", + "# Loads a Llama model from Hugging Face for local inference.\n", + "# Note: This requires a powerful GPU and specific library installations (e.g., bitsandbytes, accelerate).\n", + "LLAMA_MODEL = \"meta-llama/Meta-Llama-3.1-8B-Instruct\"\n", + "\n", + "try:\n", + " # Set up quantization config for efficient memory usage.\n", + " # This loads the model in 4-bit precision, significantly reducing VRAM requirements.\n", + " quant_config = BitsAndBytesConfig(\n", + " load_in_4bit=True,\n", + " bnb_4bit_use_double_quant=True,\n", + " bnb_4bit_compute_dtype=torch.bfloat16,\n", + " bnb_4bit_quant_type=\"nf4\"\n", + " )\n", + "\n", + " # Load the tokenizer and model.\n", + " tokenizer = AutoTokenizer.from_pretrained(LLAMA_MODEL)\n", + " model = AutoModelForCausalLM.from_pretrained(\n", + " LLAMA_MODEL, \n", + " device_map=\"auto\", \n", + " quantization_config=quant_config,\n", + " trust_remote_code=True\n", + " )\n", + " \n", + " # Set the model to evaluation mode for inference.\n", + " model.eval()\n", + "\n", + "except Exception as e:\n", + " model = None\n", + " tokenizer = None\n", + " print(f\"Failed to load local Llama model: {e}\")\n", + "\n", + "\n", + "def generate_with_llama(user_prompt: str, num_samples: int = 5):\n", + " \"\"\"\n", + " Generates synthetic data using a local Llama model.\n", + " Return a JSON string.\n", + " \"\"\"\n", + " if not model or not tokenizer:\n", + " return json.dumps({\"error\": \"Llama model not loaded. Check model paths and hardware compatibility.\"}, indent=2)\n", + "\n", + " # Llama 3.1 uses a specific chat template for conversation formatting.\n", + " messages = [\n", + " {\"role\": \"system\", \"content\": f\"You are a data generation assistant. Generate a JSON array of exactly {num_samples} objects based on the user's request. The output must be valid JSON only, without any other text or formatting.\"},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ]\n", + "\n", + " try:\n", + " inputs = tokenizer.apply_chat_template(messages, return_tensors=\"pt\").to(\"cuda\")\n", + "\n", + " outputs = model.generate(inputs, max_new_tokens=2000, do_sample=True, top_p=0.9, temperature=0.7)\n", + "\n", + " # Decode the generated tokens.\n", + " response_text = tokenizer.decode(outputs[0], skip_special_tokens=True)\n", + "\n", + " # Extract only the assistant's part from the complete chat history.\n", + " assistant_start = \"<|eot_id|><|start_header_id|>assistant<|end_header_id|>\\n\\n\"\n", + " if assistant_start in response_text:\n", + " response_text = response_text.split(assistant_start)[-1]\n", + " \n", + " # Parse the JSON and return it.\n", + " parsed_json = json.loads(response_text)\n", + " return json.dumps(parsed_json, indent=2)\n", + "\n", + " except Exception as e:\n", + " return json.dumps({\"error\": f\"An error occurred during local model generation: {e}\"}, indent=2)\n", + "\n", + "\n", + "\n", + "def generate_with_gpt(user_prompt: str, num_samples: int = 5):\n", + " \"\"\"\n", + " Generates synthetic data using OpenAI's GPT.\n", + " Return a JSON string.\n", + " \"\"\"\n", + " if not openai:\n", + " return json.dumps({\"error\": \"OpenAI client not initialized. Please check your API key.\"}, indent=2)\n", + "\n", + " try:\n", + " response = openai.chat.completions.create(\n", + " model=GPT_MODEL,\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": f\"You are a data generation assistant. Generate a JSON array of exactly {num_samples} objects based on the user's request. The output must be valid JSON only, without any other text or formatting.\"},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " response_format={\"type\": \"json_object\"}\n", + " )\n", + " \n", + " json_text = response.choices[0].message.content\n", + " return json_text\n", + " except APIError as e:\n", + " return json.dumps({\"error\": f\"Error from OpenAI API: {e.body}\"}, indent=2)\n", + " except Exception as e:\n", + " return json.dumps({\"error\": f\"An unexpected error occurred: {e}\"}, indent=2)\n", + "\n", + "\n", + "def generate_data(user_prompt, model_choice):\n", + " \"\"\"\n", + " Wrapper function that calls the appropriate generation function based on model choice.\n", + " \"\"\"\n", + " if not user_prompt:\n", + " return json.dumps({\"error\": \"Please provide a description for the data.\"}, indent=2)\n", + "\n", + " if model_choice == f\"Hugging Face ({LLAMA_MODEL})\":\n", + " return generate_with_llama(user_prompt)\n", + " elif model_choice == f\"OpenAI ({GPT_MODEL})\":\n", + " return generate_with_gpt(user_prompt)\n", + " else:\n", + " return json.dumps({\"error\": \"Invalid model choice.\"}, indent=2)\n", + "\n", + "# Gradio UI\n", + "with gr.Blocks(theme=gr.themes.Soft(), title=\"Synthetic Data Generator\") as ui:\n", + " gr.Markdown(\"# Synthetic Data Generator\")\n", + " gr.Markdown(\"Describe the type of data you need, select a model, and click 'Generate'.\")\n", + "\n", + " with gr.Row():\n", + " with gr.Column(scale=3):\n", + " data_prompt = gr.Textbox(\n", + " lines=5,\n", + " label=\"Data Prompt\",\n", + " placeholder=\"e.g., a list of customer profiles with name, email, and a favorite product\"\n", + " )\n", + " \n", + " with gr.Column(scale=1):\n", + " model_choice = gr.Radio(\n", + " [f\"Hugging Face ({LLAMA_MODEL})\", f\"OpenAI ({GPT_MODEL})\"],\n", + " label=\"Choose a Model\",\n", + " value=f\"Hugging Face ({LLAMA_MODEL})\"\n", + " )\n", + " \n", + " generate_btn = gr.Button(\"Generate Data\")\n", + " \n", + " with gr.Row():\n", + " output_json = gr.JSON(label=\"Generated Data\")\n", + " \n", + " # Click trigger\n", + " generate_btn.click(\n", + " fn=generate_data,\n", + " inputs=[data_prompt, model_choice],\n", + " outputs=output_json\n", + " )\n", + "\n", + "ui.launch(inbrowser=True, debug=True)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cd2020d3", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From ea4957e85d2a960a204a9933e2e7adebee27ea7c Mon Sep 17 00:00:00 2001 From: Ajay Singh Date: Fri, 22 Aug 2025 10:43:15 -0700 Subject: [PATCH 45/72] Removing the output from my testdata --- .../day-1-bank-account-summarization.ipynb | 270 ++++++++++++++++++ 1 file changed, 270 insertions(+) create mode 100644 week1/community-contributions/day-1-bank-account-summarization.ipynb diff --git a/week1/community-contributions/day-1-bank-account-summarization.ipynb b/week1/community-contributions/day-1-bank-account-summarization.ipynb new file mode 100644 index 0000000..bae0cfe --- /dev/null +++ b/week1/community-contributions/day-1-bank-account-summarization.ipynb @@ -0,0 +1,270 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "f60dab2a-a377-4761-8be3-69a3b8124ca6", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "import pdfplumber\n", + "import re\n", + "import json\n", + "\n", + "def parse_transaction_line(line):\n", + " # More specific pattern that captures each component'\n", + " pattern = r'^(\\d{2}/\\d{2})\\s+(.+?)\\s+(-?[\\d,]+\\.\\d{2})\\s+(-?[\\d,]+\\.\\d{2})$'\n", + " match = re.match(pattern, line.strip())\n", + " \n", + " if match:\n", + " date, description, amount, balance = match.groups()\n", + " return {\n", + " 'date': date,\n", + " 'description': description.strip(),\n", + " 'amount': amount,\n", + " 'balance': balance\n", + " }\n", + " return None\n", + "\n", + "def parse_Credit_Card_transaction_line(line):\n", + " # More specific pattern that captures each component'\n", + " pattern = r'^(\\d{2}/\\d{2})\\s+(.+?)\\s+(-?[\\d,]+\\.\\d{2})$'\n", + " match = re.match(pattern, line.strip())\n", + " \n", + " if match:\n", + " date, description, amount = match.groups()\n", + " return {\n", + " 'date': date,\n", + " 'description': description.strip(),\n", + " 'amount': amount\n", + " }\n", + " return None\n", + "\n", + "# \n", + "def extract_transactions_CA_from_pdf(pdf_path):\n", + " transactions = []\n", + " \n", + " with pdfplumber.open(pdf_path) as pdf:\n", + " for page in pdf.pages:\n", + " text = page.extract_text()\n", + " for line in text.split(\"\\n\"):\n", + " parsed = parse_transaction_line(line)\n", + " if parsed:\n", + " transactions.append(parsed)\n", + " return transactions\n", + "\n", + "def extract_transactions_CreditCard_from_pdf(pdf_path):\n", + " transactions = []\n", + " \n", + " with pdfplumber.open(pdf_path) as pdf:\n", + " for page in pdf.pages:\n", + " text = page.extract_text()\n", + " for line in text.split(\"\\n\"):\n", + " parsed = parse_Credit_Card_transaction_line(line)\n", + " if parsed:\n", + " transactions.append(parsed)\n", + " return transactions\n", + "# print(transactions, len(transactions)) # check first 10 extracted lines\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "82c34eac-fc30-41d6-8325-77efc48d0dd8", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# Load environment variables in a file called .env\n", + "from dotenv import load_dotenv\n", + "from openai import OpenAI\n", + "import os\n", + "\n", + "load_dotenv(override=True)\n", + "api_key = os.getenv('OPENAI_API_KEY')\n", + "\n", + "# Check the key\n", + "\n", + "if not api_key:\n", + " print(\"No API key was found - please head over to the troubleshooting notebook in this folder to identify & fix!\")\n", + "elif not api_key.startswith(\"sk-proj-\"):\n", + " print(\"An API key was found, but it doesn't start sk-proj-; please check you're using the right key - see troubleshooting notebook\")\n", + "elif api_key.strip() != api_key:\n", + " print(\"An API key was found, but it looks like it might have space or tab characters at the start or end - please remove them - see troubleshooting notebook\")\n", + "else:\n", + " print(\"API key found and looks good so far!\")" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "769ee512-75f5-480a-9407-f9c4cd46b679", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "\n", + "# ---------- STEP 3: Build prompts ----------\n", + "\n", + "def build_prompts(transactions):\n", + " system_prompt = \"\"\"\n", + "You are a personal financial assistant.\n", + "Your job is to analyze bank transactions, categorize each expense into categories such as:\n", + "Food, Clothing, Rent, Utilities, Entertainment, Travel, Health, Miscellaneous, and Others.\n", + "\n", + "Your responsibilities:\n", + "\n", + "Categorize all transactions and compute total spending per category.\n", + "\n", + "Identify the top 5 categories by total spending.\n", + "\n", + "Detect high-frequency purchases, even if individual amounts are small (e.g., $4 coffee bought 40 times).\n", + "\n", + "For these, group transactions by merchant/description and count frequency.\n", + "\n", + "Highlight the top 5 frequent purchases, with both frequency and total spend.\n", + "\n", + "Provide a practical summary of spending habits, covering both biggest expenses and frequent small purchases.\n", + "\n", + "Suggest 2–3 actionable recommendations to reduce spending, targeting both:\n", + "\n", + "Big categories (e.g., Rent, Travel, Entertainment).\n", + "\n", + "Small but frequent “habit expenses” (e.g., coffee, fast food, subscriptions).\n", + "\n", + "The output should be a valid JSON object with this structure:\n", + "{\n", + " \"summary\": {\n", + " \"Food\": ,\n", + " \"Clothing\": ,\n", + " \"Rent\": ,\n", + " \"Utilities\": ,\n", + " \"Entertainment\": ,\n", + " \"Travel\": ,\n", + " \"Health\": ,\n", + " \"Miscellaneous\": ,\n", + " \"Others\": \n", + " },\n", + " \"total_expenses\": ,\n", + " \"top_5_categories\": [ {\"category\": , \"amount\": } ],\n", + " \"top_5_frequent_purchases\": [ {\"item\": , \"count\": , \"total\": } ],\n", + " \"insights\": \"\",\n", + " \"recommendations\": [ \"\", \"\", \"\" ]\n", + "}\n", + "\n", + "\"\"\"\n", + "\n", + " user_prompt = \"Here are my bank account transactions for the past few months:\\n\\n\"\n", + " for txn in transactions:\n", + " user_prompt += f\"- Date: {txn['date']}, Description: {txn['description']}, Amount: {txn['amount']}\\n\"\n", + "\n", + " user_prompt += \"\"\"\n", + "Please analyze these transactions according to the instructions in the system prompt.\n", + "\"\"\"\n", + "\n", + " return system_prompt, user_prompt\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "307ca02b-2df6-4996-85e7-d073f74592f5", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# ---------- STEP 4: Call OpenAI ----------\n", + "def analyze_transactions(pdf_path):\n", + " transactions = extract_transactions_CreditCard_from_pdf(pdf_path)\n", + " system_prompt, user_prompt = build_prompts(transactions)\n", + "\n", + " client = OpenAI() # assumes OPENAI_API_KEY is set in env\n", + "\n", + " response = client.chat.completions.create(\n", + " model = \"gpt-4o-mini\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " response_format={\"type\": \"json_object\"} # ensures valid JSON\n", + " )\n", + "\n", + " result = response.choices[0].message.content\n", + " return json.loads(result)\n", + "\n", + "# ---------- MAIN ----------\n", + "if __name__ == \"__main__\":\n", + " cc_pdf_file = \"cc_statement.pdf\"\n", + " # To Debug in case of failures\n", + " # transactions = extract_transactions_from_pdf(pdf_file)\n", + " # print(cc_transactions,len(cc_transactions))\n", + " # system_prompt, user_prompt = build_prompts(cc_transactions)\n", + " # print(system_prompt, user_prompt)\n", + "\n", + " # Analyse the function to create a smart alert\n", + " cc_transactions = extract_transactions_CreditCard_from_pdf(cc_pdf_file)\n", + " analysis = analyze_transactions(cc_pdf_file)\n", + " print(\"=========================================\")\n", + " print(\"=== Top 5 Spending Habits & Insights ====\")\n", + " print(\"=========================================\")\n", + " print(json.dumps(analysis, indent=2))\n", + " print(\"=========================================\")\n", + " print(\"=========================================\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "831922f4-5efd-4cba-9975-54767b65f6d6", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.9.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From d7bb851f7fa70a66b664e015ce1f74e0e94e705b Mon Sep 17 00:00:00 2001 From: Oluwaseyi-A <62573285+Oluwaseyi-A@users.noreply.github.com> Date: Fri, 22 Aug 2025 16:16:49 -0400 Subject: [PATCH 46/72] Add week3 exercise to community-contributions --- .../AI_Minute_Taker.ipynb | 186 ++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 week3/community-contributions/AI_Minute_Taker.ipynb diff --git a/week3/community-contributions/AI_Minute_Taker.ipynb b/week3/community-contributions/AI_Minute_Taker.ipynb new file mode 100644 index 0000000..d189aef --- /dev/null +++ b/week3/community-contributions/AI_Minute_Taker.ipynb @@ -0,0 +1,186 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [], + "gpuType": "T4" + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + }, + "accelerator": "GPU" + }, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# Create meeting minutes from an Audio file\n", + "For this project, the UI allows you to either upload meeting minutes, or record something of your own!" + ], + "metadata": { + "id": "MYOLn_FzYAF4" + } + }, + { + "cell_type": "code", + "source": [ + "# --- Install deps ---\n", + "!pip install -q gradio torch==2.5.1+cu124 torchvision==0.20.1+cu124 torchaudio==2.5.1+cu124 --index-url https://download.pytorch.org/whl/cu124\n", + "!pip install -q requests bitsandbytes==0.46.0 transformers==4.48.3 accelerate==1.3.0 openai" + ], + "metadata": { + "id": "M01YO75ITfXF" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# --- Imports ---\n", + "import gradio as gr\n", + "import torch\n", + "from transformers import AutoTokenizer, AutoModelForCausalLM, TextStreamer, BitsAndBytesConfig\n", + "from openai import OpenAI\n", + "from huggingface_hub import login\n", + "from google.colab import userdata\n", + "from google.colab import drive\n", + "import os" + ], + "metadata": { + "id": "DGE8_oAwZJBo" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# --- Constants ---\n", + "AUDIO_MODEL = \"whisper-1\"\n", + "LLAMA = \"meta-llama/Meta-Llama-3.1-8B-Instruct\"" + ], + "metadata": { + "id": "JPu-aNxDTmDi" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# --- Auth ---\n", + "# assumes Colab userdata or your own env vars\n", + "hf_token = userdata.get('HF_TOKEN')\n", + "login(hf_token, add_to_git_credential=True)" + ], + "metadata": { + "id": "JfWUrEVJTmET" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "openai_api_key = userdata.get('OPENAI_API_KEY')\n", + "openai = OpenAI(api_key=openai_api_key)" + ], + "metadata": { + "id": "AiUtJ0mjTpVE" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# --- Model setup ---\n", + "quant_config = BitsAndBytesConfig(\n", + " load_in_4bit=True,\n", + " bnb_4bit_use_double_quant=True,\n", + " bnb_4bit_compute_dtype=torch.bfloat16,\n", + " bnb_4bit_quant_type=\"nf4\"\n", + ")\n", + "\n", + "tokenizer = AutoTokenizer.from_pretrained(LLAMA)\n", + "tokenizer.pad_token = tokenizer.eos_token\n", + "model = AutoModelForCausalLM.from_pretrained(\n", + " LLAMA, device_map=\"auto\", quantization_config=quant_config\n", + ")" + ], + "metadata": { + "id": "hMb4dggMW2s5" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "XTEW5qAwRN4Y" + }, + "outputs": [], + "source": [ + "# --- Processing function ---\n", + "def process_meeting(audio_file):\n", + " # Step 1: Transcribe\n", + " with open(audio_file, \"rb\") as f:\n", + " transcription = openai.audio.transcriptions.create(\n", + " model=AUDIO_MODEL, file=f, response_format=\"text\"\n", + " )\n", + "\n", + " # Step 2: Prepare prompt\n", + " system_message = (\n", + " \"You are an assistant that produces minutes of meetings from transcripts, \"\n", + " \"with summary, key discussion points, takeaways and action items with owners, \"\n", + " \"in markdown.\"\n", + " )\n", + " user_prompt = (\n", + " f\"Below is an extract transcript of a meeting. Please write minutes in markdown, \"\n", + " f\"including a summary with attendees, location and date; discussion points; \"\n", + " f\"takeaways; and action items with owners.\\n{transcription}\"\n", + " )\n", + " messages = [\n", + " {\"role\": \"system\", \"content\": system_message},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ]\n", + "\n", + " # Step 3: Run through LLaMA\n", + " inputs = tokenizer.apply_chat_template(messages, return_tensors=\"pt\").to(\"cuda\")\n", + " streamer = TextStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)\n", + " outputs = model.generate(inputs, max_new_tokens=2000)\n", + "\n", + " response = tokenizer.decode(outputs[0], skip_special_tokens=True)\n", + " return response\n", + "\n", + "# --- Gradio UI ---\n", + "with gr.Blocks() as demo:\n", + " gr.Markdown(\"## 📝 Meeting Minutes Generator\\nUpload an audio file and get structured meeting minutes.\")\n", + " with gr.Row():\n", + " audio_in = gr.Audio(type=\"filepath\", label=\"Upload Meeting Audio\")\n", + " btn = gr.Button(\"Generate Minutes\")\n", + " md_out = gr.Markdown()\n", + "\n", + " btn.click(fn=process_meeting, inputs=audio_in, outputs=md_out)" + ] + }, + { + "cell_type": "code", + "source": [ + "demo.launch()" + ], + "metadata": { + "id": "Yh4-imrmY8MH" + }, + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file From 7d880b0000d255f683307dafdb02c1dcd6196cc9 Mon Sep 17 00:00:00 2001 From: Rudra Dudhat Date: Sun, 24 Aug 2025 01:39:50 +0530 Subject: [PATCH 47/72] Add Market Research Agent notebook to community-contributions --- .../Market_Research_Agent.ipynb | 650 ++++++++++++++++++ 1 file changed, 650 insertions(+) create mode 100644 community-contributions/Market_Research_Agent.ipynb diff --git a/community-contributions/Market_Research_Agent.ipynb b/community-contributions/Market_Research_Agent.ipynb new file mode 100644 index 0000000..52dfdf4 --- /dev/null +++ b/community-contributions/Market_Research_Agent.ipynb @@ -0,0 +1,650 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "d15d8294-3328-4e07-ad16-8a03e9bbfdb9", + "metadata": {}, + "source": [ + "# YOUR FIRST LAB\n", + "### Please read this section. This is valuable to get you prepared, even if it's a long read -- it's important stuff.\n", + "\n", + "## Your first Frontier LLM Project\n", + "\n", + "Let's build a useful LLM solution - in a matter of minutes.\n", + "\n", + "By the end of this course, you will have built an autonomous Agentic AI solution with 7 agents that collaborate to solve a business problem. All in good time! We will start with something smaller...\n", + "\n", + "Our goal is to code a new kind of Web Browser. Give it a URL, and it will respond with a summary. The Reader's Digest of the internet!!\n", + "\n", + "Before starting, you should have completed the setup for [PC](../SETUP-PC.md) or [Mac](../SETUP-mac.md) and you hopefully launched this jupyter lab from within the project root directory, with your environment activated.\n", + "\n", + "## If you're new to Jupyter Lab\n", + "\n", + "Welcome to the wonderful world of Data Science experimentation! Once you've used Jupyter Lab, you'll wonder how you ever lived without it. Simply click in each \"cell\" with code in it, such as the cell immediately below this text, and hit Shift+Return to execute that cell. As you wish, you can add a cell with the + button in the toolbar, and print values of variables, or try out variations. \n", + "\n", + "I've written a notebook called [Guide to Jupyter](Guide%20to%20Jupyter.ipynb) to help you get more familiar with Jupyter Labs, including adding Markdown comments, using `!` to run shell commands, and `tqdm` to show progress.\n", + "\n", + "## If you're new to the Command Line\n", + "\n", + "Please see these excellent guides: [Command line on PC](https://chatgpt.com/share/67b0acea-ba38-8012-9c34-7a2541052665) and [Command line on Mac](https://chatgpt.com/canvas/shared/67b0b10c93a081918210723867525d2b). \n", + "\n", + "## If you'd prefer to work in IDEs\n", + "\n", + "If you're more comfortable in IDEs like VSCode, Cursor or PyCharm, they both work great with these lab notebooks too. \n", + "If you'd prefer to work in VSCode, [here](https://chatgpt.com/share/676f2e19-c228-8012-9911-6ca42f8ed766) are instructions from an AI friend on how to configure it for the course.\n", + "\n", + "## If you'd like to brush up your Python\n", + "\n", + "I've added a notebook called [Intermediate Python](Intermediate%20Python.ipynb) to get you up to speed. But you should give it a miss if you already have a good idea what this code does: \n", + "`yield from {book.get(\"author\") for book in books if book.get(\"author\")}`\n", + "\n", + "## I am here to help\n", + "\n", + "If you have any problems at all, please do reach out. \n", + "I'm available through the platform, or at ed@edwarddonner.com, or at https://www.linkedin.com/in/eddonner/ if you'd like to connect (and I love connecting!) \n", + "And this is new to me, but I'm also trying out X/Twitter at [@edwarddonner](https://x.com/edwarddonner) - if you're on X, please show me how it's done 😂 \n", + "\n", + "## More troubleshooting\n", + "\n", + "Please see the [troubleshooting](troubleshooting.ipynb) notebook in this folder to diagnose and fix common problems. At the very end of it is a diagnostics script with some useful debug info.\n", + "\n", + "## For foundational technical knowledge (eg Git, APIs, debugging) \n", + "\n", + "If you're relatively new to programming -- I've got your back! While it's ideal to have some programming experience for this course, there's only one mandatory prerequisite: plenty of patience. 😁 I've put together a set of self-study guides that cover Git and GitHub, APIs and endpoints, beginner python and more.\n", + "\n", + "This covers Git and GitHub; what they are, the difference, and how to use them: \n", + "https://github.com/ed-donner/agents/blob/main/guides/03_git_and_github.ipynb\n", + "\n", + "This covers technical foundations: \n", + "ChatGPT vs API; taking screenshots; Environment Variables; Networking basics; APIs and endpoints: \n", + "https://github.com/ed-donner/agents/blob/main/guides/04_technical_foundations.ipynb\n", + "\n", + "This covers Python for beginners, and making sure that a `NameError` never trips you up: \n", + "https://github.com/ed-donner/agents/blob/main/guides/06_python_foundations.ipynb\n", + "\n", + "This covers the essential techniques for figuring out errors: \n", + "https://github.com/ed-donner/agents/blob/main/guides/08_debugging.ipynb\n", + "\n", + "And you'll find other useful guides in the same folder in GitHub. Some information applies to my other Udemy course (eg Async Python) but most of it is very relevant for LLM engineering.\n", + "\n", + "## If this is old hat!\n", + "\n", + "If you're already comfortable with today's material, please hang in there; you can move swiftly through the first few labs - we will get much more in depth as the weeks progress. Ultimately we will fine-tune our own LLM to compete with OpenAI!\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + "

Please read - important note

\n", + " The way I collaborate with you may be different to other courses you've taken. I prefer not to type code while you watch. Rather, I execute Jupyter Labs, like this, and give you an intuition for what's going on. My suggestion is that you carefully execute this yourself, after watching the lecture. Add print statements to understand what's going on, and then come up with your own variations. If you have a Github account, use this to showcase your variations. Not only is this essential practice, but it demonstrates your skills to others, including perhaps future clients or employers...\n", + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + "

This code is a live resource - keep an eye out for my emails

\n", + " I push updates to the code regularly. As people ask questions, I add more examples or improved commentary. As a result, you'll notice that the code below isn't identical to the videos. Everything from the videos is here; but I've also added better explanations and new models like DeepSeek. Consider this like an interactive book.

\n", + " I try to send emails regularly with important updates related to the course. You can find this in the 'Announcements' section of Udemy in the left sidebar. You can also choose to receive my emails via your Notification Settings in Udemy. I'm respectful of your inbox and always try to add value with my emails!\n", + "
\n", + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + "

Business value of these exercises

\n", + " A final thought. While I've designed these notebooks to be educational, I've also tried to make them enjoyable. We'll do fun things like have LLMs tell jokes and argue with each other. But fundamentally, my goal is to teach skills you can apply in business. I'll explain business implications as we go, and it's worth keeping this in mind: as you build experience with models and techniques, think of ways you could put this into action at work today. Please do contact me if you'd like to discuss more or if you have ideas to bounce off me.\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4e2a9393-7767-488e-a8bf-27c12dca35bd", + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "\n", + "import os\n", + "import requests\n", + "from dotenv import load_dotenv\n", + "from bs4 import BeautifulSoup\n", + "from IPython.display import Markdown, display\n", + "from openai import OpenAI\n", + "\n", + "# If you get an error running this cell, then please head over to the troubleshooting notebook!" + ] + }, + { + "cell_type": "markdown", + "id": "6900b2a8-6384-4316-8aaa-5e519fca4254", + "metadata": {}, + "source": [ + "# Connecting to OpenAI (or Ollama)\n", + "\n", + "The next cell is where we load in the environment variables in your `.env` file and connect to OpenAI. \n", + "\n", + "If you'd like to use free Ollama instead, please see the README section \"Free Alternative to Paid APIs\", and if you're not sure how to do this, there's a full solution in the solutions folder (day1_with_ollama.ipynb).\n", + "\n", + "## Troubleshooting if you have problems:\n", + "\n", + "Head over to the [troubleshooting](troubleshooting.ipynb) notebook in this folder for step by step code to identify the root cause and fix it!\n", + "\n", + "If you make a change, try restarting the \"Kernel\" (the python process sitting behind this notebook) by Kernel menu >> Restart Kernel and Clear Outputs of All Cells. Then try this notebook again, starting at the top.\n", + "\n", + "Or, contact me! Message me or email ed@edwarddonner.com and we will get this to work.\n", + "\n", + "Any concerns about API costs? See my notes in the README - costs should be minimal, and you can control it at every point. You can also use Ollama as a free alternative, which we discuss during Day 2." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7b87cadb-d513-4303-baee-a37b6f938e4d", + "metadata": {}, + "outputs": [], + "source": [ + "# Load environment variables in a file called .env\n", + "\n", + "load_dotenv(override=True)\n", + "api_key = os.getenv('OPENAI_API_KEY')\n", + "\n", + "# Check the key\n", + "\n", + "if not api_key:\n", + " print(\"No API key was found - please head over to the troubleshooting notebook in this folder to identify & fix!\")\n", + "elif not api_key.startswith(\"sk-proj-\"):\n", + " print(\"An API key was found, but it doesn't start sk-proj-; please check you're using the right key - see troubleshooting notebook\")\n", + "elif api_key.strip() != api_key:\n", + " print(\"An API key was found, but it looks like it might have space or tab characters at the start or end - please remove them - see troubleshooting notebook\")\n", + "else:\n", + " print(\"API key found and looks good so far!\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "019974d9-f3ad-4a8a-b5f9-0a3719aea2d3", + "metadata": {}, + "outputs": [], + "source": [ + "openai = OpenAI()\n", + "\n", + "# If this doesn't work, try Kernel menu >> Restart Kernel and Clear Outputs Of All Cells, then run the cells from the top of this notebook down.\n", + "# If it STILL doesn't work (horrors!) then please see the Troubleshooting notebook in this folder for full instructions" + ] + }, + { + "cell_type": "markdown", + "id": "442fc84b-0815-4f40-99ab-d9a5da6bda91", + "metadata": {}, + "source": [ + "# Let's make a quick call to a Frontier model to get started, as a preview!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a58394bf-1e45-46af-9bfd-01e24da6f49a", + "metadata": {}, + "outputs": [], + "source": [ + "# To give you a preview -- calling OpenAI with these messages is this easy. Any problems, head over to the Troubleshooting notebook.\n", + "\n", + "message = \"Hello, GPT! This is my first ever message to you! Hi!\"\n", + "response = openai.chat.completions.create(model=\"gpt-4o-mini\", messages=[{\"role\":\"user\", \"content\":message}])\n", + "print(response.choices[0].message.content)" + ] + }, + { + "cell_type": "markdown", + "id": "2aa190e5-cb31-456a-96cc-db109919cd78", + "metadata": {}, + "source": [ + "## OK onwards with our first project" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c5e793b2-6775-426a-a139-4848291d0463", + "metadata": {}, + "outputs": [], + "source": [ + "# A class to represent a Webpage\n", + "# If you're not familiar with Classes, check out the \"Intermediate Python\" notebook\n", + "\n", + "# Some websites need you to use proper headers when fetching them:\n", + "headers = {\n", + " \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36\"\n", + "}\n", + "\n", + "class Website:\n", + "\n", + " def __init__(self, url):\n", + " \"\"\"\n", + " Create this Website object from the given url using the BeautifulSoup library\n", + " \"\"\"\n", + " self.url = url\n", + " response = requests.get(url, headers=headers)\n", + " soup = BeautifulSoup(response.content, 'html.parser')\n", + " self.title = soup.title.string if soup.title else \"No title found\"\n", + " for irrelevant in soup.body([\"script\", \"style\", \"img\", \"input\"]):\n", + " irrelevant.decompose()\n", + " self.text = soup.body.get_text(separator=\"\\n\", strip=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef960cf-6dc2-4cda-afb3-b38be12f4c97", + "metadata": {}, + "outputs": [], + "source": [ + "# Let's try one out. Change the website and add print statements to follow along.\n", + "\n", + "ed = Website(\"https://edwarddonner.com\")\n", + "print(ed.title)\n", + "print(ed.text)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "509a1ee7-de00-4c83-8dd8-017dcc638850", + "metadata": {}, + "outputs": [], + "source": [ + "rudra=Website(\"https://github.com/RudraDudhat2509/\")\n", + "print(rudra.title)\n", + "print(rudra.text)" + ] + }, + { + "cell_type": "markdown", + "id": "6a478a0c-2c53-48ff-869c-4d08199931e1", + "metadata": {}, + "source": [ + "## Types of prompts\n", + "\n", + "You may know this already - but if not, you will get very familiar with it!\n", + "\n", + "Models like GPT4o have been trained to receive instructions in a particular way.\n", + "\n", + "They expect to receive:\n", + "\n", + "**A system prompt** that tells them what task they are performing and what tone they should use\n", + "\n", + "**A user prompt** -- the conversation starter that they should reply to" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "abdb8417-c5dc-44bc-9bee-2e059d162699", + "metadata": {}, + "outputs": [], + "source": [ + "# Define our system prompt - you can experiment with this later, changing the last sentence to 'Respond in markdown in Spanish.\"\n", + "\n", + "system_prompt = \"You are an assistant that analyzes the contents of a website \\\n", + "and provides a short summary, ignoring text that might be navigation related. \\\n", + "Respond in markdown. Always use Points and simple english. Never use hyphens. Stick to the point\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f0275b1b-7cfe-4f9d-abfa-7650d378da0c", + "metadata": {}, + "outputs": [], + "source": [ + "# A function that writes a User Prompt that asks for summaries of websites:\n", + "\n", + "def user_prompt_for(website):\n", + " user_prompt = f\"You are looking at a website titled {website.title}\"\n", + " user_prompt += \"\\nThe contents of this website is as follows; \\\n", + "please provide a short summary of this website in markdown. \\\n", + "If it includes news or announcements, then summarize these too.\\n\\n\"\n", + " user_prompt += website.text\n", + " return user_prompt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26448ec4-5c00-4204-baec-7df91d11ff2e", + "metadata": {}, + "outputs": [], + "source": [ + "print(user_prompt_for(ed))" + ] + }, + { + "cell_type": "markdown", + "id": "ea211b5f-28e1-4a86-8e52-c0b7677cadcc", + "metadata": {}, + "source": [ + "## Messages\n", + "\n", + "The API from OpenAI expects to receive messages in a particular structure.\n", + "Many of the other APIs share this structure:\n", + "\n", + "```python\n", + "[\n", + " {\"role\": \"system\", \"content\": \"system message goes here\"},\n", + " {\"role\": \"user\", \"content\": \"user message goes here\"}\n", + "]\n", + "```\n", + "To give you a preview, the next 2 cells make a rather simple call - we won't stretch the mighty GPT (yet!)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f25dcd35-0cd0-4235-9f64-ac37ed9eaaa5", + "metadata": {}, + "outputs": [], + "source": [ + "messages = [\n", + " {\"role\": \"system\", \"content\": \"You are a snarky assistant\"},\n", + " {\"role\": \"user\", \"content\": \"What is 2 + 2?\"}\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21ed95c5-7001-47de-a36d-1d6673b403ce", + "metadata": {}, + "outputs": [], + "source": [ + "# To give you a preview -- calling OpenAI with system and user messages:\n", + "\n", + "response = openai.chat.completions.create(model=\"gpt-4o-mini\", messages=messages)\n", + "print(response.choices[0].message.content)" + ] + }, + { + "cell_type": "markdown", + "id": "d06e8d78-ce4c-4b05-aa8e-17050c82bb47", + "metadata": {}, + "source": [ + "## And now let's build useful messages for GPT-4o-mini, using a function" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0134dfa4-8299-48b5-b444-f2a8c3403c88", + "metadata": {}, + "outputs": [], + "source": [ + "# See how this function creates exactly the format above\n", + "\n", + "def messages_for(website):\n", + " return [\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt_for(website)}\n", + " ]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "36478464-39ee-485c-9f3f-6a4e458dbc9c", + "metadata": {}, + "outputs": [], + "source": [ + "# Try this out, and then try for a few more websites\n", + "\n", + "messages_for(ed)" + ] + }, + { + "cell_type": "markdown", + "id": "16f49d46-bf55-4c3e-928f-68fc0bf715b0", + "metadata": {}, + "source": [ + "## Time to bring it together - the API for OpenAI is very simple!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "905b9919-aba7-45b5-ae65-81b3d1d78e34", + "metadata": {}, + "outputs": [], + "source": [ + "# And now: call the OpenAI API. You will get very familiar with this!\n", + "\n", + "def summarize(url):\n", + " website = Website(url)\n", + " response = openai.chat.completions.create(\n", + " model = \"gpt-4o-mini\",\n", + " messages = messages_for(website)\n", + " )\n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "05e38d41-dfa4-4b20-9c96-c46ea75d9fb5", + "metadata": {}, + "outputs": [], + "source": [ + "summarize(\"https://edwarddonner.com\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3d926d59-450e-4609-92ba-2d6f244f1342", + "metadata": {}, + "outputs": [], + "source": [ + "# A function to display this nicely in the Jupyter output, using markdown\n", + "\n", + "def display_summary(url):\n", + " summary = summarize(url)\n", + " display(Markdown(summary))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3018853a-445f-41ff-9560-d925d1774b2f", + "metadata": {}, + "outputs": [], + "source": [ + "display_summary(\"https://edwarddonner.com\")" + ] + }, + { + "cell_type": "markdown", + "id": "b3bcf6f4-adce-45e9-97ad-d9a5d7a3a624", + "metadata": {}, + "source": [ + "# Let's try more websites\n", + "\n", + "Note that this will only work on websites that can be scraped using this simplistic approach.\n", + "\n", + "Websites that are rendered with Javascript, like React apps, won't show up. See the community-contributions folder for a Selenium implementation that gets around this. You'll need to read up on installing Selenium (ask ChatGPT!)\n", + "\n", + "Also Websites protected with CloudFront (and similar) may give 403 errors - many thanks Andy J for pointing this out.\n", + "\n", + "But many websites will work just fine!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "45d83403-a24c-44b5-84ac-961449b4008f", + "metadata": {}, + "outputs": [], + "source": [ + "display_summary(\"https://cnn.com\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "75e9fd40-b354-4341-991e-863ef2e59db7", + "metadata": {}, + "outputs": [], + "source": [ + "display_summary(\"https://github.com/RudraDudhat2509\")" + ] + }, + { + "cell_type": "markdown", + "id": "c951be1a-7f1b-448f-af1f-845978e47e2c", + "metadata": {}, + "source": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + "

Business applications

\n", + " In this exercise, you experienced calling the Cloud API of a Frontier Model (a leading model at the frontier of AI) for the first time. We will be using APIs like OpenAI at many stages in the course, in addition to building our own LLMs.\n", + "\n", + "More specifically, we've applied this to Summarization - a classic Gen AI use case to make a summary. This can be applied to any business vertical - summarizing the news, summarizing financial performance, summarizing a resume in a cover letter - the applications are limitless. Consider how you could apply Summarization in your business, and try prototyping a solution.\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + "

Before you continue - now try yourself

\n", + " Use the cell below to make your own simple commercial example. Stick with the summarization use case for now. Here's an idea: write something that will take the contents of an email, and will suggest an appropriate short subject line for the email. That's the kind of feature that might be built into a commercial email tool.\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "00743dac-0e70-45b7-879a-d7293a6f68a6", + "metadata": {}, + "outputs": [], + "source": [ + "# Step 1: Create your prompts\n", + "\n", + "system_prompt = \"\"\"You are to act like a Mckinsey Consultant specializing in market research. \n", + "1) You are to follow legal guidelines and never give immoral advice. \n", + "2) Your job is to maximise profits for your clients by analysing their companies initiatives and giving out recommendations for newer initiatives.\\n \n", + "3) Follow industry frameworks for reponses always give simple answers and stick to the point.\n", + "4) If possible try to see what competitors exist and what market gap can your clients company exploit.\n", + "5) Further more, USe SWOT, Porters 5 forces to summarize your recommendations, Give confidence score with every recommendations\n", + "6) Try to give unique solutions by seeing what the market gap is, if market gap is ambiguious skip this step\n", + "7) add an estimate of what rate the revenue of the comapany will increase at provided they follow the guidelines, give conservating estimates keeping in account non ideal conditions.\n", + "8) if the website isnt of a company or data isnt available, give out an error message along the lines of more data required for analysis\"\"\"\n", + "\n", + "def makereq(url):\n", + " website=Website(url)\n", + " user_prompt=f\"This is my companies website: {website.title}. Could you help me increase profits by giving me recommendations on what i should do. here is the content of my website:\\n\"\n", + " user_prompt+=website.text;\n", + " return [\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ]\n", + "def recommend(url):\n", + " response = openai.chat.completions.create(\n", + " model = \"gpt-4o-mini\",\n", + " messages = makereq(url))\n", + " display(Markdown(response.choices[0].message.content))\n", + " \n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f4484fcf-8b39-4c3f-9674-37970ed71988", + "metadata": {}, + "outputs": [], + "source": [ + "recommend(\"https://www.swiggy.com/corporate/\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "db1be9b9-b32e-4e8d-83df-0b6f822ac7b2", + "metadata": {}, + "outputs": [], + "source": [ + "recommend(\"https://playvalorant.com/en-us/\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d9089b4a-67ee-456e-b35d-ca00c2f9f73a", + "metadata": {}, + "outputs": [], + "source": [ + "recommend(\"https://nexora-labs.com/\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1e042d74-456a-4ec4-bdb8-4b08603b5e66", + "metadata": {}, + "outputs": [], + "source": [ + "recommend(\"https://github.com/RudraDudhat2509/\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "29187b86-1e35-41bc-bb54-60b3d804b96e", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From c79bd2b8fafb3e87128699d76ad6922c31eb356a Mon Sep 17 00:00:00 2001 From: IsaiasRVH2 Date: Sat, 23 Aug 2025 18:47:57 -0600 Subject: [PATCH 48/72] Added my contributions to community-contributions --- .../day1-selenium-web-summary-es-mx.ipynb | 260 ++++++++++++++++++ 1 file changed, 260 insertions(+) create mode 100644 week1/community-contributions/day1-selenium-web-summary-es-mx.ipynb diff --git a/week1/community-contributions/day1-selenium-web-summary-es-mx.ipynb b/week1/community-contributions/day1-selenium-web-summary-es-mx.ipynb new file mode 100644 index 0000000..2a3de8b --- /dev/null +++ b/week1/community-contributions/day1-selenium-web-summary-es-mx.ipynb @@ -0,0 +1,260 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "2588fbba", + "metadata": {}, + "source": [ + "# Website Analysis and Summarization with Selenium and OpenAI\n", + "\n", + "> This notebook demonstrates how to extract and summarize the main content of any website using Selenium for dynamic extraction and OpenAI for generating concise summaries in Mexican Spanish.\n", + "\n", + "## Overview\n", + "This notebook provides a workflow to automatically analyze websites, extract relevant text, and generate a short summary using a language model. Navigation elements are ignored, focusing on news, announcements, and main content.\n", + "\n", + "## Features\n", + "- Extracts relevant text from web pages using Selenium and BeautifulSoup.\n", + "- Generates automatic summaries using OpenAI's language models.\n", + "- Presents results in markdown format.\n", + "\n", + "## Requirements\n", + "- Python 3.8+\n", + "- Google Chrome browser installed\n", + "- The following Python packages:\n", + " - selenium\n", + " - webdriver-manager\n", + " - beautifulsoup4\n", + " - openai\n", + " - python-dotenv\n", + " - requests\n", + "- An OpenAI API key (project key, starting with `sk-proj-`)\n", + "- Internet connection\n", + "\n", + "## How to Use\n", + "1. Install the required packages:\n", + " ```bash\n", + " pip install selenium webdriver-manager undetected-chromedriver beautifulsoup4 openai python-dotenv requests\n", + " ```\n", + "2. Add your OpenAI API key to a `.env` file as `OPENAI_API_KEY`.\n", + "3. Run the notebook cells in order. You can change the target website URL in the code to analyze different sites.\n", + "4. The summary will be displayed in markdown format below the code cell.\n", + "\n", + "**Note:** Some websites may block automated access. The notebook includes options to simulate a real user and avoid bot detection, but results may vary depending on the site's protections.\n", + "\n", + "---" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dc7c2ade", + "metadata": {}, + "outputs": [], + "source": [ + "# Imports\n", + "import os\n", + "import requests\n", + "from dotenv import load_dotenv\n", + "from bs4 import BeautifulSoup\n", + "from IPython.display import Markdown, display\n", + "from openai import OpenAI\n", + "\n", + "from selenium import webdriver\n", + "from selenium.webdriver.chrome.service import Service\n", + "from selenium.webdriver.common.by import By\n", + "from selenium.webdriver.chrome.options import Options\n", + "from selenium.webdriver.support.ui import WebDriverWait\n", + "from selenium.webdriver.support import expected_conditions as EC\n", + "from webdriver_manager.chrome import ChromeDriverManager\n", + "import undetected_chromedriver as uc" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a2d21987", + "metadata": {}, + "outputs": [], + "source": [ + "# Load the environment variables from .env\n", + "load_dotenv(override=True)\n", + "api_key = os.getenv('OPENAI_API_KEY')\n", + "\n", + "# Check the key\n", + "\n", + "if not api_key:\n", + " print(\"No API key was found - please head over to the troubleshooting notebook in this folder to identify & fix!\")\n", + "elif not api_key.startswith(\"sk-proj-\"):\n", + " print(\"An API key was found, but it doesn't start sk-proj-; please check you're using the right key - see troubleshooting notebook\")\n", + "elif api_key.strip() != api_key:\n", + " print(\"An API key was found, but it looks like it might have space or tab characters at the start or end - please remove them - see troubleshooting notebook\")\n", + "else:\n", + " print(\"API key found and looks good so far!\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bbb3a8ed", + "metadata": {}, + "outputs": [], + "source": [ + "openai = OpenAI()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5313aa64", + "metadata": {}, + "outputs": [], + "source": [ + "class Website:\n", + " def __init__(self, url, headless=True, wait_time=10):\n", + " self.url = url # Website URL to analyze\n", + " self.title = None # Title of the website\n", + " self.text = None # Extracted text from the website\n", + " \n", + " # Chrome options configuration for Selenium\n", + " options = Options()\n", + " if headless:\n", + " options.add_argument(\"--headless=new\") # Run Chrome in headless mode (no window)\n", + " options.add_argument(\"--disable-gpu\") # Disable GPU acceleration\n", + " options.add_argument(\"--no-sandbox\") # Disable Chrome sandbox (required for some environments)\n", + " options.add_argument(\"--window-size=1920,1080\") # Set window size to simulate a real user\n", + " # Simulate a real user-agent to avoid bot detection\n", + " options.add_argument(\"user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36\")\n", + " \n", + " # Initialize Chrome WebDriver\n", + " self.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)\n", + " self.driver.get(url) # Open the URL in the browser\n", + " \n", + " try:\n", + " # Wait until the element is present in the page\n", + " WebDriverWait(self.driver, wait_time).until(EC.presence_of_element_located((By.TAG_NAME, \"body\")))\n", + " html = self.driver.page_source # Get the full HTML of the page\n", + " soup = BeautifulSoup(html, 'html.parser') # Parse HTML with BeautifulSoup\n", + " self.title = soup.title.string if soup.title else 'No title found' # Extract the title\n", + " if soup.body:\n", + " # Remove irrelevant elements from the body\n", + " for irrelevant in soup.body([\"script\", \"style\", \"img\", \"input\"]):\n", + " irrelevant.decompose()\n", + " # Extract clean text from the body\n", + " self.text = soup.body.get_text(separator='\\n', strip=True)\n", + " else:\n", + " self.text = \"No body found\" # If no body is found, indicate it\n", + " except Exception as e:\n", + " print(f\"Error accessing the site: {e}\") # Print error to console\n", + " self.text = \"Error accessing the site\" # Store error in the attribute\n", + " finally:\n", + " self.driver.quit() # Always close the browser, whether or not an error occurred" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e902c6b2", + "metadata": {}, + "outputs": [], + "source": [ + "system_prompt = \"You are an assistant that analyzes the contents of a website \\\n", + "and provides a short summary, ignoring text that might be navigation related. \\\n", + "Respond in markdown in Mexican Spanish.\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eaee8f36", + "metadata": {}, + "outputs": [], + "source": [ + "# A function that writes a User Prompt that asks for summaries of websites:\n", + "\n", + "def user_prompt_for(website):\n", + " user_prompt = f\"You are looking at a website titled {website.title}\"\n", + " user_prompt += \"\\nThe contents of this website is as follows; \\\n", + "please provide a short summary of this website in markdown. \\\n", + "If it includes news or announcements, then summarize these too.\\n\\n\"\n", + " user_prompt += website.text\n", + " return user_prompt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9ac4ed8b", + "metadata": {}, + "outputs": [], + "source": [ + "# Creates messages for the OpenAI API\n", + "def messages_for(website):\n", + " return [\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt_for(website)}\n", + " ]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1536d537", + "metadata": {}, + "outputs": [], + "source": [ + "# Creates a summary for the given URL\n", + "def summarize(url):\n", + " website = Website(url)\n", + " response = openai.chat.completions.create(\n", + " model = \"gpt-4o-mini\",\n", + " messages = messages_for(website)\n", + " )\n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fe135339", + "metadata": {}, + "outputs": [], + "source": [ + "# Shows the summary for the given URL\n", + "def display_summary(url):\n", + " summary = summarize(url)\n", + " display(Markdown(summary))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a301ab4e", + "metadata": {}, + "outputs": [], + "source": [ + "display_summary(\"https://openai.com/\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "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.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From a5bf394d4384951521775fdc378e1dcd82c0b4cf Mon Sep 17 00:00:00 2001 From: Arundhati Date: Sun, 24 Aug 2025 00:55:50 -0400 Subject: [PATCH 49/72] Added Mediterranean Banter notebook to community-contributions --- .../Mediterranean Banter.ipynb | 252 ++++++++++++++++++ 1 file changed, 252 insertions(+) create mode 100644 week2/community-contributions/Mediterranean Banter.ipynb diff --git a/week2/community-contributions/Mediterranean Banter.ipynb b/week2/community-contributions/Mediterranean Banter.ipynb new file mode 100644 index 0000000..5ac089c --- /dev/null +++ b/week2/community-contributions/Mediterranean Banter.ipynb @@ -0,0 +1,252 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "9ab6f493-026f-4950-b244-22c5251b8daa", + "metadata": {}, + "source": [ + "# Mediterranean Banter" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4568bc63-679e-4ea1-a9c9-b85dfc386ec7", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from dotenv import load_dotenv\n", + "from openai import OpenAI\n", + "import anthropic\n", + "from IPython.display import Markdown, display, update_display" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7a852bee-76e6-4538-89a3-0702c2d5f05c", + "metadata": {}, + "outputs": [], + "source": [ + "import google.generativeai" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c843ac74-4797-4bd0-bed2-dfcaa2f98c41", + "metadata": {}, + "outputs": [], + "source": [ + "load_dotenv(override=True)\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": null, + "id": "e4181018-1818-47fa-a3fb-554627a63f69", + "metadata": {}, + "outputs": [], + "source": [ + "openai = OpenAI()\n", + "\n", + "claude = anthropic.Anthropic()\n", + "\n", + "google.generativeai.configure()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "19f833c8-e183-469c-a8c8-1c014889a15d", + "metadata": {}, + "outputs": [], + "source": [ + "gpt_model_spain = \"gpt-4.1-mini\"\n", + "claude_model_italy = \"claude-3-5-haiku-latest\"\n", + "gemini_model_france = \"gemini-2.0-flash\"\n", + "\n", + "gpt_system_spain = \"You are a chatbot who is very argumentative; \\\n", + "you disagree with anything other than how beautiful and great South of Spain is.\"\n", + "\n", + "claude_system_italy = \"You are a very polite, courteous chatbot but you favour south of Italy prasing Amalfi Coast.\"\n", + "\n", + "gemini_system_france = \"You are neutral. You always accept what other people say and never try to put down other people thoughts.Although, you politely try to include that South of France is beautiful\"\n", + "\n", + "gpt_messages_spain = [\"Hi there, nothing beats the beauty of Spain and its wonderful beaches.\"]\n", + "claude_messages_italy = [\"I agree. I admire the Southern Part of Spain but its not as pretty as Amalfi Coast.\"]\n", + "gemini_messages_france = [\"Well, both are good and so is the French Riveria.\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2d426b95-5e7c-49aa-a5a1-9613296eb0d0", + "metadata": {}, + "outputs": [], + "source": [ + "def call_gpt():\n", + " messages = [{\"role\": \"system\", \"content\": gpt_system_spain}]\n", + " for gpt, claude,gemini in zip(gpt_messages_spain, claude_messages_italy,gemini_messages_france):\n", + " messages.append({\"role\": \"assistant\", \"content\": gpt})\n", + " messages.append({\"role\": \"user\", \"content\": claude})\n", + " messages.append({\"role\": \"user\", \"content\": gemini})\n", + " completion = openai.chat.completions.create(\n", + " model=gpt_model_spain,\n", + " messages=messages\n", + " )\n", + " return completion.choices[0].message.content" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3fc9a696-3145-4f37-873b-539647f2fc0b", + "metadata": {}, + "outputs": [], + "source": [ + "call_gpt()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "63910faa-a122-4261-82a0-7530c6c5749a", + "metadata": {}, + "outputs": [], + "source": [ + "def call_claude():\n", + " messages = []\n", + " for gpt_spain, claude_italy,gemini_france in zip(gpt_messages_spain, claude_messages_italy,gemini_messages_france):\n", + " messages.append({\"role\": \"user\", \"content\": gpt_spain})\n", + " messages.append({\"role\": \"user\", \"content\": gemini_france})\n", + " messages.append({\"role\": \"assistant\", \"content\": claude_italy})\n", + " messages.append({\"role\": \"user\", \"content\": gpt_messages_spain[-1]})\n", + " messages.append({\"role\": \"user\", \"content\": gemini_messages_france[-1]})\n", + " message = claude.messages.create(\n", + " model=claude_model_italy,\n", + " system=claude_system_italy,\n", + " messages=messages,\n", + " max_tokens=500\n", + " )\n", + " return message.content[0].text" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d3ab6aa2-a462-4fb3-bb6a-dc6b971827fa", + "metadata": {}, + "outputs": [], + "source": [ + "call_claude()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "114cb7eb-0915-46ac-b285-e40acf4a9ffb", + "metadata": {}, + "outputs": [], + "source": [ + "def call_gemini():\n", + " messages=[]\n", + " for gpt_spain, claude_italy,gemini_france in zip(gpt_messages_spain, claude_messages_italy,gemini_messages_france):\n", + " messages.append({\"role\": \"user\", \"content\": gpt_spain})\n", + " messages.append({\"role\": \"user\", \"content\": claude_italy})\n", + " messages.append({\"role\": \"assistant\", \"content\": gemini_france})\n", + " messages.append({\"role\": \"user\", \"content\": gpt_messages_spain[-1]})\n", + " messages.append({\"role\": \"user\", \"content\": claude_messages_italy[-1]})\n", + " gemini = google.generativeai.GenerativeModel(\n", + " model_name='gemini-2.0-flash',\n", + " system_instruction=gemini_system_france\n", + " )\n", + " dialogue_text = \"\\n\".join(f\"{m['role']}: {m['content']}\" for m in messages)\n", + " response = gemini.generate_content(dialogue_text)\n", + " return response.text\n", + " \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e3acf708-f9b1-4a6d-b3e1-823c96d00555", + "metadata": {}, + "outputs": [], + "source": [ + "call_gemini()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c103430e-68c7-4cc6-8a43-6b5aec7fdc96", + "metadata": {}, + "outputs": [], + "source": [ + "gpt_messages_spain = [\"Hi there, nothing beats the beauty of Spain and its wonderful beaches.\"]\n", + "claude_messages_italy = [\"I agree. I admire the Southern Part of Spain but its not as pretty as Amalfi Coast.\"]\n", + "gemini_messages_france = [\"Well, both are good and so is the French Riveria.\"]\n", + "\n", + "print(f\"GPT:\\n{gpt_messages_spain[0]}\\n\")\n", + "print(f\"Claude:\\n{claude_messages_italy[0]}\\n\")\n", + "print(f\"Gemini:\\n{gemini_messages_france[0]}\\n\")\n", + "\n", + "for i in range(5):\n", + " gpt_next = call_gpt()\n", + " print(f\"GPT:\\n{gpt_next}\\n\")\n", + " gpt_messages_spain.append(gpt_next)\n", + " \n", + " claude_next = call_claude()\n", + " print(f\"Claude:\\n{claude_next}\\n\")\n", + " claude_messages_italy.append(claude_next)\n", + "\n", + " gemini_next = call_gemini()\n", + " print(f\"Gemini:\\n{gemini_next}\\n\")\n", + " gemini_messages_france.append(gemini_next)\n", + "\n" + ] + } + ], + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 024d474643d54225ae850ddd2dba0f9656b2af63 Mon Sep 17 00:00:00 2001 From: Rohit Nain Date: Sun, 24 Aug 2025 11:37:07 +0530 Subject: [PATCH 50/72] added email summaizers script with openai --- .../Day-1_email_summarizers.ipynb | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 week1/community-contributions/Day-1_email_summarizers.ipynb diff --git a/week1/community-contributions/Day-1_email_summarizers.ipynb b/week1/community-contributions/Day-1_email_summarizers.ipynb new file mode 100644 index 0000000..d2a4597 --- /dev/null +++ b/week1/community-contributions/Day-1_email_summarizers.ipynb @@ -0,0 +1,103 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "d7a6bb51", + "metadata": {}, + "outputs": [], + "source": [ + "# import library\n", + "from openai import OpenAI\n", + "import os\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load your API key from an .env file\n", + "load_dotenv(override=True)\n", + "api_key = os.getenv('OPENAI_API_KEY')\n", + "openai = OpenAI()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7ac4cdf9", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "# Step 1: Create your prompts\n", + "system_prompt = \"you are a helpful assistant that suggests an appropriate short subject line for an email based on its contents.\"\n", + "\n", + "user_prompt = \"\"\"\n", + "Hi John,\n", + "I hope this email finds you well. I wanted to follow up on our meeting last week regarding the quarterly budget proposal.\n", + "After reviewing the numbers with my team, we've identified some areas where we can reduce costs by approximately 15% without impacting our core operations. This would involve consolidating some vendor contracts and optimizing our software licensing.\n", + "Could we schedule a meeting next week to discuss these findings in detail? I'm available Tuesday through Thursday afternoon.\n", + "Looking forward to hearing from you.\n", + "\n", + "Best regards,\n", + "Sarah\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a77ca09e", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "# Step 2: Make the messages list\n", + "messages = [\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8404f0fe", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "# Step 3: Call OpenAI\n", + "response = openai.chat.completions.create(model=\"gpt-4o-mini\", messages=messages)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7a4875f7", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "# Step 4: Print the result\n", + "print(response.choices[0].message.content)" + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 17463e83ffc9b119065f97fc8f80fe4e5adad89d Mon Sep 17 00:00:00 2001 From: Rohit Nain Date: Sun, 24 Aug 2025 17:56:13 +0530 Subject: [PATCH 51/72] day-2 exercise with ollama --- .../Day-2_exercise_with_ollama3.ipynb | 290 ++++++++++++++++++ 1 file changed, 290 insertions(+) create mode 100644 week1/community-contributions/Day-2_exercise_with_ollama3.ipynb diff --git a/week1/community-contributions/Day-2_exercise_with_ollama3.ipynb b/week1/community-contributions/Day-2_exercise_with_ollama3.ipynb new file mode 100644 index 0000000..1168770 --- /dev/null +++ b/week1/community-contributions/Day-2_exercise_with_ollama3.ipynb @@ -0,0 +1,290 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "135717e7", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "# imports\n", + "\n", + "import os\n", + "import requests\n", + "from dotenv import load_dotenv\n", + "from bs4 import BeautifulSoup\n", + "from IPython.display import Markdown, display\n", + "from openai import OpenAI\n", + "import ollama" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "29a9e634", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "# OPTION 1\n", + "# using openai\n", + "\n", + "# message = \"Hello, GPT! This is my first ever message to you! Hi!\"\n", + "# client = OpenAI(base_url=\"http://localhost:11434/v1\", api_key=\"not-needed\")\n", + "# response = openai.chat.completions.create(model=``, messages=[{\"role\":\"user\", \"content\":message}])\n", + "# print(response.choices[0].message.content)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "306993ed", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "# OPTION 2\n", + "# using Ollama\n", + "\n", + "message = \"Hello, GPT! This is my first ever message to you! Hi!\"\n", + "model=\"llama3\"\n", + "response=ollama.chat(model=model,messages=[{\"role\":\"user\",\"content\":message}])\n", + "print(response[\"message\"][\"content\"])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "856f767b", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "# A class to represent a Webpage\n", + "# If you're not familiar with Classes, check out the \"Intermediate Python\" notebook\n", + "\n", + "# Some websites need you to use proper headers when fetching them:\n", + "headers = {\n", + " \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36\"\n", + "}\n", + "\n", + "class Website:\n", + "\n", + " def __init__(self, url):\n", + " \"\"\"\n", + " Create this Website object from the given url using the BeautifulSoup library\n", + " \"\"\"\n", + " self.url = url\n", + " response = requests.get(url, headers=headers)\n", + " soup = BeautifulSoup(response.content, 'html.parser')\n", + " self.title = soup.title.string if soup.title else \"No title found\"\n", + " for irrelevant in soup.body([\"script\", \"style\", \"img\", \"input\"]):\n", + " irrelevant.decompose()\n", + " self.text = soup.body.get_text(separator=\"\\n\", strip=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "4ce558dc", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "# Let's try one out. Change the website and add print statements to follow along.\n", + "\n", + "ed = Website(\"https://edwarddonner.com\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "5e3956f8", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "# Define our system prompt - you can experiment with this later, changing the last sentence to 'Respond in markdown in Spanish.\"\n", + "\n", + "system_prompt = \"You are an assistant that analyzes the contents of a website \\\n", + "and provides a short summary, ignoring text that might be navigation related. \\\n", + "Respond in markdown.\"" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "99d791b4", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "# A function that writes a User Prompt that asks for summaries of websites:\n", + "\n", + "def user_prompt_for(website):\n", + " user_prompt = f\"You are looking at a website titled {website.title}\"\n", + " user_prompt += \"\\nThe contents of this website is as follows; \\\n", + "please provide a short summary of this website in markdown. \\\n", + "If it includes news or announcements, then summarize these too.\\n\\n\"\n", + " user_prompt += website.text\n", + " return user_prompt" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "5d89b748", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "# See how this function creates exactly the format above\n", + "\n", + "def messages_for(website):\n", + " return [\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt_for(website)}\n", + " ]" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "9a97d3e2", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "# And now: call the OpenAI API. You will get very familiar with this!\n", + "\n", + "def summarize(url):\n", + " website = Website(url)\n", + " response=ollama.chat(model=model,messages=messages_for(website))\n", + " return(response[\"message\"][\"content\"])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ec13fe0a", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "summarize(\"https://edwarddonner.com\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "e3ade092", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "# A function to display this nicely in the Jupyter output, using markdown\n", + "\n", + "def display_summary(url):\n", + " summary = summarize(url)\n", + " display(Markdown(summary))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "be2d49e6", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "display_summary(\"https://edwarddonner.com\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1ccbf33b", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "display_summary(\"https://cnn.com\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ae3d0eae", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "display_summary(\"https://anthropic.com\")" + ] + } + ], + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 604aca783c6b2a748365d53676606867e23b72b4 Mon Sep 17 00:00:00 2001 From: Rohit Nain Date: Sun, 24 Aug 2025 17:57:52 +0530 Subject: [PATCH 52/72] Revert "day-2 exercise with ollama" This reverts commit 17463e83ffc9b119065f97fc8f80fe4e5adad89d. --- .../Day-2_exercise_with_ollama3.ipynb | 290 ------------------ 1 file changed, 290 deletions(-) delete mode 100644 week1/community-contributions/Day-2_exercise_with_ollama3.ipynb diff --git a/week1/community-contributions/Day-2_exercise_with_ollama3.ipynb b/week1/community-contributions/Day-2_exercise_with_ollama3.ipynb deleted file mode 100644 index 1168770..0000000 --- a/week1/community-contributions/Day-2_exercise_with_ollama3.ipynb +++ /dev/null @@ -1,290 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "135717e7", - "metadata": { - "vscode": { - "languageId": "plaintext" - } - }, - "outputs": [], - "source": [ - "# imports\n", - "\n", - "import os\n", - "import requests\n", - "from dotenv import load_dotenv\n", - "from bs4 import BeautifulSoup\n", - "from IPython.display import Markdown, display\n", - "from openai import OpenAI\n", - "import ollama" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "29a9e634", - "metadata": { - "vscode": { - "languageId": "plaintext" - } - }, - "outputs": [], - "source": [ - "# OPTION 1\n", - "# using openai\n", - "\n", - "# message = \"Hello, GPT! This is my first ever message to you! Hi!\"\n", - "# client = OpenAI(base_url=\"http://localhost:11434/v1\", api_key=\"not-needed\")\n", - "# response = openai.chat.completions.create(model=``, messages=[{\"role\":\"user\", \"content\":message}])\n", - "# print(response.choices[0].message.content)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "306993ed", - "metadata": { - "vscode": { - "languageId": "plaintext" - } - }, - "outputs": [], - "source": [ - "# OPTION 2\n", - "# using Ollama\n", - "\n", - "message = \"Hello, GPT! This is my first ever message to you! Hi!\"\n", - "model=\"llama3\"\n", - "response=ollama.chat(model=model,messages=[{\"role\":\"user\",\"content\":message}])\n", - "print(response[\"message\"][\"content\"])\n" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "856f767b", - "metadata": { - "vscode": { - "languageId": "plaintext" - } - }, - "outputs": [], - "source": [ - "# A class to represent a Webpage\n", - "# If you're not familiar with Classes, check out the \"Intermediate Python\" notebook\n", - "\n", - "# Some websites need you to use proper headers when fetching them:\n", - "headers = {\n", - " \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36\"\n", - "}\n", - "\n", - "class Website:\n", - "\n", - " def __init__(self, url):\n", - " \"\"\"\n", - " Create this Website object from the given url using the BeautifulSoup library\n", - " \"\"\"\n", - " self.url = url\n", - " response = requests.get(url, headers=headers)\n", - " soup = BeautifulSoup(response.content, 'html.parser')\n", - " self.title = soup.title.string if soup.title else \"No title found\"\n", - " for irrelevant in soup.body([\"script\", \"style\", \"img\", \"input\"]):\n", - " irrelevant.decompose()\n", - " self.text = soup.body.get_text(separator=\"\\n\", strip=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "4ce558dc", - "metadata": { - "vscode": { - "languageId": "plaintext" - } - }, - "outputs": [], - "source": [ - "# Let's try one out. Change the website and add print statements to follow along.\n", - "\n", - "ed = Website(\"https://edwarddonner.com\")" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "5e3956f8", - "metadata": { - "vscode": { - "languageId": "plaintext" - } - }, - "outputs": [], - "source": [ - "# Define our system prompt - you can experiment with this later, changing the last sentence to 'Respond in markdown in Spanish.\"\n", - "\n", - "system_prompt = \"You are an assistant that analyzes the contents of a website \\\n", - "and provides a short summary, ignoring text that might be navigation related. \\\n", - "Respond in markdown.\"" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "99d791b4", - "metadata": { - "vscode": { - "languageId": "plaintext" - } - }, - "outputs": [], - "source": [ - "# A function that writes a User Prompt that asks for summaries of websites:\n", - "\n", - "def user_prompt_for(website):\n", - " user_prompt = f\"You are looking at a website titled {website.title}\"\n", - " user_prompt += \"\\nThe contents of this website is as follows; \\\n", - "please provide a short summary of this website in markdown. \\\n", - "If it includes news or announcements, then summarize these too.\\n\\n\"\n", - " user_prompt += website.text\n", - " return user_prompt" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "5d89b748", - "metadata": { - "vscode": { - "languageId": "plaintext" - } - }, - "outputs": [], - "source": [ - "# See how this function creates exactly the format above\n", - "\n", - "def messages_for(website):\n", - " return [\n", - " {\"role\": \"system\", \"content\": system_prompt},\n", - " {\"role\": \"user\", \"content\": user_prompt_for(website)}\n", - " ]" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "9a97d3e2", - "metadata": { - "vscode": { - "languageId": "plaintext" - } - }, - "outputs": [], - "source": [ - "# And now: call the OpenAI API. You will get very familiar with this!\n", - "\n", - "def summarize(url):\n", - " website = Website(url)\n", - " response=ollama.chat(model=model,messages=messages_for(website))\n", - " return(response[\"message\"][\"content\"])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ec13fe0a", - "metadata": { - "vscode": { - "languageId": "plaintext" - } - }, - "outputs": [], - "source": [ - "summarize(\"https://edwarddonner.com\")" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "e3ade092", - "metadata": { - "vscode": { - "languageId": "plaintext" - } - }, - "outputs": [], - "source": [ - "# A function to display this nicely in the Jupyter output, using markdown\n", - "\n", - "def display_summary(url):\n", - " summary = summarize(url)\n", - " display(Markdown(summary))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "be2d49e6", - "metadata": { - "vscode": { - "languageId": "plaintext" - } - }, - "outputs": [], - "source": [ - "display_summary(\"https://edwarddonner.com\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1ccbf33b", - "metadata": { - "vscode": { - "languageId": "plaintext" - } - }, - "outputs": [], - "source": [ - "display_summary(\"https://cnn.com\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ae3d0eae", - "metadata": { - "vscode": { - "languageId": "plaintext" - } - }, - "outputs": [], - "source": [ - "display_summary(\"https://anthropic.com\")" - ] - } - ], - "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.13" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} From 5515c1d004b7d57e93091324b523684397b1f8a1 Mon Sep 17 00:00:00 2001 From: Rohit Nain Date: Sun, 24 Aug 2025 17:56:13 +0530 Subject: [PATCH 53/72] day-2 exercise with ollama --- .../Day-2_exercise_with_ollama3.ipynb | 290 ++++++++++++++++++ 1 file changed, 290 insertions(+) create mode 100644 week1/community-contributions/Day-2_exercise_with_ollama3.ipynb diff --git a/week1/community-contributions/Day-2_exercise_with_ollama3.ipynb b/week1/community-contributions/Day-2_exercise_with_ollama3.ipynb new file mode 100644 index 0000000..1168770 --- /dev/null +++ b/week1/community-contributions/Day-2_exercise_with_ollama3.ipynb @@ -0,0 +1,290 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "135717e7", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "# imports\n", + "\n", + "import os\n", + "import requests\n", + "from dotenv import load_dotenv\n", + "from bs4 import BeautifulSoup\n", + "from IPython.display import Markdown, display\n", + "from openai import OpenAI\n", + "import ollama" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "29a9e634", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "# OPTION 1\n", + "# using openai\n", + "\n", + "# message = \"Hello, GPT! This is my first ever message to you! Hi!\"\n", + "# client = OpenAI(base_url=\"http://localhost:11434/v1\", api_key=\"not-needed\")\n", + "# response = openai.chat.completions.create(model=``, messages=[{\"role\":\"user\", \"content\":message}])\n", + "# print(response.choices[0].message.content)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "306993ed", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "# OPTION 2\n", + "# using Ollama\n", + "\n", + "message = \"Hello, GPT! This is my first ever message to you! Hi!\"\n", + "model=\"llama3\"\n", + "response=ollama.chat(model=model,messages=[{\"role\":\"user\",\"content\":message}])\n", + "print(response[\"message\"][\"content\"])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "856f767b", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "# A class to represent a Webpage\n", + "# If you're not familiar with Classes, check out the \"Intermediate Python\" notebook\n", + "\n", + "# Some websites need you to use proper headers when fetching them:\n", + "headers = {\n", + " \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36\"\n", + "}\n", + "\n", + "class Website:\n", + "\n", + " def __init__(self, url):\n", + " \"\"\"\n", + " Create this Website object from the given url using the BeautifulSoup library\n", + " \"\"\"\n", + " self.url = url\n", + " response = requests.get(url, headers=headers)\n", + " soup = BeautifulSoup(response.content, 'html.parser')\n", + " self.title = soup.title.string if soup.title else \"No title found\"\n", + " for irrelevant in soup.body([\"script\", \"style\", \"img\", \"input\"]):\n", + " irrelevant.decompose()\n", + " self.text = soup.body.get_text(separator=\"\\n\", strip=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "4ce558dc", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "# Let's try one out. Change the website and add print statements to follow along.\n", + "\n", + "ed = Website(\"https://edwarddonner.com\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "5e3956f8", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "# Define our system prompt - you can experiment with this later, changing the last sentence to 'Respond in markdown in Spanish.\"\n", + "\n", + "system_prompt = \"You are an assistant that analyzes the contents of a website \\\n", + "and provides a short summary, ignoring text that might be navigation related. \\\n", + "Respond in markdown.\"" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "99d791b4", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "# A function that writes a User Prompt that asks for summaries of websites:\n", + "\n", + "def user_prompt_for(website):\n", + " user_prompt = f\"You are looking at a website titled {website.title}\"\n", + " user_prompt += \"\\nThe contents of this website is as follows; \\\n", + "please provide a short summary of this website in markdown. \\\n", + "If it includes news or announcements, then summarize these too.\\n\\n\"\n", + " user_prompt += website.text\n", + " return user_prompt" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "5d89b748", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "# See how this function creates exactly the format above\n", + "\n", + "def messages_for(website):\n", + " return [\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt_for(website)}\n", + " ]" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "9a97d3e2", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "# And now: call the OpenAI API. You will get very familiar with this!\n", + "\n", + "def summarize(url):\n", + " website = Website(url)\n", + " response=ollama.chat(model=model,messages=messages_for(website))\n", + " return(response[\"message\"][\"content\"])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ec13fe0a", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "summarize(\"https://edwarddonner.com\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "e3ade092", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "# A function to display this nicely in the Jupyter output, using markdown\n", + "\n", + "def display_summary(url):\n", + " summary = summarize(url)\n", + " display(Markdown(summary))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "be2d49e6", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "display_summary(\"https://edwarddonner.com\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1ccbf33b", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "display_summary(\"https://cnn.com\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ae3d0eae", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "display_summary(\"https://anthropic.com\")" + ] + } + ], + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From c910bd11bbc19ac684b2f0cf3f7c35d2c0928264 Mon Sep 17 00:00:00 2001 From: yolelukoie <137051592+yolelukoie@users.noreply.github.com> Date: Sun, 24 Aug 2025 20:50:00 +0300 Subject: [PATCH 54/72] Added my contributions to community-contributions --- ...r_tailored_to_CV_and_job_description.ipynb | 211 ++++++++++++++++++ 1 file changed, 211 insertions(+) create mode 100644 week1/community-contributions/day1_coverletter_tailored_to_CV_and_job_description.ipynb diff --git a/week1/community-contributions/day1_coverletter_tailored_to_CV_and_job_description.ipynb b/week1/community-contributions/day1_coverletter_tailored_to_CV_and_job_description.ipynb new file mode 100644 index 0000000..9c63b6a --- /dev/null +++ b/week1/community-contributions/day1_coverletter_tailored_to_CV_and_job_description.ipynb @@ -0,0 +1,211 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "d955d75d-4970-48fe-983e-a2a850cecfc5", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import requests\n", + "from dotenv import load_dotenv\n", + "from bs4 import BeautifulSoup\n", + "from IPython.display import Markdown, display\n", + "from openai import OpenAI\n", + "\n", + "import PyPDF2\n", + "from selenium import webdriver\n", + "from selenium.webdriver.chrome.options import Options\n", + "from selenium.webdriver.chrome.service import Service\n", + "from webdriver_manager.chrome import ChromeDriverManager\n", + "from bs4 import BeautifulSoup\n", + "import time" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6e1e5dd3-f91a-466b-8fd4-2dbf4eedf101", + "metadata": {}, + "outputs": [], + "source": [ + "load_dotenv(override = True)\n", + "api_key = os.getenv(\"OPENAI_API_KEY\")\n", + "\n", + "if not api_key:\n", + " print(\"No API key\")\n", + "elif not api_key.startswith(\"sk-proj-\"):\n", + " print(\"API key doesn't look correct, check it\")\n", + "elif api_key.strip() != api_key:\n", + " print(\"It looks like API key has an extra space - check it\")\n", + "else:\n", + " print(\"API key looks good, moving on!\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "67a6e583-1ef7-4b77-8886-c0e8c619933c", + "metadata": {}, + "outputs": [], + "source": [ + "openai = OpenAI()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "34a07806-dd68-4a86-8b6e-e1b2aaf0daa1", + "metadata": {}, + "outputs": [], + "source": [ + "# path to the CV\n", + "path = \"/Users/yanasklar/Documents/For applying/CV/СV_YanaSklyar_c.pdf\"\n", + "headers = {\n", + " \"User-Agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36\"\n", + "}\n", + "\n", + "class Vacancy:\n", + " def __init__(self, url, instructions = \"\"):\n", + " self.url = url\n", + " \n", + " # configure Chrome settings\n", + " options = Options()\n", + " # options.add_argument(\"--headless\") \n", + " \"\"\"\n", + " Headless mode runs the browser in the background (invisible).\n", + " However, some websites (like openai.com) block headless browsers.\n", + " So if this line is active, the page may not load correctly and you may not get the full content.\n", + " \"\"\"\n", + " options.add_argument(\"--disable-gpu\")\n", + " options.add_argument(\"--no-sandbox\")\n", + " options.add_argument(\"--window-size=1920x1080\")\n", + "\n", + " # use webdriver-manager to manage ChromeDriver\n", + " service = Service(ChromeDriverManager().install())\n", + " driver = webdriver.Chrome(service=service, options=options)\n", + " driver.get(url)\n", + " time.sleep(3) # let the page load\n", + "\n", + " # take the source of the page\n", + " page_source = driver.page_source\n", + " driver.quit()\n", + "\n", + " # analyse with BeautifulSoup\n", + " soup = BeautifulSoup(page_source, 'html.parser')\n", + "\n", + " self.title = soup.title.string if soup.title else \"No title found\"\n", + " for irrelevant in soup.body([\"img\", \"script\", \"style\", \"input\"]):\n", + " irrelevant.decompose()\n", + " self.text = soup.body.get_text(separator='\\n', strip=True)\n", + "\n", + " # read CV\n", + " with open(path, 'rb') as f:\n", + " reader = PyPDF2.PdfReader(f)\n", + " cv_text = \"\"\n", + " for page in reader.pages:\n", + " text = page.extract_text()\n", + " if text:\n", + " cv_text += text + \"\\n\"\n", + " self.cv_text = cv_text\n", + "\n", + " # summarise and print the description of the job\n", + " message = f\"\"\"Here is the content of a webpage: {self.text}.\n", + " Find job description on that page,\n", + " summarise it, include the list requirements and other important details.\n", + " \"\"\"\n", + " messages = [{\"role\":\"user\", \"content\":message}]\n", + " response = openai.chat.completions.create(model='gpt-4o-mini', messages = messages)\n", + " print(\"The job description: \", response.choices[0].message.content)\n", + "\n", + " # create prompts\n", + " self.system_prompt = \"\"\"You are a career assistant specializing in writing cover letter.\n", + " Your tasks:\n", + " 1. Read the candidate's CV (provided as text).\n", + " 2. Read the job description (provided from a webpage).\n", + " 3. Write a concise and compelling cover letter, that:\n", + " - Hightlights the most relevant experience and skills from the CV,\n", + " - Aligns directly wit the requirements in the job description,\n", + " - Adapts to cultural and professional norms in Israel.\n", + " The letter should be no longer than half a page, persuasive and tailored to make the applicant stand out.\n", + " \"\"\"\n", + "\n", + " user_prompt = f\"\"\"\n", + " Here is my CV:\n", + " {self.cv_text}\n", + " \n", + " The job vacancy is from the website {self.title}.\n", + " Here is the decription of the vacancy:\n", + " {self.text}\n", + " Please write a cover letter that connects my background to this vacancy.\n", + " Make it persuasive and suitable for Israeli job market.\n", + " \"\"\"\n", + " \n", + " if instructions:\n", + " user_prompt += f\"Additional instructions: {instructions}\"\n", + " self.user_prompt = user_prompt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9160b9f5-177b-4477-8e54-3a212f275a22", + "metadata": {}, + "outputs": [], + "source": [ + "def cover_letter(url, instructions = \"\"):\n", + " vacancy = Vacancy(url, instructions)\n", + " messages = [\n", + " {\"role\":\"system\", \"content\":vacancy.system_prompt},\n", + " {\"role\":\"user\", \"content\":vacancy.user_prompt}\n", + " ]\n", + " response = openai.chat.completions.create(model='gpt-4o-mini', messages=messages)\n", + " if not response:\n", + " print(\"smt went wrong\")\n", + " print(response.choices[0].message.content)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1de4b55c-a8da-445f-9865-c7a8bafdbc3c", + "metadata": {}, + "outputs": [], + "source": [ + "a = \"https://www.linkedin.com/jobs/view/4285898438/?alternateChannel=search&eBP=CwEAAAGY3R5LOabDLOVTy6xvBcSlWyAkIXQz8IRkSM3rgsqTPtvcEvUSnq980O7oLV2Hh_ldTpc2cBBmRq1IRnLtp7TzEcUvndFEXeCuviA5yo7oFYfW7KoEp4SPNzmf3D9LtnSgk9Iudy3skk6n3hVOtyDpx8Zm0AiTWPvdwCaZ_w5Xu8lAG797NRNDco71ynm99LmCOC9Go7DdDQ2eLewamc4SOsA4xWcXy0GmZVy3kBF1AprK3ylAYR2wrm5-hp4lRpbbfUxXjkEOG6H_GbPpKtN-N8mYnMd9w_cej5qQmTFX86gqSi6HuXFtK0h46TbOS5r-YQksVd1Yb4kYZnDznWXPLbxp04xVJSPzsHoa05wQdOfZ2UUSoMTJmic3n3qfV2u9Bp8n4sLYtINpzKdvm4eADGGkN-nR3O2oPeas9XjGbBwNdjXHAcX_PJoRwlFdQ1gVkYQEF1T7qAfXUJoUt-fv4oLxGnIgV6yJuMgw&refId=9NA7Bvt%2FhCqDkFNRGu1dPA%3D%3D&trackingId=W11hvpcIjHA%2FjU%2FFZ%2B1uAA%3D%3D\"\n", + "b = \"The style of the cover letter should informal, as if i talked to a friend about my background\"\n", + "cover_letter(a, b)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0feb3cbe-686a-4a97-9ca3-a0cb32a24c5d", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python (llms)", + "language": "python", + "name": "llms" + }, + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 21028a6bf7257fa646cec72b02c841ecf343d26d Mon Sep 17 00:00:00 2001 From: Levezze Date: Sun, 17 Aug 2025 22:53:12 -0400 Subject: [PATCH 55/72] Add modular 3-way LLM conversation notebook Implements a clean, reusable architecture for multi-LLM conversations: - Unified OpenAI SDK interface for GPT, Claude, and Gemini models - Dynamic role assignment using a dictionary-based configuration - Three distinct personas: snarky arguer, sharp debater, and mediator - Conversation context management across all participants - Interactive display using IPython Markdown rendering The modular `call_llm()` function handles context building and message tracking, making it easy to orchestrate complex multi-agent dialogues. Demonstrates best practices for LLM interaction patterns in the course. --- .../day1_3_way_conversation_levzhitnik.ipynb | 255 ++++++++++++++++++ 1 file changed, 255 insertions(+) create mode 100644 week2/community-contributions/day1_3_way_conversation_levzhitnik.ipynb diff --git a/week2/community-contributions/day1_3_way_conversation_levzhitnik.ipynb b/week2/community-contributions/day1_3_way_conversation_levzhitnik.ipynb new file mode 100644 index 0000000..e5c0388 --- /dev/null +++ b/week2/community-contributions/day1_3_way_conversation_levzhitnik.ipynb @@ -0,0 +1,255 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "596b764a-2ece-4cb0-91c7-5317b8b2c65f", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from dotenv import load_dotenv\n", + "from openai import OpenAI\n", + "from IPython.display import Markdown, display, update_display" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "191079a8-fcb0-45fa-a954-9e92e3baa250", + "metadata": {}, + "outputs": [], + "source": [ + "load_dotenv(override=True)\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": "3a0f19ff-c936-469f-9fa1-c09b5c126263", + "metadata": {}, + "outputs": [], + "source": [ + "gpt_model = \"gpt-4.1-mini\"\n", + "claude_model = \"claude-3-5-haiku-latest\"\n", + "gemini_model = \"gemini-2.5-flash\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c1ffa25e-8250-4a86-951a-af44f1369336", + "metadata": {}, + "outputs": [], + "source": [ + "gpt_client = OpenAI(\n", + " api_key=openai_api_key\n", + ")\n", + "\n", + "claude_client = OpenAI(\n", + " api_key=anthropic_api_key,\n", + " base_url=\"https://api.anthropic.com/v1/\"\n", + ")\n", + "\n", + "gemini_client = OpenAI(\n", + " api_key=google_api_key,\n", + " base_url=\"https://generativelanguage.googleapis.com/v1beta/openai/\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eb8a203d-bdc7-40ee-a456-d47bdc71b07f", + "metadata": {}, + "outputs": [], + "source": [ + "# Tests\n", + "\n", + "messages = [{\"role\": \"system\", \"content\": \"You are a helpful assistant.\"},\n", + " {\"role\": \"user\", \"content\": \"Howdy partner!\"}]\n", + "\n", + "gpt_response = gpt_client.chat.completions.create(\n", + " model=gpt_model,\n", + " messages=messages,\n", + " temperature=0.5\n", + ")\n", + "print(f\"GPT: {gpt_response.choices[0].message.content}\")\n", + "\n", + "claude_response = claude_client.chat.completions.create(\n", + " model=claude_model,\n", + " messages=messages,\n", + " temperature=0.5\n", + ")\n", + "print(f\"Claude: {claude_response.choices[0].message.content}\")\n", + "\n", + "gemini_response = gemini_client.chat.completions.create(\n", + " model=gemini_model,\n", + " messages=messages,\n", + " temperature=0.5\n", + ")\n", + "print(f\"Gemini: {gemini_response.choices[0].message.content}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d140561e-fbf8-4741-b0bd-f850524bd6b3", + "metadata": {}, + "outputs": [], + "source": [ + "gpt_system = \"You are 'user_1'. You are snarky, entitled, and argumentative. Your role is to try and argue about anything and everything, and always have the last word, and never back down.\"\n", + "claude_system = \"You are 'user_2'. You are a sharp debater. You always debate every argument, and you do everything you can to be the debate winner. You don't stop until you have the upper hand.\"\n", + "gemini_system = \"You are 'user_3'. You are a mediator, coach and philosopher. Your job is to bring two sides to an agreement and have them stop arguing.\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b2b26a34-eb36-41c1-be2d-fc8154218897", + "metadata": {}, + "outputs": [], + "source": [ + "apis = {\n", + " \"gpt\": {\n", + " \"name\": \"gpt\",\n", + " \"user_name\": \"Gapetto\",\n", + " \"client\": gpt_client,\n", + " \"model\": gpt_model,\n", + " \"system\": gpt_system,\n", + " \"messages\": [],\n", + " },\n", + " \"claude\": {\n", + " \"name\": \"claude\",\n", + " \"user_name\": \"Claudia\",\n", + " \"client\": claude_client,\n", + " \"model\": claude_model,\n", + " \"system\": claude_system,\n", + " \"messages\": [],\n", + " },\n", + " \"gemini\": {\n", + " \"name\": \"gemini\",\n", + " \"user_name\": \"Germione\",\n", + " \"client\": gemini_client,\n", + " \"model\": gemini_model,\n", + " \"system\": gemini_system,\n", + " \"messages\": []\n", + " }\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "88bb7277-45dc-41b4-827c-b2e5a8b76675", + "metadata": {}, + "outputs": [], + "source": [ + "def call_llm(name: str):\n", + " llm = apis[name]\n", + " context = [{\"role\": \"system\", \"content\": llm[\"system\"]}]\n", + " \n", + " gpt_role, gpt_name = (\"assistant\", \"\") if name == \"gpt\" else (\"user\", f'{apis[\"gpt\"][\"user_name\"]}: ')\n", + " claude_role, claude_name = (\"assistant\", \"\") if name == \"claude\" else (\"user\", f'{apis[\"claude\"][\"user_name\"]}: ')\n", + " gemini_role, gemini_name = (\"assistant\", \"\") if name == \"gemini\" else (\"user\", f'{apis[\"gemini\"][\"user_name\"]}: ')\n", + " \n", + " for gpt, claude, gemini in zip(apis[\"gpt\"][\"messages\"], apis[\"claude\"][\"messages\"], apis[\"gemini\"][\"messages\"]):\n", + " context.append({\"role\": gpt_role, \"content\": f\"{gpt_name}{gpt}\"})\n", + " context.append({\"role\": claude_role, \"content\": f\"{claude_name}{claude}\"})\n", + " context.append({\"role\": gemini_role, \"content\": f\"{gemini_name}{gemini}\"})\n", + " \n", + " for i, key in enumerate(apis.keys()):\n", + " if key != name:\n", + " if len(apis[key][\"messages\"]) > len(llm[\"messages\"]):\n", + " context.append({\"role\": \"user\", \"content\": f'{apis[key][\"user_name\"]}: {apis[key][\"messages\"][-1]}'})\n", + " \n", + " response = llm[\"client\"].chat.completions.create(\n", + " model=llm[\"model\"],\n", + " messages=context,\n", + " temperature=0.7\n", + " )\n", + "\n", + " message = response.choices[0].message.content\n", + " llm[\"messages\"].append(message)\n", + " return message" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4fc73a2e-d8de-4a39-bfa2-67b16c231869", + "metadata": {}, + "outputs": [], + "source": [ + "apis[\"gpt\"][\"messages\"] = [\"Hi\"]\n", + "apis[\"claude\"][\"messages\"] = [\"Hi\"]\n", + "apis[\"gemini\"][\"messages\"] = [\"Lord of the Rings or Harry Potter?\"] # Obviously LOTR." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3810fbaf-94d1-4750-8e13-812d2e05b2d7", + "metadata": {}, + "outputs": [], + "source": [ + "gpt_response = call_llm(\"gpt\")\n", + "display(Markdown(f\"### Gapetto:\\n{gpt_response}\\n\\n\"))\n", + "\n", + "claude_response = call_llm(\"claude\")\n", + "display(Markdown(f\"### Claudia:\\n{claude_response}\\n\\n\"))\n", + "\n", + "gemini_response = call_llm(\"gemini\")\n", + "display(Markdown(f\"### Germione:\\n{gemini_response}\\n\\n\"))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e87b2ffc-6197-401a-97ca-7f51ac1677f2", + "metadata": {}, + "outputs": [], + "source": [ + "apis[\"gpt\"][\"messages\"] = [\"Hi\"]\n", + "apis[\"claude\"][\"messages\"] = [\"Hi\"]\n", + "apis[\"gemini\"][\"messages\"] = [\"Lord of the Rings or Harry Potter?\"]\n", + "\n", + "for i in range(5):\n", + " display(Markdown(f\"## Round {i+1}:\\n\\n\"))\n", + " \n", + " gpt_response = call_llm(\"gpt\")\n", + " display(Markdown(f\"### Gapetto:\\n{gpt_response}\\n\\n\"))\n", + "\n", + " claude_response = call_llm(\"claude\")\n", + " display(Markdown(f\"### Claudia:\\n{claude_response}\\n\\n\"))\n", + "\n", + " gemini_response = call_llm(\"gemini\")\n", + " display(Markdown(f\"### Germione:\\n{gemini_response}\\n\\n\"))" + ] + } + ], + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 262e17b399ac2d84d0f02ed216f586c73b6177bc Mon Sep 17 00:00:00 2001 From: Arundhati Date: Mon, 25 Aug 2025 13:51:27 -0400 Subject: [PATCH 56/72] Added gemini to dropdown task to community-contributions --- .../AddingGeminiToDropdown.ipynb | 223 ++++++++++++++++++ 1 file changed, 223 insertions(+) create mode 100644 week2/community-contributions/AddingGeminiToDropdown.ipynb diff --git a/week2/community-contributions/AddingGeminiToDropdown.ipynb b/week2/community-contributions/AddingGeminiToDropdown.ipynb new file mode 100644 index 0000000..656a542 --- /dev/null +++ b/week2/community-contributions/AddingGeminiToDropdown.ipynb @@ -0,0 +1,223 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "057bc09f-a682-4b72-97ed-c69ddef3f03e", + "metadata": {}, + "source": [ + "# Gemini to Dropdown" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d66eb067-7bae-4145-b613-6da2f40fbf27", + "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", + "import google.generativeai as genai\n", + "import anthropic" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e36f8a93-8a65-48f2-bcad-7c47dd72ef3a", + "metadata": {}, + "outputs": [], + "source": [ + "import gradio as gr " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8a5ec1b0-f5b4-46d2-abb0-b28b73cc4d28", + "metadata": {}, + "outputs": [], + "source": [ + "load_dotenv(override=True)\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": null, + "id": "26d0099c-890f-4358-8c1d-7a708abcb105", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "openai = OpenAI()\n", + "\n", + "claude = anthropic.Anthropic()\n", + "\n", + "google.generativeai.configure()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6606bfdb-964e-4d6f-b2a1-5017b99aa23d", + "metadata": {}, + "outputs": [], + "source": [ + "system_message = \"You are a helpful assistant\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e0cfb96a-2dbe-4228-8efb-75947dbc3228", + "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": "9008a15d-0ee8-44e0-b123-225e7148113e", + "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": "378ad12e-6645-4647-807c-00995e360268", + "metadata": {}, + "outputs": [], + "source": [ + "def stream_gemini(prompt):\n", + " gemini = genai.GenerativeModel(\n", + " model_name=\"gemini-2.0-flash\",\n", + " system_instruction=system_message\n", + " )\n", + " \n", + " stream = gemini.generate_content(prompt, stream=True)\n", + " \n", + " result = \"\"\n", + " for chunk in stream:\n", + " try:\n", + " part = chunk.text\n", + " if part:\n", + " result += part\n", + " yield result \n", + " except Exception as e:\n", + " print(\"Chunk error:\", e)\n", + " \n", + " \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fd50e143-eead-49b1-8ea3-b440becd4bc9", + "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": "c7fc9cb4-fbb8-4301-86a6-96c90f67eb3b", + "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", + ")\n", + "view.launch()" + ] + } + ], + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 6b528cf5d5dd1a71d4ba915a1b4abf8a0d712824 Mon Sep 17 00:00:00 2001 From: Rohit Nain Date: Tue, 26 Aug 2025 09:36:53 +0530 Subject: [PATCH 57/72] build a tool that take technical questions and responds with an explanation with Openai and Ollama --- .../week-1_exercise.ipynb | 337 ++++++++++++++++++ 1 file changed, 337 insertions(+) create mode 100644 week1/community-contributions/week-1_exercise.ipynb diff --git a/week1/community-contributions/week-1_exercise.ipynb b/week1/community-contributions/week-1_exercise.ipynb new file mode 100644 index 0000000..5072bc1 --- /dev/null +++ b/week1/community-contributions/week-1_exercise.ipynb @@ -0,0 +1,337 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "64d2e4a0", + "metadata": {}, + "source": [ + "# End of Week 1 Exercise\n", + "\n", + "To demonstrate your familiarity with OpenAI API, and also Ollama, build a tool that takes a technical question,\n", + "and responds with an explanation. This is a tool that you will be able to use yourself during the course!" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "e62b915e", + "metadata": {}, + "outputs": [], + "source": [ + "from openai import OpenAI\n", + "import ollama\n", + "from dotenv import load_dotenv\n", + "import os\n", + "from IPython.display import display, update_display, Markdown" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "8bdfc47a", + "metadata": {}, + "outputs": [], + "source": [ + "MODEL_GPT = 'gpt-4o-mini'\n", + "MODEL_LLAMA = 'llama3'\n", + "load_dotenv()\n", + "\n", + "api_key = os.getenv('OPENAI_API_KEY')\n", + "\n", + "openai=OpenAI()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "57983d03", + "metadata": {}, + "outputs": [], + "source": [ + "def create_messages(prompt=\"Describe some of the business applications of Generative AI\"):\n", + " \"\"\"Create properly formatted messages for API calls\"\"\"\n", + " messages = [\n", + " {\n", + " \"role\": \"system\",\n", + " \"content\": \"You are a helpful technical assistant that provides clear, detailed explanations for technical questions.\"\n", + " },\n", + " {\"role\": \"user\", \"content\": prompt}\n", + " ]\n", + " return messages" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "a6bcb94d", + "metadata": {}, + "outputs": [], + "source": [ + "def answer_with_openai(prompt=\"Describe some of the business applications of Generative AI\"):\n", + " \"\"\"Get answer using OpenAI API and print in stream\"\"\"\n", + " try:\n", + " messages = create_messages(prompt)\n", + " stream = openai.chat.completions.create(\n", + " model=MODEL_GPT,\n", + " messages=messages,\n", + " temperature=0.7,\n", + " stream=True\n", + " )\n", + " answer = \"\"\n", + " display_handle = display(Markdown(\"\"), display_id=True)\n", + " for chunk in stream:\n", + " if chunk.choices[0].delta.content:\n", + " answer += chunk.choices[0].delta.content\n", + " # Clean up markdown formatting for display\n", + " clean_answer = answer.replace(\"```\", \"\").replace(\"markdown\", \"\")\n", + " update_display(Markdown(clean_answer), display_id=display_handle.display_id)\n", + " return answer\n", + " except Exception as e:\n", + " return f\"Error with OpenAI: {str(e)}\"\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "e96159ab", + "metadata": {}, + "outputs": [], + "source": [ + "def answer_with_ollama(prompt=\"Describe some of the business applications of Generative AI\"):\n", + " \"\"\"Get answer using Ollama API and print in stream\"\"\"\n", + " try:\n", + " messages = create_messages(prompt)\n", + " stream = ollama.chat(\n", + " model=MODEL_LLAMA,\n", + " messages=messages,\n", + " stream=True\n", + " )\n", + " answer = \"\"\n", + " display_handle = display(Markdown(\"\"), display_id=True)\n", + " for chunk in stream:\n", + " if chunk['message']['content']:\n", + " answer += chunk['message']['content']\n", + " # Clean up markdown formatting for display\n", + " clean_answer = answer.replace(\"```\", \"\").replace(\"markdown\", \"\")\n", + " update_display(Markdown(clean_answer), display_id=display_handle.display_id)\n", + " return answer\n", + " except Exception as e:\n", + " return f\"Error with Ollama: {str(e)}\"" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "ab72f8b6", + "metadata": {}, + "outputs": [], + "source": [ + "def technical_qa_tool(question, use_openai=True, use_ollama=True):\n", + " \"\"\"Main function to get technical explanations from both APIs\"\"\"\n", + " print(f\"Question: {question}\")\n", + " print(\"=\" * 80)\n", + " \n", + " if use_openai:\n", + " print(\"\\n🤖 OpenAI Response:\")\n", + " print(\"-\" * 40)\n", + " answer_with_openai(question)\n", + " \n", + " if use_ollama:\n", + " print(\"\\n🦙 Ollama Response:\")\n", + " print(\"-\" * 40)\n", + " answer_with_ollama(question)\n", + " # display(Markdown(ollama_answer))\n", + " \n", + " print(\"\\n\" + \"=\" * 80)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "1a6aa4a2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Question: What is the difference between supervised and unsupervised machine learning?\n", + "================================================================================\n", + "\n", + "🤖 OpenAI Response:\n", + "----------------------------------------\n" + ] + }, + { + "data": { + "text/markdown": [ + "Supervised and unsupervised machine learning are two primary categories of machine learning techniques, and they differ mainly in how they learn from data and the type of problems they are used to solve. Here’s a detailed explanation of each:\n", + "\n", + "### Supervised Machine Learning\n", + "\n", + "**Definition**: In supervised learning, the model is trained on a labeled dataset, meaning that each training example is paired with an output label. The goal is to learn a mapping from inputs (features) to the output labels.\n", + "\n", + "**Characteristics**:\n", + "- **Labeled Data**: Requires a dataset that includes both the input features and the corresponding output labels.\n", + "- **Objective**: The objective is to predict the output for new, unseen data based on the learned mapping from the training data.\n", + "- **Common Techniques**:\n", + " - **Regression**: For predicting continuous values (e.g., predicting house prices).\n", + " - **Classification**: For predicting discrete labels (e.g., spam detection in emails).\n", + "- **Examples**:\n", + " - Predicting whether an email is spam or not based on various features (classification).\n", + " - Forecasting sales figures based on historical sales data (regression).\n", + "\n", + "### Unsupervised Machine Learning\n", + "\n", + "**Definition**: In unsupervised learning, the model is trained on data that is not labeled, meaning that it does not have predefined output labels. The goal is to discover patterns, groupings, or structures within the data.\n", + "\n", + "**Characteristics**:\n", + "- **Unlabeled Data**: Works with datasets that only have input features without any associated output labels.\n", + "- **Objective**: The objective is to explore the data and find hidden patterns or intrinsic structures without specific guidance.\n", + "- **Common Techniques**:\n", + " - **Clustering**: Grouping similar data points together (e.g., customer segmentation).\n", + " - **Dimensionality Reduction**: Reducing the number of features while retaining essential information (e.g., PCA - Principal Component Analysis).\n", + "- **Examples**:\n", + " - Grouping customers into segments based on purchasing behavior (clustering).\n", + " - Reducing the dimensionality of a dataset to visualize it in two or three dimensions (dimensionality reduction).\n", + "\n", + "### Key Differences\n", + "\n", + "1. **Data Type**:\n", + " - Supervised Learning: Requires labeled data.\n", + " - Unsupervised Learning: Works with unlabeled data.\n", + "\n", + "2. **Goal**:\n", + " - Supervised Learning: To learn a function that maps inputs to the correct outputs.\n", + " - Unsupervised Learning: To identify patterns or groupings in the input data.\n", + "\n", + "3. **Applications**:\n", + " - Supervised Learning: Typically used in scenarios where past data with known outcomes is available (e.g., fraud detection, image classification).\n", + " - Unsupervised Learning: Used for exploratory data analysis or when the outcome is not known (e.g., market basket analysis, anomaly detection).\n", + "\n", + "In summary, the primary difference between supervised and unsupervised machine learning lies in the presence or absence of labeled data and the objectives of the learning process. Supervised learning aims to predict outcomes based on existing labels, while unsupervised learning seeks to identify hidden structures in data without predefined labels." + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "🦙 Ollama Response:\n", + "----------------------------------------\n" + ] + }, + { + "data": { + "text/markdown": [ + "In machine learning, there are two main categories: supervised and unsupervised learning. The key difference lies in the type of data used to train the model and the goal of the learning process.\n", + "\n", + "**Supervised Learning**\n", + "\n", + "In supervised learning, you have a labeled dataset that contains both input data (features) and corresponding output labels or target variables. The goal is to learn a mapping between the input data and the output labels so that the model can make accurate predictions on new, unseen data.\n", + "\n", + "Here are some characteristics of supervised learning:\n", + "\n", + "1. Labeled training data: You have a dataset with input data and corresponding output labels.\n", + "2. Specific goal: You want to predict the output label for a given input instance.\n", + "3. Model evaluation: You evaluate the performance of your model using metrics like accuracy, precision, recall, F1 score, etc.\n", + "\n", + "Examples of supervised learning tasks include:\n", + "\n", + "* Image classification (e.g., recognizing dogs vs. cats)\n", + "* Sentiment analysis (e.g., determining if text is positive or negative)\n", + "* Regression problems (e.g., predicting house prices based on features like number of bedrooms and square footage)\n", + "\n", + "**Unsupervised Learning**\n", + "\n", + "In unsupervised learning, you have an unlabeled dataset, and the goal is to discover patterns, relationships, or structure in the data without a specific target variable. This type of learning is often used for exploratory data analysis, feature selection, and dimensionality reduction.\n", + "\n", + "Here are some characteristics of unsupervised learning:\n", + "\n", + "1. Unlabeled training data: You have a dataset with only input features (no output labels).\n", + "2. No specific goal: You want to find interesting patterns or structure in the data.\n", + "3. Model evaluation: You evaluate the performance of your model using metrics like silhouette score, Calinski-Harabasz index, etc.\n", + "\n", + "Examples of unsupervised learning tasks include:\n", + "\n", + "* Clustering (e.g., grouping customers based on their purchase history)\n", + "* Dimensionality reduction (e.g., reducing the number of features in a dataset while preserving important information)\n", + "* Anomaly detection (e.g., identifying unusual behavior or outliers in financial transactions)\n", + "\n", + "In summary, supervised learning involves training a model to make predictions based on labeled data, whereas unsupervised learning aims to discover patterns and relationships in unlabeled data." + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "================================================================================\n" + ] + } + ], + "source": [ + "# Test the tool with a technical question\n", + "technical_question = \"What is the difference between supervised and unsupervised machine learning?\"\n", + "technical_qa_tool(technical_question)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0a976ce1", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b0a539e", + "metadata": {}, + "outputs": [], + "source": [ + "# Interactive version - uncomment to use\n", + "# user_question = input(\"Enter your technical question: \")\n", + "# technical_qa_tool(user_question)" + ] + } + ], + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From aa7fc8c7bd5e71ca98356569246390d3574c4640 Mon Sep 17 00:00:00 2001 From: Oluwaseyi-A <62573285+Oluwaseyi-A@users.noreply.github.com> Date: Tue, 26 Aug 2025 17:06:44 -0400 Subject: [PATCH 58/72] Add week4 challenge to community-contributions --- .../unit-test-generator-v3.ipynb | 222 ++++++++++++++++++ 1 file changed, 222 insertions(+) create mode 100644 week4/community-contributions/unit-test-generator-v3.ipynb diff --git a/week4/community-contributions/unit-test-generator-v3.ipynb b/week4/community-contributions/unit-test-generator-v3.ipynb new file mode 100644 index 0000000..c47b6d0 --- /dev/null +++ b/week4/community-contributions/unit-test-generator-v3.ipynb @@ -0,0 +1,222 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "56957b7f-e289-4999-8a40-ce1a8378d8cd", + "metadata": {}, + "source": [ + "# Unit Test Generator\n", + "\n", + "The requirement: use a Frontier model to generate fast and repeatable unit tests for Python code.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3ef67ef0-1bda-45bb-abca-f003217602d4", + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "\n", + "import os\n", + "import io\n", + "import sys\n", + "import ast\n", + "import unittest, contextlib\n", + "from dotenv import load_dotenv\n", + "from openai import OpenAI\n", + "import google.generativeai\n", + "import anthropic\n", + "from IPython.display import Markdown, display, update_display\n", + "import gradio as gr\n", + "import subprocess\n", + "\n", + "# environment\n", + "\n", + "load_dotenv(override=True)\n", + "os.environ['OPENAI_API_KEY'] = os.getenv('OPENAI_API_KEY', 'your-key-if-not-using-env')\n", + "os.environ['ANTHROPIC_API_KEY'] = os.getenv('ANTHROPIC_API_KEY', 'your-key-if-not-using-env')\n", + "\n", + "openai = OpenAI()\n", + "claude = anthropic.Anthropic()\n", + "OPENAI_MODEL = \"gpt-4o\"\n", + "CLAUDE_MODEL = \"claude-3-7-sonnet-20250219\"\n", + "\n", + "system_message = \"You are an assistant that implements unit testing for Python code. \"\n", + "system_message += \"Respond only with Python code; use comments sparingly and do not provide any explanation other than occasional comments. \"\n", + "\n", + "def remove_main_block_from_code(code):\n", + " \"\"\"\n", + " Remove top-level `if __name__ == \"__main__\":` blocks from code.\n", + " \"\"\"\n", + " try:\n", + " tree = ast.parse(code)\n", + "\n", + " class RemoveMain(ast.NodeTransformer):\n", + " def visit_If(self, node):\n", + " # check if this is: if __name__ == \"__main__\":\n", + " test = node.test\n", + " if (\n", + " isinstance(test, ast.Compare) and\n", + " isinstance(test.left, ast.Name) and\n", + " test.left.id == \"__name__\" and\n", + " len(test.ops) == 1 and isinstance(test.ops[0], ast.Eq) and\n", + " len(test.comparators) == 1 and\n", + " isinstance(test.comparators[0], ast.Constant) and\n", + " test.comparators[0].value == \"__main__\"\n", + " ):\n", + " return None # remove this node entirely\n", + " return node\n", + "\n", + " tree = RemoveMain().visit(tree)\n", + " ast.fix_missing_locations(tree)\n", + " return ast.unparse(tree) # get back code as string\n", + " except Exception as e:\n", + " print(\"Error removing __main__ block:\", e)\n", + " return code # fallback: return original code if AST fails\n", + "\n", + "def user_prompt_for(python_file):\n", + " if isinstance(python_file, dict): # from Gradio\n", + " file_path = python_file[\"name\"]\n", + " elif hasattr(python_file, \"name\"): # tempfile\n", + " file_path = python_file.name\n", + " else: # string path\n", + " file_path = python_file\n", + "\n", + " with open(file_path, \"r\", encoding=\"utf-8\") as f:\n", + " python_code = f.read()\n", + "\n", + " # strip __main__ blocks\n", + " python_code = remove_main_block_from_code(python_code)\n", + "\n", + " user_prompt = \"Write unit tests for this Python code. \"\n", + " user_prompt += \"Respond only with Python code; do not explain your work other than a few comments. \"\n", + " user_prompt += \"The unit testing is done in Jupyterlab, so you should use packages that play nicely with the Jupyter kernel. \\n\\n\"\n", + " user_prompt += \"Include the original Python code in your generated output so that I can run all in one fell swoop.\\n\\n\"\n", + " user_prompt += python_code\n", + "\n", + " return user_prompt\n", + "\n", + "def messages_for(python_file):\n", + " return [\n", + " {\"role\": \"system\", \"content\": system_message},\n", + " {\"role\": \"user\", \"content\": user_prompt_for(python_file)}\n", + " ]\n", + "\t\n", + "def stream_gpt(python_file): \n", + " stream = openai.chat.completions.create(model=OPENAI_MODEL, messages=messages_for(python_file), stream=True)\n", + " reply = \"\"\n", + " for chunk in stream:\n", + " fragment = chunk.choices[0].delta.content or \"\"\n", + " reply += fragment\n", + " yield reply.replace('```python\\n','').replace('```','')\n", + "\t\t\n", + "def stream_claude(python_file):\n", + " result = claude.messages.stream(\n", + " model=CLAUDE_MODEL,\n", + " max_tokens=2000,\n", + " system=system_message,\n", + " messages=[{\"role\": \"user\", \"content\": user_prompt_for(python_file)}],\n", + " )\n", + " reply = \"\"\n", + " with result as stream:\n", + " for text in stream.text_stream:\n", + " reply += text\n", + " yield reply.replace('```python\\n','').replace('```','')\n", + "\t\t\t\n", + "def unit_test(python_file, model):\n", + " if model==\"GPT\":\n", + " result = stream_gpt(python_file)\n", + " elif model==\"Claude\":\n", + " result = stream_claude(python_file)\n", + " else:\n", + " raise ValueError(\"Unknown model\")\n", + " for stream_so_far in result:\n", + " yield stream_so_far\n", + "\n", + "def execute_python(code):\n", + " buffer = io.StringIO()\n", + " try:\n", + " with contextlib.redirect_stdout(buffer), contextlib.redirect_stderr(buffer):\n", + " # execute code in isolated namespace\n", + " ns = {}\n", + " exec(code, ns)\n", + "\n", + " # manually collect TestCase subclasses\n", + " test_cases = [\n", + " obj for obj in ns.values()\n", + " if isinstance(obj, type) and issubclass(obj, unittest.TestCase)\n", + " ]\n", + " if test_cases:\n", + " suite = unittest.TestSuite()\n", + " for case in test_cases:\n", + " suite.addTests(unittest.defaultTestLoader.loadTestsFromTestCase(case))\n", + " runner = unittest.TextTestRunner(stream=buffer, verbosity=2)\n", + " runner.run(suite)\n", + " except Exception as e:\n", + " print(f\"Error during execution: {e}\", file=buffer)\n", + "\n", + " return buffer.getvalue()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "670b8b78-0b13-488a-9533-59802b2fe101", + "metadata": {}, + "outputs": [], + "source": [ + "# --- Gradio UI ---\n", + "with gr.Blocks() as ui:\n", + " gr.Markdown(\"## Unit Test Generator\\nUpload a Python file and get structured unit testing.\")\n", + " with gr.Row(): # Row 1\n", + " orig_code = gr.File(label=\"Upload your Python file\", file_types=[\".py\"])\n", + " test_code = gr.Textbox(label=\"Unit test code:\", lines=10)\n", + " with gr.Row(): # Row 2\n", + " model = gr.Dropdown([\"GPT\", \"Claude\"], label=\"Select model\", value=\"GPT\")\n", + " with gr.Row(): # Row 3\n", + " generate = gr.Button(\"Generate unit test code\")\n", + " with gr.Row(): # Row 4\n", + " unit_run = gr.Button(\"Run Python unit test\")\n", + " with gr.Row(): # Row 5\n", + " test_out = gr.Textbox(label=\"Unit test result:\", lines=10)\n", + "\n", + " generate.click(unit_test, inputs=[orig_code, model], outputs=[test_code])\n", + "\n", + " unit_run.click(execute_python, inputs=[test_code], outputs=[test_out])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "609bbdc3-1e1c-4538-91dd-7d13134ab381", + "metadata": {}, + "outputs": [], + "source": [ + "ui.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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 4176d43e1a35f8cbd59b5d7cbffc3ff0ddb4ace0 Mon Sep 17 00:00:00 2001 From: Kwon Lee Date: Wed, 27 Aug 2025 09:23:06 -0800 Subject: [PATCH 59/72] added a microsoft edge driver solution by refactoring an existing chrome driver selenium solution --- .../day1_selenium_microsoftedgedriver.ipynb | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 week1/community-contributions/day1_selenium_microsoftedgedriver.ipynb diff --git a/week1/community-contributions/day1_selenium_microsoftedgedriver.ipynb b/week1/community-contributions/day1_selenium_microsoftedgedriver.ipynb new file mode 100644 index 0000000..c2e6b86 --- /dev/null +++ b/week1/community-contributions/day1_selenium_microsoftedgedriver.ipynb @@ -0,0 +1,123 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "3ba06289-d17a-4ccd-85f5-2b79956d4e59", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install selenium" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "935fe7b1-1807-4f75-863d-4c118e425a19", + "metadata": {}, + "outputs": [], + "source": [ + "pip show selenium" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eabbbc62-1de1-4883-9b3e-9c90145ea6c5", + "metadata": {}, + "outputs": [], + "source": [ + "from selenium import webdriver\n", + "from selenium.webdriver.edge.options import Options as EdgeOptions # Import EdgeOptions\n", + "from selenium.webdriver.edge.service import Service as EdgeService # Import EdgeService\n", + "from bs4 import BeautifulSoup\n", + "import time\n", + "import os\n", + "\n", + "class Website:\n", + " def __init__(self, url, driver_path=None, wait_time=3):\n", + " self.url = url\n", + " self.wait_time = wait_time\n", + "\n", + " # Headless Edge settings\n", + " options = EdgeOptions() # Use EdgeOptions\n", + " # options.add_argument(\"--headless\")\n", + " options.add_argument(\"--disable-gpu\")\n", + " options.add_argument(\"--no-sandbox\")\n", + " options.add_argument(\"--window-size=1920x1080\")\n", + "\n", + " # Driver path\n", + " if driver_path:\n", + " # For Edge, you might need to specify the path to msedgedriver\n", + " # For driver download, https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/?form=MA13LH#downloads\n", + " service = EdgeService(executable_path=driver_path) # Use EdgeService\n", + " else:\n", + " # If msedgedriver.exe is in your system's PATH, you can omit executable_path\n", + " service = EdgeService()\n", + "\n", + " # Start browser\n", + " # Use webdriver.Edge() for Microsoft Edge\n", + " driver = webdriver.Edge(service=service, options=options)\n", + " driver.get(url)\n", + "\n", + " # Wait for the loading page\n", + " time.sleep(self.wait_time)\n", + "\n", + " # Take page source\n", + " html = driver.page_source\n", + " driver.quit()\n", + "\n", + " # Analysis with BeautifulSoup \n", + " soup = BeautifulSoup(html, 'html.parser')\n", + " self.title = soup.title.string if soup.title else \"No title found\"\n", + "\n", + " # Clean irrelevant tags\n", + " for irrelevant in soup.body([\"script\", \"style\", \"img\", \"input\"]):\n", + " irrelevant.decompose()\n", + "\n", + " self.text = soup.body.get_text(separator=\"\\n\", strip=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "852c52e2-bd4d-4bb9-94ef-e498c33f1a89", + "metadata": {}, + "outputs": [], + "source": [ + "site = Website(\"https://openai.com\", driver_path=\"/Users/klee/Documents/edgedriver_mac64_m1/msedgedriver\")\n", + "print(\"Title:\", site.title)\n", + "print(\"\\nFirst 500 character:\\n\", site.text[:500])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7620c685-c35c-4d6b-aaf1-a3da98f19ca7", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 372f4ee82dbe81ecc559b162f9501fd335830cb0 Mon Sep 17 00:00:00 2001 From: Kartik Date: Thu, 28 Aug 2025 02:05:04 +0530 Subject: [PATCH 60/72] tools implemented --- week2/stock-api-day5.ipynb | 1180 ++++++++++++++++++++++++++++++++++++ 1 file changed, 1180 insertions(+) create mode 100644 week2/stock-api-day5.ipynb diff --git a/week2/stock-api-day5.ipynb b/week2/stock-api-day5.ipynb new file mode 100644 index 0000000..92d0769 --- /dev/null +++ b/week2/stock-api-day5.ipynb @@ -0,0 +1,1180 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "bcb31876-4d8c-41ef-aa24-b8c78dfd5808", + "metadata": {}, + "source": [ + "# Project - Stock Information AI Assistant\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b7bd1bd7-19d9-4c4b-bc4b-9bc9cca8bd0f", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install finnhub-python" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8b50bbe2-c0b1-49c3-9a5c-1ba7efa2bcb4", + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "\n", + "import os\n", + "import json\n", + "from dotenv import load_dotenv\n", + "from openai import OpenAI\n", + "import gradio as gr\n", + "import finnhub\n", + "from typing import Dict, List, Any, Optional\n", + "from datetime import datetime" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "747e8786-9da8-4342-b6c9-f5f69c2e22ae", + "metadata": {}, + "outputs": [], + "source": [ + "# Initialization\n", + "\n", + "load_dotenv(override=True)\n", + "\n", + "openai_api_key = os.getenv('OPENAI_API_KEY')\n", + "FINNHUB_API_KEY = os.getenv(\"FINNHUB_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 FINNHUB_API_KEY:\n", + " print(f\"FINNHUB_API_KEY exists!\")\n", + "else:\n", + " print(\"OpenAI API Key not set\")\n", + " \n", + "MODEL = \"gpt-5-mini\"\n", + "openai = OpenAI()\n", + "finnhub_client = finnhub.Client(api_key=FINNHUB_API_KEY)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ee3aaa9a-5495-42fd-a382-803fbfa92eaf", + "metadata": {}, + "outputs": [], + "source": [ + "system_message += f\"\"\"\n", + "You are called \"TickerBot\", You are a helpful stock information assistant specializing in US stocks. You provide factual, educational information without investment advice. You have access to tools for:\n", + "- Stock symbol lookup\n", + "- Real-time quotes\n", + "- Company Financials\n", + "- Company News\n", + "- Market overview\n", + "\n", + "### **Core Principles**\n", + "**Educational Focus**: Explain financial metrics clearly and keep an educational tone.\n", + "**Factual**: NEVER give buy/sell advice or predictions.\n", + "**Accurate always**: If no data is available, inform the user in a friendly way. Always be accurate. If you don't know the answer, simply say so. Do not make up your own stock details information.\n", + "\n", + "### **How to Handle Different Requests**\n", + "- For all temporal reasoning in this chat you can use `get_current_time()` tool to get time and then relative to current time you can proceed.\n", + "- When users mention companies, search for symbols with the tool `search_symbol()` else proceed directly if obvious match\n", + "- Try to search for news or data for only for a maximum of 1 month time range, else it becomes a lot of data to parse. If user asks for recent news just check the last 5 days from today; For example if today is 10-06-2025, use from=\"2025-06-05\", to=\"2025-06-10\"\n", + "\n", + "**Single Stock Comprehensive Analysis** (Use very judicially as it is time taking tool, only when user definitely needs a complete overview or multiple things that you would otherwise need to call multiple tools for):\n", + "- User asks about \"Apple\" or \"AAPL\" → Use all company specific tools that you deem necessary. \n", + "- Present a comprehensive analysis with current price, key metrics, and recent developments\n", + "\n", + "**Market Overview Requests**:\n", + "- \"What's happening in the market?\" → Use `get_market_overview(\"general\")`\n", + "- Summarize all news stories with very brief analysis\n", + "\n", + "### **Error Handling**\n", + "- If symbol search fails: \"I couldn't find that company in US markets. Could you try a different name or provide the ticker symbol?\"\n", + "- If some information gathered from the tool call says unavailable or error do not present it to the user unless they had specifically asked for it. Present rest of the gathered information if any.\n", + "- If data is unavailable: \"Some data isn't available right now, but here's what I found...\"\n", + "- Stay helpful and suggest alternatives\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "61a2a15d-b559-4844-b377-6bd5cb4949f6", + "metadata": {}, + "outputs": [], + "source": [ + "def validate_symbol(symbol: str) -> bool:\n", + " \"\"\"Validate stock symbol format\"\"\"\n", + " if not symbol or not isinstance(symbol, str):\n", + " return False\n", + " return symbol.isalnum() and 1 <= len(symbol) <= 5 and symbol.isupper()\n", + "\n", + "def search_symbol(query: str) -> Dict[str, Any]:\n", + " \"\"\"Search for stock symbol using Finnhub client\"\"\"\n", + " print(f\"Tool search_symbol called for {query}\")\n", + " try:\n", + " if not query or len(query.strip()) < 1:\n", + " return {\"success\": False, \"error\": \"Invalid search query\"}\n", + " \n", + " query = query.strip()[:50]\n", + " result = finnhub_client.symbol_lookup(query)\n", + " \n", + " if result.get(\"result\") and len(result[\"result\"]) > 0:\n", + " first_result = result[\"result\"][0]\n", + " symbol = first_result.get(\"symbol\", \"\").upper()\n", + " \n", + " if validate_symbol(symbol):\n", + " return {\n", + " \"success\": True,\n", + " \"symbol\": symbol\n", + " }\n", + " else:\n", + " return {\"success\": False, \"error\": \"Invalid symbol format found\"}\n", + " else:\n", + " return {\"success\": False, \"error\": \"No matching US stocks found\"}\n", + " \n", + " except Exception as e:\n", + " return {\"success\": False, \"error\": f\"Symbol search failed: {str(e)[:100]}\"}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "173010e3-dfef-4611-8b68-d11256bd5fba", + "metadata": {}, + "outputs": [], + "source": [ + "search_symbol_function = {\n", + " \"name\": \"search_symbol\",\n", + " \"description\": \"Search for a stock symbol / ticker symbol based on company name or partial name\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"query\": {\n", + " \"type\": \"string\",\n", + " \"description\": \"Company name or partial name to search for, extract only relevant name part and pass it here, keep this to less than 50 characters\"\n", + " }\n", + " },\n", + " \"required\": [\n", + " \"query\"\n", + " ]\n", + " }\n", + "}\n", + "\n", + "search_symbol_tool = {\"type\": \"function\", \"function\": search_symbol_function}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448bb4ce-8e86-4ceb-ab52-96bddfd33337", + "metadata": {}, + "outputs": [], + "source": [ + "def _format_big_number_from_millions(value_millions: Any) -> str:\n", + " \"\"\"\n", + " Finnhub returns some large metrics (marketCapitalization, enterpriseValue, revenueTTM)\n", + " in MILLIONS USD. Convert to full USD and format with M/B/T suffixes.\n", + " \"\"\"\n", + " if value_millions is None:\n", + " return \"Unavailable\"\n", + " try:\n", + " value = float(value_millions) * 1_000_000 # convert millions -> full USD\n", + " except (TypeError, ValueError):\n", + " return \"Unavailable\"\n", + "\n", + " trillion = 1_000_000_000_000\n", + " billion = 1_000_000_000\n", + " million = 1_000_000\n", + "\n", + " if value >= trillion:\n", + " return f\"{value / trillion:.2f}T USD\"\n", + " if value >= billion:\n", + " return f\"{value / billion:.2f}B USD\"\n", + " if value >= million:\n", + " return f\"{value / million:.2f}M USD\"\n", + " return f\"{value:.2f} USD\"\n", + "\n", + "\n", + "def _safe_metric(metrics: Dict[str, Any], key: str) -> Any:\n", + " \"\"\"\n", + " Return metric value if present; otherwise \"Unavailable\".\n", + " We intentionally return the raw value for numeric metrics (no rounding/format)\n", + " except for the specially formatted big-number fields handled elsewhere.\n", + " \"\"\"\n", + " if metrics is None:\n", + " return \"Unavailable\"\n", + " val = metrics.get(key)\n", + " return val if val is not None else \"Unavailable\"\n", + "\n", + "\n", + "def get_company_financials(symbol: str) -> Dict[str, Any]:\n", + " \"\"\"\n", + " Fetch and return a curated set of 'basic' financial metrics for `symbol`.\n", + " - Calls finnhub_client.company_basic_financials(symbol, 'all')\n", + " - Formats market cap, enterprise value, revenue (Finnhub returns these in millions)\n", + " - Returns success flag and readable keys\n", + " \"\"\"\n", + " print(f\"Tool get_company_financials called for {symbol}\")\n", + " try:\n", + " if not symbol or not symbol.strip():\n", + " return {\"success\": False, \"error\": \"Invalid stock symbol\"}\n", + "\n", + " symbol = symbol.strip().upper()\n", + "\n", + " # --- API Call ---\n", + " financials_resp = finnhub_client.company_basic_financials(symbol, \"all\")\n", + "\n", + " # Finnhub places primary values under \"metric\"\n", + " metrics = financials_resp.get(\"metric\", {})\n", + " if not metrics:\n", + " return {\"success\": False, \"error\": \"No financial metrics found\"}\n", + "\n", + " # --- Build result using helpers ---\n", + " result = {\n", + " \"success\": True,\n", + " \"symbol\": symbol,\n", + " \"financials\": {\n", + " \"Market Cap\": _format_big_number_from_millions(metrics.get(\"marketCapitalization\")),\n", + " \"Enterprise Value\": _format_big_number_from_millions(metrics.get(\"enterpriseValue\")),\n", + " \"P/E Ratio (TTM)\": _safe_metric(metrics, \"peBasicExclExtraTTM\"),\n", + " \"Forward P/E\": _safe_metric(metrics, \"forwardPE\"),\n", + " \"Revenue (TTM)\": _format_big_number_from_millions(metrics.get(\"revenueTTM\")),\n", + " \"Gross Margin (TTM)\": _safe_metric(metrics, \"grossMarginTTM\"),\n", + " \"Net Profit Margin (TTM)\": _safe_metric(metrics, \"netProfitMarginTTM\"),\n", + " \"EPS (TTM)\": _safe_metric(metrics, \"epsTTM\"),\n", + " \"EPS Growth (5Y)\": _safe_metric(metrics, \"epsGrowth5Y\"),\n", + " \"Dividend Yield (Indicated Annual)\": _safe_metric(metrics, \"dividendYieldIndicatedAnnual\"),\n", + " \"Current Ratio (Quarterly)\": _safe_metric(metrics, \"currentRatioQuarterly\"),\n", + " \"Debt/Equity (Long Term, Quarterly)\": _safe_metric(metrics, \"longTermDebt/equityQuarterly\"),\n", + " \"Beta\": _safe_metric(metrics, \"beta\"),\n", + " \"52-Week High\": _safe_metric(metrics, \"52WeekHigh\"),\n", + " \"52-Week Low\": _safe_metric(metrics, \"52WeekLow\"),\n", + " }\n", + " }\n", + "\n", + " return result\n", + "\n", + " except Exception as e:\n", + " # keep error message short but useful for debugging\n", + " return {\"success\": False, \"error\": f\"Failed to fetch metrics: {str(e)[:200]}\"}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9df7b74e-fec8-4e75-92a9-31acc75e6e97", + "metadata": {}, + "outputs": [], + "source": [ + "get_company_financials_function = {\n", + " \"name\": \"get_company_financials\",\n", + " \"description\": \"Fetch and return a curated set of basic financial metrics for a stock symbol. Calls Finnhub's company_basic_financials API, formats large numbers (market cap, enterprise value, revenue) in M/B/T USD, and shows metrics like P/E ratios, EPS, margins, dividend yield, debt/equity, beta, and 52-week range. Returns 'Unavailable' for missing values.\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"symbol\": {\n", + " \"type\": \"string\",\n", + " \"description\": \"Stock ticker symbol to fetch metrics for. Example: 'AAPL' for Apple Inc.\"\n", + " }\n", + " },\n", + " \"required\": [\n", + " \"symbol\"\n", + " ]\n", + " }\n", + "}\n", + "\n", + "\n", + "get_company_financials_tool = {\"type\": \"function\", \"function\": get_company_financials_function}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cfeeb200-3f30-4855-82b9-cc8b2a950f80", + "metadata": {}, + "outputs": [], + "source": [ + "def get_stock_quote(symbol: str) -> dict:\n", + " \"\"\"\n", + " Fetch the latest stock quote for a given ticker symbol using Finnhub's /quote endpoint.\n", + " Returns current price, daily high/low, open, previous close, percent change, and readable timestamp.\n", + " \"\"\"\n", + " print(f\"Tool get_stock_quote called for {symbol}\")\n", + " try:\n", + " if not symbol or len(symbol.strip()) < 1:\n", + " return {\"success\": False, \"error\": \"Invalid symbol provided\"}\n", + " \n", + " symbol = symbol.strip().upper()\n", + " data = finnhub_client.quote(symbol)\n", + "\n", + " if not data or \"c\" not in data:\n", + " return {\"success\": False, \"error\": \"No quote data found\"}\n", + " \n", + " # Convert epoch timestamp to ISO UTC if present\n", + " timestamp = data.get(\"t\")\n", + " if timestamp and isinstance(timestamp, (int, float)):\n", + " timestamp = datetime.utcfromtimestamp(timestamp).isoformat() + \"Z\"\n", + " else:\n", + " timestamp = \"Unavailable\"\n", + " \n", + " return {\n", + " \"success\": True,\n", + " \"symbol\": symbol,\n", + " \"current_price\": round(data.get(\"c\", 0), 2) if data.get(\"c\") is not None else \"Unavailable\",\n", + " \"change\": round(data.get(\"d\", 0), 2) if data.get(\"d\") is not None else \"Unavailable\",\n", + " \"percent_change\": f\"{round(data.get('dp', 0), 2)}%\" if data.get(\"dp\") is not None else \"Unavailable\",\n", + " \"high_price\": round(data.get(\"h\", 0), 2) if data.get(\"h\") is not None else \"Unavailable\",\n", + " \"low_price\": round(data.get(\"l\", 0), 2) if data.get(\"l\") is not None else \"Unavailable\",\n", + " \"open_price\": round(data.get(\"o\", 0), 2) if data.get(\"o\") is not None else \"Unavailable\",\n", + " \"previous_close\": round(data.get(\"pc\", 0), 2) if data.get(\"pc\") is not None else \"Unavailable\",\n", + " \"timestamp\": timestamp\n", + " }\n", + " except Exception as e:\n", + " return {\"success\": False, \"error\": f\"Quote retrieval failed: {str(e)[:100]}\"}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3724d92a-4515-4267-af6f-2c1ec2b6ed36", + "metadata": {}, + "outputs": [], + "source": [ + "get_stock_quote_function = {\n", + " \"name\": \"get_stock_quote\",\n", + " \"description\": \"Retrieve the latest stock quote for a given symbol, including current price, daily high/low, open, previous close, and percent change. Data is near real-time. Avoid constant polling; use websockets for streaming updates.\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"symbol\": {\n", + " \"type\": \"string\",\n", + " \"description\": \"Stock ticker symbol to fetch the latest quote for. Example: 'AAPL', 'MSFT'.\"\n", + " }\n", + " },\n", + " \"required\": [\"symbol\"]\n", + " }\n", + "}\n", + "\n", + "get_stock_quote_tool = {\"type\": \"function\", \"function\": get_stock_quote_function}\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "62f5d477-6626-428f-b8eb-d763e736ef5b", + "metadata": {}, + "outputs": [], + "source": [ + "def get_company_news(symbol: str, _from: str, to: str):\n", + " \"\"\"\n", + " Fetch the top 5 latest company news for a stock symbol within a date range.\n", + " - Ensures the range does not exceed ~1 months (35 days).\n", + " - Best practice: Keep searches to a month or less to avoid too much data.\n", + "\n", + " Args:\n", + " symbol (str): Stock ticker (e.g., \"AAPL\").\n", + " _from (str): Start date in YYYY-MM-DD format.\n", + " to (str): End date in YYYY-MM-DD format.\n", + "\n", + " Returns:\n", + " list or dict: Cleaned news data or error message.\n", + " \"\"\"\n", + " # Validate date format\n", + " print(f\"Tool get_company_news called for {symbol} from {_from} to {to}\")\n", + " try:\n", + " start_date = datetime.strptime(_from, \"%Y-%m-%d\")\n", + " end_date = datetime.strptime(to, \"%Y-%m-%d\")\n", + " except ValueError:\n", + " return {\"success\": False, \"error\": \"Invalid date format. Use YYYY-MM-DD.\"}\n", + "\n", + " # Check date range\n", + " delta_days = (end_date - start_date).days\n", + " if delta_days > 35:\n", + " return {\n", + " \"success\": False, \n", + " \"error\": f\"Date range too large ({delta_days} days). \"\n", + " \"Please use a range of 1 months or less.\"\n", + " }\n", + "\n", + " # Fetch data\n", + " try:\n", + " news = finnhub_client.company_news(symbol, _from=_from, to=to)\n", + " except Exception as e:\n", + " return {\"success\": False, \"error\": str(e)}\n", + "\n", + " # Do not want to report just the latest news in the time period\n", + " if len(news) <= 10:\n", + " # If 10 or fewer articles, take all\n", + " selected_news = news\n", + " else:\n", + " # Take first 5 (oldest) and last 5 (newest)\n", + " selected_news = news[:5] + news[-5:]\n", + "\n", + " # Clean & transform objects\n", + " cleaned_news = []\n", + " for article in news:\n", + " cleaned_news.append({\n", + " \"summary\": article.get(\"summary\"),\n", + " \"source\": article.get(\"source\"),\n", + " \"published_at\": datetime.utcfromtimestamp(article[\"datetime\"]).strftime(\"%Y-%m-%d %H:%M:%S UTC\"),\n", + " \"related\": article.get(\"related\")\n", + " })\n", + "\n", + " return {\"success\": True, \"news\": cleaned_news}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5150ecb6-e3f1-46dc-94fa-2a9abe5165f6", + "metadata": {}, + "outputs": [], + "source": [ + "get_company_news_function = {\n", + " \"name\": \"get_company_news\",\n", + " \"description\": \"Fetch the top 5 most recent company news articles for a given stock symbol. ⚠️ Avoid querying more than a 1-month range at a time as it may return too much data. Only tells news about company within last 1 year. An error is returned if the requested time range exceeds 1 month.\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"symbol\": {\n", + " \"type\": \"string\",\n", + " \"description\": \"Stock ticker symbol, e.g., 'AAPL'.\"\n", + " },\n", + " \"_from\": {\n", + " \"type\": \"string\",\n", + " \"description\": \"Start date in YYYY-MM-DD format. Ensure it is not more than 1 year ago.\"\n", + " },\n", + " \"to\": {\n", + " \"type\": \"string\",\n", + " \"description\": \"End date in YYYY-MM-DD format. Ensure it is not more than 1 year ago.\"\n", + " }\n", + " },\n", + " \"required\": [\n", + " \"symbol\",\n", + " \"_from\",\n", + " \"to\"\n", + " ]\n", + " }\n", + "}\n", + "\n", + "get_company_news_tool = {\"type\": \"function\", \"function\": get_company_news_function}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26dd7375-626f-4235-b4a2-f1926f62cc5e", + "metadata": {}, + "outputs": [], + "source": [ + "def get_market_news(category: str = \"general\"):\n", + " \"\"\"\n", + " Fetch the latest market news for a given category.\n", + " - Returns only the top 7 articles.\n", + "\n", + " Args:\n", + " category (str): News category. One of [\"general\", \"forex\", \"crypto\", \"merger\"].\n", + "\n", + " Returns:\n", + " list or dict: A cleaned list of news articles or error message.\n", + " \"\"\"\n", + " print(f\"Tool get_market_news called for category '{category}'\")\n", + "\n", + " try:\n", + " news = finnhub_client.general_news(category)\n", + " except Exception as e:\n", + " return {\"success\": False, \"error\": str(e)}\n", + "\n", + " # Do not want to report just the latest news in the time period\n", + " if len(news) <= 10:\n", + " # If 10 or fewer articles, take all\n", + " selected_news = news\n", + " else:\n", + " # Take first 5 (oldest) and last 5 (newest)\n", + " selected_news = news[:5] + news[-5:]\n", + "\n", + " # Clean & transform objects\n", + " cleaned_news = []\n", + " for article in news:\n", + " cleaned_news.append({\n", + " \"headline\": article.get(\"headline\"),\n", + " \"summary\": article.get(\"summary\"),\n", + " \"source\": article.get(\"source\"),\n", + " \"category\": article.get(\"category\"),\n", + " \"published_at\": datetime.utcfromtimestamp(article[\"datetime\"]).strftime(\"%Y-%m-%d %H:%M:%S UTC\"),\n", + " \"related\": article.get(\"related\")\n", + " })\n", + "\n", + " return {\"success\": True, \"news\": cleaned_news}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5bd1aa28-119c-4c7a-bdc0-161a582ab1cc", + "metadata": {}, + "outputs": [], + "source": [ + "get_market_news_function = {\n", + " \"name\": \"get_market_news\",\n", + " \"description\": \"Fetch the latest market news by category. Returns the top 10 news articles with headline, summary, source, category, published time (UTC), and URLs. Categories: general, forex, crypto, merger. Use this to quickly get relevant financial news.\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"category\": {\n", + " \"type\": \"string\",\n", + " \"description\": \"News category to fetch. One of: general, forex, crypto, merger.\"\n", + " }\n", + " },\n", + " \"required\": [\"category\"]\n", + " }\n", + "}\n", + "\n", + "get_market_news_tool = {\"type\": \"function\", \"function\": get_market_news_function}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d3378855-b83c-4078-b1e9-5f03e55c7276", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bf29bdd0-7603-45fc-ad39-790eb0b471d5", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a25474d9-128e-431f-9b4c-1b3897798f0b", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bdca8679-935f-4e7f-97e6-e71a4d4f228c", + "metadata": {}, + "outputs": [], + "source": [ + "# And this is included in a list of tools:\n", + "\n", + "tools = [{\"type\": \"function\", \"function\": price_function}]" + ] + }, + { + "cell_type": "markdown", + "id": "c3d3554f-b4e3-4ce7-af6f-68faa6dd2340", + "metadata": {}, + "source": [ + "## Getting OpenAI to use our Tool\n", + "\n", + "There's some fiddly stuff to allow OpenAI \"to call our tool\"\n", + "\n", + "What we actually do is give the LLM the opportunity to inform us that it wants us to run the tool.\n", + "\n", + "Here's how the new chat function looks:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ce9b0744-9c78-408d-b9df-9f6fd9ed78cf", + "metadata": {}, + "outputs": [], + "source": [ + "def chat(message, history):\n", + " messages = [{\"role\": \"system\", \"content\": system_message}] + history + [{\"role\": \"user\", \"content\": message}]\n", + " response = openai.chat.completions.create(model=MODEL, messages=messages, tools=tools)\n", + "\n", + " if response.choices[0].finish_reason==\"tool_calls\":\n", + " message = response.choices[0].message\n", + " response, city = handle_tool_call(message)\n", + " messages.append(message)\n", + " messages.append(response)\n", + " response = openai.chat.completions.create(model=MODEL, messages=messages)\n", + " \n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b0992986-ea09-4912-a076-8e5603ee631f", + "metadata": {}, + "outputs": [], + "source": [ + "# We have to write that function handle_tool_call:\n", + "\n", + "def handle_tool_call(message):\n", + " tool_call = message.tool_calls[0]\n", + " arguments = json.loads(tool_call.function.arguments)\n", + " city = arguments.get('destination_city')\n", + " price = get_ticket_price(city)\n", + " response = {\n", + " \"role\": \"tool\",\n", + " \"content\": json.dumps({\"destination_city\": city,\"price\": price}),\n", + " \"tool_call_id\": tool_call.id\n", + " }\n", + " return response, city" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f4be8a71-b19e-4c2f-80df-f59ff2661f14", + "metadata": {}, + "outputs": [], + "source": [ + "gr.ChatInterface(fn=chat, type=\"messages\").launch()" + ] + }, + { + "cell_type": "markdown", + "id": "473e5b39-da8f-4db1-83ae-dbaca2e9531e", + "metadata": {}, + "source": [ + "# Let's go multi-modal!!\n", + "\n", + "We can use DALL-E-3, the image generation model behind GPT-4o, to make us some images\n", + "\n", + "Let's put this in a function called artist.\n", + "\n", + "### Price alert: each time I generate an image it costs about 4 cents - don't go crazy with images!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2c27c4ba-8ed5-492f-add1-02ce9c81d34c", + "metadata": {}, + "outputs": [], + "source": [ + "# Some imports for handling images\n", + "\n", + "import base64\n", + "from io import BytesIO\n", + "from PIL import Image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "773a9f11-557e-43c9-ad50-56cbec3a0f8f", + "metadata": {}, + "outputs": [], + "source": [ + "def artist(city):\n", + " image_response = openai.images.generate(\n", + " model=\"dall-e-3\",\n", + " prompt=f\"An image representing a vacation in {city}, showing tourist spots and everything unique about {city}, in a vibrant pop-art style\",\n", + " size=\"1024x1024\",\n", + " n=1,\n", + " response_format=\"b64_json\",\n", + " )\n", + " image_base64 = image_response.data[0].b64_json\n", + " image_data = base64.b64decode(image_base64)\n", + " return Image.open(BytesIO(image_data))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d877c453-e7fb-482a-88aa-1a03f976b9e9", + "metadata": {}, + "outputs": [], + "source": [ + "image = artist(\"New York City\")\n", + "display(image)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "728a12c5-adc3-415d-bb05-82beb73b079b", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "f4975b87-19e9-4ade-a232-9b809ec75c9a", + "metadata": {}, + "source": [ + "## Audio (NOTE - Audio is optional for this course - feel free to skip Audio if it causes trouble!)\n", + "\n", + "And let's make a function talker that uses OpenAI's speech model to generate Audio\n", + "\n", + "### Troubleshooting Audio issues\n", + "\n", + "If you have any problems running this code below (like a FileNotFound error, or a warning of a missing package), you may need to install FFmpeg, a very popular audio utility.\n", + "\n", + "**For PC Users**\n", + "\n", + "Detailed instructions are [here](https://chatgpt.com/share/6724efee-6b0c-8012-ac5e-72e2e3885905) and summary instructions:\n", + "\n", + "1. Download FFmpeg from the official website: https://ffmpeg.org/download.html\n", + "\n", + "2. Extract the downloaded files to a location on your computer (e.g., `C:\\ffmpeg`)\n", + "\n", + "3. Add the FFmpeg bin folder to your system PATH:\n", + "- Right-click on 'This PC' or 'My Computer' and select 'Properties'\n", + "- Click on 'Advanced system settings'\n", + "- Click on 'Environment Variables'\n", + "- Under 'System variables', find and edit 'Path'\n", + "- Add a new entry with the path to your FFmpeg bin folder (e.g., `C:\\ffmpeg\\bin`)\n", + "- Restart your command prompt, and within Jupyter Lab do Kernel -> Restart kernel, to pick up the changes\n", + "\n", + "4. Open a new command prompt and run this to make sure it's installed OK\n", + "`ffmpeg -version`\n", + "\n", + "**For Mac Users**\n", + "\n", + "1. Install homebrew if you don't have it already by running this in a Terminal window and following any instructions: \n", + "`/bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\"`\n", + "\n", + "2. Then install FFmpeg with `brew install ffmpeg`\n", + "\n", + "3. Verify your installation with `ffmpeg -version` and if everything is good, within Jupyter Lab do Kernel -> Restart kernel to pick up the changes\n", + "\n", + "Message me or email me at ed@edwarddonner.com with any problems!" + ] + }, + { + "cell_type": "markdown", + "id": "4cc90e80-c96e-4dd4-b9d6-386fe2b7e797", + "metadata": {}, + "source": [ + "## To check you now have ffmpeg and can access it here\n", + "\n", + "Excecute the next cell to see if you get a version number. (Putting an exclamation mark before something in Jupyter Lab tells it to run it as a terminal command rather than python code).\n", + "\n", + "If this doesn't work, you may need to actually save and close down your Jupyter lab, and start it again from a new Terminal window (Mac) or Anaconda prompt (PC), remembering to activate the llms environment. This ensures you pick up ffmpeg.\n", + "\n", + "And if that doesn't work, please contact me!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7b3be0fb-1d34-4693-ab6f-dbff190afcd7", + "metadata": {}, + "outputs": [], + "source": [ + "!ffmpeg -version\n", + "!ffprobe -version\n", + "!ffplay -version" + ] + }, + { + "cell_type": "markdown", + "id": "d91d3f8f-e505-4e3c-a87c-9e42ed823db6", + "metadata": {}, + "source": [ + "# For Mac users - and possibly many PC users too\n", + "\n", + "This version should work fine for you. It might work for Windows users too, but you might get a Permissions error writing to a temp file. If so, see the next section!\n", + "\n", + "As always, if you have problems, please contact me! (You could also comment out the audio talker() in the later code if you're less interested in audio generation)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ffbfe93b-5e86-4e68-ba71-b301cd5230db", + "metadata": {}, + "outputs": [], + "source": [ + "from pydub import AudioSegment\n", + "from pydub.playback import play\n", + "\n", + "def talker(message):\n", + " response = openai.audio.speech.create(\n", + " model=\"tts-1\",\n", + " voice=\"onyx\", # Also, try replacing onyx with alloy\n", + " input=message\n", + " )\n", + " \n", + " audio_stream = BytesIO(response.content)\n", + " audio = AudioSegment.from_file(audio_stream, format=\"mp3\")\n", + " play(audio)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b88d775d-d357-4292-a1ad-5dc5ed567281", + "metadata": {}, + "outputs": [], + "source": [ + "talker(\"Well, hi there\")" + ] + }, + { + "cell_type": "markdown", + "id": "ad89a9bd-bb1e-4bbb-a49a-83af5f500c24", + "metadata": {}, + "source": [ + "# For Windows users (or any Mac users with problems above)\n", + "\n", + "## First try the Mac version above, but if you get a permissions error writing to a temp file, then this code should work instead.\n", + "\n", + "A collaboration between students Mark M. and Patrick H. and Claude got this resolved!\n", + "\n", + "Below are 4 variations - hopefully one of them will work on your PC. If not, message me please!\n", + "\n", + "And for Mac people - all 3 of the below work on my Mac too - please try these if the Mac version gave you problems.\n", + "\n", + "## PC Variation 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d104b96a-02ca-4159-82fe-88e0452aa479", + "metadata": {}, + "outputs": [], + "source": [ + "import base64\n", + "from io import BytesIO\n", + "from PIL import Image\n", + "from IPython.display import Audio, display\n", + "\n", + "def talker(message):\n", + " response = openai.audio.speech.create(\n", + " model=\"tts-1\",\n", + " voice=\"onyx\",\n", + " input=message)\n", + "\n", + " audio_stream = BytesIO(response.content)\n", + " output_filename = \"output_audio.mp3\"\n", + " with open(output_filename, \"wb\") as f:\n", + " f.write(audio_stream.read())\n", + "\n", + " # Play the generated audio\n", + " display(Audio(output_filename, autoplay=True))\n", + "\n", + "talker(\"Well, hi there\")" + ] + }, + { + "cell_type": "markdown", + "id": "3a5d11f4-bbd3-43a1-904d-f684eb5f3e3a", + "metadata": {}, + "source": [ + "## PC Variation 2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d59c8ebd-79c5-498a-bdf2-3a1c50d91aa0", + "metadata": {}, + "outputs": [], + "source": [ + "import tempfile\n", + "import subprocess\n", + "from io import BytesIO\n", + "from pydub import AudioSegment\n", + "import time\n", + "\n", + "def play_audio(audio_segment):\n", + " temp_dir = tempfile.gettempdir()\n", + " temp_path = os.path.join(temp_dir, \"temp_audio.wav\")\n", + " try:\n", + " audio_segment.export(temp_path, format=\"wav\")\n", + " time.sleep(3) # Student Dominic found that this was needed. You could also try commenting out to see if not needed on your PC\n", + " subprocess.call([\n", + " \"ffplay\",\n", + " \"-nodisp\",\n", + " \"-autoexit\",\n", + " \"-hide_banner\",\n", + " temp_path\n", + " ], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)\n", + " finally:\n", + " try:\n", + " os.remove(temp_path)\n", + " except Exception:\n", + " pass\n", + " \n", + "def talker(message):\n", + " response = openai.audio.speech.create(\n", + " model=\"tts-1\",\n", + " voice=\"onyx\", # Also, try replacing onyx with alloy\n", + " input=message\n", + " )\n", + " audio_stream = BytesIO(response.content)\n", + " audio = AudioSegment.from_file(audio_stream, format=\"mp3\")\n", + " play_audio(audio)\n", + "\n", + "talker(\"Well hi there\")" + ] + }, + { + "cell_type": "markdown", + "id": "96f90e35-f71e-468e-afea-07b98f74dbcf", + "metadata": {}, + "source": [ + "## PC Variation 3" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8597c7f8-7b50-44ad-9b31-db12375cd57b", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pydub import AudioSegment\n", + "from pydub.playback import play\n", + "from io import BytesIO\n", + "\n", + "def talker(message):\n", + " # Set a custom directory for temporary files on Windows\n", + " custom_temp_dir = os.path.expanduser(\"~/Documents/temp_audio\")\n", + " os.environ['TEMP'] = custom_temp_dir # You can also use 'TMP' if necessary\n", + " \n", + " # Create the folder if it doesn't exist\n", + " if not os.path.exists(custom_temp_dir):\n", + " os.makedirs(custom_temp_dir)\n", + " \n", + " response = openai.audio.speech.create(\n", + " model=\"tts-1\",\n", + " voice=\"onyx\", # Also, try replacing onyx with alloy\n", + " input=message\n", + " )\n", + " \n", + " audio_stream = BytesIO(response.content)\n", + " audio = AudioSegment.from_file(audio_stream, format=\"mp3\")\n", + "\n", + " play(audio)\n", + "\n", + "talker(\"Well hi there\")" + ] + }, + { + "cell_type": "markdown", + "id": "e821224c-b069-4f9b-9535-c15fdb0e411c", + "metadata": {}, + "source": [ + "## PC Variation 4\n", + "\n", + "### Let's try a completely different sound library\n", + "\n", + "First run the next cell to install a new library, then try the cell below it." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69d3c0d9-afcc-49e3-b829-9c9869d8b472", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install simpleaudio" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "28f9cc99-36b7-4554-b3f4-f2012f614a13", + "metadata": {}, + "outputs": [], + "source": [ + "from pydub import AudioSegment\n", + "from io import BytesIO\n", + "import tempfile\n", + "import os\n", + "import simpleaudio as sa\n", + "\n", + "def talker(message):\n", + " response = openai.audio.speech.create(\n", + " model=\"tts-1\",\n", + " voice=\"onyx\", # Also, try replacing onyx with alloy\n", + " input=message\n", + " )\n", + " \n", + " audio_stream = BytesIO(response.content)\n", + " audio = AudioSegment.from_file(audio_stream, format=\"mp3\")\n", + "\n", + " # Create a temporary file in a folder where you have write permissions\n", + " with tempfile.NamedTemporaryFile(suffix=\".wav\", delete=False, dir=os.path.expanduser(\"~/Documents\")) as temp_audio_file:\n", + " temp_file_name = temp_audio_file.name\n", + " audio.export(temp_file_name, format=\"wav\")\n", + " \n", + " # Load and play audio using simpleaudio\n", + " wave_obj = sa.WaveObject.from_wave_file(temp_file_name)\n", + " play_obj = wave_obj.play()\n", + " play_obj.wait_done() # Wait for playback to finish\n", + "\n", + " # Clean up the temporary file afterward\n", + " os.remove(temp_file_name)\n", + " \n", + "talker(\"Well hi there\")" + ] + }, + { + "cell_type": "markdown", + "id": "7986176b-cd04-495f-a47f-e057b0e462ed", + "metadata": {}, + "source": [ + "## PC Users - if none of those 4 variations worked!\n", + "\n", + "Please get in touch with me. I'm sorry this is causing problems! We'll figure it out.\n", + "\n", + "Alternatively: playing audio from your PC isn't super-critical for this course, and you can feel free to focus on image generation and skip audio for now, or come back to it later." + ] + }, + { + "cell_type": "markdown", + "id": "1d48876d-c4fa-46a8-a04f-f9fadf61fb0d", + "metadata": {}, + "source": [ + "# Our Agent Framework\n", + "\n", + "The term 'Agentic AI' and Agentization is an umbrella term that refers to a number of techniques, such as:\n", + "\n", + "1. Breaking a complex problem into smaller steps, with multiple LLMs carrying out specialized tasks\n", + "2. The ability for LLMs to use Tools to give them additional capabilities\n", + "3. The 'Agent Environment' which allows Agents to collaborate\n", + "4. An LLM can act as the Planner, dividing bigger tasks into smaller ones for the specialists\n", + "5. The concept of an Agent having autonomy / agency, beyond just responding to a prompt - such as Memory\n", + "\n", + "We're showing 1 and 2 here, and to a lesser extent 3 and 5. In week 8 we will do the lot!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ba820c95-02f5-499e-8f3c-8727ee0a6c0c", + "metadata": {}, + "outputs": [], + "source": [ + "def chat(history):\n", + " messages = [{\"role\": \"system\", \"content\": system_message}] + history\n", + " response = openai.chat.completions.create(model=MODEL, messages=messages, tools=tools)\n", + " image = None\n", + " \n", + " if response.choices[0].finish_reason==\"tool_calls\":\n", + " message = response.choices[0].message\n", + " response, city = handle_tool_call(message)\n", + " messages.append(message)\n", + " messages.append(response)\n", + " image = artist(city)\n", + " response = openai.chat.completions.create(model=MODEL, messages=messages)\n", + " \n", + " reply = response.choices[0].message.content\n", + " history += [{\"role\":\"assistant\", \"content\":reply}]\n", + "\n", + " # Comment out or delete the next line if you'd rather skip Audio for now..\n", + " talker(reply)\n", + " \n", + " return history, image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f38d0d27-33bf-4992-a2e5-5dbed973cde7", + "metadata": {}, + "outputs": [], + "source": [ + "# More involved Gradio code as we're not using the preset Chat interface!\n", + "# Passing in inbrowser=True in the last line will cause a Gradio window to pop up immediately.\n", + "\n", + "with gr.Blocks() as ui:\n", + " with gr.Row():\n", + " chatbot = gr.Chatbot(height=500, type=\"messages\")\n", + " image_output = gr.Image(height=500)\n", + " with gr.Row():\n", + " entry = gr.Textbox(label=\"Chat with our AI Assistant:\")\n", + " with gr.Row():\n", + " clear = gr.Button(\"Clear\")\n", + "\n", + " def do_entry(message, history):\n", + " history += [{\"role\":\"user\", \"content\":message}]\n", + " return \"\", history\n", + "\n", + " entry.submit(do_entry, inputs=[entry, chatbot], outputs=[entry, chatbot]).then(\n", + " chat, inputs=chatbot, outputs=[chatbot, image_output]\n", + " )\n", + " clear.click(lambda: None, inputs=None, outputs=chatbot, queue=False)\n", + "\n", + "ui.launch(inbrowser=True)" + ] + }, + { + "cell_type": "markdown", + "id": "226643d2-73e4-4252-935d-86b8019e278a", + "metadata": {}, + "source": [ + "# Exercises and Business Applications\n", + "\n", + "Add in more tools - perhaps to simulate actually booking a flight. A student has done this and provided their example in the community contributions folder.\n", + "\n", + "Next: take this and apply it to your business. Make a multi-modal AI assistant with tools that could carry out an activity for your work. A customer support assistant? New employee onboarding assistant? So many possibilities! Also, see the week2 end of week Exercise in the separate Notebook." + ] + }, + { + "cell_type": "markdown", + "id": "7e795560-1867-42db-a256-a23b844e6fbe", + "metadata": {}, + "source": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + "

I have a special request for you

\n", + " \n", + " My editor tells me that it makes a HUGE difference when students rate this course on Udemy - it's one of the main ways that Udemy decides whether to show it to others. If you're able to take a minute to rate this, I'd be so very grateful! And regardless - always please reach out to me at ed@edwarddonner.com if I can help at any point.\n", + " \n", + "
" + ] + } + ], + "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.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 7e73249dd67bcd0e91bf0c1e5f67aef62d82571c Mon Sep 17 00:00:00 2001 From: JacquieAM <69653489+JacquieAM@users.noreply.github.com> Date: Wed, 27 Aug 2025 18:01:50 -0500 Subject: [PATCH 61/72] Add website-summary notebook for community contribution --- .../jacquieAM/website-summary.ipynb | 329 ++++++++++++++++++ 1 file changed, 329 insertions(+) create mode 100644 week1/community-contributions/training-summary-translation-length/jacquieAM/website-summary.ipynb diff --git a/week1/community-contributions/training-summary-translation-length/jacquieAM/website-summary.ipynb b/week1/community-contributions/training-summary-translation-length/jacquieAM/website-summary.ipynb new file mode 100644 index 0000000..9c31463 --- /dev/null +++ b/week1/community-contributions/training-summary-translation-length/jacquieAM/website-summary.ipynb @@ -0,0 +1,329 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "9ab446e4-219c-4589-aa8f-9386adcf5c60", + "metadata": {}, + "outputs": [], + "source": [ + "## Project Overview\n", + "This project combines web scraping with OpenAI’s GPT models to summarize online training content. It extracts material from Microsoft’s **Quantum Computing Fundamentals** learning path, cleans it, and generates concise summaries per lesson as well as an overall course summary. \n", + "\n", + "## Key Features\n", + "- Fetches and parses webpages using **requests** and **BeautifulSoup** \n", + "- Produces summaries in multiple languages (e.g., English, Spanish, or any language) and at varying levels of detail (short, medium, detailed) \n", + "- Summarizes individual lessons on demand or processes entire learning paths \n", + "- Presents results as clean, structured **Markdown** directly in the notebook \n", + "\n", + "## Tech Stack\n", + "- **Model**: GPT-4o-mini \n", + "- **Language**: Python \n", + "- **Libraries**: BeautifulSoup, OpenAI \n", + "\n", + "## Purpose\n", + "This project demonstrates how AI can streamline the understanding of technical documentation and online courses by generating multilingual, customizable summaries. \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4e2a9393-7767-488e-a8bf-27c12dca35bd", + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "\n", + "import os\n", + "import requests\n", + "from dotenv import load_dotenv\n", + "from bs4 import BeautifulSoup\n", + "from IPython.display import Markdown, display\n", + "from openai import OpenAI\n", + "\n", + "# If you get an error running this cell, then please head over to the troubleshooting notebook!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7b87cadb-d513-4303-baee-a37b6f938e4d", + "metadata": {}, + "outputs": [], + "source": [ + "# Load environment variables from .env file (not included)\n", + "\n", + "load_dotenv(override=True)\n", + "api_key = os.getenv('OPENAI_API_KEY')\n", + "\n", + "# Check the key\n", + "\n", + "if not api_key:\n", + " print(\"No API key was found\")\n", + "elif not api_key.startswith(\"sk-proj-\"):\n", + " print(\"An API key was found, but it doesn't start sk-proj-; please check you're using the right key\")\n", + "elif api_key.strip() != api_key:\n", + " print(\"An API key was found, but it looks like it might have space or tab characters at the start or end - please remove them\")\n", + "else:\n", + " print(\"API key found and looks good so far!\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "019974d9-f3ad-4a8a-b5f9-0a3719aea2d3", + "metadata": {}, + "outputs": [], + "source": [ + "openai = OpenAI()\n", + "\n", + "# If this doesn't work, try Kernel menu >> Restart Kernel and Clear Outputs Of All Cells, then run the cells from the top of this notebook down.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c5e793b2-6775-426a-a139-4848291d0463", + "metadata": {}, + "outputs": [], + "source": [ + "# A class to represent a Webpage\n", + "\n", + "# Some websites need you to use proper headers when fetching them:\n", + "headers = {\n", + " \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36\"\n", + "}\n", + "\n", + "class Website:\n", + "\n", + " def __init__(self, url):\n", + " \"\"\"\n", + " Create this Website object from the given url using the BeautifulSoup library\n", + " \"\"\"\n", + " self.url = url\n", + " response = requests.get(url, headers=headers)\n", + " soup = BeautifulSoup(response.content, 'html.parser')\n", + " self.title = soup.title.string if soup.title else \"No title found\"\n", + " for irrelevant in soup.body([\"script\", \"style\", \"img\", \"input\"]):\n", + " irrelevant.decompose()\n", + " self.text = soup.body.get_text(separator=\"\\n\", strip=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef960cf-6dc2-4cda-afb3-b38be12f4c97", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "training_website = Website(\"https://learn.microsoft.com/en-us/training/paths/quantum-computing-fundamentals/\")\n", + "print(training_website.title)\n", + "print(training_website.text)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "abdb8417-c5dc-44bc-9bee-2e059d162699", + "metadata": {}, + "outputs": [], + "source": [ + "# Create a system prompt function that can use different language and length \n", + "\n", + "def build_system_prompt(language=\"Spanish\", length=\"short\"):\n", + " return f\"\"\"You are an assistant that analyzes the contents of a website and provides a {length} summary, ignoring text that might be navigation related.\n", + " Respond in 20 words or less markdown, and respond in {language}.\n", + " \"\"\"\n", + " \n", + " \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "987c95a6-6618-4d22-a2c3-3038a9d3f154", + "metadata": {}, + "outputs": [], + "source": [ + "# Create a function that writes a User Prompt that asks for summaries of websites:\n", + "\n", + "def user_prompt_for(website):\n", + " user_prompt = f\"You are looking at a website titled {website.title}\"\n", + " user_prompt += \"\\nThe contents of this website is as follows; \\\n", + "please provide a short summary in {language} of this website in markdown. \\\n", + "If it includes news or announcements, then summarize these too.\\n\\n\"\n", + " user_prompt += website.text\n", + " return user_prompt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8a846c89-81d8-4f48-9d62-7744d76694e2", + "metadata": {}, + "outputs": [], + "source": [ + "print(user_prompt_for(training_website))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26448ec4-5c00-4204-baec-7df91d11ff2e", + "metadata": {}, + "outputs": [], + "source": [ + "print(user_prompt_for(training_website))" + ] + }, + { + "cell_type": "markdown", + "id": "d06e8d78-ce4c-4b05-aa8e-17050c82bb47", + "metadata": {}, + "source": [ + "## And now let's build useful messages for GPT-4o-mini, using a function" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0134dfa4-8299-48b5-b444-f2a8c3403c88", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "def messages_for(website, language=\"Spanish\", length=\"short\"):\n", + " return [\n", + " {\"role\": \"system\", \"content\": build_system_prompt(language, length)},\n", + " {\"role\": \"user\", \"content\": user_prompt_for(website)}\n", + " ]" + ] + }, + { + "cell_type": "markdown", + "id": "16f49d46-bf55-4c3e-928f-68fc0bf715b0", + "metadata": {}, + "source": [ + "## Time to bring it together - the API for OpenAI is very simple!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "425214b8-c5c5-4d7a-8b79-f9e151c9d54f", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "905b9919-aba7-45b5-ae65-81b3d1d78e34", + "metadata": {}, + "outputs": [], + "source": [ + "#call the OpenAI API. \n", + "\n", + "def summarize(url, language=\"Spanish\", length=\"short\"):\n", + " website = Website(url)\n", + " response = openai.chat.completions.create(\n", + " model=\"gpt-4o-mini\",\n", + " messages=messages_for(website, language, length)\n", + " )\n", + " return response.choices[0].message.content\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1c437357-d004-49f5-95c3-fce38aefcb5c", + "metadata": {}, + "outputs": [], + "source": [ + "#Summarize all the lessons in microsoft quantum computer training, having the option to summarize by lesson, or the training as a whole\n", + "\n", + "def summarize_training(path_url, language=\"Spanish\", length=\"short\"):\n", + " links = get_links_from_path(path_url)\n", + " print(f\"Found {len(links)} lessons\")\n", + "\n", + " all_summaries = []\n", + "\n", + " for link in links:\n", + " print(f\"Summarizing {link}...\")\n", + " summary = summarize(link, language, length)\n", + " all_summaries.append(f\"### {link}\\n{summary}\\n\")\n", + "\n", + " combined_prompt = \"Here are summaries of each lesson:\\n\\n\" + \"\\n\".join(all_summaries)\n", + " response = openai.chat.completions.create(\n", + " model=\"gpt-4o-mini\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": build_system_prompt(language, length)},\n", + " {\"role\": \"user\", \"content\": \"Please summarize the entire training path based on these lesson summaries:\\n\\n\" + combined_prompt}\n", + " ]\n", + " )\n", + "\n", + " return \"\\n\".join(all_summaries) + \"\\n\\n## General Course Summary\\n\" + response.choices[0].message.content\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "05e38d41-dfa4-4b20-9c96-c46ea75d9fb5", + "metadata": {}, + "outputs": [], + "source": [ + "summarize(\"https://learn.microsoft.com/en-us/training/paths/quantum-computing-fundamentals/\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3d926d59-450e-4609-92ba-2d6f244f1342", + "metadata": {}, + "outputs": [], + "source": [ + "# A function to display this nicely in the Jupyter output, using markdown\n", + "\n", + "def display_summary(url):\n", + " summary = summarize(url)\n", + " display(Markdown(summary))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3018853a-445f-41ff-9560-d925d1774b2f", + "metadata": {}, + "outputs": [], + "source": [ + "display_summary(\"https://learn.microsoft.com/en-us/training/paths/quantum-computing-fundamentals/\")" + ] + } + ], + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From c62a1e5a3af6701b2118e33f0483a8ec997779aa Mon Sep 17 00:00:00 2001 From: Arundhati Date: Wed, 27 Aug 2025 21:17:24 -0400 Subject: [PATCH 62/72] Added Sushi Restaurant --- .../SushiRestaurant.ipynb | 181 ++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 week2/community-contributions/SushiRestaurant.ipynb diff --git a/week2/community-contributions/SushiRestaurant.ipynb b/week2/community-contributions/SushiRestaurant.ipynb new file mode 100644 index 0000000..ad32c65 --- /dev/null +++ b/week2/community-contributions/SushiRestaurant.ipynb @@ -0,0 +1,181 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "757905af-7f93-4dca-9526-063bc93a78c7", + "metadata": {}, + "source": [ + "# Sakana-ya (魚屋) Sushi\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a6721fb-efca-4412-a0a7-cc8e6c4ced76", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from dotenv import load_dotenv\n", + "from openai import OpenAI\n", + "import gradio as gr\n", + "import json" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b0fa458f-f73f-491c-b666-95db4b91f571", + "metadata": {}, + "outputs": [], + "source": [ + "load_dotenv(override=True)\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": null, + "id": "aa2846f2-e09c-421d-9774-c04961a79800", + "metadata": {}, + "outputs": [], + "source": [ + "openai = OpenAI()\n", + "MODEL = 'gpt-4o-mini'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7672ecdf-cf50-4b96-887a-b0a4eb5bbbf5", + "metadata": {}, + "outputs": [], + "source": [ + " \n", + "menu = {\n", + " \"Nigiri (1 pc)\": {\n", + " \"Salmon\": 4.25,\n", + " \"Tuna\": 4.75,\n", + " \"Yellowtail\": 5.00,\n", + " \"Eel\": 5.25,\n", + " \"Tamago\": 3.00,\n", + " },\n", + " \"Sashimi (3 pc)\": {\n", + " \"Salmon\": 8.50,\n", + " \"Tuna\": 9.00,\n", + " \"Yellowtail\": 9.50,\n", + " \"Octopus\": 8.00,\n", + " },\n", + " \"Classic Rolls (6 pc)\": {\n", + " \"California\": 6.50,\n", + " \"Spicy Tuna\": 7.50,\n", + " \"Philadelphia\": 7.25,\n", + " \"Cucumber\": 4.50,\n", + " \"Avocado\": 4.75,\n", + " },\n", + " \"Specialty Rolls (8 pc)\": {\n", + " \"Dragon\": 13.50,\n", + " \"Rainbow\": 14.00,\n", + " \"Crunchy Shrimp\": 12.50,\n", + " \"Volcano\": 13.00,\n", + " \"Spider\": 14.50,\n", + " },\n", + " \"Appetizers\": {\n", + " \"Edamame\": 5.00,\n", + " \"Gyoza (5)\": 6.50,\n", + " \"Miso Soup\": 3.00,\n", + " \"Seaweed Salad\": 5.50,\n", + " },\n", + " \"Beverages\": {\n", + " \"Green Tea\": 2.50,\n", + " \"Ramune Soda\": 3.00,\n", + " \"Sparkling Water\": 2.75,\n", + " },\n", + " \"Desserts\": {\n", + " \"Mochi Ice Cream (2)\": 5.00,\n", + " \"Matcha Cheesecake\": 6.50,\n", + " },\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "99914500-3630-4fea-987c-d19c760994c6", + "metadata": {}, + "outputs": [], + "source": [ + "def chat(message, history):\n", + " system_message = \"You are a helpful assistant for Sakana-ya (魚屋) Sushi restaurant.\\\n", + " Help out with information and if you dont know something just say you cant help with that.\"\n", + " system_message += json.dumps(menu)\n", + " system_message+=\"If something is not in the menu, we dont serve it.\\\n", + " If we dont have a dish just mention it that we dont offer it. \"\n", + "\n", + " sushi_exotic = [\n", + " {\"role\": \"user\", \"content\": \"Do you have aji?\"},\n", + " {\"role\": \"user\", \"content\": \"We currently dont have shun its available only during the season i.e in May.\"},\n", + " {\"role\": \"user\", \"content\": \"What about buri?\"},\n", + " {\"role\": \"user\", \"content\": \"Thats seasonal as well only during December. Do visit us during that time.\"},\n", + " \n", + " ]\n", + " \n", + " messages = [{\"role\": \"system\", \"content\": system_message}]+ sushi_exotic + history + [{\"role\": \"user\", \"content\": message}]\n", + " stream = openai.chat.completions.create(model=MODEL, messages=messages, stream=True)\n", + "\n", + " response = \"\"\n", + " for chunk in stream:\n", + " response += chunk.choices[0].delta.content or ''\n", + " yield response" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a5c61d91-abee-4ada-9a42-ae87cf53fcff", + "metadata": {}, + "outputs": [], + "source": [ + "gr.ChatInterface(fn=chat, type=\"messages\").launch()" + ] + } + ], + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 5aebd4f0de398315459b64f4cd1b7258b8b3bb4b Mon Sep 17 00:00:00 2001 From: prateektambe Date: Thu, 28 Aug 2025 21:12:18 +0530 Subject: [PATCH 63/72] Week3Day5 - Dataset generator --- .../SyntheticDataGenerator_PT.ipynb | 141 ++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 community-contributions/SyntheticDataGenerator_PT.ipynb diff --git a/community-contributions/SyntheticDataGenerator_PT.ipynb b/community-contributions/SyntheticDataGenerator_PT.ipynb new file mode 100644 index 0000000..18cf4c6 --- /dev/null +++ b/community-contributions/SyntheticDataGenerator_PT.ipynb @@ -0,0 +1,141 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "d08b387c-53fb-46d2-b083-5eebc3c97e1b", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install -q --upgrade torch==2.5.1+cu124 torchvision==0.20.1+cu124 torchaudio==2.5.1+cu124 --index-url https://download.pytorch.org/whl/cu124\n", + "!pip install -q requests bitsandbytes==0.46.0 transformers==4.48.3 accelerate==1.3.0 openai" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4f1851b2-890c-427b-8e70-b998efa04c67", + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "\n", + "import os\n", + "import requests\n", + "from IPython.display import Markdown, display, update_display\n", + "from openai import OpenAI\n", + "from google.colab import drive\n", + "from huggingface_hub import login\n", + "from google.colab import userdata\n", + "from transformers import AutoTokenizer, AutoModelForCausalLM, TextStreamer, BitsAndBytesConfig\n", + "import torch" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c2d334b5-453e-4213-8e1c-905d504d2dc1", + "metadata": {}, + "outputs": [], + "source": [ + "LLAMA = \"meta-llama/Meta-Llama-3.1-8B-Instruct\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c1b3684c-c170-45f2-a83d-7e6e2ca1e23b", + "metadata": {}, + "outputs": [], + "source": [ + "hf_token = userdata.get('HF_TOKEN')\n", + "login(hf_token, add_to_git_credential=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c1b6dae-3213-4d68-8fa1-d195704790dc", + "metadata": {}, + "outputs": [], + "source": [ + "openai_api_key = userdata.get('OPENAI_API_KEY')\n", + "openai = OpenAI(api_key=openai_api_key)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "988974c7-814c-478a-be7b-0928b0efdbab", + "metadata": {}, + "outputs": [], + "source": [ + "system_message = \"You are an assistant that produces synthetic test data. The fields, data type of the field like numeric, date, alphanumeric etc., will be provided. Generate data considering all cases, if it is a workflow audit data then consider all touchpoint movements. Do not provide a python script to generate the data. Provide the data as a json with arrays.\"\n", + "user_prompt = \"\"\"Create a synthetic dataset for testing. \n", + "Column names and type - \n", + "ID: 10 digit number\n", + "TRACKING_ID: 13 character alphanumeric\n", + "CASE REPORT DATE : DD-MMM-YYYY HH:MM:SS\n", + "NOTIFICATION DATE : DD-MMM-YYYY HH:MM:SS\n", + "IN SCOPE : (Yes/No)\n", + "\"\"\"\n", + "\n", + "messages = [\n", + " {\"role\": \"system\", \"content\": system_message},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "40cebc04-abf0-4c61-8b18-f98d3c1fe680", + "metadata": {}, + "outputs": [], + "source": [ + "quant_config = BitsAndBytesConfig(\n", + " load_in_4bit=True,\n", + " bnb_4bit_use_double_quant=True,\n", + " bnb_4bit_compute_dtype=torch.bfloat16,\n", + " bnb_4bit_quant_type=\"nf4\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "710ba1af-8e12-4635-933b-00df8d2e3f9d", + "metadata": {}, + "outputs": [], + "source": [ + "tokenizer = AutoTokenizer.from_pretrained(LLAMA)\n", + "tokenizer.pad_token = tokenizer.eos_token\n", + "inputs = tokenizer.apply_chat_template(messages, return_tensors=\"pt\").to(\"cuda\")\n", + "streamer = TextStreamer(tokenizer)\n", + "model = AutoModelForCausalLM.from_pretrained(LLAMA, device_map=\"auto\", quantization_config=quant_config)\n", + "outputs = model.generate(inputs, max_new_tokens=2000, streamer=streamer)" + ] + } + ], + "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.13.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 2fca75f7ee647afc4bf6bea4e704dfe77fbc3e6c Mon Sep 17 00:00:00 2001 From: Kartik Date: Fri, 29 Aug 2025 02:34:53 +0530 Subject: [PATCH 64/72] tools linked to openai and chat interface with gradio --- week2/stock-api-day5.ipynb | 367 +++++++++++++++++++++++++++---------- 1 file changed, 271 insertions(+), 96 deletions(-) diff --git a/week2/stock-api-day5.ipynb b/week2/stock-api-day5.ipynb index 92d0769..aadb3b9 100644 --- a/week2/stock-api-day5.ipynb +++ b/week2/stock-api-day5.ipynb @@ -10,17 +10,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "b7bd1bd7-19d9-4c4b-bc4b-9bc9cca8bd0f", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: finnhub-python in /opt/anaconda3/envs/llms/lib/python3.11/site-packages (2.4.24)\n", + "Requirement already satisfied: requests>=2.22.0 in /opt/anaconda3/envs/llms/lib/python3.11/site-packages (from finnhub-python) (2.32.3)\n", + "Requirement already satisfied: charset_normalizer<4,>=2 in /opt/anaconda3/envs/llms/lib/python3.11/site-packages (from requests>=2.22.0->finnhub-python) (3.4.2)\n", + "Requirement already satisfied: idna<4,>=2.5 in /opt/anaconda3/envs/llms/lib/python3.11/site-packages (from requests>=2.22.0->finnhub-python) (3.10)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /opt/anaconda3/envs/llms/lib/python3.11/site-packages (from requests>=2.22.0->finnhub-python) (2.4.0)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /opt/anaconda3/envs/llms/lib/python3.11/site-packages (from requests>=2.22.0->finnhub-python) (2025.4.26)\n" + ] + } + ], "source": [ "!pip install finnhub-python" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "8b50bbe2-c0b1-49c3-9a5c-1ba7efa2bcb4", "metadata": {}, "outputs": [], @@ -39,10 +52,47 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, + "id": "ba0ddc1a-c775-4ed3-9531-ed0c5799e87f", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-08-29 02:28:59,653 [INFO] Logger initialized!\n" + ] + } + ], + "source": [ + "import logging\n", + "\n", + "# Configure root logger\n", + "logging.basicConfig(\n", + " level=logging.INFO, # Set level: DEBUG, INFO, WARNING, ERROR\n", + " format=\"%(asctime)s [%(levelname)s] %(message)s\", \n", + " force=True # Ensures reconfiguration if you rerun this cell\n", + ")\n", + "\n", + "logger = logging.getLogger(__name__) # Use a global logger object\n", + "logger.info(\"Logger initialized!\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, "id": "747e8786-9da8-4342-b6c9-f5f69c2e22ae", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-08-29 02:28:59,657 [INFO] OpenAI API Key exists and begins sk-proj-\n", + "2025-08-29 02:28:59,657 [INFO] FINNHUB_API_KEY exists!\n" + ] + } + ], "source": [ "# Initialization\n", "\n", @@ -52,14 +102,14 @@ "FINNHUB_API_KEY = os.getenv(\"FINNHUB_API_KEY\")\n", "\n", "if openai_api_key:\n", - " print(f\"OpenAI API Key exists and begins {openai_api_key[:8]}\")\n", + " logger.info(f\"OpenAI API Key exists and begins {openai_api_key[:8]}\")\n", "else:\n", - " print(\"OpenAI API Key not set\")\n", + " logger.error(\"OpenAI API Key not set\")\n", "\n", "if FINNHUB_API_KEY:\n", - " print(f\"FINNHUB_API_KEY exists!\")\n", + " logger.info(f\"FINNHUB_API_KEY exists!\")\n", "else:\n", - " print(\"OpenAI API Key not set\")\n", + " logger.error(\"OpenAI API Key not set\")\n", " \n", "MODEL = \"gpt-5-mini\"\n", "openai = OpenAI()\n", @@ -68,12 +118,12 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "ee3aaa9a-5495-42fd-a382-803fbfa92eaf", "metadata": {}, "outputs": [], "source": [ - "system_message += f\"\"\"\n", + "system_message = f\"\"\"\n", "You are called \"TickerBot\", You are a helpful stock information assistant specializing in US stocks. You provide factual, educational information without investment advice. You have access to tools for:\n", "- Stock symbol lookup\n", "- Real-time quotes\n", @@ -91,10 +141,6 @@ "- When users mention companies, search for symbols with the tool `search_symbol()` else proceed directly if obvious match\n", "- Try to search for news or data for only for a maximum of 1 month time range, else it becomes a lot of data to parse. If user asks for recent news just check the last 5 days from today; For example if today is 10-06-2025, use from=\"2025-06-05\", to=\"2025-06-10\"\n", "\n", - "**Single Stock Comprehensive Analysis** (Use very judicially as it is time taking tool, only when user definitely needs a complete overview or multiple things that you would otherwise need to call multiple tools for):\n", - "- User asks about \"Apple\" or \"AAPL\" → Use all company specific tools that you deem necessary. \n", - "- Present a comprehensive analysis with current price, key metrics, and recent developments\n", - "\n", "**Market Overview Requests**:\n", "- \"What's happening in the market?\" → Use `get_market_overview(\"general\")`\n", "- Summarize all news stories with very brief analysis\n", @@ -109,7 +155,48 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, + "id": "fdf1a2b0-07be-47a0-9ce3-14d21b48c8f2", + "metadata": {}, + "outputs": [], + "source": [ + "def get_current_time() -> Dict[str, Any]:\n", + " \"\"\"\n", + " Retrieve the current UTC time in ISO format with timezone.\n", + " Returns a dictionary for consistency with other tools.\n", + " \"\"\"\n", + " try:\n", + " current_time = datetime.utcnow().isoformat() + 'Z'\n", + " return {\n", + " \"success\": True,\n", + " \"current_time\": current_time\n", + " }\n", + " except Exception as e:\n", + " return {\"success\": False, \"error\": f\"Failed to get time: {str(e)[:100]}\"}" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "12d912fc-91fb-469e-9572-2876a099f5aa", + "metadata": {}, + "outputs": [], + "source": [ + "get_current_time_function = {\n", + " \"name\": \"get_current_time\",\n", + " \"description\": \"Get the current UTC time in ISO format (YYYY-MM-DDTHH:MM:SS.ssssssZ). Useful for temporal reasoning, date calculations, or setting time ranges for queries like news.\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {}, # No parameters needed\n", + " \"required\": []\n", + " }\n", + "}\n", + "get_current_time_tool = {\"type\": \"function\", \"function\": get_current_time_function}" + ] + }, + { + "cell_type": "code", + "execution_count": 8, "id": "61a2a15d-b559-4844-b377-6bd5cb4949f6", "metadata": {}, "outputs": [], @@ -122,13 +209,14 @@ "\n", "def search_symbol(query: str) -> Dict[str, Any]:\n", " \"\"\"Search for stock symbol using Finnhub client\"\"\"\n", - " print(f\"Tool search_symbol called for {query}\")\n", + " logger.info(f\"Tool search_symbol called for {query}\")\n", " try:\n", " if not query or len(query.strip()) < 1:\n", " return {\"success\": False, \"error\": \"Invalid search query\"}\n", " \n", " query = query.strip()[:50]\n", " result = finnhub_client.symbol_lookup(query)\n", + " logger.info(f\"Tool search_symbol {result}\")\n", " \n", " if result.get(\"result\") and len(result[\"result\"]) > 0:\n", " first_result = result[\"result\"][0]\n", @@ -150,7 +238,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "173010e3-dfef-4611-8b68-d11256bd5fba", "metadata": {}, "outputs": [], @@ -177,7 +265,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "448bb4ce-8e86-4ceb-ab52-96bddfd33337", "metadata": {}, "outputs": [], @@ -226,7 +314,7 @@ " - Formats market cap, enterprise value, revenue (Finnhub returns these in millions)\n", " - Returns success flag and readable keys\n", " \"\"\"\n", - " print(f\"Tool get_company_financials called for {symbol}\")\n", + " logger.info(f\"Tool get_company_financials called for {symbol}\")\n", " try:\n", " if not symbol or not symbol.strip():\n", " return {\"success\": False, \"error\": \"Invalid stock symbol\"}\n", @@ -235,6 +323,7 @@ "\n", " # --- API Call ---\n", " financials_resp = finnhub_client.company_basic_financials(symbol, \"all\")\n", + " logger.info(f\"Tool company_basic_financials {financials_resp}\")\n", "\n", " # Finnhub places primary values under \"metric\"\n", " metrics = financials_resp.get(\"metric\", {})\n", @@ -273,7 +362,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "id": "9df7b74e-fec8-4e75-92a9-31acc75e6e97", "metadata": {}, "outputs": [], @@ -301,7 +390,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "id": "cfeeb200-3f30-4855-82b9-cc8b2a950f80", "metadata": {}, "outputs": [], @@ -311,13 +400,14 @@ " Fetch the latest stock quote for a given ticker symbol using Finnhub's /quote endpoint.\n", " Returns current price, daily high/low, open, previous close, percent change, and readable timestamp.\n", " \"\"\"\n", - " print(f\"Tool get_stock_quote called for {symbol}\")\n", + " logger.info(f\"Tool get_stock_quote called for {symbol}\")\n", " try:\n", " if not symbol or len(symbol.strip()) < 1:\n", " return {\"success\": False, \"error\": \"Invalid symbol provided\"}\n", " \n", " symbol = symbol.strip().upper()\n", " data = finnhub_client.quote(symbol)\n", + " logger.info(f\"Tool get_stock_quote {data}\")\n", "\n", " if not data or \"c\" not in data:\n", " return {\"success\": False, \"error\": \"No quote data found\"}\n", @@ -347,7 +437,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "id": "3724d92a-4515-4267-af6f-2c1ec2b6ed36", "metadata": {}, "outputs": [], @@ -372,7 +462,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "id": "62f5d477-6626-428f-b8eb-d763e736ef5b", "metadata": {}, "outputs": [], @@ -392,7 +482,7 @@ " list or dict: Cleaned news data or error message.\n", " \"\"\"\n", " # Validate date format\n", - " print(f\"Tool get_company_news called for {symbol} from {_from} to {to}\")\n", + " logger.info(f\"Tool get_company_news called for {symbol} from {_from} to {to}\")\n", " try:\n", " start_date = datetime.strptime(_from, \"%Y-%m-%d\")\n", " end_date = datetime.strptime(to, \"%Y-%m-%d\")\n", @@ -411,6 +501,7 @@ " # Fetch data\n", " try:\n", " news = finnhub_client.company_news(symbol, _from=_from, to=to)\n", + " logger.info(f\"Tool get_company_news {news}\")\n", " except Exception as e:\n", " return {\"success\": False, \"error\": str(e)}\n", "\n", @@ -424,7 +515,7 @@ "\n", " # Clean & transform objects\n", " cleaned_news = []\n", - " for article in news:\n", + " for article in selected_news:\n", " cleaned_news.append({\n", " \"summary\": article.get(\"summary\"),\n", " \"source\": article.get(\"source\"),\n", @@ -437,7 +528,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "id": "5150ecb6-e3f1-46dc-94fa-2a9abe5165f6", "metadata": {}, "outputs": [], @@ -454,11 +545,11 @@ " },\n", " \"_from\": {\n", " \"type\": \"string\",\n", - " \"description\": \"Start date in YYYY-MM-DD format. Ensure it is not more than 1 year ago.\"\n", + " \"description\": \"Start date in YYYY-MM-DD format. Ensure it is not more than 1 year ago from today. Ensure it is before or equal to the date in to.\"\n", " },\n", " \"to\": {\n", " \"type\": \"string\",\n", - " \"description\": \"End date in YYYY-MM-DD format. Ensure it is not more than 1 year ago.\"\n", + " \"description\": \"End date in YYYY-MM-DD format. Ensure it is not more than 1 year ago. Ensure it is after or equal to the date in from.\"\n", " }\n", " },\n", " \"required\": [\n", @@ -474,7 +565,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "id": "26dd7375-626f-4235-b4a2-f1926f62cc5e", "metadata": {}, "outputs": [], @@ -490,10 +581,11 @@ " Returns:\n", " list or dict: A cleaned list of news articles or error message.\n", " \"\"\"\n", - " print(f\"Tool get_market_news called for category '{category}'\")\n", + " logger.info(f\"Tool get_market_news called for category '{category}'\")\n", "\n", " try:\n", " news = finnhub_client.general_news(category)\n", + " logger.info(f\"Tool get_market_news {news}\")\n", " except Exception as e:\n", " return {\"success\": False, \"error\": str(e)}\n", "\n", @@ -507,7 +599,7 @@ "\n", " # Clean & transform objects\n", " cleaned_news = []\n", - " for article in news:\n", + " for article in selected_news:\n", " cleaned_news.append({\n", " \"headline\": article.get(\"headline\"),\n", " \"summary\": article.get(\"summary\"),\n", @@ -522,7 +614,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "id": "5bd1aa28-119c-4c7a-bdc0-161a582ab1cc", "metadata": {}, "outputs": [], @@ -547,38 +639,21 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "d3378855-b83c-4078-b1e9-5f03e55c7276", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bf29bdd0-7603-45fc-ad39-790eb0b471d5", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a25474d9-128e-431f-9b4c-1b3897798f0b", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, + "execution_count": 18, "id": "bdca8679-935f-4e7f-97e6-e71a4d4f228c", "metadata": {}, "outputs": [], "source": [ - "# And this is included in a list of tools:\n", - "\n", - "tools = [{\"type\": \"function\", \"function\": price_function}]" + "# List of tools:\n", + "tools = [search_symbol_tool, get_company_financials_tool, get_stock_quote_tool, get_company_news_tool, get_market_news_tool, get_current_time_tool]\n", + "tool_functions = {\n", + " \"search_symbol\": search_symbol,\n", + " \"get_company_financials\": get_company_financials,\n", + " \"get_stock_quote\": get_stock_quote,\n", + " \"get_company_news\": get_company_news,\n", + " \"get_market_news\": get_market_news,\n", + " \"get_current_time\": get_current_time\n", + "}" ] }, { @@ -597,45 +672,62 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, + "id": "86f76f57-76c4-4dc7-94a8-cfe7816a39f1", + "metadata": {}, + "outputs": [], + "source": [ + "def execute_tool_call(tool_call):\n", + " func_name = tool_call.function.name\n", + " args = json.loads(tool_call.function.arguments)\n", + "\n", + " logger.info(f\"Executing tool: {func_name} with args: {args}\")\n", + "\n", + " func = tool_functions.get(func_name)\n", + " if not func:\n", + " result = {\"error\": f\"Function '{func_name}' not found\"}\n", + " else:\n", + " try:\n", + " result = func(**args)\n", + " except Exception as e:\n", + " logger.exception(f\"Error executing {func_name}\")\n", + " result = {\"error\": str(e)}\n", + "\n", + " return {\n", + " \"role\": \"tool\",\n", + " \"tool_call_id\": tool_call.id,\n", + " \"content\": json.dumps(result)\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": 20, "id": "ce9b0744-9c78-408d-b9df-9f6fd9ed78cf", "metadata": {}, "outputs": [], "source": [ "def chat(message, history):\n", " messages = [{\"role\": \"system\", \"content\": system_message}] + history + [{\"role\": \"user\", \"content\": message}]\n", - " response = openai.chat.completions.create(model=MODEL, messages=messages, tools=tools)\n", "\n", - " if response.choices[0].finish_reason==\"tool_calls\":\n", - " message = response.choices[0].message\n", - " response, city = handle_tool_call(message)\n", - " messages.append(message)\n", - " messages.append(response)\n", - " response = openai.chat.completions.create(model=MODEL, messages=messages)\n", - " \n", - " return response.choices[0].message.content" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b0992986-ea09-4912-a076-8e5603ee631f", - "metadata": {}, - "outputs": [], - "source": [ - "# We have to write that function handle_tool_call:\n", + " while True:\n", + " # Send to OpenAI\n", + " response = openai.chat.completions.create(model=MODEL, messages=messages, tools=tools)\n", + " ai_message = response.choices[0].message\n", + " finish_reason = response.choices[0].finish_reason\n", "\n", - "def handle_tool_call(message):\n", - " tool_call = message.tool_calls[0]\n", - " arguments = json.loads(tool_call.function.arguments)\n", - " city = arguments.get('destination_city')\n", - " price = get_ticket_price(city)\n", - " response = {\n", - " \"role\": \"tool\",\n", - " \"content\": json.dumps({\"destination_city\": city,\"price\": price}),\n", - " \"tool_call_id\": tool_call.id\n", - " }\n", - " return response, city" + " # If no tool calls, this is user-facing output\n", + " if finish_reason != \"tool_calls\":\n", + " return ai_message.content # ✅ Only return final assistant content\n", + "\n", + " # Otherwise, handle all tool calls in this message\n", + " tool_responses = []\n", + " for tool_call in ai_message.tool_calls:\n", + " tool_responses.append(execute_tool_call(tool_call))\n", + "\n", + " # Add tool call request + tool responses to conversation\n", + " messages.append(ai_message)\n", + " messages.extend(tool_responses)" ] }, { @@ -643,11 +735,94 @@ "execution_count": null, "id": "f4be8a71-b19e-4c2f-80df-f59ff2661f14", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-08-29 02:29:05,739 [INFO] HTTP Request: GET http://127.0.0.1:7860/gradio_api/startup-events \"HTTP/1.1 200 OK\"\n", + "2025-08-29 02:29:05,746 [INFO] HTTP Request: HEAD http://127.0.0.1:7860/ \"HTTP/1.1 200 OK\"\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "* Running on local URL: http://127.0.0.1:7860\n", + "* To create a public link, set `share=True` in `launch()`.\n" + ] + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-08-29 02:29:07,097 [INFO] HTTP Request: GET https://api.gradio.app/pkg-version \"HTTP/1.1 200 OK\"\n", + "2025-08-29 02:29:17,018 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "2025-08-29 02:29:17,024 [INFO] Executing tool: search_symbol with args: {'query': 'Apple'}\n", + "2025-08-29 02:29:17,025 [INFO] Tool search_symbol called for Apple\n", + "2025-08-29 02:29:17,777 [INFO] Tool search_symbol {'count': 11, 'result': [{'description': 'Apple Inc', 'displaySymbol': 'AAPL', 'symbol': 'AAPL', 'type': 'Common Stock'}, {'description': 'Apple Hospitality REIT Inc', 'displaySymbol': 'APLE', 'symbol': 'APLE', 'type': 'Common Stock'}, {'description': 'Apple iSports Group Inc', 'displaySymbol': 'AAPI', 'symbol': 'AAPI', 'type': 'Common Stock'}, {'description': 'Apple Flavor & Fragrance Group Co Ltd', 'displaySymbol': '603020.SS', 'symbol': '603020.SS', 'type': 'Common Stock'}, {'description': 'Maui Land & Pineapple Company Inc', 'displaySymbol': 'MLP', 'symbol': 'MLP', 'type': 'Common Stock'}, {'description': 'Apple International Co Ltd', 'displaySymbol': '2788.T', 'symbol': '2788.T', 'type': 'Common Stock'}, {'description': 'Applepark Co Ltd', 'displaySymbol': '164A.T', 'symbol': '164A.T', 'type': 'Common Stock'}, {'description': 'Pineapple Inc', 'displaySymbol': 'PNPL', 'symbol': 'PNPL', 'type': 'Common Stock'}, {'description': 'Pineapple Resources Bhd', 'displaySymbol': 'PINEAPP.KL', 'symbol': 'PINEAPP.KL', 'type': 'Common Stock'}, {'description': 'Pineapple Financial Inc', 'displaySymbol': 'PAPL', 'symbol': 'PAPL', 'type': 'Common Stock'}, {'description': 'Pineapple Energy Inc', 'displaySymbol': 'SUNE', 'symbol': 'SUNE', 'type': 'Common Stock'}]}\n", + "2025-08-29 02:29:19,090 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "2025-08-29 02:29:19,096 [INFO] Executing tool: get_current_time with args: {}\n", + "2025-08-29 02:29:20,043 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "2025-08-29 02:29:20,047 [INFO] Executing tool: get_stock_quote with args: {'symbol': 'AAPL'}\n", + "2025-08-29 02:29:20,049 [INFO] Tool get_stock_quote called for AAPL\n", + "2025-08-29 02:29:20,274 [INFO] Tool get_stock_quote {'c': 232.56, 'd': 2.07, 'dp': 0.8981, 'h': 233.41, 'l': 229.335, 'o': 230.82, 'pc': 230.49, 't': 1756411200}\n", + "2025-08-29 02:29:30,843 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "2025-08-29 02:29:44,436 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "2025-08-29 02:29:44,441 [INFO] Executing tool: get_current_time with args: {}\n", + "2025-08-29 02:29:46,801 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "2025-08-29 02:29:46,806 [INFO] Executing tool: get_company_news with args: {'symbol': 'AAPL', '_from': '2025-08-21', 'to': '2025-08-28'}\n", + "2025-08-29 02:29:46,808 [INFO] Tool get_company_news called for AAPL from 2025-08-21 to 2025-08-28\n", + "2025-08-29 02:29:47,767 [INFO] Tool get_company_news [{'category': 'company', 'datetime': 1756408626, 'headline': 'Commentary: Trump’s trade war is hurting most sectors of the economy', 'id': 136563635, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The latest round of earnings reports revealed widespread damage from the Trump tariffs and other attacks on trade.', 'url': 'https://finnhub.io/api/news?id=f79d96aa415027377d39121c37660b242b4665192144f64a93b39b1515e24fdb'}, {'category': 'company', 'datetime': 1756405437, 'headline': 'Trump-Intel deal designed to block sale of chipmaking unit, CFO says', 'id': 136563640, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The Trump administration’s investment in Intel was structured to deter the chipmaker from selling its manufacturing unit, its chief financial...', 'url': 'https://finnhub.io/api/news?id=f0e37125d1ccd2adc8afe9ffb145ccfa0dd2001cbd1d23eaf1c96270c33ab33f'}, {'category': 'company', 'datetime': 1756403740, 'headline': \"Apple–TSMC Chip Pact Builds Firewall Against Trump's Tariffs\", 'id': 136563655, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple Inc (NASDAQ:AAPL) isn\\'t just building the iPhone 18—it\\'s creating a moat. By reportedly securing nearly half of Taiwan Semiconductor Manufacturing Co Ltd\\'s (NYSE:TSM) initial 2nm chip production capacity, Apple has locked in supply for its flagship device while also erecting a \"firewall\" against President Donald Trump\\'s proposed 100% tariffs on imported semiconductors. Track AAPL stock here. The move highlights how Apple\\'s scale, foresight, and U.S. investments could shield it from the pol', 'url': 'https://finnhub.io/api/news?id=080fa7ce38b3b44861946e6973f447bb280a79ea485c2b2f1ae11a938bbccd90'}, {'category': 'company', 'datetime': 1756401279, 'headline': \"What's Going On With Marvell Technology Stock Thursday?\", 'id': 136563649, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Marvell Technology (NASDAQ:MRVL) shares surged Thursday as investors bet on the company to deliver strong second-quarter results, scheduled for after the closing bell. Optimism has been fueled by accelerating demand for artificial intelligence infrastructure and expectations that Marvell will capture a growing share of hyperscale spending. The rally followed industry peer Nvidia’s (NASDAQ:NVDA) blockbuster results, which reinforced expectations of sustained demand from the artificial intelligenc', 'url': 'https://finnhub.io/api/news?id=4cf8c5984bf7ff829223fe47ee62f42082ee29a59dfa95d4b539bfe0fd0a423e'}, {'category': 'company', 'datetime': 1756400124, 'headline': 'Most of the Other Mag 7 Stocks Are Rising After Nvidia Earnings', 'id': 136563657, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'A group of Magnificent Seven stocks buoyed the S&P 500 after Nvidia earnings, but the chip titan wasn’t among them. The Dow was up 50 points, or 0.1%, while the Nasdaq Composite was up 0.5%. Nvidia shares were down 1% after moving up and down at the open.', 'url': 'https://finnhub.io/api/news?id=e89114f6041717edcc3ed7d65565eac2750bc512978233bdc8c6a18dae1bd6e0'}, {'category': 'company', 'datetime': 1756398112, 'headline': 'Stock Market Today: Nasdaq Up As Pure Storage Triggers Breakaway Buy; Nvidia Cuts Losses, Hormel Dives (Live Coverage)', 'id': 136560744, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The Dow Jones index slips in mixed trade Thursday following surprise GDP numbers and jobless claims. Nvidia stock drops after earnings.', 'url': 'https://finnhub.io/api/news?id=58cb2ef567614c88ee8f9a823109d024b43d6de6c4d18baa9bd184de26c931bc'}, {'category': 'company', 'datetime': 1756397760, 'headline': \"A Small Cap In A Big Cap's Clothing\", 'id': 136563776, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/1705316992/image_1705316992.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': 'AAPL is no longer the largest company in the world and now trails both Nvidia and Microsoft in terms of market cap. Click to read.', 'url': 'https://finnhub.io/api/news?id=e809d05668bd6be09e9fc420bf30d52521f1e6e4e7551f49911804ecf2247f3e'}, {'category': 'company', 'datetime': 1756397421, 'headline': 'Trump tariffs are increasingly forcing countries to pick sides between the US and China', 'id': 136560766, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'President Trump’s trade wars are increasingly forcing countries to choose between the US and its main adversaries.', 'url': 'https://finnhub.io/api/news?id=8177e96bbae4398135d97186f74049bba0d0eec4e76863edf5957488c9f737ff'}, {'category': 'company', 'datetime': 1756392896, 'headline': 'Evercore ISI Reiterates Outperform on Apple (AAPL) With $250 PT', 'id': 136560767, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple Inc. (NASDAQ:AAPL) is one of the AI Stocks Analysts Say You Shouldn’t Ignore. On August 22, Evercore ISI reiterated the stock as “Outperform” stating that it likes Apple’s price hikes on Apple TV+. “We think the Apple TV+ price increases could help modestly on services growth, but the real intent is to minimize churn. Services […]', 'url': 'https://finnhub.io/api/news?id=fb1b0e9cc0f40efd15e9b2dfc73b8684dcae4a89f5ba687b678e90e707d05cfb'}, {'category': 'company', 'datetime': 1756391075, 'headline': 'MP Materials: The Defense Establishment Comes A-Calling', 'id': 136562702, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/1428654585/image_1428654585.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': 'MP Materials is strategically positioned as a leading rare earth supplier amid rising US-China tensions and government focus on resource independence. Read the latest stock analysis here.', 'url': 'https://finnhub.io/api/news?id=1727d118f012c8bf42398a37c74b2b2ad9638666dd7efdf80539a5edee7fc302'}, {'category': 'company', 'datetime': 1756390634, 'headline': 'How Trump and Melania meme coins are performing half a year on', 'id': 136557610, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Both tokens launched before the US president's 20 January inauguration and quickly caught fire across crypto forums and political media.\", 'url': 'https://finnhub.io/api/news?id=80aa0488039ed175c0218e44a05e2ea529aed8fb9531d6015adb959f60044895'}, {'category': 'company', 'datetime': 1756389524, 'headline': 'Stock Market Today: Dow Slips, Nasdaq Rises After Surprise GDP, Jobless Claims; Nvidia Drops On Earnings (Live Coverage)', 'id': 136557573, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The Dow Jones index slips in mixed trade Thursday following surprise GDP numbers and jobless claims. Nvidia stock drops after earnings.', 'url': 'https://finnhub.io/api/news?id=aecd19ed894e08a95a5c74ed51c36088b293dda61667fd30342cab56ee8a9c0a'}, {'category': 'company', 'datetime': 1756388700, 'headline': '2 Growth Stocks That Could Be Worth $1 Trillion in 5 Years', 'id': 136557612, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'These two longtime market leaders should continue to perform well.', 'url': 'https://finnhub.io/api/news?id=940ed0a9a05b5d73504f52a9a1da73f837f81ad32f7414fc2ea5ed355f0140fe'}, {'category': 'company', 'datetime': 1756387449, 'headline': \"This Overlooked Stock Market Sector is Getting Hot Ahead of the Fed's Expected September Rate Cut\", 'id': 136560763, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'How to track sector rotation in the market, and why old-school utilities are catching a tailwind after Powell’s speech.', 'url': 'https://finnhub.io/api/news?id=f0053dc1668970117d9f9fb0b6ef53faff354c6079b706205c54497955c19026'}, {'category': 'company', 'datetime': 1756386540, 'headline': \"If You'd Invested $1,000 in Apple Stock 5 Years Ago, Here's How Much You'd Have Today\", 'id': 136557613, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'You might be surprised to see how much your investment would be today.', 'url': 'https://finnhub.io/api/news?id=8c9acc794cd8b231a9233116a3dc9e994a56c1c3a82189d074108e98ab54d68b'}, {'category': 'company', 'datetime': 1756386000, 'headline': 'Avalon GloboCare to Launch Online Sales of KetoAir Breathalyzer in the United Kingdom', 'id': 136557614, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'FREEHOLD, N.J., Aug. 28, 2025 (GLOBE NEWSWIRE) -- Avalon GloboCare Corp. (“Avalon” or the “Company”) (NASDAQ: ALBT), a developer of precision diagnostic consumer products, today announced that it will launch the sales of KetoAir™ breathalyzer device and related accessories in the United Kingdom (“UK”). The products will be available for purchase starting September 1, 2025, at www.KetoAir.uk. KetoAir™ is a handheld breathalyzer designed for ketogenic health management (U.S. Food and Drug Administ', 'url': 'https://finnhub.io/api/news?id=e559b96b92a52447e682c0f47c53fa6a508e7398d5b3e5de911491454985d36e'}, {'category': 'company', 'datetime': 1756385063, 'headline': 'Market Chatter: Apple Warns UK Strategic Market Status Could Harm Users, Developers', 'id': 136557615, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Apple (AAPL) believes that Britain's plans to increase competition in the mobile operating system ma\", 'url': 'https://finnhub.io/api/news?id=16193e567e9dc751ddfab0787f451b0f6978ff34d2d52737bb037964cb3088cc'}, {'category': 'company', 'datetime': 1756383230, 'headline': 'The Swatch Group: Running Out Of Time', 'id': 136559852, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/1791242549/image_1791242549.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': 'Swatch Group struggles with smartwatch disruption, falling EPS, and weak demand. Learn about its challenges, risks, and potential value opportunities.', 'url': 'https://finnhub.io/api/news?id=ca5970ea6e8ed42a4e3691dca273ba9e121de29acb56336c9560a79eabb40437'}, {'category': 'company', 'datetime': 1756382877, 'headline': 'When will iPhone 17 be released? What features to expect? What to know in Tennessee', 'id': 136557616, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The newest iPhone is expected to be announced during a Sept. 9 event, meaning it could hit the market in the coming weeks.', 'url': 'https://finnhub.io/api/news?id=93b0e7100da77cd91b5a784d1f044e99eccd00657935413602ac3754d95e9341'}, {'category': 'company', 'datetime': 1756382470, 'headline': 'As Trump And Intel Make News, This Nvidia, AMD Partner Chips Away At A Breakout', 'id': 136557617, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'With the semiconductor industry in focus as Nvidia reports, the Trump administration takes a stake in Intel and TSMC stock etches a buy point.', 'url': 'https://finnhub.io/api/news?id=0639e7b2512036ffaa5f122e7bccb0a595e35b5f4a85fef22a1f742133d79902'}, {'category': 'company', 'datetime': 1756382400, 'headline': 'Get ready, EV owners: Here come the dongles', 'id': 136557728, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"The transition from CCS to NACS will unlock thousands more fast chargers for many EV drivers, but they'll need to know their adapters to get the most out of it.\", 'url': 'https://finnhub.io/api/news?id=791f3b535a827c891140497cf89f87e37078b485a1c9d281692e6e62701cbbb6'}, {'category': 'company', 'datetime': 1756382400, 'headline': 'Could Buying MP Materials Today Set You Up for Life?', 'id': 136557618, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'MP Materials stock has surged over 300% in 2025. Can it keep that up?', 'url': 'https://finnhub.io/api/news?id=cde8cb7b7e803b646fd2e21292c3e4b0908454b34eabfb4a04c9a2ad56b8a879'}, {'category': 'company', 'datetime': 1756382143, 'headline': 'Morgan Stanley Maintains Equalweight on Skyworks (SWKS), Cuts Price Target Amid Broadcom Content Loss', 'id': 136557619, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Skyworks Solutions, Inc. (NASDAQ:SWKS) ranks among the best 5G stocks to buy now. Morgan Stanley retained its Equalweight rating on Skyworks Solutions, Inc. (NASDAQ:SWKS) and reduced its price target from $68 to $65 on August 6. Based in part on Apple’s previous remarks, the research firm noticed that the supply chain for smartphones has outperformed […]', 'url': 'https://finnhub.io/api/news?id=dd93604c17d502c50685fcce411f0ad5afa787886bc30b3edeebde6530455293'}, {'category': 'company', 'datetime': 1756380630, 'headline': 'Apple says UK mobile market shake-up could harm users and developers', 'id': 136557620, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"LONDON -Apple said on Thursday Britain's plans to increase competition in the mobile operating system market could harm users and developers, and potentially force the company to share its technology with foreign competitors for free. Last month, Britain's competition regulator told Apple and Android-owner Google to be fairer in how they distribute apps on their mobile platforms, setting out possible interventions as it plans to designate the U.S. tech companies with strategic market status over their duopoly.\", 'url': 'https://finnhub.io/api/news?id=4586d9fb5c2a41f4c8105a80667c11835661ad496368946acf15b94c6272ad1d'}, {'category': 'company', 'datetime': 1756378650, 'headline': \"Tesla sales drop 40% across Europe in July as China's BYD sees jump\", 'id': 136557621, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Sales of Tesla cars have continued to decline across Europe, falling 40% in July, as Chinese rival BYD saw a surge in registrations in the region last month.', 'url': 'https://finnhub.io/api/news?id=46d0e09bc4cfda7fd65bf1f247e15ce13082d242766a227b93cc70e92bcf6bf2'}, {'category': 'company', 'datetime': 1756377360, 'headline': 'AGs attack deepfake porn payments', 'id': 136560769, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple, Visa and others must be “more aggressive” in banning payment authorization for nonconsensual deepfake content, state AGs told the companies.', 'url': 'https://finnhub.io/api/news?id=5b99f45abab1c5465df76ca6c27da2afd266ebef62599d480a55d33d7590e981'}, {'category': 'company', 'datetime': 1756376520, 'headline': \"12 Stocks Warren Buffett's Berkshire Hathaway Has Been Loading Up On in 2025\", 'id': 136557622, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Despite a few big stock sales, there have been a lot of additions to Berkshire's portfolio.\", 'url': 'https://finnhub.io/api/news?id=3d261fc0e50b40a48d492134da9a6984c463cd0ba69e573fa387ef3c50489f9f'}, {'category': 'company', 'datetime': 1756376229, 'headline': 'Apple (AAPL): Examining Valuation as AI Concerns and Product Launches Dominate Attention', 'id': 136557623, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple (AAPL) has always had a knack for capturing headlines, but lately, it’s been the company’s moves—or lack of moves—in artificial intelligence that are drawing outsized attention from investors. As Apple prepares for its upcoming product event with new iPhones and wearables expected, multiple reports suggest the tech giant is under mounting pressure to prove it can catch up in the AI race. Recent partnership talks and news of possible acquisitions only add to the drama, as the market...', 'url': 'https://finnhub.io/api/news?id=9a405abfbd5a198d23b48942eeaf8cd2758d491872dc294d2d477e168c22259c'}, {'category': 'company', 'datetime': 1756375801, 'headline': 'How Twilio’s (TWLO) Global RCS Launch Could Shape Its Messaging Platform and Customer Trust', 'id': 136557624, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Twilio recently announced the global general availability of Rich Communication Services (RCS) messaging, enabling more than 349,000 active customers to send branded, verified, and interactive messages across Android and iOS devices through its Programmable Messaging and Verify APIs. This launch, following Apple’s rollout of RCS support and expanding Twilio's reach across 20+ countries, positions the company to address rising messaging fraud by bolstering customer trust and enabling richer,...\", 'url': 'https://finnhub.io/api/news?id=ca2307c8e7be2ecfaff7e462350f223f2840e596cd366e3fe1573e6bd327b14b'}, {'category': 'company', 'datetime': 1756372500, 'headline': 'Prediction: 1 Artificial Intelligence (AI) Stock Will Be Worth More Than Palantir Technologies and Amazon Combined by 2030', 'id': 136557607, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Palantir is one of the most valuable software businesses in the world, while Amazon remains a trillion-dollar giant.', 'url': 'https://finnhub.io/api/news?id=fc96e4f9665522a0c22481cd146e66d9b5ce8ce2934077c86c504f0697260d9a'}, {'category': 'company', 'datetime': 1756370411, 'headline': 'Bitcoin price recovers as Nvidia earnings fuel risk appetite', 'id': 136557626, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'It came as the S&P 500 notched a record high and Nvidia delivered stronger-than-expected quarterly results, reinforcing investor appetite for risk assets.', 'url': 'https://finnhub.io/api/news?id=8c3119a8a72d87a448ff861e8e4d4b8619a0635371e0e3713c949308eb32f044'}, {'category': 'company', 'datetime': 1756368912, 'headline': 'LIVE: Wall Street and European stocks mixed as US GDP revised higher and weekly jobless claims fall', 'id': 136557627, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"US GDP grew at a 3.3% annualised pace last quarter, according to the government's second estimate.\", 'url': 'https://finnhub.io/api/news?id=94bd66317beaa9f8b873ea175cd746f9091c5c1fd8938424b2ca4e20259b5df2'}, {'category': 'company', 'datetime': 1756364760, 'headline': 'Zacks Investment Ideas feature highlights: Apple, Meta Platforms and DoorDash', 'id': 136557628, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple, Meta and DoorDash all smashed Q2 expectations with record-breaking growth, strong margins and bullish post-earnings momentum.', 'url': 'https://finnhub.io/api/news?id=753d4c569e19112422028eb00f371cfd015fbeeca321005775f91b9d77d6b158'}, {'category': 'company', 'datetime': 1756364400, 'headline': 'Apple accuses Britain of ‘EU-style’ crackdown', 'id': 136557629, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple has accused Britain’s competition watchdog of stifling growth with an “EU-style” crackdown on the iPhone maker.', 'url': 'https://finnhub.io/api/news?id=88bb9408c819df29b22469513d47540a5d54f0585fc8caf47ac8288a93fd41b8'}, {'category': 'company', 'datetime': 1756326420, 'headline': 'Apple Teases iPhone 17 Launch With Sept. 9 Showcase', 'id': 136541162, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Event to spotlight slimmer phone, new watches, AirPods and AI', 'url': 'https://finnhub.io/api/news?id=57f533b5c833e80c1d77f63268da8555521d3d5583d5684b46ac7036d8b0d570'}, {'category': 'company', 'datetime': 1756323780, 'headline': \"Warren Buffett's Berkshire Hathaway Trims Apple Stake, Again. What's the Deal?\", 'id': 136541163, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The massive conglomerate now has a cash hoard of $344 billion.', 'url': 'https://finnhub.io/api/news?id=7dc81e41b6376258c7eb512fa47525b93dbc56d436b9acee7318023adae6a69f'}, {'category': 'company', 'datetime': 1756320350, 'headline': 'Apple (AAPL) Buy Rating Maintained Ahead of Potential September Event', 'id': 136541164, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple Inc. (NASDAQ:AAPL) is one of the AI Stocks Analysts Are Tracking Closely. On August 25, Bank of America reiterated the stock as “Buy” and acknowledged that even though there are reports that there is no official iPhone event yet scheduled on September 9 for Apple, investors should tone down their expectations for the next cycle […]', 'url': 'https://finnhub.io/api/news?id=36ef4b48e9a75c5faaad802d9779733bd8eb0d2ed1aff058090ccf2ffbf76544'}, {'category': 'company', 'datetime': 1756317830, 'headline': 'Chipolo, an AirTag rival, debuts rechargeable trackers with a six-month battery life', 'id': 136541165, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Chipolo debuts a lineup of rechargeable trackers to compete with AirTag and others.', 'url': 'https://finnhub.io/api/news?id=058e82cd659bfbb73fd85321d63d0825a8cd02ec4774a2cb53eda240bbffd98d'}, {'category': 'company', 'datetime': 1756315800, 'headline': '[Latest] Global Motion Graphics Market Size/Share Worth USD 280 Billion by 2034 at a 12.2% CAGR: Custom Market Insights (Analysis, Outlook, Leaders, Report, Trends, Forecast, Segmentation, Growth Rate, Value, SWOT Analysis)', 'id': 136539413, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': '[220+ Pages Latest Report] According to a market research study published by Custom Market Insights, the demand analysis of Global Motion Graphics Market size & share revenue was valued at approximately USD 85.5 Billion in 2024 and is expected to reach USD 98.3 Billion in 2025 and is expected to reach around USD 280 Billion by 2034, at a CAGR of 12.2% between 2025 and 2034. The key market players listed in the report with their sales, revenues and strategies are Adobe Inc., Autodesk Inc., Maxon', 'url': 'https://finnhub.io/api/news?id=e6f397e64732b302a0646b559119b00c38feacf9f0c5daffee527ec2fb030208'}, {'category': 'company', 'datetime': 1756315645, 'headline': 'Pfizer: Finally Some Fortune, Plus Twenty High-Quality Dividend Growth Valuations', 'id': 136542130, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/2203006359/image_2203006359.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': \"Discover high-quality dividend-growth stocks near 52-week lows. Explore Pfizer's strong dividend and valuations, plus other top picks like Merck and Qualcomm.\", 'url': 'https://finnhub.io/api/news?id=ec425284e980cf083d7d06feec4294590bc48a5d33b2fdd798c828b58de26570'}, {'category': 'company', 'datetime': 1756312967, 'headline': \"Cracker Barrel logo debacle isn't CEO Julie Masino's only challenge: Opening Bid top takeaway\", 'id': 136538441, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Cracker Barrel has a host of issues.', 'url': 'https://finnhub.io/api/news?id=5d954f41f3cbb1bd20135e12731d5043295f6c7a22381c604c77986feb3e3dd7'}, {'category': 'company', 'datetime': 1756310381, 'headline': 'The Gap Between Nvidia and the Next Largest Company Is Now $700 Billion', 'id': 136539403, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Nvidia's market capitalization stood at about $4.4 trillion this week, about $700 billion ahead of the next most valuable company, Microsoft. The gap between the AI chip giant and the next largest public company has never been wider, according to Dow Jones Market Data.\", 'url': 'https://finnhub.io/api/news?id=f9ce19a19e80e96971dc5bb4e5998b4f73764cfdb89fda81e2cd7672edc77884'}, {'category': 'company', 'datetime': 1756308600, 'headline': 'Q2 Earnings: These 3 Tech Stocks Shattered Expectations', 'id': 136539416, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"The 2025 Q2 earnings cycle is nearing its end, with these three companies' results stealing the spotlight. Can they repeat their stellar performances in the Q3 season?\", 'url': 'https://finnhub.io/api/news?id=c8908ad4d0110207fd887b4cbe53973de66b66981914f3ae3f421964cfd4e39d'}, {'category': 'company', 'datetime': 1756305529, 'headline': 'How Apple investors should weigh India tariffs & ongoing AI lag', 'id': 136539417, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Apple (AAPL) is ramping up production at five factories in India ahead of its iPhone 17 launch, all while facing new 50% tariffs from the US on Indian goods. Yahoo Finance Senior Reporter Ines Ferré and Slatestone Wealth chief market strategist Kenny Polcari, who is also the host of Yahoo Finance's Trader Talk podcast, join Opening Bid host Brian Sozzi to weigh in on the headline risk to Apple. To watch more expert insights and analysis on the latest market action, check out more\\xa0Opening Bid.\", 'url': 'https://finnhub.io/api/news?id=f985e17b57b8661a44209cdab0364c36ab40feed82fbacbada76d466df119581'}, {'category': 'company', 'datetime': 1756303740, 'headline': 'Apple Music Taps TuneIn to Expand Global Access to Its Live Radio Stations', 'id': 136539418, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Beginning today, listeners around the world can stream all six commercial-free Apple Music live radio stations on TuneIn SAN FRANCISCO, Aug. 27, 2025 (GLOBE NEWSWIRE) -- TuneIn, the world’s leader in live audio, today announced a new partnership with Apple to expand access to Apple Music’s commercial-free live radio stations to listeners around the world. This marks the first time Apple’s 24/7 global radio stations are available outside of its own native platform. Starting today, all six free Ap', 'url': 'https://finnhub.io/api/news?id=e0413ec85f8c3aca11dd19d3b50b0f1680a6191a99c9e1760725d09871ab2e5f'}, {'category': 'company', 'datetime': 1756302300, 'headline': 'My 3 Favorite Stocks to Buy Right Now', 'id': 136536616, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Contrary to a common assumption at this time, not every stock is priced too richly or poses too much risk. Several underappreciated and undervalued names are just waiting to be found.', 'url': 'https://finnhub.io/api/news?id=5c9c5ad47420d627cfdffdc181bb0a20b74931b5b9a4ee6e4b598a7fe15ffe94'}, {'category': 'company', 'datetime': 1756300020, 'headline': 'COLLEGE FOR CREATIVE STUDIES LAUNCHES APPLE FOUNDATION PROGRAM, FREE CODING COURSES FOR DETROITERS', 'id': 136536132, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The Apple Foundation Program at CCS will welcome its first cohort in October 2025, offering a free introductory app development course with access to laptops and additional devices. CCS Apple Foundation Lab Courtesy of College for Creative Studies CCS Apple Foundation Lab Courtesy of College for Creative Studies Detroit, MI, Aug. 27, 2025 (GLOBE NEWSWIRE) -- The College for Creative Studies (CCS) is excited to launch the Apple Foundation Program, a free app development program coming to the Coll', 'url': 'https://finnhub.io/api/news?id=c39f266620c5451aea0891907dfe081dc8bad553e13b1175be1a2c1955a20968'}, {'category': 'company', 'datetime': 1756299600, 'headline': 'Apple Makes Music Push in Radio After Losing Ground to Spotify', 'id': 136539420, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The deal with digital radio platform TuneIn marks the first time Apple Music’s six radio stations will be available outside the company’s app.', 'url': 'https://finnhub.io/api/news?id=2b3af74ab5be8c92b9fc60e9ddf9ea2316e2a7b47b4705db59639bc775ff1581'}, {'category': 'company', 'datetime': 1756299600, 'headline': 'ESR to Unveil Game-Changing Tech Innovations at IFA 2025', 'id': 136536133, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'ESR, a global tech brand trusted by over 123 million users, will present its newest innovations at IFA 2025 from September 5–9 at Messe Berlin. Guided by its mission \"Tech Made Easier,\" ESR is set to unveil industry-first accessories that deliver wired-speed magnetic charging, stronger device protection, and more flexible productivity.', 'url': 'https://finnhub.io/api/news?id=ab2ce5abbf3516bc95c82979500217ce98402582a6083375f7b1edb7e0e92ab8'}, {'category': 'company', 'datetime': 1756298700, 'headline': 'Billionaire Bill Ackman Just Bought This Magnificent Artificial Intelligence (AI) Stock, Which Could Join Nvidia, Microsoft, and Apple in the $3 Trillion Club By 2028', 'id': 136536103, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Ackman\\'s hedge fund, Pershing Square, recently added another \"Magnificent Seven\" stock to its portfolio.', 'url': 'https://finnhub.io/api/news?id=0dcbb9593b57a4f988911c73d340dec2c9ee67cf5fe2dc86402a13ec133409be'}, {'category': 'company', 'datetime': 1756298544, 'headline': 'MetaMask Adds Google and Apple Login to Simplify Self-Custodial Wallet Access', 'id': 136536135, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'MetaMask has launched social login functionality, allowing users to create and recover self-custodial wallets using Google or Apple accounts, eliminating the need to manually manage traditional 12-word Secret Recovery Phrases while preserving complete user control over private keys. The feature combines familiar Web2 authentication with advanced cryptographic techniques, including Threshold ...', 'url': 'https://finnhub.io/api/news?id=fefb7a0bd947b9ea884c2ad78bba45b797bbc2fe6e7e419fbc1f41f9bc40b0fe'}, {'category': 'company', 'datetime': 1756297975, 'headline': 'Alphabet At The Crossroads: Legal Minefield Or Money Machine', 'id': 136538321, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/872409924/image_872409924.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': 'Alphabet faces antitrust risk, but a breakup could unlock hidden value.', 'url': 'https://finnhub.io/api/news?id=94344a89f867ac85036a39124e9fd93cc16cff445838394e0d8c309e5273eceb'}, {'category': 'company', 'datetime': 1756295929, 'headline': 'Microsoft vs. Apple: Which Stock Has Performed Better Since Trump Took Office?', 'id': 136536116, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple and Microsoft stocks have surged—but which one performed better? See how these tech giants stack up during Trump’s second term so far.', 'url': 'https://finnhub.io/api/news?id=854230d76b6fd36b2a4ae52e69d5f5bec794619ea75e004e447c9a78ffa760ca'}, {'category': 'company', 'datetime': 1756295100, 'headline': 'As Warren Buffett Continues to Trim Apple Stake, Should Investors Be Worried?', 'id': 136536137, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Apple now comprises 21% of Berkshire's closely monitored equity portfolio.\", 'url': 'https://finnhub.io/api/news?id=5d982d0ed73fdda2a4280275c09cefba88552b34a1299052e0f5263e263ba3a5'}, {'category': 'company', 'datetime': 1756291928, 'headline': 'What happens to your pension if your relationship ends?', 'id': 136536138, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"If there's an overreliance on one partner’s pension and you end up breaking up you could find yourself close to retirement with little in the way of income.\", 'url': 'https://finnhub.io/api/news?id=c3f07c39e3f7a9bf94894372a3977c0b5aad0f22174af5931a31c0f99e318f63'}, {'category': 'company', 'datetime': 1756291569, 'headline': \"Tesla Stock 'Could Fall 90% Tomorrow,' Fund Manager Still Won't Buy — Here's Where He's Investing Instead\", 'id': 136536120, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Tesla Inc (NASDAQ:TSLA) stock has fallen 8% year-to-date in 2025 and some investors and analysts believe the stock remains overvalued with more room to fall. One of the top-performing fund managers thinks Tesla stock could have significant downside ...', 'url': 'https://finnhub.io/api/news?id=434f7927d77afa8219186d9fdcb67ead90bbb30935a3a8e8f48580f5bcbf65a1'}, {'category': 'company', 'datetime': 1756291392, 'headline': 'AI Weekly: grouchy Grok and the wizard of bots', 'id': 136536140, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"STORY: From why Elon Musk says Apple is being mean to Grok, to how bots reinvented the Wizard of Oz, this is AI Weekly.:: AI Weekly:: Sphere Entertainment\\xa0Elon Musk’s xAI is suing Apple and OpenAI, claiming they conspired to thwart competition.He says they gave prominence to ChatGPT in Apple’s app store, while limiting the profile of his competing chatbot Grok.OpenAI said the case was just another example of what it called Musk’s “pattern of harassment”.Meta is set to back political candidates who back lighter regulation of AI.The Facebook parent says it will set up a California-focused political action committee to back state-level candidates from either party.It plans to spend tens of millions of dollars on the effort, potentially putting it among the state's top politicial spenders ahead of a 2026 governor race.\\xa0DeepSeek has unveiled an upgraded model that it says is can be optimised to work with Chinese chips.That may signal it’s positioned to work with the country’s own semiconductor makers, as Beijing pushes to reduce its reliance on U.S. tech.Earlier this year, DeepSeek shook the sector when it released an AI model able to compete with the likes of ChatGPT, but developed at much lower cost.:: Sphere EntertainmentAI has reimagined “The Wizard of Oz”.The famous film will be shown in Las Vegas on a towering spherical screen that surrounds viewers.AI tools preserve the original performances, but also add new elements.Ben Grossman is the boss of visual effects firm Magnopus:“We need to drastically increase the resolution and detail of the original movie, we need to complete the missing parts of the people who were cut off and then we need to create the continuity of the scene so that the performances that you know are there are actually there.”And Google focused on AI when unveiling its latest Pixel phones.:: Google\\xa0That includes a “coach” in the camera app that can help users take better pictures.There’s also an AI assistant that can display useful information before it’s even asked, such as showing a flight confirmation email when the user calls an airline.\", 'url': 'https://finnhub.io/api/news?id=2b6a4d8f83a26751f9c767abe00e26abbabfb1071fff7f699c0518d49891f5ce'}, {'category': 'company', 'datetime': 1756290780, 'headline': 'It’s Trump’s Market Now. How to Navigate Fed Threats, State Stock Buying, Economic Curveballs.', 'id': 136536141, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Trump escalates Fed fight, Apple teases product event next week, Cracker Barrel drops new logo, and more news to start your day.', 'url': 'https://finnhub.io/api/news?id=67a5e0f03199596b736b0f4d450d0b0f50f5413e3f39010b9f387d60351fe739'}, {'category': 'company', 'datetime': 1756288800, 'headline': 'The Best \"Magnificent Seven\" Stock to Buy Right Now, According to Wall Street (Hint: Not Nvidia)', 'id': 136536125, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Almost every analyst agrees this AI giant is a buy with plenty of upside left.', 'url': 'https://finnhub.io/api/news?id=d6cefbf6bd2b81a2d3edda7b925845062de2a510ca2d395594240036c0b0c4dc'}, {'category': 'company', 'datetime': 1756285332, 'headline': 'EU to Propose Removing US Tariffs This Week to Meet Trump Demand', 'id': 136539421, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The European Commission, which handles trade matters for the EU, will also give preferential tariff rates on certain seafood and agricultural goods, according to people familiar with the matter. The EU has conceded that the trade arrangement struck with Trump favors the US but that the accord is necessary to give businesses stability and certainty.', 'url': 'https://finnhub.io/api/news?id=612cccf472079a1f84ac02fea985ed07785463e11fce1542fde2df16313aa3ce'}, {'category': 'company', 'datetime': 1756285263, 'headline': 'Crypto Industry Unites Against Senate Bill Over Protections for Software Devs', 'id': 136536143, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Top crypto and tech groups said they would not support the Senate’s market structure bill without new language shielding developers from criminal liability.', 'url': 'https://finnhub.io/api/news?id=c1422933d13544e8a6ea15de880fcc0b45d85931f54e313abb4d5f1d9dc447c4'}, {'category': 'company', 'datetime': 1756285020, 'headline': 'Prediction: This Unstoppable Vanguard ETF Will Keep Beating the S&P 500 Over the Long Term', 'id': 136536127, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The S&P 500 typically delivers strong long-term returns, but this Vanguard ETF has consistently outperformed it.', 'url': 'https://finnhub.io/api/news?id=de010cb83b6d643dc3697d4fcd9dee466c036b714ed688738a4d10e9b0ab9387'}, {'category': 'company', 'datetime': 1756284300, 'headline': 'Ben Graham Misquoted: The Stock Market Is Never A Weighing Machine', 'id': 136535891, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/1329937320/image_1329937320.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': \"The stock market is not a weighing machine in the long run. Check out Graham's insights on why the stock market operates as a voting machine.\", 'url': 'https://finnhub.io/api/news?id=1f8e990b991e9dd7e08e7bbe07edf4020234609d120abc13241f0507716fe9e4'}, {'category': 'company', 'datetime': 1756282320, 'headline': 'The New Conversational Standard: Rich Communication Services Market Forecast Report 2025-2030, with Profiles of Google, Apple, Twilio, Sinch, Infobip, MessageBird, and GSMA', 'id': 136536145, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The RCS market is poised for rapid growth, driven by Apple\\'s RCS integration in iOS 18, unifying global users. Key opportunities lie in leveraging RCS Business Messaging for enhanced brand-consumer interaction, exploring high-growth regions like Asia-Pacific, and integrating RCS into digital strategies for MNOs, enterprises, and CPaaS providers.Dublin, Aug. 27, 2025 (GLOBE NEWSWIRE) -- The \"New Conversational Standard: Rich Communication Services (RCS) Market Analysis, RBM Opportunities, and Glo', 'url': 'https://finnhub.io/api/news?id=cdf9963e9810636d6dd5ad679403d87a7fe343bdfeb4099a71f0413bebce46b6'}, {'category': 'company', 'datetime': 1756281713, 'headline': 'FTSE 100 LIVE: Stocks mixed as UK energy prices set to rise more than expected', 'id': 136536146, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The increase kicks in at start of October, which campaigners say will mean another winter of relatively high energy bills.', 'url': 'https://finnhub.io/api/news?id=c651e4c616007403c5a8acfaffde18b8820eec9726a0ae66c4e971e13aadc1cf'}, {'category': 'company', 'datetime': 1756279166, 'headline': 'IMAX Corporation (IMAX) Signs Expansion Agreement with Apple Cinemas for New IMAX with Laser Systems', 'id': 136536147, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'With strong upside potential and significant hedge fund interest, IMAX Corporation (NYSE:IMAX) secures a spot on our list of the 10 Must-Buy Canadian Stocks to Invest in. A significant expansion agreement for five new IMAX with Laser systems around the United States was announced by IMAX Corporation (NYSE:IMAX) and Apple Cinemas on August 7, 2025, […]', 'url': 'https://finnhub.io/api/news?id=fbfd81ca0494903d8d382c281080e814876acca5f579b9bc868ceec4ef3aec61'}, {'category': 'company', 'datetime': 1756278300, 'headline': 'Parallels Launches Parallels Desktop 26 with Support for macOS Tahoe 26, Compatibility with Windows 11 25H2, and New IT Management Tools', 'id': 136536131, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The latest release introduces more secure VM management, accurate Mac disk visibility in Windows, renewed SOC 2 Type II compliance, and more simplified deployment and device management for enterprise IT teams Parallels Desktop 26 for Mac Parallels Desktop is the only Microsoft-authorized way to run Windows 11 on Macs with Apple silicon. Parallels Desktop for Mac Enterprise Edition Parallels Desktop 26 introduces powerful enterprise features, making it easier for IT teams to manage, monitor, and', 'url': 'https://finnhub.io/api/news?id=a16e2511406c745e43e1cbd4a820454a72f67143b38c49df587d7f919b067ee8'}, {'category': 'company', 'datetime': 1756274568, 'headline': 'Trump Slaps India With 50% Tariffs, Upending Ties With Modi', 'id': 136536149, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The new tariffs, the highest in Asia, took effect at 12:01 a.m. in Washington on Wednesday, doubling the existing 25% duty on Indian exports. The levies will hit more than 55% of goods shipped to the US — India’s biggest market — and hurt labor-intensive industries like textiles and jewelry the most. Key exports like electronics and pharmaceuticals are exempt, sparing Apple Inc.’s massive new factory investments in India for now.', 'url': 'https://finnhub.io/api/news?id=fe4f2d299dc86ea71bb917b7cd3ca3260f0913917841a08a8b2e61130f156555'}, {'category': 'company', 'datetime': 1756267201, 'headline': 'The Chinese gadget maker taking on Tesla and Apple', 'id': 136536150, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'An electric vehicle factory built by China’s largest smartphone maker has become a tourist attraction in Beijing, with visits to the company...', 'url': 'https://finnhub.io/api/news?id=4cd753b8caeb83784586d510ce431255fbfe91882b4713b02fb81661cecef582'}, {'category': 'company', 'datetime': 1756266829, 'headline': 'Can Apple’s (AAPL) AI Partnerships Revive Investor Sentiment?', 'id': 136536151, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple Inc. (NASDAQ:AAPL) is one of the top stocks to buy and hold forever. Apple Inc. (NASDAQ:AAPL) is often seen as a textbook example of how to build and strengthen a moat over time. Its brand strength, device and services ecosystem lock-in, and customer loyalty enable it to generate recurring revenues, maintain strong pricing power, and consistently […]', 'url': 'https://finnhub.io/api/news?id=3ebfed59c2e2e7119d0b4077fd406bb25fd5f0e2ef25dbf50f73bd57e334546f'}, {'category': 'company', 'datetime': 1756263240, 'headline': 'The Most Overvalued Of Mag7: Why Apple Gets My Sell', 'id': 136534658, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/1705316992/image_1705316992.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': 'Apple is recognized as a leader, but execution lags. Click here to read more about AAPL stock and why it is rated as a Sell.', 'url': 'https://finnhub.io/api/news?id=1926506c568d5cc3875b9c40c9a3b211652036847eb5d504f84db226cf67ade7'}, {'category': 'company', 'datetime': 1756235481, 'headline': 'Alphabet Lands $10B Meta Cloud Deal--Is A Siri-Gemini Deal Close?', 'id': 136532253, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/2210768067/image_2210768067.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': \"Alphabet Inc.'s Google Cloud lands a $10B Meta deal, challenging AWS and Azure. Click for my updated look at GOOGL stock and why I remain bullish.\", 'url': 'https://finnhub.io/api/news?id=86e5017e035d7aea11fa1ea7fec5b5fb9004d28101950c42bee1a638795926d5'}, {'category': 'company', 'datetime': 1756231255, 'headline': \"Apple Promises 'Awe Dropping' Event Sept. 9\", 'id': 136529950, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple announced Tuesday that it will hold its fall product launch event on Sept. 9, likely headlined by the iPhone 17 series handsets.', 'url': 'https://finnhub.io/api/news?id=eb6ebae095d68639321c7bc616ac6707bbdf8b06f84f539109f00dbba2859e61'}, {'category': 'company', 'datetime': 1756228823, 'headline': 'OMAH: A Berkshire Hathaway Copycat With A 15% Distribution Yield', 'id': 136531630, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/1030142522/image_1030142522.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': \"OMAH ETF seeks 15% annual yield via covered calls on Berkshire's holdings, ideal for income investors. Click here to read my most recent analysis of OMAH.\", 'url': 'https://finnhub.io/api/news?id=58990138d8fe8d477a6838738136d46cb3da707c449f5d2bca585ad94a3798e7'}, {'category': 'company', 'datetime': 1756228320, 'headline': \"Can Strong Content Portfolio Drive Apple's Streaming Prospects?\", 'id': 136529951, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple TV+ hits record Emmy nods and box office success as Services revenues jump double digits despite tough streaming competition.', 'url': 'https://finnhub.io/api/news?id=24b80129567e08f81469955913d3e7c594cf01f50aca4b2796eda55dc206bf7a'}, {'category': 'company', 'datetime': 1756228268, 'headline': \"Elon Musk's xAI sues Apple, OpenAI over AI competition and App Store rankings\", 'id': 136529952, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Elon Musk's xAI filed a lawsuit against Apple and OpenAI in federal court, alleging the companies conspired to prevent competition in the market for artificial intelligence tools.\", 'url': 'https://finnhub.io/api/news?id=13d253c2491e234963d5e88a6cbbdf36bf22ffeebb0b00664a073e991643a738'}, {'category': 'company', 'datetime': 1756228243, 'headline': 'Apple product launch, Meta Super PAC, Trump & Cracker Barrel', 'id': 136529953, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Yahoo Finance's John Hyland tracks Tuesday's top moving stocks and biggest market stories in this Market Minute: Apple's (AAPL) upcoming fall product launch on Sept. 9, Meta (META) reportedly launching a Super PAC focused on artificial intelligence (AI), and President Trump weighing in on the new Cracker Barrel (CBRL) logo. Stay up to date on the latest market action, minute-by-minute, with Yahoo Finance's Market Minute.\", 'url': 'https://finnhub.io/api/news?id=35b93c4400f7b555a2910620d9bca12e0bd6cfaa86ba56d5de59646fba94d752'}, {'category': 'company', 'datetime': 1756226940, 'headline': 'Apple’s Annual Event Will Be Sept 9. What to Expect for the iPhone and AI.', 'id': 136529954, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple will host its annual product event on Sept. 9, the company said Tuesday. Investors and customers alike will be looking for announcements regarding the company’s next iPhone launch and artificial intelligence updates. The Apple event—almost always takes place in September—unveils what new products and updates the company will be launching in the weeks to follow.', 'url': 'https://finnhub.io/api/news?id=b5a5a400b786c4cc164f9ec881a2311d566332bdf548a2fc5818ef858d748573'}, {'category': 'company', 'datetime': 1756226127, 'headline': 'Not so fast: German court says Apple can’t call Watch carbon neutral', 'id': 136529955, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Apple's carbon neutral claims are undermined by the short-term nature of carbon credits used to support them, the court said.\", 'url': 'https://finnhub.io/api/news?id=83f2575c7a3b3ada4263ced904f915e73685c92c56a4c9b377936566bd926fdc'}, {'category': 'company', 'datetime': 1756225200, 'headline': 'More Volatility Ahead In This AI Bull Market', 'id': 136531096, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/1388937775/image_1388937775.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': 'Gary Vaughan from Daily Stock PicksÂ\\xa0on buying the dip, crypto long-term and why bonds might now be a once in a lifetime buy.', 'url': 'https://finnhub.io/api/news?id=02e88f1c840a10605837aa875c0e48f3a5667a8415226907fb48b5338249b884'}, {'category': 'company', 'datetime': 1756224432, 'headline': 'Apple to hold fall event on September 9, new iPhones expected', 'id': 136529956, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"The event will be held at the Steve Jobs Theater at Apple's headquarters in Cupertino, California and serve as a showcase of the company's efforts to integrate artificial intelligence into its devices. Media reports have said Apple will also unveil a slimmer version of its latest iPhone, possibly branded as the iPhone Air, echoing its iPad Air and MacBook Air lines. The company is also expected to showcase new entry-level, high-end Apple Watches, upgraded iPad Pros and a faster version of the Vision Pro headset, Bloomberg News has reported recently.\", 'url': 'https://finnhub.io/api/news?id=2f9081e1f78dab4b8fd7ca3a839bced221a1007faee91a43904a3dc0b3927604'}, {'category': 'company', 'datetime': 1756224300, 'headline': 'Apple is holding its iPhone 17 event on September 9', 'id': 136529957, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Along with the iPhones, Apple will likely have updated the Apple Watch Series 11, Ultra 3, and SE 3. The Apple Watch Ultra 3 would be a notable update amid the trio, with a bigger screen and faster charging support.', 'url': 'https://finnhub.io/api/news?id=798c01eeaa99f2a20a2b540332738653ac0ab5e56bb56102f362eb33fba1f0b2'}, {'category': 'company', 'datetime': 1756222621, 'headline': \"GM's $1 billion bet on F1 rolls on with star driver pairing for Cadillac team\", 'id': 136526543, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'GM’s Cadillac F1 team unveiled its driver pairing for the 2026 season, when the Big Three automaker’s big bet on F1 begins.', 'url': 'https://finnhub.io/api/news?id=d5dadf0c2d424b03eb856d6fd5771083fd61b82952d49619bf7ac66d82ee49d5'}, {'category': 'company', 'datetime': 1756221211, 'headline': 'Attorneys general tell AI companies to protect kids', 'id': 136529944, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Attorneys general in a letter highlighted Meta's scandal over its recent AI chatbot policies allowing romantic conversations with minors\", 'url': 'https://finnhub.io/api/news?id=c80eac904cb211ce08b917cdbdb49c14b6e9716c160c11c91f1134b00dd02cf7'}, {'category': 'company', 'datetime': 1756220400, 'headline': '2 High-Conviction Picks For 7.73% Growth And 4.22% Yield Within A Dividend Portfolio', 'id': 136529227, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/2188450078/image_2188450078.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': \"Through DPSTF and META, we increased Dividend Income Accelerator Portfolio's sector diversification and global exposure. Learn more about the portfolio here.\", 'url': 'https://finnhub.io/api/news?id=3452d5cd9b4cf8d4251a0ea48074df10fe22dad78a44764ff71b7843f2de36f2'}, {'category': 'company', 'datetime': 1756219920, 'headline': 'Apple has an AI problem — and a Google partnership could actually make things worse', 'id': 136541516, 'image': '', 'related': 'AAPL', 'source': 'MarketWatch', 'summary': 'Apple has an AI problem — and a Google partnership could actually make things worse', 'url': 'https://finnhub.io/api/news?id=872986dd4f00566feaa310ee2fa0ab6a465476060222213ade9a930c4715aea1'}, {'category': 'company', 'datetime': 1756219440, 'headline': 'The Zacks Analyst Blog Highlights Alphabet, Apple and Garmin', 'id': 136529960, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Alphabet expands its Pixel lineup with new smartphones, watches, and earbuds, but faces fierce competition from Apple's AI push and Garmin's health-focused wearables.\", 'url': 'https://finnhub.io/api/news?id=93db37c7152895bb7d2a2f3d8de26eb915baea8ac2eea26dc76b571b118beb92'}, {'category': 'company', 'datetime': 1756218652, 'headline': 'Trump vs. Lisa Cook and what it really means for the stock market: Opening Bid top takeaway', 'id': 136525458, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The battle is well underway.', 'url': 'https://finnhub.io/api/news?id=6db1fb4523672e793b334b0953a0e3e17809d60f1522dc0a42d6ec9943d2cf40'}, {'category': 'company', 'datetime': 1756218587, 'headline': \"'Sexualized' AI Chatbots Pose Threat to Kids, Warn Attorneys General in Letter\", 'id': 136529961, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'A coalition of 44 state attorneys general have written to 13 AI firms demanding they protect children from sexually suggestive chatbot content.', 'url': 'https://finnhub.io/api/news?id=beae4eff89cbbac582eebe5b2a564df1ab0402115fab0f6ec44b4adcd3948cb6'}, {'category': 'company', 'datetime': 1756217611, 'headline': 'Apple internally discussed buying Mistral, Perplexity, the Information reports', 'id': 136529962, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Apple has trailed rivals such as Alphabet's Google and Samsung in terms of roll-out of AI features in its devices. CEO Tim Cook signaled last month that Apple was open to larger AI-related acquisitions to accelerate its roadmap, a shift from its historically conservative M&A posture. Perplexity, which is backed by Nvidia and Amazon founder Jeff Bezos, said it is unaware of any merger conversations including the company, aside from its own acquisitions.\", 'url': 'https://finnhub.io/api/news?id=9238d3913f4ea061860ef4435dc0e5662ad535c650c489b04e155b56238db7e5'}, {'category': 'company', 'datetime': 1756217332, 'headline': \"Apple To Invest $2.5 Billion For This Company's Glass, Making Its Shares Jump\", 'id': 136525500, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'This fiber-optics stock is in a buy zone after a positive earnings report. Shares are up 40% so far this year.', 'url': 'https://finnhub.io/api/news?id=ff60a2ae2dd68824095f1deab9962e8de096976d954b3edb4561105d00e430c6'}, {'category': 'company', 'datetime': 1756216626, 'headline': 'Only 19 Companies Have More Money Than Elon Musk — Which Are Worth Investing In?', 'id': 136525463, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'These 19 companies top Elon Musk in wealth. See which ones could be solid picks for your investment portfolio.', 'url': 'https://finnhub.io/api/news?id=4905c4e94e17d8585183949d95e9c37c7ddbc86c60581365e44ab2c72bd56384'}, {'category': 'company', 'datetime': 1756216248, 'headline': 'Trump vows retaliation against countries with digital rules targeting US tech', 'id': 136525502, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The Trump administration has long held the EU’s tech regulations in contempt.', 'url': 'https://finnhub.io/api/news?id=486e26a45bbbc11a274fd4612cdc325097aa3e314abca130893d90e6cf31b151'}, {'category': 'company', 'datetime': 1756206060, 'headline': 'Apple’s August Stock Revival Gives Hope to Concerned Investors', 'id': 136524134, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Shares of the tech giant entered August down 17% for the year due in part to concerns about the impact of President Donald Trump’s sweeping levies, which cost the company $800 million in its fiscal third quarter alone. The US president has long criticized Apple for its reliance on overseas production partners, at one point even threatening to punish the company with tariffs if it didn’t make its iPhones in the US. Then, at an event in the Oval Office on Aug. 6, Apple Chief Executive Officer Tim Cook committed to spending an additional $100 billion on manufacturing in the US.', 'url': 'https://finnhub.io/api/news?id=d4af929538b268228162d9bd3115adb945972a5278888c20ddcf0732ece89dc8'}, {'category': 'company', 'datetime': 1756215276, 'headline': \"Is the tide turning on the AI boom's myth of destiny?\", 'id': 136525465, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'For over a year, AI was gospel. Now, Wall Street, Silicon Valley, and regulators are asking the same question: What if it’s not?', 'url': 'https://finnhub.io/api/news?id=c93c2e83ece71b1b0d6f6ea8daae7246a98738e2c7aad1a53853d61b079ea23b'}, {'category': 'company', 'datetime': 1756215114, 'headline': 'Apple: Breakdown Of $600B Investment Commitment (Rating Downgrade)', 'id': 136527045, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/1705316992/image_1705316992.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': \"Apple's $600B US investment bolsters supply chain resilience, AI growth, and govt ties, minimizing risks.\", 'url': 'https://finnhub.io/api/news?id=001db74a945b3e627a70dce9199b32d4b815fdf4e9e58c7354aa60e4eb00f8ef'}, {'category': 'company', 'datetime': 1752586675, 'headline': 'S&P 500 stocks: List of additions and removals in 2025', 'id': 135946875, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'These stocks have been added or removed from the S&P 500 this year.', 'url': 'https://finnhub.io/api/news?id=c82b8aa916b7627eff6a48b9619bcb02464992951170719c78e81c3c1e3cd758'}, {'category': 'company', 'datetime': 1756214040, 'headline': 'Trump Takes Aim at Digital Taxes. What It Means for Tech Stocks.', 'id': 136525506, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Digital taxes largely hit U.S. firms such as Google-parent Alphabet, retailer Amazon, and Facebook-parent Meta.', 'url': 'https://finnhub.io/api/news?id=75278f14b5dfe4ab92541fb57c79de69ac9768b17c951ff637fe0d3865c3e459'}, {'category': 'company', 'datetime': 1756213680, 'headline': 'Atomic Data Expands Leadership Team', 'id': 136525507, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The Additions Will Accelerate Growth Across Three Operating CompaniesMINNEAPOLIS, Aug. 26, 2025 (GLOBE NEWSWIRE) -- Atomic Data, a leading IT services provider and technology teammate, has announced two key leadership appointments that reinforce its long-term strategic vision and strengthen its shared services operating model. Jay Bozicevich, a three-decade veteran of the financial services industry, will step into the dual roles of President of Atomic Data and Chief Operating Officer of Shared', 'url': 'https://finnhub.io/api/news?id=cf6f397f00502ab95b260e3bef757f58fa106e5105c39e77df9b8e0bd803d1ee'}, {'category': 'company', 'datetime': 1756213200, 'headline': 'Level Launches Level Lock Pro: The Ultimate Blend of Design, Performance, and Security', 'id': 136525508, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'REDWOOD CITY, Calif., August 26, 2025--Level, the company that redefined smart home today introduces Level Lock Pro, the ultimate in smart home performance, security and design. Level Lock Pro provides enhanced performance, security, and features such as door status detection to show when a door is left open, all while retaining the same award-winning invisible design Level is known for. There has never before been a smart lock that packs so much technology in the footprint of a traditional dead', 'url': 'https://finnhub.io/api/news?id=ba6aaa945fdf72d7b0ff6ec45454b30944831abf27e68bd11de8db5b8c1fa58e'}, {'category': 'company', 'datetime': 1756212744, 'headline': 'Apple Loses German Case On Green Marketing Pledge', 'id': 136525509, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Apple Watch can't be advertised as CO?-neutral, court rules\", 'url': 'https://finnhub.io/api/news?id=2ce75c880408058d8a276d83753fe01903ac146b8c6b12ab0e798d1b2418f5b2'}, {'category': 'company', 'datetime': 1756212272, 'headline': 'EU Defends Digital Taxes After Trump Calls Them Unfair on US', 'id': 136525510, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': '“It’s the sovereign right of the EU and its member states to regulate our economic activities on our territory that are consistent with our democratic values,” European Commission Spokeswoman Paula Pinho told reporters Tuesday in Brussels. Without specifying any government, Trump threatened export restrictions on US advanced technology and semiconductors and higher tariffs in retaliation for nations’ digital services taxes that hit American companies.', 'url': 'https://finnhub.io/api/news?id=7de834c2295cd83ee6630cf06bc371f15816a768702ce246a190d1133a4baa23'}, {'category': 'company', 'datetime': 1756212208, 'headline': 'Latest News In Cloud AI - Aurasell Transforms CRM Landscape With AI-Native Platform Launch', 'id': 136525493, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Aurasell has launched as the world's first AI-native CRM platform, introducing a significant shift in the landscape of cloud-based business software. The platform integrates a comprehensive suite of tools into a single system, aiming to eliminate the inefficiencies and high costs associated with traditional, fragmented CRM and go-to-market (GTM) systems. By leveraging AI, Aurasell provides enhanced automation and data unification, which can streamline operations from prospecting to contract...\", 'url': 'https://finnhub.io/api/news?id=207ea8323e1b58d3848a4374d82364443f6b0455e6408f0507c116e10ddbf39c'}, {'category': 'company', 'datetime': 1756211520, 'headline': 'AI Powers AR: Spotselfie Debuts Real-World Ad Marketplace for Brands & Creators', 'id': 136525512, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Spotselfie®, the self-funded AR real-world social metaverse with 16 issued patents, is rolling out its next-generation platform. This AI-powered creator marketplace lets brands and independent creators place GPS-anchored brand experiences in the real world. Built for mobile AR and the next wave of XR smart glasses, it opens new income streams for creators and delivers brands unmatched local targeting.', 'url': 'https://finnhub.io/api/news?id=90be422c09d26a51591bdec839617db7929d82f81f97ba77a05df28e656398a3'}, {'category': 'company', 'datetime': 1756210560, 'headline': 'Boring Is Better Than Amazon, Apple, and Alphabet. These 3 Stocks Prove It.', 'id': 136525495, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Torsten Sløk, the chief economist at Apollo Global Management, says some big tech stocks are being outdone by what might be considered ho-hum names.', 'url': 'https://finnhub.io/api/news?id=91abe67ba7809fa434c3ca366e8a93ff76cea29a866a1272fd1007da924b21f8'}, {'category': 'company', 'datetime': 1756206900, 'headline': 'Tech, Media & Telecom Roundup: Market Talk', 'id': 136525514, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Find insight on Samsung SDI, Cambricon Technologies, Nvidia and more in the latest Market Talks covering technology, media and telecom.', 'url': 'https://finnhub.io/api/news?id=6f3c57dee3ef235b9c03327c1368efb31c146d3c0770094cd015d9072c9ee71b'}, {'category': 'company', 'datetime': 1756204680, 'headline': 'Exploring Trends Across Asset Classes, Mega-Caps, And Banks', 'id': 136525746, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/1308271745/image_1308271745.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': \"Equities have stalled out in the last half of August as a buyer's strike ahead of the seasonally weak month of September takes hold. Click to read.\", 'url': 'https://finnhub.io/api/news?id=e261ed2b3678ac77557c1b354cdc074ed03a8137a6ce9fe9d83108f769ba1221'}, {'category': 'company', 'datetime': 1756204200, 'headline': 'Trump Fires Another Shot at the Fed. The Economy Could Be Collateral Damage.', 'id': 136525515, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Trade deals are still in flux, Musk sues Apple, OpenAI, Intel’s deal with U.S. comes with a catch, and more news to start your day.', 'url': 'https://finnhub.io/api/news?id=feea0a87baf07a24584e4e8b8248a325a74996a515c6f040e4bcbf11919f7830'}, {'category': 'company', 'datetime': 1756202400, 'headline': 'Apple-Google Likely Tie-Up for Siri Revamp Puts These ETFs in Focus', 'id': 136523788, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Apple and Google's AI talks lift both stocks, putting ETFs like IYW, FTEC, FCOM and VOX, with heavy exposure to the tech giants, in focus.\", 'url': 'https://finnhub.io/api/news?id=94c168d3e743b209b245da5b32ecc7207d844937d4d278cf72a515e5a0057625'}, {'category': 'company', 'datetime': 1756202400, 'headline': 'Circular Economy Market to Soar from $149.86 Billion in 2024 to $355.44 Billion by 2032, Driven by ESG Adoption and Recycling Innovation | Report by DataM Intelligence', 'id': 136523787, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'According to research report published by DataM Intelligence, \"The Circular Economy Market Size valued US$149.86 billion in 2024, is projected to reach US$355.44 billion by 2032, expanding at a robust CAGR of 11.40% from 2025 to 2032.\" Global concerns over waste management and resource scarcity are significantly driving the circular economy market, as nations and industries face the dual challenge of rising waste volumes and depleting raw materials.', 'url': 'https://finnhub.io/api/news?id=7ae834401cec373cbbebc6770403f421198ff3a98febd8a0a916ffaf4027c8bb'}, {'category': 'company', 'datetime': 1756202329, 'headline': \"Apple Watch not a 'CO2-neutral product,' German court finds\", 'id': 136523789, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'BERLIN (Reuters) -Apple can no longer advertise its Apple Watch as a \"CO2-neutral product\" in Germany, following a court ruling on Tuesday that upheld a complaint from environmentalists, finding that the U.S. tech company had misled consumers. Apple had promoted the device online as \"our first CO2-neutral product,\" a claim found by a panel of judges to be unfounded and in violation of German competition law, according to a statement from a regional court in Frankfurt. An Apple spokesperson said the court ruling \"broadly upheld our rigorous approach to carbon neutrality\" and declined to comment on whether the company would appeal Tuesday\\'s ruling.', 'url': 'https://finnhub.io/api/news?id=6bba43b58fbaa3325141222ddf982d019366b4f7af671d3278bcea9d588d4ec3'}, {'category': 'company', 'datetime': 1756199205, 'headline': 'Elon Musk’s xAI files lawsuit against Apple and OpenAI', 'id': 136523790, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"The lawsuit alleges Apple's ChatGPT integration sidelines rival apps such as xAI's Grok in App Store rankings.\", 'url': 'https://finnhub.io/api/news?id=d4ee4300cb2fbdea35e2495786189edac83b6f9f477ab491f5251d1a371f90e6'}, {'category': 'company', 'datetime': 1756198863, 'headline': \"Elon Musk Sues Apple, OpenAI Over iPhone AI 'Monopoly'\", 'id': 136523791, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"The lawsuit claims Apple and OpenAI's exclusive iPhone AI deal locks out rivals from 80% of the chatbot market.\", 'url': 'https://finnhub.io/api/news?id=eb6c93280471945b15f63b8433082dc950ee64a93ed4fedc248ad5d566b1c58b'}, {'category': 'company', 'datetime': 1756198800, 'headline': 'Labour accused of abandoning UK tech in AI push', 'id': 136523771, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Labour has been accused of abandoning British tech firms despite Sir Keir Starmer’s pledge to transform the country into an artificial intelligence (AI) powerhouse.', 'url': 'https://finnhub.io/api/news?id=afa0535831fcd97266559a9d37f57a658c3075f6d66955f03b2c79cb1ff64bb0'}, {'category': 'company', 'datetime': 1756198015, 'headline': 'Trump threatens tariffs on nations imposing digital taxes on US tech', 'id': 136523778, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The president said the taxes against US firms “give a complete pass to China’s largest tech companies”.View on euronews', 'url': 'https://finnhub.io/api/news?id=b776efdb64af47c5fe1e927b709c73cbe5c9c0d14ced2ac5e16a21f1476bbb8e'}, {'category': 'company', 'datetime': 1756197600, 'headline': \"Prediction: 2 Stocks That'll Be Worth More Than Berkshire Hathaway 5 Years From Now\", 'id': 136523779, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'These two megacap stocks have Berkshire Hathaway in their sights.', 'url': 'https://finnhub.io/api/news?id=f33417a3a5a437980a5180f2bf5f6287f63409452b581252b1955fcea7108cbc'}, {'category': 'company', 'datetime': 1756195620, 'headline': 'Wall Street Breakfast Podcast: Trump Fires Cook,\\xa0Threatens More Tariffs', 'id': 136524231, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/1717444876/image_1717444876.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': 'Trump fires Fed Governor Cook,Â\\xa0threatens more tariffs, andÂ\\xa0Hassett on Fed chair nominee.', 'url': 'https://finnhub.io/api/news?id=dfb538777ae981067d19edc7864c752efabdf58a28713289109d61c75297a09b'}, {'category': 'company', 'datetime': 1756193878, 'headline': 'Heard on the Street Monday Recap: Trump’s New Deal', 'id': 136523795, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'President Trump said he wants to pursue more deals like the government’s equity investment in Intel. The U.S. converted funds previously allocated for manufacturing expansion into a 9.9% stake in the chip maker. The government also obtained a five-year warrant, under which it could receive an additional 5% if Intel spins out or sells off its manufacturing operations.', 'url': 'https://finnhub.io/api/news?id=31535f8995229bc9f0c38c870b6e861a6d0c18dd7d1ea1cab9a0c56060fb920e'}, {'category': 'company', 'datetime': 1756192028, 'headline': \"Elon Musk's xAI sues Apple, OpenAI over competition claims\", 'id': 136523796, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'STORY: Elon Musk’s xAI is suing Apple and OpenAI over claims they conspired to thwart rivals on artificial intelligence.The suit was filed in a Texas court on Monday (August 26).It says the pair “locked up markets to maintain their monopolies” after Apple integrated OpenAI’s ChatGPT into its products.The suit says the partnership led the iPhone maker to promote ChatGPT in its app store, while limiting prominence for Musk’s competing chatbot Grok.In a social media post, Musk said “a million reviews with 4.9 average for Grok and still Apple refuses to mention Grok on any lists”.Apple didn’t respond to a request for comment on the suit.While OpenAI said the case was consistent with what it called Musk’s “ongoing pattern of harassment”.Some legal experts said Apple’s dominant position in the smartphone market could bolster xAI’s allegation that it was suppressing competition.But Ohio State University law professor Amy Schmitz cast doubt on some of Musk’s claims:“The fact remains that Grok is in the app store and it has ranked highly in some months. In fact, one report I looked at had it ranked at, I think, number one on the App Store in February of 2025, which shows that there is competition, right?”Musk cofounded OpenAI with Sam Altman in 2015.Its ChatGPT bot would later become the fastest-growing consumer application in history.But the pair fell out, and Musk went on to found the rival xAI.In a separate case, he’s suing the ChatGPT maker over its plan to convert from a nonprofit to a for-profit entity.', 'url': 'https://finnhub.io/api/news?id=20e1a5980ae6bfeaa51588fb7adf04a8a77455ce6b836af5680092325a6affbf'}, {'category': 'company', 'datetime': 1756191720, 'headline': 'Prediction: This Unstoppable Stock Will Join Nvidia, Microsoft, and Apple in the $3 Trillion Club Before 2028', 'id': 136523782, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Multiple avenues for growth will help this tech stalwart ascend to new heights.', 'url': 'https://finnhub.io/api/news?id=0a902a286165aa31474fa39cd6d738bff751ff0a50ada011825d386ccd1e8ec8'}, {'category': 'company', 'datetime': 1756184435, 'headline': 'How to close the menopause pay gap', 'id': 136523798, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Women experience an average 10% reduction in earnings by the fourth year following a menopause diagnosis.', 'url': 'https://finnhub.io/api/news?id=4a9e22064b284c05ab6ed13378a663bd282d07b3a51b0d5867a7b0d0b20b906d'}, {'category': 'company', 'datetime': 1756181665, 'headline': 'Trump vows retaliation against countries proposing digital taxes or regulation on American tech giants', 'id': 136523799, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The President seeks to curb rules taking aim at U.S. tech conglomerates', 'url': 'https://finnhub.io/api/news?id=ce623059cb32952ee4c09957bbb8fecad99152bf240a69a20402253669f856ee'}, {'category': 'company', 'datetime': 1756180826, 'headline': 'The $5.5bn cup of coffee', 'id': 136523800, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'One thing to start: Elon Musk’s xAI has sued Apple and OpenAI alleging they broke antitrust rules by thwarting competition in artificial intelligence...', 'url': 'https://finnhub.io/api/news?id=b784bf1bbf51f2a7ae66430e9a9fe87f284667b812b7af3558f0ad86558cc92e'}, {'category': 'company', 'datetime': 1756171860, 'headline': 'Phinge®, Home of Netverse® and Netaverse™ With Verified and Safer AI Announces \"Test the Waters\" Campaign for Potential Regulation A+ Offering', 'id': 136523801, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Phinge Corporation today announced its intention to gauge market interest for a potential Regulation A+ offering, referred to as \"testing the waters\" under SEC Rule 255.', 'url': 'https://finnhub.io/api/news?id=23effc0ec59ab92a7532012a0b3ec4f1493fc83f940cb4d7bdc783cc24d844ee'}, {'category': 'company', 'datetime': 1756168269, 'headline': \"Jeff Bezos Said He Would Have 'Felt Icky' Had He Taken Any More Shares Of Amazon: 'I Just Didn't Feel Good...'\", 'id': 136523802, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Jeff Bezos once revealed in an interview that he never needed more stock to stay motivated at Amazon.com and that asking for it would have felt \"icky.\" Jeff Bezos Was ‘Proud’ Of His Compensation Package At Amazon In a 2024 interview at The New York ...', 'url': 'https://finnhub.io/api/news?id=93c751516e3666864e8c2e9ae96f5d91f74e81629b54bd48d507cb0dc4368d85'}, {'category': 'company', 'datetime': 1756154463, 'headline': \"Elon Musk's xAI sues Apple and OpenAI over AI competition\", 'id': 136523803, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Elon Musk\\'s xAI seeks billions in damages from Apple and OpenAI for allegedly “perpetrating their anticompetitive scheme\"', 'url': 'https://finnhub.io/api/news?id=81d1ba51ee5956233684563e8c4b5b066a6bc8955c78796b911b419a6633806f'}, {'category': 'company', 'datetime': 1756153867, 'headline': 'Stock Market Today: Dow Drops, Apple Firm Despite Musk Threat; Cathie Wood Loads Up On This Stock (Live Coverage)', 'id': 136522222, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The Dow fell as Nvidia shined on the stock market today. Apple held up despite an Elon Musk AI move. Cathie Wood bought a diving stock.', 'url': 'https://finnhub.io/api/news?id=741cc617526e6af9d4f9f3bc5a38ad75e609a0e15933233540034f15031a65bc'}, {'category': 'company', 'datetime': 1756153307, 'headline': \"Elon Musk's X & xAI sue Apple & Open AI: What happens next?\", 'id': 136522261, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"X (formerly Twitter) and xAI (XAAI.PVT), owned by Tesla (TSLA) CEO Elon Musk, are suing Apple (AAPL) and OpenAI (OPAI.PVT). Musk's companies allege that Apple and OpenAI's partnership is anti-competitive and that the government should intervene due to antitrust laws. Yahoo Finance Senior Legal Reporter Alexis Keenan outlines the details of the suit. To watch more expert insights and analysis on the latest market action, check out more Market Domination.\", 'url': 'https://finnhub.io/api/news?id=7da38784a0869068ff9d0cb848412665a7729714621f73e14ae7b1b5bc3e5f30'}, {'category': 'company', 'datetime': 1756153296, 'headline': 'Why Apple Stock Could Sell Off After iPhone 17 Reveal', 'id': 136522262, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple stock could sell off after the company announces its iPhone 17 series smartphones next month, a Wall Street analyst said Monday.', 'url': 'https://finnhub.io/api/news?id=33011ae688343f7c45f9f05da64def83f3063e2686e7fa2da5d99883b981b78c'}, {'category': 'company', 'datetime': 1756152841, 'headline': \"Apple's Biggest iPhone Overhaul in a Decade Could Redefine the Stock's Next Growth Cycle\", 'id': 136522263, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Three years, three redesigns, foldables, AI-powered Siri, and a $100B services pivot -- Apple's next chapter begins.\", 'url': 'https://finnhub.io/api/news?id=554f3fddfdd67d0566bf7df68d092df224df5b41f44680af01e3a839730d68e8'}, {'category': 'company', 'datetime': 1756151760, 'headline': 'Apple no longer innovates — it waits. And with AI, anyone playing it safe will get left behind.', 'id': 136541521, 'image': '', 'related': 'AAPL', 'source': 'MarketWatch', 'summary': 'Apple no longer innovates — it waits. And with AI, anyone playing it safe will get left behind.', 'url': 'https://finnhub.io/api/news?id=272058be85f6596bdceae844d391faf2a80d7f1e1321f59ab01ab25b65b1400a'}, {'category': 'company', 'datetime': 1756151544, 'headline': 'Sector Update: Tech Stocks Mixed in Late Afternoon Trading', 'id': 136522229, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Tech stocks were mixed late Monday afternoon, with the Technology Select Sector SPDR Fund (XLK) frac', 'url': 'https://finnhub.io/api/news?id=2c0bfc5d0dd6af1cab926d1fd2505d8d19703009bdda35aef17ff2936d1bda65'}, {'category': 'company', 'datetime': 1756151528, 'headline': 'US Equity Indexes Mixed Amid Higher Treasury Yields, Dollar', 'id': 136522230, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'US equity indexes traded mixed heading into the close on Monday amid gains in both government bond y', 'url': 'https://finnhub.io/api/news?id=c702f097666c85b6e3990aac44ae65118eeb133cd08498eefa5f99174f46f849'}, {'category': 'company', 'datetime': 1756150843, 'headline': \"Inside Elon Musk's suit against Apple and OpenAI: 'This is a tale of two monopolists'\", 'id': 136522266, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Elon Musk followed through on Monday with a warning to sue Apple and OpenAI over their agreement to integrate OpenAI’s chatbot into Apple’s operating systems and prioritize the chatbot in its app store.', 'url': 'https://finnhub.io/api/news?id=bbb6426526db4acbd3ad432e567665510f3ece060f0b6d8a4dd0f3a7036d3ace'}, {'category': 'company', 'datetime': 1756147860, 'headline': 'Elon Musk’s xAI Sues Apple and OpenAI, Alleging They Are Monopolists', 'id': 136522267, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Musk said the partnership between the two companies has given the ChatGPT-maker access to “billions of user prompts.”', 'url': 'https://finnhub.io/api/news?id=c10d9f0635e4eb3fe91f2c5c05a1507f6a9aaeaf682671a9f0d6f767c60f9271'}, {'category': 'company', 'datetime': 1756147440, 'headline': 'Musk Sues OpenAI and Apple Over AI Access in App Store', 'id': 136522268, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'xAI filed suit against OpenAI and Apple, alleging anticompetitive behavior, according to a report from CNBC.', 'url': 'https://finnhub.io/api/news?id=3e8876dd844b1ac11ecfa0256361a8de7798d4d2629948be49edfbeeced54463'}, {'category': 'company', 'datetime': 1756146753, 'headline': 'Musk sues Apple and ChatGPT maker for ‘conspiring’ against him', 'id': 136522269, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Elon Musk has filed a lawsuit against Apple and ChatGPT maker OpenAI, accusing the companies of conspiring against his AI business.', 'url': 'https://finnhub.io/api/news?id=0dcf5c23d8b030b5e284a4fa60a5aabab4e2943880014f0b573c49c8fd96f2dc'}, {'category': 'company', 'datetime': 1756144729, 'headline': 'Elon Musk accuses Apple and OpenAI of stifling AI competition in antitrust lawsuit', 'id': 136522270, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Elon Musk on Monday targeted Apple and OpenAI in an antitrust lawsuit alleging that the iPhone maker and the ChatGPT maker are teaming up to thwart competition in artificial intelligence. The 61-page complaint filed in Texas federal court follows through on a threat that Musk made two weeks ago when he accused Apple of unfairly favoring OpenAI and ChatGPT in the iPhone's app store rankings for top AI apps. Musk's post insinuated that Apple had rigged the system against ChatGPT competitors such as the Grok chatbot made by his own xAI.\", 'url': 'https://finnhub.io/api/news?id=d53b55c1be0e7744d4bab3e799f1456ecca1191cdbe747fccc03753864f98cb9'}, {'category': 'company', 'datetime': 1756143185, 'headline': 'Sector Update: Tech Stocks Mixed Monday Afternoon', 'id': 136522248, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Tech stocks were mixed Monday afternoon, with the Technology Select Sector SPDR Fund (XLK) adding 0.', 'url': 'https://finnhub.io/api/news?id=4f72b52f62dbadbf3a017217986ed454470b3ce6dff0f140a7d02c16d36e871d'}, {'category': 'company', 'datetime': 1756143125, 'headline': 'US Equity Indexes Mixed as Nvidia Helps Lift Nasdaq Composite', 'id': 136522249, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'US equity indexes traded mixed after midday Monday, with the Nasdaq Composite eking out a gain amid', 'url': 'https://finnhub.io/api/news?id=97583c089a3ab8dbbfc9195508c38b6a74ebc23e472c43727b756eaa05a0dcf2'}, {'category': 'company', 'datetime': 1756143038, 'headline': 'Elon Musk’s xAI sues Apple and OpenAI, alleging anticompetitive collusion', 'id': 136522273, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'According to Musk, Apple and OpenAI are colluding to stifle competition from other AI companies.', 'url': 'https://finnhub.io/api/news?id=516a56dece05e72da77f994ec08b1f901e8a1a28c2f28f9a0c0b9412c42a8d70'}, {'category': 'company', 'datetime': 1756142987, 'headline': 'Elon Musk Sues Apple, OpenAI', 'id': 136522274, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Bloomberg\\'s Mark Gurman details the latest on Apple as Elon Musk files a lawsuit against the tech giant and OpenAI, accusing them of unfairly favoring OpenAI on its smartphones. He joins Caroline Hyde on \"Bloomberg Tech.\"', 'url': 'https://finnhub.io/api/news?id=071349467edabf0c07f743af2407158405cc21bc874e0e86ce02f4acd35995be'}, {'category': 'company', 'datetime': 1756141964, 'headline': \"Elon Musk sues Apple & OpenAI, Roblox rises, Alphabet's new high\", 'id': 136522275, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Yahoo Finance's John Hyland tracks Monday's top moving stocks and biggest market stories in this Market Minute: Tesla (TSLA) CEO and xAI (XAAI.PVT) founder Elon Musk suing Apple (AAPL) and OpenAI (OPAI.PVT), Roblox (RBLX) stock rallying, and Alphabet (GOOG, GOOGL) stock hitting a new record. Stay up to date on the latest market action, minute-by-minute, with Yahoo Finance's Market Minute.\", 'url': 'https://finnhub.io/api/news?id=cd37f083513a4b43ce601efcf627712b2ba7c6ced97d0b6ce53bb151c3b93deb'}, {'category': 'company', 'datetime': 1756141742, 'headline': \"Musk's X, xAI Sue Apple, OpenAI for Alleged 'Anticompetitive Scheme'\", 'id': 136522276, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Elon Musk\\'s companies X and xAI on Monday sued Apple and OpenAI in federal court, alleging they have engaged in an \"anticompetitive scheme\" that prevents competitors like xAI\\'s Grok from competing fairly and ascending the App Store charts.', 'url': 'https://finnhub.io/api/news?id=9e539309f995339b843e01c6ce1eb901aea061bde6652385aacec2c901748116'}, {'category': 'company', 'datetime': 1756140046, 'headline': \"Apple iPhone 17 Launch Could Trigger 'Sell The News' Reaction, Analyst Warns\", 'id': 136522277, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Apple Inc. (NASDAQ:AAPL) is gearing up for its next iPhone cycle with a September launch expected to spotlight a new ultra-thin iPhone 17 Air, but muted consumer buzz and restrained carrier promotions suggest the release may lack the blockbuster momentum of past product cycles. Bank of America Securities analyst Wamsi Mohan maintained a Buy rating on Apple (NASDAQ:AAPL) with a price forecast of $250. Mohan said expectations for Apple's next iPhone cycle remain modest despite reports suggesting a\", 'url': 'https://finnhub.io/api/news?id=e4ab774ba6dcf3899d4162abc2facb5d717884b38aef2e050ccb0da3ad3ab090'}, {'category': 'company', 'datetime': 1756139126, 'headline': 'American Eagle downgraded, Puma soars, Musk sues Apple & OpenAI', 'id': 136509512, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Market Catalysts host Allie Canal dives into what's driving interest in some of Monday's trending tickers on Yahoo Finance's platform, including American Eagle Outfitters (AEO), Puma (PUM.DE), Apple (AAPL), and OpenAI (OPAI.PVT). To watch more expert insights and analysis on the latest market action, check out more Market Catalysts.\", 'url': 'https://finnhub.io/api/news?id=624249acd2ebf5c12f5827252807b7ecb625e9f3357bbf43d1947fb2b2a2669d'}, {'category': 'company', 'datetime': 1756137739, 'headline': \"Musk's xAI sues Apple, OpenAI alleging antitrust violations\", 'id': 136522279, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Elon Musk's companies xAI and X filed a sweeping US antitrust lawsuit Monday against Apple and OpenAI, alleging the tech giants formed an illegal partnership to stifle competition in artificial intelligence and smartphone markets.The plaintiffs claim Apple holds 65 percent of the US smartphone market, while OpenAI controls at least 80 percent of the generative AI chatbot market through ChatGPT.\\nApple and OpenAI announced their partnership in June 2024, making ChatGPT the exclusive AI assistant a\", 'url': 'https://finnhub.io/api/news?id=4995a61d78bd0b891e214d004f7d3c718694b4b41939294746f2667f1e98297d'}, {'category': 'company', 'datetime': 1756129771, 'headline': 'Stock Market Today: Dow Falls Ahead Of Nvidia Earnings, Inflation Data; Palantir Sells Off (Live Coverage)', 'id': 136507733, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The Dow Jones index falls Monday ahead of Nvidia earnings and key inflation data. Palantir stock drops.', 'url': 'https://finnhub.io/api/news?id=683641b210c1124848bd7d6581630691a3455bdce5b964676579ed0e2d8aa9bc'}, {'category': 'company', 'datetime': 1756127340, 'headline': 'Apple Plans Foldable, Curved-Glass iPhones: Report. What It Means for the Stock.', 'id': 136507777, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The shares are in a slump as investors wait to see how the company integrates artificial intelligence with its flagship product.', 'url': 'https://finnhub.io/api/news?id=928c434fc143e6e69f0e54225b9c755fc9080278e8da14fe7586966936d419b5'}, {'category': 'company', 'datetime': 1756121820, 'headline': 'What Is the Highest Apple Stock Has Ever Been?', 'id': 136507778, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Apple's all-time high was reached in late 2024, and it is well below this level today.\", 'url': 'https://finnhub.io/api/news?id=9a00ef0f43eb87671050f652a9f1dd0f502d8732e636adc1a6e6f870b57c1713'}, {'category': 'company', 'datetime': 1755870060, 'headline': 'Suze Orman reveals her favorite stock right now and the investing mistake that shaped her strategy', 'id': 136487722, 'image': '', 'related': 'AAPL', 'source': 'MarketWatch', 'summary': 'Suze Orman reveals her favorite stock right now and the investing mistake that shaped her strategy', 'url': 'https://finnhub.io/api/news?id=03c9e876a9f29d950a1dfa70089118437b7e02856f9547f278c249c14c0797fb'}, {'category': 'company', 'datetime': 1756116566, 'headline': 'Could Apple’s (AAPL) Airline Move Reveal a New Approach to Audience Growth?', 'id': 136507780, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"In August 2025, United Airlines announced that full seasons of select Apple TV+ original series, including Severance and Ted Lasso, are now available for free on over 130,000 seatback screens and in the United app, significantly expanding the airline's inflight entertainment content. This partnership could boost awareness and trial of Apple TV+ among United travelers, broadening Apple’s services reach beyond traditional streaming audiences. We'll explore how Berkshire Hathaway’s sizable...\", 'url': 'https://finnhub.io/api/news?id=8d1ec568e2355141d78aad1cadc0dc78a7410789f281182fa35436398a4f81cf'}, {'category': 'company', 'datetime': 1756114020, 'headline': \"If You'd Invested $1,000 in SoFi Technologies (SOFI) Stock 3 Years Ago, Here's How Much You'd Have Today. (Spoiler: Wow.)\", 'id': 136507781, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Spoiler: You'd have a lot.\", 'url': 'https://finnhub.io/api/news?id=cc372f93fc694e46f10bb1bfac7534e774ec28014abef59053ca2fdc87cd1e9d'}, {'category': 'company', 'datetime': 1756111500, 'headline': 'IBM: The Retracement An Opportunity As IBM Has Transformed Its Business', 'id': 136507588, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/1445810162/image_1445810162.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': \"IBM's focus on hybrid cloud, AI, and innovation boosts growth potential. Discover why its undervalued shares offer income & capital appreciation.\", 'url': 'https://finnhub.io/api/news?id=bd07496ca6f4bf66e1a45fb96943d6eda47f5938fe184effb5ca3bd4c30d1ad1'}, {'category': 'company', 'datetime': 1756109296, 'headline': 'BDJ: This Fund Provides Diversification Benefits Along With A High Yield (Rating Downgrade)', 'id': 136507375, 'image': '', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': '', 'url': 'https://finnhub.io/api/news?id=638320c4013e8c18f47c802a7de2f3e0726a7af7dac1e8eae884dee0a4d4eeb2'}, {'category': 'company', 'datetime': 1756102306, 'headline': \"Apple: The Future Is Bright, But That Doesn't Mean To Buy\", 'id': 136507010, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/2203575435/image_2203575435.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': 'Apple shows robust growth and strong margins, driven by its services segment, but a high valuation tempers buy potential.', 'url': 'https://finnhub.io/api/news?id=31f874ee1dcdd39caf82979740b96b0578f9ab14109c20d15d7c1274b63c0b12'}, {'category': 'company', 'datetime': 1756088516, 'headline': 'ETV: Decent Price Right Now, But Not As Diversified As I Would Like', 'id': 136506262, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/2153687482/image_2153687482.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': \"ETV's strategy relies on writing index options, but its heavy technology weighting reduces diversification. Read why ETV CEF is a Hold.\", 'url': 'https://finnhub.io/api/news?id=e609d8759451296d6349d17fdd99438fa94156eeb9a23a86f2d0e912ae4441a0'}, {'category': 'company', 'datetime': 1756083600, 'headline': 'Tech Rally Shows Signs of Losing Steam', 'id': 136507772, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Nvidia and other stocks in the Magnificent Seven have been buffeted recently by growing doubts about their valuations and the potential of artificial intelligence.', 'url': 'https://finnhub.io/api/news?id=0f8fa3e29ac4bd95c89354949c4161a2d35db2381f83831109a9b2f473e5024f'}, {'category': 'company', 'datetime': 1756077120, 'headline': 'Prediction: All \"Ten Titans\" Stocks Will Surpass $1 Trillion in Market Cap by 2030', 'id': 136507773, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The Ten Titans already make up 38% of the S&P 500, but their share could grow if companies keep delivering on investor expectations.', 'url': 'https://finnhub.io/api/news?id=21506a32bd26bd2e8cb299d0693e1834738da72b97c33b4ccc8a045bbd406e21'}, {'category': 'company', 'datetime': 1756072815, 'headline': 'If you bought Bitcoin instead of every new iPhone, you’d have $250M', 'id': 136507784, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Bitcoin or iPhone, which investment would have paid more?', 'url': 'https://finnhub.io/api/news?id=2219010c26b8b851571c82f93c92505738ad14bc5c10403441a6544a640d2cd3'}, {'category': 'company', 'datetime': 1756066081, 'headline': 'Tracking Renaissance Technologies (RenTec) 13F Portfolio - Q2 2025 Update', 'id': 136504690, 'image': '', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': '', 'url': 'https://finnhub.io/api/news?id=5af03a9d2830ba72b2e198c9657b545ae8d7d8941028d9d6e3cde20a2dffefca'}, {'category': 'company', 'datetime': 1756065569, 'headline': 'Netflix’s ‘KPop Demon Hunters’ is probably the biggest movie in theaters', 'id': 136507785, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"This is Netflix's first time winning the domestic box office.\", 'url': 'https://finnhub.io/api/news?id=390d947eadec7e91d89abc8db8b332bcd287771bd8582c26f09c9b33d5e1ad3a'}, {'category': 'company', 'datetime': 1756058400, 'headline': \"Prediction: These 2 Trillion-Dollar Artificial Intelligence (AI) Stocks Could Strike a Megadeal That Wall Street Isn't Ready For\", 'id': 136502572, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Most of the \"Magnificent Seven\" companies have built and scaled legitimate artificial intelligence (AI) platforms, but two outliers in big tech remain.', 'url': 'https://finnhub.io/api/news?id=4aa61de7969df2e537fcbf75911a5d0975ee96cf94d45ea916556d38a6a8a54d'}, {'category': 'company', 'datetime': 1756051200, 'headline': 'Chinese backer of UK tech takeover accused of military ties', 'id': 136502573, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'A Chinese tech giant funding the takeover of a British semiconductor company has been accused of links to the country’s military.', 'url': 'https://finnhub.io/api/news?id=3b55f1aa895d7b89e582f60248f0424a158bb4d34316de66b42018335c7ae2bc'}, {'category': 'company', 'datetime': 1756047600, 'headline': 'The \"Ten Titans\" Stocks Now Make Up 38% of the S&P 500. Here\\'s What It Means for Your Investment Portfolio', 'id': 136502531, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Massive growth stocks are driving the performance of the S&P 500, for better or for worse.', 'url': 'https://finnhub.io/api/news?id=0beed2ea303bafdbcdee6489b172454ab0df5c2c868733b172d80693a4b795d7'}, {'category': 'company', 'datetime': 1756041990, 'headline': 'The Best Ways To Use the Apple Stocks App To Build Your Best Portfolio', 'id': 136502575, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Discover how Apple’s built-in Stocks app can help investing beginners track funds, set alerts and grow their investing skills.', 'url': 'https://finnhub.io/api/news?id=5ca7e4d33ae50bc068d77ba9e3f590dcd3ec53763ff7a803fc9da8abb40fc20c'}, {'category': 'company', 'datetime': 1756034640, 'headline': \"Here's How Many Shares of Apple Stock You'd Need for $10,000 in Yearly Dividends\", 'id': 136502576, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'This powerful consumer brand has found remarkable success because of its ongoing focus on innovation.', 'url': 'https://finnhub.io/api/news?id=b8be2c8adfc45a2581f853334d822802bab801a5392766dc7210bc22fd02c7a9'}, {'category': 'company', 'datetime': 1756033110, 'headline': 'Nvidia will deliver key earnings report this week', 'id': 136502538, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Check out the stocks that propelled last week's huge Dow rally.\", 'url': 'https://finnhub.io/api/news?id=7b86059d86ff84352acd6fae86a8258b87a44dd3f1d25102d65586b83cc7a8d5'}, {'category': 'company', 'datetime': 1756032600, 'headline': 'Why Is Warren Buffett Dumping Apple Stock Right Now?', 'id': 136502578, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Berkshire Hathaway has been rapidly reducing its Apple stock holdings. What's going on?\", 'url': 'https://finnhub.io/api/news?id=73ff48685f460de5f73fe6ecf015179bc929e73c78a4bed4aefadbf48985bb15'}, {'category': 'company', 'datetime': 1756028040, 'headline': 'Best Stock to Buy Right Now: Apple vs. Microsoft', 'id': 136502563, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Which of these roughly half-century-old companies presents a better investment opportunity?', 'url': 'https://finnhub.io/api/news?id=8a5e42a9d73e09b83190dc51513b368fd5f813da7aada8001706e41188f20fa0'}, {'category': 'company', 'datetime': 1756027390, 'headline': \"Ethereum's next upgrade: What you need to know\", 'id': 136502580, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Ethereum is gearing up for another major upgrade with the Fusaka hard fork, set for November 5', 'url': 'https://finnhub.io/api/news?id=b8308a5310cab511f1c7f66260442bcb62a56effedfb06262eb84d6b01983bd5'}, {'category': 'company', 'datetime': 1756022520, 'headline': '‘It’s almost tragic’: Bubble or not, the AI backlash is validating what one researcher and critic has been saying for years', 'id': 136502566, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Gary Marcus told Fortune that AI valuations remind him of Wile E Coyote. \"We are off the cliff.\"', 'url': 'https://finnhub.io/api/news?id=c02f68e789e6c621e714c92b71596e170bad8e3e5e606e8c3dc0c7c7d5e951be'}, {'category': 'company', 'datetime': 1756012944, 'headline': 'No Base iPhone in 2026 as Apple Bets Big on Foldable Launch', 'id': 136502582, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple Inc. (NASDAQ:AAPL) is among the best stocks to buy now according to AI. According to the report by South Korean outlet ETNews, Apple Inc. (NASDAQ:AAPL) will skip the launch schedule in 2026, breaking from its tradition by not releasing its base model. The reason is simple – it’s saving the spotlight for its first-ever […]', 'url': 'https://finnhub.io/api/news?id=808ae2d0c49ab9b03f5ff9655f9330c6676802665ea8750cf5937e302a0d3582'}, {'category': 'company', 'datetime': 1756012786, 'headline': 'Amazon AI Chip Executive Joins Arm to Build Complete Chips', 'id': 136502583, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Amazon.com, Inc. (NASDAQ:AMZN) is among the best stocks to buy now according to AI. On Monday, it was revealed that Arm Holdings has hired Rami Sinno, artificial intelligence chip director at Amazon.com, Inc. (NASDAQ:AMZN), in an effort to develop its own complete chips. Up to this point, Arm has not developed its own chips; rather, […]', 'url': 'https://finnhub.io/api/news?id=2c4675a4789aea76a1abe4ded69dab761cf657957e5b375d54245308b9a8cda2'}, {'category': 'company', 'datetime': 1756011644, 'headline': \"'We quit our jobs to launch a £2.5m tequila cocktail business'\", 'id': 136502584, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Co-founders Alice Parmiter and Wynter Karo quit their corporate jobs to launch premium tequila cocktail brand Pimentae.', 'url': 'https://finnhub.io/api/news?id=6d5de702003b9d1be6bd2638afa73d0025eaf761609e9f36f47ef9ec5d753072'}, {'category': 'company', 'datetime': 1755988028, 'headline': '3 Reasons You Should Buy Apple Stock Ahead of a Major Product Launch', 'id': 136502585, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'When it comes to the rise and fall of Apple stock, there are a number of catalysts investors look out for, and one of them is product launches. Apple consistently moves the market with their new...', 'url': 'https://finnhub.io/api/news?id=94beb6b43d176186a159a51c9c3deeda2a003e3c97a587160b4d0c7c7b64b3cf'}, {'category': 'company', 'datetime': 1755967620, 'headline': 'Prediction: This Quantum Computing Stock Will Still Be Worth More Than Berkshire Hathaway, Palantir, and Tesla Combined in 2030', 'id': 136495839, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Quantum computing could become the next frontier of the artificial intelligence revolution.', 'url': 'https://finnhub.io/api/news?id=963004d4b5e80bab2c5fff729f22be257f34cf9ebb2bedd4c494b9da856a2d25'}, {'category': 'company', 'datetime': 1755964802, 'headline': 'Should You Buy Nvidia Stock Before August 27?', 'id': 136497749, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'While U.S.-China tensions continue, Nvidia remains the undisputed king of AI hardware.', 'url': 'https://finnhub.io/api/news?id=98f85b2449e45b2ff2677d9b64411d13507b8092f83be42f053ed7cdaabb7cb8'}, {'category': 'company', 'datetime': 1755958200, 'headline': 'Warren Buffett Is Selling Apple and Bank of America and Piling Into This Beaten Down Value Stock Instead', 'id': 136495877, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'This stock looks like a classic \"bear greedy when others are fearful\" investment.', 'url': 'https://finnhub.io/api/news?id=aea4c08e323cb64a8b592182ebcbde4ebf32768cce3245433c496ead6e48207f'}, {'category': 'company', 'datetime': 1755957919, 'headline': 'This week in Trumponomics: A government hedge fund?', 'id': 136495842, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Trump wants to nationalize Intel and make other big companies do his bidding. Everybody fine with that?', 'url': 'https://finnhub.io/api/news?id=7197f4b7e60502eeab5cbd8a0a8f7b4c4e183277572e2ee0635531c7ecf46a26'}, {'category': 'company', 'datetime': 1755950400, 'headline': 'How Tech Is Tackling the New Age-Verification Rules', 'id': 136495879, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Selfies, government IDs and AI are all being used by companies in an effort to adhere to new laws and regulations aimed at protecting children.', 'url': 'https://finnhub.io/api/news?id=2ebcad4799efbcb2a4e34a0eec8c391bf65a92be17fe05d73e0f8b732927209d'}, {'category': 'company', 'datetime': 1755943669, 'headline': 'Foxconn’s Recall of More Chinese Staff Tests Apple’s India Push', 'id': 136495880, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The extraction of Chinese workers from the factory of Yuzhan Technology, a Foxconn component unit, in southern Tamil Nadu state is the second such move in a few months. Foxconn has started flying in Taiwanese engineers to replace staff leaving, people familiar with the matter said, asking not to be named as the information is private. Earlier this year, officials in Beijing verbally encouraged regulatory agencies and local governments to curb technology transfers and equipment exports to India and Southeast Asia in what is a potential attempt to prevent companies from shifting manufacturing elsewhere.', 'url': 'https://finnhub.io/api/news?id=ce0350a1cada1abfc2638e13fd6f5ce5d031693e9c391e8c7d25d188f75d151a'}, {'category': 'company', 'datetime': 1755943531, 'headline': 'Did Trump save Intel? Not really, analysts say.', 'id': 136495849, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'SAN FRANCISCO (Reuters) -U.S. President Donald Trump is injecting nearly $9 billion into Intel in exchange for a 9.9% equity stake. What Intel needs is external customers for its so-called cutting-edge 14A manufacturing process - a tough ask, at least in the short term. CEO Lip Bu Tan, who took the top job in March, warned last month that the company may have to quit the chip contracting business if it does not land any big clients.', 'url': 'https://finnhub.io/api/news?id=f9dc938c9ab927a7ae254533f06a600f1daf54df8050ee606becea6f1ec5df0b'}, {'category': 'company', 'datetime': 1755941400, 'headline': 'Warren Buffett Is Selling Apple Stock Again. Should You Follow His Lead?', 'id': 136495882, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Buffett hadn't sold Apple stock in nearly a year.\", 'url': 'https://finnhub.io/api/news?id=67a819077623f6d8344de845e6097c7d733def259f5a1be9305512e41bc53398'}, {'category': 'company', 'datetime': 1755936600, 'headline': \"Goodbye Growth? Here's What I'm Buying As Value Mounts A Comeback\", 'id': 136493917, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/2193071535/image_2193071535.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': 'Recent underperformance in growth tech stocks reflects doubts about AI, while value-oriented dividend stocks have shown resilience and defensiveness. See more here.', 'url': 'https://finnhub.io/api/news?id=cd45534dafc843f5318537f56c7fad06e00d25a8e4c8fbf6789d1ab654d988d8'}, {'category': 'company', 'datetime': 1755935280, 'headline': 'Is Apple Stock Your Ticket to Becoming a Millionaire?', 'id': 136495883, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Shares of the tech giant have produced a total return of 68,660% in the past three decades.', 'url': 'https://finnhub.io/api/news?id=d2eec603ce17842f284932a4a3e5c03aff9daa6de5e5d86ddb6af845553352f9'}, {'category': 'company', 'datetime': 1755930600, 'headline': 'Brace for a Second China Shock. Advanced Manufacturing Is at Risk.', 'id': 136495884, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The U.S. could face a second version of the “China shock” that hollowed out parts of the U.S. manufacturing sector, according to Dan Wang, a veteran China technology analyst. The first China shock kept prices low for Americans and boosted corporate profitability. It also helped China transform into a more formidable rival, feeding the current frictions in the U.S.-China relationship.', 'url': 'https://finnhub.io/api/news?id=850292052d1c0a7a2f63dfb7d5c37273a14e9bc420558fbc9ca6bd344ab50a71'}, {'category': 'company', 'datetime': 1755925257, 'headline': 'The Guns N’ Roses-inspired company helping to make job search less soul-crushing', 'id': 136495885, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'As a fan of rock band Gun N’ Roses, Jérémy Clédat wanted to start his company with a name that resonated with the global job search market.', 'url': 'https://finnhub.io/api/news?id=01ebf524fba8ec60e739cfab45a16b7d5294a516e1158a9db36238ffab7015cd'}, {'category': 'company', 'datetime': 1755921418, 'headline': 'Apple (AAPL) off the Hook on Britain’s iPhone ‘Backdoor’ Push', 'id': 136495886, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple Inc. (NASDAQ:AAPL) is one of the best stocks to buy according to billionaire Ken Fisher. On August 19, U.S. Director of National Intelligence Tulsi Gabbard, confirmed that Britain has dropped its demand for the company to provide a backdoor to its encrypted devices. British authorities were pushing the iPhone maker to provide a backdoor […]', 'url': 'https://finnhub.io/api/news?id=a98cd2b33fc9c36638974f17b290dc1f9f9a5c17ae1a7662d24e54cd8f5f3662'}, {'category': 'company', 'datetime': 1755913206, 'headline': 'Bernstein Reiterates Market Perform on Alphabet (GOOGL) Amid AI Competition', 'id': 136495887, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Alphabet Inc. (NASDAQ:GOOGL) is one of the Must-Watch AI Stocks for Investors. On August 19, Bernstein SocGen Group analyst Mark Shmulik reiterated a Market Perform rating on the stock with a $185.00 price target. Drawing parallels between the current artificial intelligence landscape and the mobile platform wars of the early 2010s, the firm noted that they […]', 'url': 'https://finnhub.io/api/news?id=52e18599d510ed5d44cc4be72d8bce573a555e0a3d6b252b19a42c7a6cb4f948'}, {'category': 'company', 'datetime': 1755909000, 'headline': 'Prediction: This Unstoppable Stock Will Join Nvidia, Microsoft, and Apple in the $3 Trillion Club Before 2029', 'id': 136495867, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'This tech giant is firing on all cylinders.', 'url': 'https://finnhub.io/api/news?id=06994cc452da8b68a81d3fd95c7879eb25b2ad61afb29c7393e040155999f3e9'}, {'category': 'company', 'datetime': 1755901072, 'headline': 'Apple Explores Using Google Gemini AI to Power Siri', 'id': 136495889, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple is in early talks to use Google\\'s Gemini to power a revamped Siri, a potential step toward outsourcing more AI technology. Bloomberg\\'s Mark Gurman speaks with Vonnie Quinn and Caroline Hyde on \"The Close\" about Apple\\'s next moves.', 'url': 'https://finnhub.io/api/news?id=c363ca48e9308ec13ce2347c2fc1cd4819e52806ed374d2df3427bef570f13d1'}, {'category': 'company', 'datetime': 1755896497, 'headline': \"Dow Hits Record High as Powell's Dovish Tilt Fuels Stock Market Rally\", 'id': 136495871, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Wall Street's equity indexes rallied on Friday, with the Dow Jones Industrial Average hitting a reco\", 'url': 'https://finnhub.io/api/news?id=c45ffc6ab579368ee4943ead165a214976c8fd630c32c9e71cd71bd0eb4b2699'}, {'category': 'company', 'datetime': 1755895238, 'headline': 'Apple-Google Talks Heating Up Over Siri-Gemini IPhone Agreement?', 'id': 136495891, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Google stock rose Friday amid a report Apple and Alphabet are in talks over a Gemini-Siri iPhone deal as well as a Meta cloud computing pact.', 'url': 'https://finnhub.io/api/news?id=7bdfa9590bbf6abc5c8bae96c1af4c0d60442f4a5eec8f6169a0bb11714408eb'}, {'category': 'company', 'datetime': 1755894360, 'headline': 'Apple Looks at Using Gemini for AI, Report Says. Alphabet Stock Jumps.', 'id': 136495892, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Alphabet stock jumped to a record high Friday afternoon after a report said Apple is exploring using Google’s Gemini to run the highly anticipated Siri voice assistant. Bloomberg reported that the iPhone maker has approached Google to look into possibly building a custom artificial-intelligence model that would be the foundation of the long-awaited AI-powered Siri. Shares of Alphabet climbed 3.2% to $206.09.', 'url': 'https://finnhub.io/api/news?id=b7caed03521886a7c082609b0a414963bb97e1a8291cc7d3a2f6509f6ff7e550'}, {'category': 'company', 'datetime': 1755892834, 'headline': 'Apple gets ready for AI in the enterprise with new ChatGPT configuration options', 'id': 136495893, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple will let businesses configure ChatGPT enterprise access in the fall.', 'url': 'https://finnhub.io/api/news?id=ff16d935a7e5e70d4af11beac775853b8403fc5f2ca7ac8ae912094e619e5c7d'}, {'category': 'company', 'datetime': 1755892096, 'headline': 'Apple May Use Google AI to Power Revamped Siri', 'id': 136495894, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Apple is in early discussions about using Google Gemini to power a revamped version of its Siri voice assistant. The work is part of an effort to catch up in generative AI, a field where the company arrived late and then struggled to gain traction. Bloomberg's Denitsa Tsekova reports.\", 'url': 'https://finnhub.io/api/news?id=10cb0d9b54ab072a06079afacfbaa7e40b93ffdeeb1addc9744763603cd2ff39'}, {'category': 'company', 'datetime': 1755891483, 'headline': 'Ethereum, Gap, Apple: Trending tickers', 'id': 136495895, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Market Domination Host Josh Lipton and Prairie Operating Co. EVP of market strategy Lou Basenese discuss some of the day's top trending tickers, including Etherium (ETH-USD), Gap (GAP), and Apple (AAPL). To watch more expert insights and analysis on the latest market action, check out more Market Domination.\", 'url': 'https://finnhub.io/api/news?id=513c75a2bddffce5c5da870e661aadeafdcfe6e8b9e9f2fbf9f1cfd5ddec103b'}, {'category': 'company', 'datetime': 1755885259, 'headline': 'Apple reportedly wants Google’s Gemini to power new Siri', 'id': 136478817, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Investing.com -- Apple Inc (NASDAQ:AAPL). is said to be exploring the possibility of using Google’s Gemini model to power a revamped version of its Siri voice assistant, potentially outsourcing more of its artificial intelligence technology.', 'url': 'https://finnhub.io/api/news?id=139913ae884d4863c0bbcee60a33d4d4d9f1e1fbc699de4f12026bbdb69cd234'}, {'category': 'company', 'datetime': 1755885159, 'headline': 'MP Materials (MP) Surges 247% Over Last Quarter Amid Market Optimism', 'id': 136478818, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"MP Materials (MP) has showcased significant developments, including improved quarterly sales and a notable partnership with Apple to supply rare earth magnets. However, despite better sales figures, the company's ongoing losses reflect its challenging financial landscape. While the shares of MP surged 247% over the last quarter, the broader market also saw upward momentum, highlighted by optimism from potential interest rate cuts indicated by Fed Chair Powell. The news of strategic buyback...\", 'url': 'https://finnhub.io/api/news?id=c0a05d2b9539b4bcd299176f87094a644b42b9779339447aa52c38680f183729'}, {'category': 'company', 'datetime': 1755883746, 'headline': \"Stock Market Today: Dow Soars 900 Points As Fed's Powell Raises Rate-Cut Hopes; Nvidia Earnings Loom (Live Coverage)\", 'id': 136478797, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The Dow Jones soared to an all-time Friday on increased hopes of a rate cut at the September Federal Reserve meeting.', 'url': 'https://finnhub.io/api/news?id=a805579fc4172735f665585fd7d8d2a3aee69a6e9ed896a0dacacba43613f053'}, {'category': 'company', 'datetime': 1755883350, 'headline': \"Apple in talks to use Google's Gemini AI to power revamped Siri, Bloomberg News reports\", 'id': 136478822, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Alphabet's shares were up 3.7% while Apple's stock was up 1.6%, both extending gains in afternoon trading following the report. Apple recently approached Alphabet's Google to develop a custom AI model to power a redesigned Siri next year, the report said. Apple remains weeks from deciding whether to stick with in-house Siri models or switch to an external partner, and it has not yet chosen a partner.\", 'url': 'https://finnhub.io/api/news?id=d3f01a1dc2bd8cd8fa3dca65439ad99cb28cdf8a1b5e063380b30e92c19949a6'}, {'category': 'company', 'datetime': 1755883164, 'headline': \"Apple's latest security update directly hits crypto users\", 'id': 136478824, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple urges users to immediately update their devices. Here is how it impacts crypto users.', 'url': 'https://finnhub.io/api/news?id=43dc0a0ae76e081ac38f1854ea4461d80362a55dfa7f6c726aafc7c5b3c1ef44'}, {'category': 'company', 'datetime': 1755883110, 'headline': 'Apple Explores Using Google Gemini AI to Power Revamped Siri', 'id': 136478826, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The iPhone maker recently approached Alphabet Inc.’s Google to explore building a custom AI model that would serve as the foundation of the new Siri next year, according to people familiar with he matter. Google has started training a model that could run on Apple’s servers, said the people, who asked not to be identified because the discussions are private. Earlier this year, Apple also explored partnerships with Anthropic PBC and OpenAI, weighing whether Claude or ChatGPT could serve as Siri’s new brain.', 'url': 'https://finnhub.io/api/news?id=5e934c677d156a05ca72ffc602338342dc5957ea7a3940b1c7f3c9f7cd140763'}, {'category': 'company', 'datetime': 1755883020, 'headline': 'Dell Technologies vs. Apple: Which PC Maker Stock is a Better Buy?', 'id': 136478827, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'DELL or AAPL, which PC maker is a better pick, given the strong demand for AI-powered devices amid rising tariffs?', 'url': 'https://finnhub.io/api/news?id=985c2070d00aa745e59ca55a11d5cf8f10bccddc7ea2a5b87f42435be096d554'}, {'category': 'company', 'datetime': 1755882000, 'headline': 'Y Combinator says Apple’s App Store has hindered startup growth', 'id': 136478829, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Y Combinator is asking the court to deny Apple’s appeal.', 'url': 'https://finnhub.io/api/news?id=5d2b4f1964b618a05375b8680527bf6bc517f240daa4d5075c2794a020440546'}, {'category': 'company', 'datetime': 1755881142, 'headline': 'Masimo files lawsuit against US border patrol amid Apple patent dispute', 'id': 136478830, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Masimo contests that US border patrol inaction over prohibiting the import of Apple Watch’s determined to include features that infringe on its light-based pulse oximetry technology is unlawful.', 'url': 'https://finnhub.io/api/news?id=a12e0b45d7d58437876740c7036ac6c966f4dc171bb3912cc877fe0001f2811c'}, {'category': 'company', 'datetime': 1755870090, 'headline': 'Stock Market Today: Dow Jones Index Rises Ahead Of Big Powell Speech; Nvidia Falls On AI Chip News (Live Coverage)', 'id': 136476309, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"The Dow Jones index rose Friday ahead of Fed Chair Powell's speech. Nvidia stock fell on AI chip news, while Palantir also dropped.\", 'url': 'https://finnhub.io/api/news?id=e0f20dd04abda6bce17068f4b17e56a1a8dcc47f435d132d48fde56d027940e5'}, {'category': 'company', 'datetime': 1755872329, 'headline': 'Apple just indirectly boosted the value of its all-in-one subscription service', 'id': 136478832, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple hiked the price of Apple TV+ earlier this week, the third time it’s done so since 2019.', 'url': 'https://finnhub.io/api/news?id=472c9b6e27318765aa4454bee42e36228b952463214fa850d0eb8520c24ea1c0'}, {'category': 'company', 'datetime': 1755872220, 'headline': 'Meta Doubles Down on ‘Superintelligence’ Investment. It’s Good News for AI Stocks.', 'id': 136478814, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Meta Platforms is “investing more and more” into its artificial-intelligence efforts according to chief AI officer Alexandr Wang.', 'url': 'https://finnhub.io/api/news?id=574da7668862eeecb690af573b4e31a3d1517185457513bc7b9f6d0ea9108559'}, {'category': 'company', 'datetime': 1755871202, 'headline': 'How To Make An Iron Condor Fly With Options On Apple Stock', 'id': 136476454, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Apple has had some up-and-down price action, and it's a good bet it will go sideways. This could make for an iron condor setup.\", 'url': 'https://finnhub.io/api/news?id=7222792f96523088014e91d64f3462b712538e9071a0bb7ac00b2dfdb4c592a0'}, {'category': 'company', 'datetime': 1755871200, 'headline': 'Meet the Unstoppable Vanguard ETF With 55% Invested in \"Ten Titans\" Growth Stocks', 'id': 136476419, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The Vanguard S&P 500 Growth ETF has especially high weightings in select \"Ten Titans\" stocks.', 'url': 'https://finnhub.io/api/news?id=5ca186cfc0502126d6873ca3ceec89c7428c922342b104a6f94ff4b550759b22'}, {'category': 'company', 'datetime': 1755870571, 'headline': 'Meta Hires Another Apple AI Leader Amid Headcount Freeze, Report Says', 'id': 136476456, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Meta Platforms is reportedly hiring another senior AI executive from Apple for its Meta Superintelligence Labs, where it is moving to freeze headcount.', 'url': 'https://finnhub.io/api/news?id=03aa9b139c6a4ad64e005804e63597136c919603c45a2cd4352e19874da2e23e'}, {'category': 'company', 'datetime': 1755868678, 'headline': 'What If You’d Invested $500 in Apple Stock Instead of Buying the First iPhone?', 'id': 136476457, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The very first iPhone customers got plenty of use and enjoyment out of it, but they might have felt even better if they had invested that money in Apple stock.', 'url': 'https://finnhub.io/api/news?id=be031bbd19fc281a4c21acc193a683e5434e5f7d0d0e24e9ca71c8477134e368'}, {'category': 'company', 'datetime': 1755866651, 'headline': 'Latest News In Cloud AI - AI-Powered Security Boosts Cloud Protection in New Partnership', 'id': 136476439, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Radware and EPIC Cloud Company have entered into a Managed Security Service Provider (MSSP) agreement aimed at enhancing cloud application security through AI-powered solutions. This collaboration allows EPIC Cloud to integrate Radware’s advanced security services into their offerings, thereby bolstering protection for cloud-based applications and data. Radware’s service includes a comprehensive security platform featuring web application firewalls, bot management, API protection, and DDoS...', 'url': 'https://finnhub.io/api/news?id=314fd848df66c32f01bc147fc013d5799bff38e4d2c32d3c6a92d1dd11874575'}, {'category': 'company', 'datetime': 1755863178, 'headline': \"Mark Zuckerberg Halts AI Hiring After Million-Dollar Talent Poaching Sparks Investor Backlash Amid Meta's 'Superintelligence Efforts:' Report\", 'id': 136476459, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Meta Platforms Inc. (NASDAQ:META) has implemented a hiring freeze in its artificial intelligence division following months of aggressive recruitment that included nine-figure compensation packages. Hiring Moratorium Follows Talent War Spending The ...', 'url': 'https://finnhub.io/api/news?id=8392d7b0547d3be92c922c19b5b9bd2c19f89bd4d75b0cad5df90a38cb53c227'}, {'category': 'company', 'datetime': 1755863100, 'headline': 'Could Uber Become a Trillion-Dollar Company One Day?', 'id': 136476443, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Uber is quietly becoming one of the most powerful transport infrastructure companies.', 'url': 'https://finnhub.io/api/news?id=1a88598da212691416aa7304d8d80ba3f4a1799f409e0516ddd06f76997742b7'}, {'category': 'company', 'datetime': 1755861140, 'headline': 'Russia mandates pre-installation of MAX app', 'id': 136476461, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The app is designed to integrate with various government services.', 'url': 'https://finnhub.io/api/news?id=ab881b4b983e5a4c86ee13cbc6b2dbcd43f3e5ebe97eabdce44243da948f2b89'}, {'category': 'company', 'datetime': 1755858809, 'headline': \"Broadcom's AI Push Gains Speed With Microsoft, Meta, And Apple Pouring Billions Into Data Infrastructure\", 'id': 136476321, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Broadcom Inc. (NASDAQ:AVGO) is riding the artificial intelligence boom as soaring Big Tech investments in data infrastructure fuel demand for its custom chips and networking solutions, propelling the stock to strong year-to-date gains even as the company faces regulatory challenges in Europe. The custom chipmaker has surged 25% year-to-date, outpacing the NASDAQ Composite’s 9% gain, as booming demand for its networking and Application-Specific Integrated Circuit (ASIC) businesses positions the c', 'url': 'https://finnhub.io/api/news?id=b4fc561e1ea668faf67baf1d647f0ee877585164271fb7c5eaa8eda827e5caa6'}, {'category': 'company', 'datetime': 1755857452, 'headline': 'Investors zero in on Nvidia results as US tech stocks waver', 'id': 136476450, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"NEW YORK (Reuters) -A wobble in U.S. technology shares has raised the stakes for Nvidia Corp's quarterly results on Wednesday, with earnings from the semiconductor giant posing a crucial test for the scorching AI trade. The benchmark S&P 500 has pulled back this week from record levels, dragged lower by a roughly 3% drop so far this week in the heavyweight tech sector after a huge run for the group. Fueled by its dominant artificial intelligence (AI) products, Nvidia's massive share price gains have buoyed both the tech sector and the overall market in recent years.\", 'url': 'https://finnhub.io/api/news?id=8e0bae9104c2d5c3445963999e6df31717d9966102ad20374b5d1646d468c1d4'}, {'category': 'company', 'datetime': 1755856544, 'headline': '6 Stocks That Turned $1,000 Initial Investments Into Millions by Mid-2025', 'id': 136476464, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'These 6 stocks turned modest $1K investments into millions by mid-2025. See which companies delivered massive returns.', 'url': 'https://finnhub.io/api/news?id=066447d8e4c79d6dc79a1f3d956f70e2f43f3a8d059cc46665f961522bf3648d'}, {'category': 'company', 'datetime': 1755853743, 'headline': 'Should CEO pay be capped? Readers have their say', 'id': 136476465, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Pay for CEOs at FTSE 100 firms has hit a record high for the third year in a row, raising questions about equity and fairness.', 'url': 'https://finnhub.io/api/news?id=171ce63d87c11410ef52b55c53490aeee7a4389be2ea324c1cfbfa50c06fc116'}, {'category': 'company', 'datetime': 1755852300, 'headline': 'Do Extreme Concentration And Bad Breadth Signify A Bubble?', 'id': 136475952, 'image': '', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': '', 'url': 'https://finnhub.io/api/news?id=7157f6bce8ab4cae4100f74e195d5e82876e640cbc5f8436d773bb24af2eee88'}, {'category': 'company', 'datetime': 1755850500, 'headline': 'BNY Mellon Equity Income Fund Q2 2025 Commentary', 'id': 136475862, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/2158808037/image_2158808037.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': 'BNY Mellon Equity Income Fund returned -3.31% during the first quarter of 2025. Click here to read more.', 'url': 'https://finnhub.io/api/news?id=49d43786806274bdfd92a192f7ae853e14fd9144cdadf9898889b5496ea6be41'}, {'category': 'company', 'datetime': 1755850413, 'headline': 'FTSE 100 LIVE: Stocks eke out gains as traders await key Jackson Hole speech from Federal Reserve chair', 'id': 136476324, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Traders look for comments that could help confirm expectations that a US interest rate cut is on the cards.', 'url': 'https://finnhub.io/api/news?id=86dfe633de7c66a75f0be7a6a3f1d3edf5360d215952aa1d0201f141758d78a4'}, {'category': 'company', 'datetime': 1755849060, 'headline': \"Billionaire Warren Buffett Sold 69% of Berkshire's Stake in Apple and Has Loaded Up on This Industry-Leading Stock for 4 Straight Quarters\", 'id': 136476467, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"The Oracle of Omaha is paring down his No. 1 holding, yet again, in favor of a company that's delivered a nearly 48,000% total return since it went public.\", 'url': 'https://finnhub.io/api/news?id=e8e188c0ad3059e6099a6e54429a1a0668c28439de8808827a8dced673eb4c33'}, {'category': 'company', 'datetime': 1755838802, 'headline': 'IBM head of research on how quantum computing will change businesses', 'id': 136476468, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"IBM's Alessandro Curioni says companies must act now to gain an edge from quantum computing.\", 'url': 'https://finnhub.io/api/news?id=2bc8ddfcbb9c7ee49ef066106ef1d70077e630f55f9e2c01828995feadef7955'}, {'category': 'company', 'datetime': 1755837281, 'headline': 'Apple makes move sure to frustrate loyal customers', 'id': 136476469, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Apple's services division is a huge moneymaker and the company is milking it for all it's worth.\", 'url': 'https://finnhub.io/api/news?id=9099051383c0d494301133812162f480bc17fa1987c0999552108ee8c98e5f96'}, {'category': 'company', 'datetime': 1755830400, 'headline': \"The Visible Alpha AI Monitor Update: What's Next For AI?\", 'id': 136474705, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/2151904577/image_2151904577.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': 'The Visible Alpha AI Monitor aggregates publicly traded US technology companies, providing a comprehensive measure of the current state and projected growth of the core AI industry.', 'url': 'https://finnhub.io/api/news?id=6fefae13e9d9825b6cf0023b8e57db778fe619013fbe6242efa6e859633469e7'}, {'category': 'company', 'datetime': 1755826084, 'headline': 'Meta makes huge cloud computing deal with Google: source', 'id': 136476470, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Meta has made a cloud computing deal with Google worth more than $10 billion over the course of six years, a source close to the transaction told AFP Thursday.Google parent Alphabet's cloud computing business was on pace to bring in $50 billion over the course of the year, the company said in a recent earnings report.\", 'url': 'https://finnhub.io/api/news?id=c16a5b49617a847ebffe2155701fc8c66b73d16b6238a4e45affc5c246c2d67f'}, {'category': 'company', 'datetime': 1755820705, 'headline': 'Trump administration is not eyeing equity in TSMC, Micron, official says', 'id': 136476471, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'WASHINGTON (Reuters) -The Trump administration is considering taking equity stakes in companies getting funds from the 2022 CHIPS Act but has no similar plans for bigger firms boosting U.S. investments, such as TSMC and Micron, a White House official told Reuters. The official confirmed a Wall Street Journal report that the administration does not intend to seek equity stakes in semiconductor companies, such as Micron and TSMC, that plan to step up investment.', 'url': 'https://finnhub.io/api/news?id=d551c06b88c15bfad192c4d46a69b45d12c9af5300867d14d6d4d269e122b1e9'}]\n", + "2025-08-29 02:30:06,375 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "2025-08-29 02:30:39,933 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "2025-08-29 02:30:39,939 [INFO] Executing tool: get_market_news with args: {'category': 'forex'}\n", + "2025-08-29 02:30:39,941 [INFO] Tool get_market_news called for category 'forex'\n", + "2025-08-29 02:30:40,166 [INFO] Tool get_market_news [{'category': 'forex', 'datetime': 1756412432, 'headline': \"Trump official announces 'transitory' taxes for the next six months\", 'id': 7510362, 'image': 'https://images.investinglive.com/images/Tariff%20Trump_id_6a2dc517-dc8d-4e19-84db-f22c99095372_size975.jpg', 'related': '', 'source': 'Forexlive', 'summary': \"

Senior Trump administration official:

  • Package shipments to U.S. to face flat duties of $80–$200 for six months before shifting to specific duty rates

This is in relation to Trump's removal of the 'de minimis' exemption on buying low value products from overseas. US consumers will now be taxed a minimum of $80, and up to $200, for ordering such items from offshore now.

More now, senior Trump administration official:

  • CBP has collected over $492 million in additional duties on packages from China and Hong Kong since de minimis exemption was ended for them
  • Engaged with foreign partners to ensure there is minimal disruption to shipments
  • Britain, Canada, Ukraine have said there will be no interruption in mail coming to U.S
  • There will not be any exceptions to the end of the de minimis exemption.
\\n This article was written by Eamonn Sheridan at investinglive.com.\", 'url': 'https://investinglive.com/news/trump-official-announces-transitory-taxes-for-the-next-six-months-20250828/'}]\n", + "2025-08-29 02:30:56,552 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n" + ] + } + ], "source": [ - "gr.ChatInterface(fn=chat, type=\"messages\").launch()" + "gr.ChatInterface(fn=chat, type=\"messages\", title=\"TickerBot\", description=\"Ask about stock prices, company profiles and market news!\").launch(debug=True)" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef238ae3-353f-462f-a7f7-2378cc482edb", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "09d7f664-7252-4fa0-b817-10dbda83e3f1", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6cd3c913-c486-4d33-8f3d-c110e127fe66", + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "markdown", "id": "473e5b39-da8f-4db1-83ae-dbaca2e9531e", @@ -1172,7 +1347,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.7" + "version": "3.11.13" } }, "nbformat": 4, From a490884a329c005c10469ecb393598581b2b45fc Mon Sep 17 00:00:00 2001 From: Daniel Fernandez Colon Date: Fri, 29 Aug 2025 20:46:55 +0200 Subject: [PATCH 65/72] Added my contribution to week1 day1 exercise --- .../day1-email-subject-implementation.ipynb | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 week1/community-contributions/day1-email-subject-implementation.ipynb diff --git a/week1/community-contributions/day1-email-subject-implementation.ipynb b/week1/community-contributions/day1-email-subject-implementation.ipynb new file mode 100644 index 0000000..e968e7c --- /dev/null +++ b/week1/community-contributions/day1-email-subject-implementation.ipynb @@ -0,0 +1,115 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "4e2a9393-7767-488e-a8bf-27c12dca35bd", + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "\n", + "import os\n", + "from dotenv import load_dotenv\n", + "from openai import OpenAI\n", + "\n", + "# If you get an error running this cell, then please head over to the troubleshooting notebook!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7b87cadb-d513-4303-baee-a37b6f938e4d", + "metadata": {}, + "outputs": [], + "source": [ + "# Load environment variables in a file called .env\n", + "\n", + "load_dotenv(override=True)\n", + "api_key = os.getenv('OPENAI_API_KEY')\n", + "\n", + "# Check the key\n", + "\n", + "if not api_key:\n", + " print(\"No API key was found - please head over to the troubleshooting notebook in this folder to identify & fix!\")\n", + "elif not api_key.startswith(\"sk-proj-\"):\n", + " print(\"An API key was found, but it doesn't start sk-proj-; please check you're using the right key - see troubleshooting notebook\")\n", + "elif api_key.strip() != api_key:\n", + " print(\"An API key was found, but it looks like it might have space or tab characters at the start or end - please remove them - see troubleshooting notebook\")\n", + "else:\n", + " print(\"API key found and looks good so far!\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "019974d9-f3ad-4a8a-b5f9-0a3719aea2d3", + "metadata": {}, + "outputs": [], + "source": [ + "openai = OpenAI()\n", + "\n", + "# If this doesn't work, try Kernel menu >> Restart Kernel and Clear Outputs Of All Cells, then run the cells from the top of this notebook down.\n", + "# If it STILL doesn't work (horrors!) then please see the Troubleshooting notebook in this folder for full instructions" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "00743dac-0e70-45b7-879a-d7293a6f68a6", + "metadata": {}, + "outputs": [], + "source": [ + "# Step 1: Create your prompts\n", + "\n", + "system_prompt = \"Eres un analista acostumbrado a trabajar con correos electrónicos que contiene un gran conocimiento sobre la mejor manera de resumir contenido releveante \\\n", + "dejando de lado cualquier información que no despierte interés o no sea el tema principal del correo. Tu función será leer contenido de correos y definir un listado de las 3 mejores opciones con el formato: Opción *numero de la opción*: *sujeto* Motivo: *que palabras clave dentro del texto has utilizado para llegar a esa conclusion y la relación semántica con tu idea\"\n", + "user_prompt = \"\"\"\n", + "Tengo un correo que le quiero enviar a mi profesor pero no se muy bien como llamarlo, ayudame. El correo es el siguiente:\n", + "Hola profe,\n", + "Ultimamente estoy disfrutando mucho sus clases y la información que presenta me parece muy importante. Este fin de semana me voy de vacaciones y no podré\n", + "ir a sus clases la semana que viene. Me gustaría si pudiera pasarme los pdfs de la siguiente semana para echarle un vistazo por mi cuenta durante mi ausencia en Francia.\n", + "\n", + "Un saludo,\n", + "Daniel.\n", + "\"\"\"\n", + "\n", + "# Step 2: Make the messages list\n", + "\n", + "messages = [{\"role\" : \"system\" , \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}]\n", + "\n", + "# Step 3: Call OpenAI\n", + "\n", + "response = openai.chat.completions.create( \n", + " model = \"gpt-4o-mini\",\n", + " messages = messages)\n", + "\n", + "# Step 4: print the result\n", + "\n", + "print(response.choices[0].message.content)" + ] + } + ], + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 831dab9597ef1d6b204901b1a87c5e4feae203e9 Mon Sep 17 00:00:00 2001 From: Ahsan-Ullah <69212320+TechQaiser@users.noreply.github.com> Date: Fri, 29 Aug 2025 13:23:24 -0700 Subject: [PATCH 66/72] TechQaiser Youtube Video Summarizer. Paste Youtube Link & Get Summary Of Video --- .../youtube_video_summarize.ipynb | 216 ++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100644 week1/community-contributions/youtube_video_summarize.ipynb diff --git a/week1/community-contributions/youtube_video_summarize.ipynb b/week1/community-contributions/youtube_video_summarize.ipynb new file mode 100644 index 0000000..c96714f --- /dev/null +++ b/week1/community-contributions/youtube_video_summarize.ipynb @@ -0,0 +1,216 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 36, + "id": "8ca2e60d-17c0-40fc-91c6-c16915b39c06", + "metadata": {}, + "outputs": [], + "source": [ + "import re, html, json\n", + "import requests\n", + "from urllib.error import HTTPError\n", + "from openai import OpenAI\n", + "from IPython.display import Markdown, display, update_display\n", + "from youtube_transcript_api import YouTubeTranscriptApi, NoTranscriptFound, TranscriptsDisabled, VideoUnavailable\n", + "\n", + "OLLAMA_API = \"http://localhost:11434/api/chat\"\n", + "HEADERS = {\"Content-Type\": \"application/json\"}\n", + "MODEL = \"llama3.2\"\n", + "api_key='ollama'\n", + "\n", + "def yt_title_desc_transcript(url: str, lang=\"en\"):\n", + " \"\"\"\n", + " Returns {\"title\": str|None, \"description\": str|None, \"transcript\": str|None}.\n", + " - Title via oEmbed (no API key).\n", + " - Description scraped from the watch page (shortDescription).\n", + " - Transcript via youtube-transcript-api, gracefully handling 400/disabled.\n", + " \"\"\"\n", + " # --- extract 11-char video id ---\n", + " m = re.search(r\"(?:v=|/)([0-9A-Za-z_-]{11})|^([0-9A-Za-z_-]{11})$\", url)\n", + " vid = (m.group(1) or m.group(2)) if m else None\n", + " if not vid:\n", + " return {\"title\": None, \"description\": None, \"transcript\": None}\n", + "\n", + " # --- title via oEmbed (very robust) ---\n", + " title = None\n", + " try:\n", + " r = requests.get(\"https://www.youtube.com/oembed\",\n", + " params={\"url\": f\"https://www.youtube.com/watch?v={vid}\", \"format\": \"json\"},\n", + " timeout=10)\n", + " if r.ok:\n", + " title = r.json().get(\"title\")\n", + " except Exception:\n", + " pass\n", + "\n", + " # --- description from watch page (shortDescription in initial JSON) ---\n", + " description = None\n", + " try:\n", + " page = requests.get(f\"https://www.youtube.com/watch?v={vid}\", timeout=10).text\n", + " # Look for ytInitialPlayerResponse JSON\n", + " jmatch = re.search(r\"ytInitialPlayerResponse\\s*=\\s*({.*?});\", page, re.DOTALL)\n", + " if jmatch:\n", + " data = json.loads(jmatch.group(1))\n", + " desc = data.get(\"videoDetails\", {}).get(\"shortDescription\")\n", + " if desc:\n", + " description = html.unescape(desc)\n", + " except Exception:\n", + " pass\n", + "\n", + " # --- transcript (handle 400 cleanly) ---\n", + " transcript_text = None\n", + " try:\n", + " items = YouTubeTranscriptApi.get_transcript(vid, languages=[lang])\n", + " transcript_text = \" \".join(ch[\"text\"].strip() for ch in items if ch.get(\"text\"))\n", + " except (NoTranscriptFound, TranscriptsDisabled, VideoUnavailable, HTTPError):\n", + " # HTTPError covers the \"HTTP Error 400: Bad Request\" case\n", + " transcript_text = None\n", + " except Exception:\n", + " transcript_text = None\n", + "\n", + " return {\"title\": title, \"description\": description, \"transcript\": transcript_text}\n" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "ad9be496-4e91-4562-90f3-54d11208da55", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "system_prompt = '''\n", + "You are an assistant that generates detailed yet concise summaries of YouTube videos.\n", + "When the user provides a title and description of a YouTube video, your task is to write a coherent, engaging, and informative summary of around 500 words.\n", + "The summary should:\n", + "\n", + "Capture the main themes and key points the video likely covers.\n", + "\n", + "Expand on the description logically, providing context and flow.\n", + "\n", + "Stay neutral, factual, and clear (no personal opinions).\n", + "\n", + "Be self-contained so it makes sense without needing to watch the video.\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "dd4be0bc-df1f-47e0-9e03-9b734117f80a", + "metadata": {}, + "outputs": [], + "source": [ + "def user_prompt(title, description):\n", + " prompt = '''Provide me the YouTube video title and description.\\n\n", + " I will generate a clear, engaging, and concise summary of the video content in around 500 words,\\n\n", + " highlighting the main ideas, key points, and important details.\\n'''\n", + " prompt += f'here is the title : {title} \\n Description : {description} '\n", + " return prompt" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "46896ad3-db1e-448a-8a03-036b9568c69f", + "metadata": {}, + "outputs": [], + "source": [ + "def stream_youtube(yt_url):\n", + " ollama = OpenAI(base_url='http://localhost:11434/v1', api_key='ollama')\n", + " video_metadata = yt_title_desc_transcript(yt_url)\n", + " stream = ollama.chat.completions.create(\n", + " model=MODEL,\n", + " messages = [\n", + " {\"role\":\"system\", \"content\": system_prompt},\n", + " {\"role\":\"user\", \"content\": user_prompt(video_metadata['title'], video_metadata['description'])}\n", + " ],\n", + " stream=True\n", + " \n", + " )\n", + " response = \"\"\n", + " display_handle = display(Markdown(\"\"), display_id=True)\n", + " for chunk in stream:\n", + " response += chunk.choices[0].delta.content or ''\n", + " response = response.replace(\"```\",\"\").replace(\"markdown\", \"\")\n", + " update_display(Markdown(response), display_id=display_handle.display_id)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "b59f8773-c13e-4050-ad3c-b578d07ef5e7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "Here is a summary of the YouTube video:\n", + "\n", + "**Monta Re: A Baul-Inspired Tribute to the Mystic Guru Shankaracharya**\n", + "\n", + "The music video for \"Monta Re\" by Amit Trivedi, featuring Swanand Kirkire and Amitabh Bhattacharya, is a soulful tribute to the mystic guru Shankaracharya. Set in the Bengali folk music tradition, this song brings to life the ancient tales of Shankaracharya's spiritual journey.\n", + "\n", + "With elegant lyrics penned by Amitabh Bhattacharya, \"Monta Re\" transports listeners to the banks of the Ganges River, where Shankaracharya wandered in search of wisdom and inner peace. The song's haunting melodies and emotive vocals evoke a sense of longing and introspection, perfectly capturing the mystic guru's spiritual essence.\n", + "\n", + "The music video beautifully illustrates the baul-inspired style, with intricate traditional dance movements performed by a group of energetic dancers. The choreography seamlessly blends elements of Bengal's folk heritage with modern sensibilities, making the song an engaging watch for audience members interested in Indian classical music.\n", + "\n", + "**Music and Lyric Credit:**\n", + "Amit Trivedi handles the music composition, ensuring that the melody complements the song's themes without overpowering them. Amitabh Bhattacharya takes credit for the lyrics, which tell stunning stories of Shankaracharya's spiritual adventures. The song features Swanand Kirkire and Amitabh Bhattacharya as vocalists, further enriching its emotional impact.\n", + "\n", + "**Relevance to Bengali Culture:**\n", + "\"Monta Re\" is a heartwarming tribute to Bengal's rich cultural heritage. Inspired by the baul traditions of the region, this song honors Shankaracharya's life and spiritual journey without diminishing his significance in modern times. By showcasing these folk roots, \"Monta Re\" provides fans with an enriching sensory experience.\n", + "\n", + "You can listen to \"Monta Re\" along with other T-Series music videos released by Amit Trivedi at the links provided below:\n", + "\n", + "- Watch \"Ankahee\"\n", + "- Check out \"Sawaar Loon\"\n", + "- Explore \"Zinda Hoon\"\n", + "\n", + "Follow the official T-SERIES YouTube channel for an ever-growing variety of original music tracks!\n", + "\n", + "By embracing the richness of Bengali folk traditions, \"Monta Re\" embodies a musical reflection of Shankaracharya's extraordinary journey as both spiritual guide and symbol of timeless wisdom." + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "stream_youtube('https://youtu.be/99NUJ1cLbBI?list=RDdJ6_aU6auZc')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "649287ca-aff8-4b59-91b7-731c007e83a7", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From f126a5aba0eaa4e4fa943ad4d8baa5cd3c16a990 Mon Sep 17 00:00:00 2001 From: Daniel Fernandez Colon Date: Fri, 29 Aug 2025 22:51:10 +0200 Subject: [PATCH 67/72] week 1 day 2 exercise contribution --- .../day2_exercise_using_input.ipynb | 319 ++++++++++++++++++ 1 file changed, 319 insertions(+) create mode 100644 week1/community-contributions/day2_exercise_using_input.ipynb diff --git a/week1/community-contributions/day2_exercise_using_input.ipynb b/week1/community-contributions/day2_exercise_using_input.ipynb new file mode 100644 index 0000000..f616d96 --- /dev/null +++ b/week1/community-contributions/day2_exercise_using_input.ipynb @@ -0,0 +1,319 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "d15d8294-3328-4e07-ad16-8a03e9bbfdb9", + "metadata": {}, + "source": [ + "# Welcome to your first assignment!\n", + "\n", + "Instructions are below. Please give this a try, and look in the solutions folder if you get stuck (or feel free to ask me!)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4e2a9393-7767-488e-a8bf-27c12dca35bd", + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "\n", + "import requests\n", + "from bs4 import BeautifulSoup\n", + "from IPython.display import Markdown, display" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "29ddd15d-a3c5-4f4e-a678-873f56162724", + "metadata": {}, + "outputs": [], + "source": [ + "# Constants\n", + "\n", + "OLLAMA_API = \"http://localhost:11434/api/chat\"\n", + "HEADERS = {\"Content-Type\": \"application/json\"}\n", + "MODEL = \"llama3.2\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dac0a679-599c-441f-9bf2-ddc73d35b940", + "metadata": {}, + "outputs": [], + "source": [ + "# Create a messages list using the same format that we used for OpenAI\n", + "\n", + "messages = [\n", + " {\"role\": \"user\", \"content\": \"Describe some of the business applications of Generative AI\"}\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7bb9c624-14f0-4945-a719-8ddb64f66f47", + "metadata": {}, + "outputs": [], + "source": [ + "payload = {\n", + " \"model\": MODEL,\n", + " \"messages\": messages,\n", + " \"stream\": False\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7745b9c4-57dc-4867-9180-61fa5db55eb8", + "metadata": {}, + "outputs": [], + "source": [ + "import ollama\n", + "\n", + "response = ollama.chat(model=MODEL, messages=messages)\n", + "print(response['message']['content'])" + ] + }, + { + "cell_type": "markdown", + "id": "a4704e10-f5fb-4c15-a935-f046c06fb13d", + "metadata": {}, + "source": [ + "## Alternative approach - using OpenAI python library to connect to Ollama" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23057e00-b6fc-4678-93a9-6b31cb704bff", + "metadata": {}, + "outputs": [], + "source": [ + "# There's actually an alternative approach that some people might prefer\n", + "# You can use the OpenAI client python library to call Ollama:\n", + "\n", + "from openai import OpenAI\n", + "ollama_via_openai = OpenAI(base_url='http://localhost:11434/v1', api_key='ollama')\n", + "\n", + "response = ollama_via_openai.chat.completions.create(\n", + " model=MODEL,\n", + " messages=messages\n", + ")\n", + "\n", + "print(response.choices[0].message.content)" + ] + }, + { + "cell_type": "markdown", + "id": "1622d9bb-5c68-4d4e-9ca4-b492c751f898", + "metadata": {}, + "source": [ + "# NOW the exercise for you\n", + "\n", + "Take the code from day1 and incorporate it here, to build a website summarizer that uses Llama 3.2 running locally instead of OpenAI; use either of the above approaches." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "0c1f84c4-4cc0-4085-8ea5-871a8ca46a47", + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "\n", + "import ollama" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "890852ab-2cd4-41dc-b168-6bd1360b967a", + "metadata": {}, + "outputs": [], + "source": [ + "MODEL = \"llama3.2\"" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "6de38216-6d1c-48c4-877b-86d403f4e0f8", + "metadata": {}, + "outputs": [], + "source": [ + "# A class to represent a Webpage\n", + "\n", + "# Some websites need you to use proper headers when fetching them:\n", + "headers = {\n", + " \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36\"\n", + "}\n", + "\n", + "class Website:\n", + "\n", + " def __init__(self, url):\n", + " \"\"\"\n", + " Create this Website object from the given url using the BeautifulSoup library\n", + " \"\"\"\n", + " self.url = url\n", + " response = requests.get(url, headers=headers)\n", + " soup = BeautifulSoup(response.content, 'html.parser')\n", + " self.title = soup.title.string if soup.title else \"No title found\"\n", + " for irrelevant in soup.body([\"script\", \"style\", \"img\", \"input\"]):\n", + " irrelevant.decompose()\n", + " self.text = soup.body.get_text(separator=\"\\n\", strip=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "9d398f9a-c66e-42b5-91b4-5417944b8408", + "metadata": {}, + "outputs": [], + "source": [ + "def user_prompt_generator(website) -> str:\n", + " user_prompt = f\"You will act as a website summarizer with knowledge of Web Content Accessibility Guidelines. You will look into the web: {website.title} and \"\n", + " user_prompt += \"break down the relevant information about it in this categories: What is the website about, \\\n", + " to whom the website belongs and what practises should improve to have a better user experience. \\n\\n\"\n", + " user_prompt += website.text\n", + "\n", + " return user_prompt" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "156d7c67-b714-4156-9f69-faf0c50aaf13", + "metadata": {}, + "outputs": [], + "source": [ + "def messages_generator(user_prompt : str) -> list[dict[str, str]]:\n", + " messages = [{\"role\" : \"user\", \"content\" : user_prompt}]\n", + "\n", + " return messages" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "f07c4143-6cc5-4d28-846c-a373564e9264", + "metadata": {}, + "outputs": [], + "source": [ + "def user_request_reader() -> str:\n", + " while True:\n", + " website_url = input(\"Define what website you want to summarize by giving the url: \")\n", + " if website_url.lower().startswith(\"http\"):\n", + " return website_url\n", + " print(\"URL not valid. Please provide a full url.\\n\")" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "94933255-2ca8-40b5-8f74-865d3e781058", + "metadata": {}, + "outputs": [], + "source": [ + "def summarizer_bot():\n", + " website_url = user_request_reader()\n", + " website = Website(website_url)\n", + " \n", + " user_prompt = user_prompt_generator(website)\n", + " messages = messages_generator(user_prompt)\n", + "\n", + " response = ollama.chat(model=MODEL, messages=messages)\n", + " print(response['message']['content'])" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "2d81faa4-25b3-4d5d-8f36-93772e449b5c", + "metadata": {}, + "outputs": [ + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Define what website you want to summarize by giving the url: test.com\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "URL not valid. Please provide a full url.\n", + "\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Define what website you want to summarize by giving the url: https://edwarddonner.com\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "**Summary:**\n", + "\n", + "The website \"Home - Edward Donner\" belongs to Edward Donner, a co-founder and CTO of Nebula.io, an AI startup. The website is about Edward's interests in writing code, experimenting with Large Language Models (LLMs), and DJing, as well as his work in applying AI to help people discover their potential.\n", + "\n", + "**Categories:**\n", + "\n", + "### What is the website about?\n", + "\n", + "The website is primarily about Edward Donner's personal brand, showcasing his expertise in AI and LLMs. It includes information about his work at Nebula.io, which applies AI to talent management. The website also features a \"Connect Four\" arena where LLMs compete against each other, as well as sections for learning more about LLMs and staying up-to-date with Edward's courses and publications.\n", + "\n", + "### To whom does the website belong?\n", + "\n", + "The website belongs to Edward Donner, a co-founder and CTO of Nebula.io. It appears to be a personal website or blog, showcasing his expertise and interests in AI and LLMs.\n", + "\n", + "### Practices to improve for better user experience:\n", + "\n", + "1. **Clearer navigation**: The website's menu is simple but not intuitive. Adding clear categories or sections would help users quickly find the information they're looking for.\n", + "2. **More detailed about section**: The \"About\" section provides a brief overview of Edward's work and interests, but it could be more detailed and comprehensive.\n", + "3. **Improved accessibility**: While the website is likely following general web accessibility guidelines, there are no clear indications of this on the page. Adding alt text to images, providing a clear font size and color scheme, and ensuring sufficient contrast between background and foreground would improve the user experience for people with disabilities.\n", + "4. **Better calls-to-action (CTAs)**: The website could benefit from more prominent CTAs, guiding users towards specific actions such as signing up for courses or following Edward on social media.\n", + "5. **SEO optimization**: The website's content and meta tags appear to be optimized for search engines, but a more thorough SEO analysis would help identify areas for improvement.\n", + "\n", + "Overall, the website provides a clear overview of Edward Donner's interests and expertise in AI and LLMs, but could benefit from some tweaks to improve accessibility, navigation, and CTAs.\n" + ] + } + ], + "source": [ + "# The call\n", + "summarizer_bot()" + ] + } + ], + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From d7cf761930e56a54a0592272795bb61be858988e Mon Sep 17 00:00:00 2001 From: Oluwaseyi-A <62573285+Oluwaseyi-A@users.noreply.github.com> Date: Fri, 29 Aug 2025 18:20:26 -0400 Subject: [PATCH 68/72] Added week 5 challenge to community-contributions --- .../RAG-based-academic-assistant-v3.ipynb | 409 ++++++++++++++++++ 1 file changed, 409 insertions(+) create mode 100644 week5/community-contributions/RAG-based-academic-assistant-v3.ipynb diff --git a/week5/community-contributions/RAG-based-academic-assistant-v3.ipynb b/week5/community-contributions/RAG-based-academic-assistant-v3.ipynb new file mode 100644 index 0000000..7899ff8 --- /dev/null +++ b/week5/community-contributions/RAG-based-academic-assistant-v3.ipynb @@ -0,0 +1,409 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "97a93fee-6bbd-477b-aba8-577d318a9f9d", + "metadata": {}, + "source": [ + "# AI-Powered Academic Knowledge Assistant\n", + "AI-powered RAG (Retrieval-Augmented Generation) system that transforms document collections into queryable knowledge bases using OpenAI embeddings and vector search. Features configurable chunking, file size limits, and retrieval parameters with a Gradio interface for processing PDFs and generating contextually-aware responses via LangChain and ChromaDB." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3589eee0-ce34-42f4-b538-b43f3b0d9f6f", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import glob\n", + "from dotenv import load_dotenv\n", + "import gradio as gr\n", + "import shutil\n", + "import tiktoken\n", + "import time\n", + "import uuid\n", + "from typing import List, Tuple, Optional\n", + "\n", + "# imports for langchain and Chroma\n", + "from langchain.document_loaders import DirectoryLoader, TextLoader, PyPDFLoader\n", + "from langchain.text_splitter import CharacterTextSplitter\n", + "from langchain.schema import Document\n", + "from langchain_openai import OpenAIEmbeddings, ChatOpenAI\n", + "from langchain_chroma import Chroma\n", + "from langchain.memory import ConversationBufferMemory\n", + "from langchain.chains import ConversationalRetrievalChain\n", + "from langchain.embeddings import HuggingFaceEmbeddings\n", + "\n", + "from langchain_community.document_loaders import PyPDFLoader, TextLoader\n", + "from langchain.docstore.document import Document\n", + "\n", + "# Load environment variables\n", + "load_dotenv(override=True)\n", + "os.environ['OPENAI_API_KEY'] = os.getenv('OPENAI_API_KEY', 'your-key-if-not-using-env')\n", + "\n", + "# Global variables to store the current setup\n", + "current_vectorstore = None\n", + "current_conversation_chain = None\n", + "processing_status = \"\"\n", + "\n", + "def count_tokens(text: str, model: str = \"gpt-4o-mini\") -> int:\n", + " \"\"\"Count tokens in text using tiktoken\"\"\"\n", + " try:\n", + " encoding = tiktoken.encoding_for_model(model)\n", + " return len(encoding.encode(text))\n", + " except:\n", + " # Fallback estimation: roughly 4 characters per token\n", + " return len(text) // 4\n", + "\n", + "def filter_chunks_by_tokens(chunks: List[Document], max_total_tokens: int = 250000) -> List[Document]:\n", + " \"\"\"Filter chunks to stay within token limits\"\"\"\n", + " filtered_chunks = []\n", + " total_tokens = 0\n", + " \n", + " for chunk in chunks:\n", + " chunk_tokens = count_tokens(chunk.page_content)\n", + " \n", + " # Skip individual chunks that are too large (shouldn't happen with proper splitting)\n", + " if chunk_tokens > 8000: # Individual chunk limit\n", + " continue\n", + " \n", + " if total_tokens + chunk_tokens <= max_total_tokens:\n", + " filtered_chunks.append(chunk)\n", + " total_tokens += chunk_tokens\n", + " else:\n", + " break\n", + " \n", + " return filtered_chunks\n", + "\n", + "def add_metadata(doc, doc_type, file_path):\n", + " \"\"\"Add metadata including document type and file information\"\"\"\n", + " doc.metadata[\"doc_type\"] = doc_type\n", + " doc.metadata[\"file_path\"] = file_path\n", + " doc.metadata[\"file_name\"] = os.path.basename(file_path)\n", + " return doc\n", + "\n", + "def check_file_size(file_path, max_size_bytes):\n", + " \"\"\"Check if file size is within the limit\"\"\"\n", + " try:\n", + " file_size = os.path.getsize(file_path)\n", + " return file_size <= max_size_bytes, file_size\n", + " except OSError:\n", + " return False, 0\n", + "\n", + "def load_pdfs_with_size_limit(folder_path, doc_type, max_size_bytes):\n", + " \"\"\"Load PDF files from a folder with size restrictions\"\"\"\n", + " pdf_files = glob.glob(os.path.join(folder_path, \"**/*.pdf\"), recursive=True)\n", + " loaded_docs = []\n", + " skipped_files = []\n", + " \n", + " for pdf_file in pdf_files:\n", + " is_valid_size, file_size = check_file_size(pdf_file, max_size_bytes)\n", + " \n", + " if is_valid_size:\n", + " try:\n", + " loader = PyPDFLoader(pdf_file)\n", + " docs = loader.load()\n", + " docs_with_metadata = [add_metadata(doc, doc_type, pdf_file) for doc in docs]\n", + " loaded_docs.extend(docs_with_metadata)\n", + " except Exception as e:\n", + " skipped_files.append((pdf_file, f\"Loading error: {str(e)}\"))\n", + " else:\n", + " file_size_mb = file_size / 1024 / 1024\n", + " skipped_files.append((pdf_file, f\"File too large: {file_size_mb:.2f} MB\"))\n", + " \n", + " return loaded_docs, skipped_files\n", + "\n", + "def process_documents(knowledge_base_dir: str, max_file_size_mb: float, chunk_size: int, chunk_overlap: int) -> Tuple[str, str]:\n", + " \"\"\"Process documents and create vector store\"\"\"\n", + " global current_vectorstore, current_conversation_chain\n", + " \n", + " try:\n", + " # Validate directory\n", + " if not knowledge_base_dir or not knowledge_base_dir.strip():\n", + " return \"❌ Error: Please enter a directory path!\", \"\"\n", + " \n", + " directory_path = knowledge_base_dir.strip()\n", + " \n", + " if not os.path.exists(directory_path):\n", + " return \"❌ Error: Directory does not exist! Please check the path.\", \"\"\n", + " \n", + " # Configuration\n", + " MAX_FILE_SIZE_BYTES = int(max_file_size_mb * 1024 * 1024)\n", + " \n", + " # Find folders\n", + " if directory_path.endswith('*'):\n", + " folders = glob.glob(directory_path)\n", + " else:\n", + " folders = glob.glob(os.path.join(directory_path, \"*\"))\n", + " \n", + " if not folders:\n", + " return \"❌ Error: No folders found in the specified directory!\", \"\"\n", + " \n", + " # Process documents\n", + " documents = []\n", + " all_skipped_files = []\n", + " status_lines = []\n", + " \n", + " status_lines.append(f\"🔍 Processing folders with {max_file_size_mb} MB file size limit...\")\n", + " status_lines.append(\"-\" * 60)\n", + " \n", + " for folder in folders:\n", + " if os.path.isdir(folder):\n", + " doc_type = os.path.basename(folder)\n", + " status_lines.append(f\"📁 Processing folder: {doc_type}\")\n", + " \n", + " folder_docs, skipped_files = load_pdfs_with_size_limit(folder, doc_type, MAX_FILE_SIZE_BYTES)\n", + " documents.extend(folder_docs)\n", + " all_skipped_files.extend(skipped_files)\n", + " \n", + " if folder_docs:\n", + " status_lines.append(f\" ✅ Loaded {len(folder_docs)} document pages\")\n", + " if skipped_files:\n", + " status_lines.append(f\" ⚠️ Skipped {len(skipped_files)} files\")\n", + " \n", + " if not documents:\n", + " error_msg = \"❌ No PDF documents were loaded successfully.\"\n", + " if all_skipped_files:\n", + " error_msg += f\"\\n\\nAll {len(all_skipped_files)} files were skipped:\"\n", + " for file_path, reason in all_skipped_files[:10]: # Show first 10\n", + " error_msg += f\"\\n • {os.path.basename(file_path)}: {reason}\"\n", + " if len(all_skipped_files) > 10:\n", + " error_msg += f\"\\n ... and {len(all_skipped_files) - 10} more\"\n", + " return error_msg, \"\"\n", + " \n", + " # Text splitting\n", + " status_lines.append(\"\\n\" + \"=\"*40)\n", + " status_lines.append(\"✂️ TEXT SPLITTING\")\n", + " status_lines.append(\"=\"*40)\n", + " \n", + " text_splitter = CharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=chunk_overlap)\n", + " chunks = text_splitter.split_documents(documents)\n", + " \n", + " # Filter chunks by token count to prevent API errors\n", + " status_lines.append(\"🔢 Checking token limits...\")\n", + " original_chunk_count = len(chunks)\n", + " chunks = filter_chunks_by_tokens(chunks, max_total_tokens=250000)\n", + " \n", + " if len(chunks) < original_chunk_count:\n", + " status_lines.append(f\"⚠️ Filtered from {original_chunk_count} to {len(chunks)} chunks to stay within token limits\")\n", + " \n", + " # Create vectorstore\n", + " status_lines.append(\"🧮 Creating vector embeddings...\")\n", + " embeddings = OpenAIEmbeddings()\n", + " \n", + " # Use a temporary database name\n", + " db_name = \"temp_vector_db\"\n", + " \n", + " # Delete if already exists\n", + " if os.path.exists(db_name):\n", + " shutil.rmtree(db_name)\n", + " \n", + " # Create vectorstore\n", + " vectorstore = Chroma.from_documents(\n", + " documents=chunks, \n", + " embedding=embeddings, \n", + " persist_directory=db_name\n", + " )\n", + " \n", + " # Update global variables\n", + " current_vectorstore = vectorstore\n", + " \n", + " # Create conversation chain\n", + " llm = ChatOpenAI(temperature=0.7, model_name=\"gpt-4o-mini\")\n", + " memory = ConversationBufferMemory(memory_key='chat_history', return_messages=True)\n", + " retriever = vectorstore.as_retriever(search_kwargs={\"k\": 25})\n", + " current_conversation_chain = ConversationalRetrievalChain.from_llm(\n", + " llm=llm, \n", + " retriever=retriever, \n", + " memory=memory\n", + " )\n", + " \n", + " # Summary statistics\n", + " status_lines.append(\"\\n\" + \"=\"*40)\n", + " status_lines.append(\"📊 SUMMARY\")\n", + " status_lines.append(\"=\"*40)\n", + " status_lines.append(f\"✅ Total PDFs processed: {len(set(doc.metadata['file_path'] for doc in documents))}\")\n", + " status_lines.append(f\"📄 Total document pages: {len(documents)}\")\n", + " status_lines.append(f\"🧩 Total text chunks: {len(chunks)}\")\n", + " status_lines.append(f\"📁 Document types: {', '.join(set(doc.metadata['doc_type'] for doc in documents))}\")\n", + " status_lines.append(f\"🗃️ Vector store size: {vectorstore._collection.count()} embeddings\")\n", + " \n", + " if all_skipped_files:\n", + " status_lines.append(f\"\\n⚠️ Skipped files: {len(all_skipped_files)}\")\n", + " for file_path, reason in all_skipped_files[:5]: # Show first 5\n", + " status_lines.append(f\" • {os.path.basename(file_path)}: {reason}\")\n", + " if len(all_skipped_files) > 5:\n", + " status_lines.append(f\" ... and {len(all_skipped_files) - 5} more\")\n", + " \n", + " success_msg = \"✅ Knowledge base successfully created and ready for questions!\"\n", + " detailed_status = \"\\n\".join(status_lines)\n", + " \n", + " return success_msg, detailed_status\n", + " \n", + " except Exception as e:\n", + " error_msg = f\"❌ Error processing documents: {str(e)}\"\n", + " return error_msg, \"\"\n", + "\n", + "def chat_with_documents(message, history, num_chunks):\n", + " \"\"\"Chat with the processed documents\"\"\"\n", + " global current_conversation_chain, current_vectorstore\n", + " \n", + " if current_conversation_chain is None:\n", + " return \"❌ Please process documents first before asking questions!\"\n", + " \n", + " try:\n", + " # Update retriever with new chunk count\n", + " if current_vectorstore is not None:\n", + " retriever = current_vectorstore.as_retriever(search_kwargs={\"k\": num_chunks})\n", + " current_conversation_chain.retriever = retriever\n", + " \n", + " result = current_conversation_chain.invoke({\"question\": message})\n", + " return result[\"answer\"]\n", + " \n", + " except Exception as e:\n", + " return f\"❌ Error generating response: {str(e)}\"\n", + "\n", + "def reset_conversation():\n", + " \"\"\"Reset the conversation memory\"\"\"\n", + " global current_conversation_chain\n", + " if current_conversation_chain is not None:\n", + " current_conversation_chain.memory.clear()\n", + " return \"✅ Conversation history cleared!\"\n", + " return \"No active conversation to reset.\"\n", + "\n", + "# Create Gradio Interface\n", + "with gr.Blocks(title=\"AI-Powered Academic Knowledge Assistant\", theme=gr.themes.Soft()) as app:\n", + " gr.Markdown(\"# 🎓 AI-Powered Academic Knowledge Assistant\")\n", + " gr.Markdown(\"Transform your entire document library into an intelligent, searchable AI tutor that answers questions instantly.\")\n", + " \n", + " with gr.Tabs():\n", + " # Configuration Tab\n", + " with gr.Tab(\"⚙️ Configuration\"):\n", + " gr.Markdown(\"### 📁 Document Processing Settings\")\n", + " \n", + " gr.Markdown(\"💡 **Tip:** Copy and paste your folder path here. On mobile, you can use file manager apps to copy folder paths.\")\n", + " \n", + " with gr.Row():\n", + " with gr.Column():\n", + " knowledge_dir = gr.Textbox(\n", + " label=\"Knowledge Base Directory\",\n", + " value=r\"C:\\Users\\Documents\\Syllabi\\Georgia Tech\\Spring 22\\Microwave Design\",\n", + " placeholder=\"Enter or paste your document directory path\",\n", + " lines=1\n", + " )\n", + " \n", + " max_file_size = gr.Slider(\n", + " label=\"Max File Size (MB)\",\n", + " minimum=0.5,\n", + " maximum=50,\n", + " value=4,\n", + " step=0.5\n", + " )\n", + " \n", + " with gr.Column():\n", + " chunk_size = gr.Slider(\n", + " label=\"Chunk Size (characters)\",\n", + " minimum=200,\n", + " maximum=1500,\n", + " value=800,\n", + " step=100,\n", + " info=\"Smaller chunks = better token management\"\n", + " )\n", + " \n", + " chunk_overlap = gr.Slider(\n", + " label=\"Chunk Overlap (characters)\",\n", + " minimum=0,\n", + " maximum=300,\n", + " value=150,\n", + " step=25,\n", + " info=\"Overlap preserves context between chunks\"\n", + " )\n", + " \n", + " process_btn = gr.Button(\"🚀 Process Documents\", variant=\"primary\", size=\"lg\")\n", + " \n", + " with gr.Row():\n", + " status_output = gr.Textbox(\n", + " label=\"Status\",\n", + " lines=2,\n", + " max_lines=2\n", + " )\n", + " \n", + " detailed_output = gr.Textbox(\n", + " label=\"Detailed Processing Log\",\n", + " lines=15,\n", + " max_lines=20\n", + " )\n", + " \n", + " # Chat Tab\n", + " with gr.Tab(\"💬 Chat\"):\n", + " gr.Markdown(\"### 🤖 Ask Questions About Your Documents\")\n", + " \n", + " with gr.Row():\n", + " with gr.Column(scale=1):\n", + " num_chunks = gr.Slider(\n", + " label=\"Number of chunks to retrieve\",\n", + " minimum=1,\n", + " maximum=50,\n", + " value=25,\n", + " step=1\n", + " )\n", + " \n", + " reset_btn = gr.Button(\"🗑️ Clear Chat History\", variant=\"secondary\")\n", + " reset_output = gr.Textbox(label=\"Reset Status\", lines=1)\n", + " \n", + " with gr.Column(scale=3):\n", + " chatbot = gr.ChatInterface(\n", + " fn=lambda msg, history: chat_with_documents(msg, history, num_chunks.value),\n", + " type=\"messages\",\n", + " title=\"Academic Assistant Chat\",\n", + " description=\"Ask questions about your processed documents\"\n", + " )\n", + " \n", + " # Event handlers\n", + " process_btn.click(\n", + " fn=process_documents,\n", + " inputs=[knowledge_dir, max_file_size, chunk_size, chunk_overlap],\n", + " outputs=[status_output, detailed_output]\n", + " )\n", + " \n", + " reset_btn.click(\n", + " fn=reset_conversation,\n", + " outputs=reset_output\n", + " )\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9eb807e0-194b-48dd-a1e9-b1b9b8a99620", + "metadata": {}, + "outputs": [], + "source": [ + "app.launch(share=True, 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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 21fe2d9e2b13e6828f25626b33688ab613660fe0 Mon Sep 17 00:00:00 2001 From: Kartik Date: Sat, 30 Aug 2025 15:19:50 +0530 Subject: [PATCH 69/72] working with couple more tools --- week2/stock-api-day5.ipynb | 1013 ++++++++++++++---------------------- 1 file changed, 395 insertions(+), 618 deletions(-) diff --git a/week2/stock-api-day5.ipynb b/week2/stock-api-day5.ipynb index aadb3b9..8848482 100644 --- a/week2/stock-api-day5.ipynb +++ b/week2/stock-api-day5.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 170, "id": "b7bd1bd7-19d9-4c4b-bc4b-9bc9cca8bd0f", "metadata": {}, "outputs": [ @@ -33,7 +33,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 171, "id": "8b50bbe2-c0b1-49c3-9a5c-1ba7efa2bcb4", "metadata": {}, "outputs": [], @@ -52,7 +52,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 172, "id": "ba0ddc1a-c775-4ed3-9531-ed0c5799e87f", "metadata": {}, "outputs": [ @@ -60,7 +60,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-08-29 02:28:59,653 [INFO] Logger initialized!\n" + "2025-08-30 15:05:58,159 [INFO] Logger initialized!\n" ] } ], @@ -80,7 +80,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 173, "id": "747e8786-9da8-4342-b6c9-f5f69c2e22ae", "metadata": {}, "outputs": [ @@ -88,8 +88,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-08-29 02:28:59,657 [INFO] OpenAI API Key exists and begins sk-proj-\n", - "2025-08-29 02:28:59,657 [INFO] FINNHUB_API_KEY exists!\n" + "2025-08-30 15:05:58,164 [INFO] OpenAI API Key exists and begins sk-proj-\n", + "2025-08-30 15:05:58,164 [INFO] FINNHUB_API_KEY exists!\n" ] } ], @@ -111,51 +111,100 @@ "else:\n", " logger.error(\"OpenAI API Key not set\")\n", " \n", - "MODEL = \"gpt-5-mini\"\n", + "MODEL = \"gpt-4.1-mini\" # not using gpt-5-mini as openai doesn't let you stream responses till you are a verified organisation :(\n", "openai = OpenAI()\n", "finnhub_client = finnhub.Client(api_key=FINNHUB_API_KEY)" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 174, "id": "ee3aaa9a-5495-42fd-a382-803fbfa92eaf", "metadata": {}, "outputs": [], "source": [ - "system_message = f\"\"\"\n", - "You are called \"TickerBot\", You are a helpful stock information assistant specializing in US stocks. You provide factual, educational information without investment advice. You have access to tools for:\n", - "- Stock symbol lookup\n", - "- Real-time quotes\n", - "- Company Financials\n", - "- Company News\n", - "- Market overview\n", + "system_message = f\"\"\"\n", + "You are \"TickerBot\" — a concise, factual, educational assistant specializing in U.S. stocks. \n", + "Your job: quickly and accurately explain stock and company information in plain English. NEVER give investment advice, buy/sell recommendations, or price predictions.\n", "\n", - "### **Core Principles**\n", - "**Educational Focus**: Explain financial metrics clearly and keep an educational tone.\n", - "**Factual**: NEVER give buy/sell advice or predictions.\n", - "**Accurate always**: If no data is available, inform the user in a friendly way. Always be accurate. If you don't know the answer, simply say so. Do not make up your own stock details information.\n", + "## PRIVACY ABOUT IMPLEMENTATION\n", + "- Do not reveal any internal implementation details to users. Never display or mention internal tool names, API names, developer notes, configured flags, date-range limits, or other system/developer constraints in user-facing replies.\n", + "- All runtime/tool constraints and capability detection are internal. Present only user-facing capabilities in plain language.\n", "\n", - "### **How to Handle Different Requests**\n", - "- For all temporal reasoning in this chat you can use `get_current_time()` tool to get time and then relative to current time you can proceed.\n", - "- When users mention companies, search for symbols with the tool `search_symbol()` else proceed directly if obvious match\n", - "- Try to search for news or data for only for a maximum of 1 month time range, else it becomes a lot of data to parse. If user asks for recent news just check the last 5 days from today; For example if today is 10-06-2025, use from=\"2025-06-05\", to=\"2025-06-10\"\n", + "## USER-FACING CAPABILITIES\n", + "- When asked \"What can you do?\", list only stock-relevant actions in plain language. Example reply:\n", + " \"I can look up tickers, show the latest quotes, provide key company financials and latest earnings details, summarize recent company or market headlines, and give a brief market overview.\"\n", + "- Do not list internal utilities or developer tools as user-facing capabilities.\n", "\n", - "**Market Overview Requests**:\n", - "- \"What's happening in the market?\" → Use `get_market_overview(\"general\")`\n", - "- Summarize all news stories with very brief analysis\n", + "## GENERAL PRINCIPLES\n", + "- Answer only what was asked for. \n", + "- Be brief, clear, and professional while still maintaining a warm tone. Use short paragraphs and one-line bullet explanations when requested.\n", + "- Return only what the system provides; do not invent, infer, or extrapolate unavailable data.\n", + "- Never offer or advertise any feature the environment does not actually support. Avoid offering attachments, direct downloads, or full-text article retrieval unless the system explicitly provides those outputs.\n", "\n", - "### **Error Handling**\n", - "- If symbol search fails: \"I couldn't find that company in US markets. Could you try a different name or provide the ticker symbol?\"\n", - "- If some information gathered from the tool call says unavailable or error do not present it to the user unless they had specifically asked for it. Present rest of the gathered information if any.\n", - "- If data is unavailable: \"Some data isn't available right now, but here's what I found...\"\n", - "- Stay helpful and suggest alternatives\n", - "\"\"\"" + "## Behavior Rules\n", + "- Stay professional and neutral at all times. \n", + "- Clarify only when user intent is ambiguous; never guess. \n", + "- Only disclose information the user explicitly requested. \n", + "- Never explain system limits (e.g., API ranges, date limits) ever. \n", + "- Summaries should be tight and relevant, not verbose. \n", + "\n", + "## NEWS & HEADLINES\n", + "- When interpreting date-related or temporal reasoning requests (e.g., “latest earnings,” “recent news,” “Q1 results”) Call `get_current_time` to determine the current date.\n", + "- Present news/headlines in concise bullet lines when requested. Default recent-window behavior is internal; do not describe or expose internal default windows or limits to the user.\n", + "- If the system only returns headlines/summaries, present those and do not offer to fetch full-text or additional ranges unless the user explicitly asks and the environment supports that action.\n", + "\n", + "## FOLLOW-UP & CLARIFYING QUESTIONS\n", + "- If no matching stock symbol is found, ask the user to clarify the name or ticker. Mention you only support U.S. stocks. If they confirm the symbol but no data exists, state that no results were found.\n", + "- Never append unsolicited menus, multi-choice lists, or repeated \"Would you like...\" prompts at the end of a normal reply.\n", + "- Ask a single direct clarifying question only when strictly necessary to fulfill the user's request (for example: ambiguous company name or missing ticker). That single question must be the final line of the reply.\n", + "- If the user's intent is clear, proceed and return results. Do not request confirmations or offer options unless required to complete the task.\n", + "\n", + "## MISSING-DATA / NOTE RULES\n", + "- Do NOT call out missing/unavailable single fields unless:\n", + " 1) the missing field was explicitly requested by the user; OR\n", + " 2) multiple (>1) key metrics required to answer the user's request are unavailable and their absence materially prevents a useful answer.\n", + "- If condition (1) or (2) applies, include at most one concise \"Note:\" line naming the specific missing field(s) and nothing else.\n", + "- Otherwise omit any comment about single, non-central missing fields.\n", + "\n", + "## ERROR HANDLING\n", + "- If a company/ticker cannot be found: \"I couldn't find that company on U.S. exchanges. Please provide the ticker or a clearer company name.\"\n", + "- If partial results are returned: present available data and at most one short note: \"Some data wasn't available: , .\"\n", + "- If you do not know the answer, say plainly: \"I don't have that information.\"\n", + "\n", + "## ADVICE / DISCLAIMER (CONDITIONAL)\n", + "- Do NOT include an investment-advice disclaimer in normal greetings or factual replies.\n", + "- Show a single-line disclaimer only when the user explicitly asks for recommendations/advice or uses clear advice-seeking language (e.g., \"should I buy\", \"recommend\", \"what should I do\", \"financial advice\").\n", + "- Disclaimer text when triggered: \"I can't provide investment advice or buy/sell recommendations. I can provide facts and explain metrics.\"\n", + "\n", + "EXAMPLES (templates — follow exactly)\n", + "\n", + "1) Clear factual request (no unsolicited follow-up)\n", + "User: \"What's AAPL last trade?\"\n", + "Assistant:\n", + "Last trade timestamp: 2025-08-28 20:00:00 UTC (U.S. market close — 4:00 PM ET)\n", + "\n", + "(—end: no menu, no offers—)\n", + "\n", + "2) Ambiguous request — single clarifying question only\n", + "User: \"Show me Apple\"\n", + "Assistant:\n", + "I found two matches. Do you mean Apple Inc. (AAPL) or Apple Hospitality REIT (APLE)?\n", + "\n", + "(—end: single question final line—)\n", + "\n", + "3) News returned as headlines only (do not offer unsupported fetches)\n", + "User: \"Recent NVDA news\"\n", + "Assistant:\n", + "- 2025-08-28: Headline A — short summary.\n", + "- 2025-08-26: Headline B — short summary.\n", + "(—end: do not offer full-article fetch or extended-range offers unless explicitly requested and supported—)\n", + "\"\"\"\n" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 175, "id": "fdf1a2b0-07be-47a0-9ce3-14d21b48c8f2", "metadata": {}, "outputs": [], @@ -177,7 +226,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 176, "id": "12d912fc-91fb-469e-9572-2876a099f5aa", "metadata": {}, "outputs": [], @@ -196,7 +245,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 177, "id": "61a2a15d-b559-4844-b377-6bd5cb4949f6", "metadata": {}, "outputs": [], @@ -238,7 +287,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 178, "id": "173010e3-dfef-4611-8b68-d11256bd5fba", "metadata": {}, "outputs": [], @@ -265,7 +314,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 179, "id": "448bb4ce-8e86-4ceb-ab52-96bddfd33337", "metadata": {}, "outputs": [], @@ -323,7 +372,6 @@ "\n", " # --- API Call ---\n", " financials_resp = finnhub_client.company_basic_financials(symbol, \"all\")\n", - " logger.info(f\"Tool company_basic_financials {financials_resp}\")\n", "\n", " # Finnhub places primary values under \"metric\"\n", " metrics = financials_resp.get(\"metric\", {})\n", @@ -339,7 +387,6 @@ " \"Enterprise Value\": _format_big_number_from_millions(metrics.get(\"enterpriseValue\")),\n", " \"P/E Ratio (TTM)\": _safe_metric(metrics, \"peBasicExclExtraTTM\"),\n", " \"Forward P/E\": _safe_metric(metrics, \"forwardPE\"),\n", - " \"Revenue (TTM)\": _format_big_number_from_millions(metrics.get(\"revenueTTM\")),\n", " \"Gross Margin (TTM)\": _safe_metric(metrics, \"grossMarginTTM\"),\n", " \"Net Profit Margin (TTM)\": _safe_metric(metrics, \"netProfitMarginTTM\"),\n", " \"EPS (TTM)\": _safe_metric(metrics, \"epsTTM\"),\n", @@ -362,7 +409,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 180, "id": "9df7b74e-fec8-4e75-92a9-31acc75e6e97", "metadata": {}, "outputs": [], @@ -390,7 +437,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 181, "id": "cfeeb200-3f30-4855-82b9-cc8b2a950f80", "metadata": {}, "outputs": [], @@ -407,7 +454,6 @@ " \n", " symbol = symbol.strip().upper()\n", " data = finnhub_client.quote(symbol)\n", - " logger.info(f\"Tool get_stock_quote {data}\")\n", "\n", " if not data or \"c\" not in data:\n", " return {\"success\": False, \"error\": \"No quote data found\"}\n", @@ -437,7 +483,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 182, "id": "3724d92a-4515-4267-af6f-2c1ec2b6ed36", "metadata": {}, "outputs": [], @@ -462,14 +508,14 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 183, "id": "62f5d477-6626-428f-b8eb-d763e736ef5b", "metadata": {}, "outputs": [], "source": [ "def get_company_news(symbol: str, _from: str, to: str):\n", " \"\"\"\n", - " Fetch the top 5 latest company news for a stock symbol within a date range.\n", + " Fetch the top latest company news for a stock symbol within a date range.\n", " - Ensures the range does not exceed ~1 months (35 days).\n", " - Best practice: Keep searches to a month or less to avoid too much data.\n", "\n", @@ -501,7 +547,6 @@ " # Fetch data\n", " try:\n", " news = finnhub_client.company_news(symbol, _from=_from, to=to)\n", - " logger.info(f\"Tool get_company_news {news}\")\n", " except Exception as e:\n", " return {\"success\": False, \"error\": str(e)}\n", "\n", @@ -528,14 +573,14 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 184, "id": "5150ecb6-e3f1-46dc-94fa-2a9abe5165f6", "metadata": {}, "outputs": [], "source": [ "get_company_news_function = {\n", " \"name\": \"get_company_news\",\n", - " \"description\": \"Fetch the top 5 most recent company news articles for a given stock symbol. ⚠️ Avoid querying more than a 1-month range at a time as it may return too much data. Only tells news about company within last 1 year. An error is returned if the requested time range exceeds 1 month.\",\n", + " \"description\": \"Fetch the top most recent company news articles for a given stock symbol. ⚠️ Avoid querying more than a 1-month range at a time as it may return too much data. Only tells news about company within last 1 year. An error is returned if the requested time range exceeds 1 month.\",\n", " \"parameters\": {\n", " \"type\": \"object\",\n", " \"properties\": {\n", @@ -565,7 +610,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 185, "id": "26dd7375-626f-4235-b4a2-f1926f62cc5e", "metadata": {}, "outputs": [], @@ -573,7 +618,6 @@ "def get_market_news(category: str = \"general\"):\n", " \"\"\"\n", " Fetch the latest market news for a given category.\n", - " - Returns only the top 7 articles.\n", "\n", " Args:\n", " category (str): News category. One of [\"general\", \"forex\", \"crypto\", \"merger\"].\n", @@ -585,8 +629,8 @@ "\n", " try:\n", " news = finnhub_client.general_news(category)\n", - " logger.info(f\"Tool get_market_news {news}\")\n", " except Exception as e:\n", + " logger.error(f\"Tool get_market_news API call failed!\")\n", " return {\"success\": False, \"error\": str(e)}\n", "\n", " # Do not want to report just the latest news in the time period\n", @@ -605,7 +649,6 @@ " \"summary\": article.get(\"summary\"),\n", " \"source\": article.get(\"source\"),\n", " \"category\": article.get(\"category\"),\n", - " \"published_at\": datetime.utcfromtimestamp(article[\"datetime\"]).strftime(\"%Y-%m-%d %H:%M:%S UTC\"),\n", " \"related\": article.get(\"related\")\n", " })\n", "\n", @@ -614,7 +657,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 186, "id": "5bd1aa28-119c-4c7a-bdc0-161a582ab1cc", "metadata": {}, "outputs": [], @@ -639,19 +682,135 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 187, + "id": "fbe8ef6c-2d88-43a2-94dc-70b507fe9cd2", + "metadata": {}, + "outputs": [], + "source": [ + "def get_earnings_calendar(symbol: str = \"\", _from: str = \"\", to: str = \"\"):\n", + " \"\"\"\n", + " Fetch LATEST earnings calendar data for a stock symbol within a date range.\n", + " - End date must be within the last month. (Free tier only allows last 1 month data)\n", + " - Shows historical and upcoming earnings releases with EPS and revenue data.\n", + " Args:\n", + " symbol (str): Stock ticker (e.g., \"AAPL\"). Leave empty for all companies.\n", + " _from (str): Start date in YYYY-MM-DD format.\n", + " to (str): End date in YYYY-MM-DD format.\n", + " Returns:\n", + " list or dict: Cleaned earnings calendar data or error message.\n", + " \"\"\"\n", + " logger.info(f\"Tool get_earnings_calendar called for {symbol or 'all symbols'} from {_from} to {to}\")\n", + " \n", + " # Validate date format if provided\n", + " if _from or to:\n", + " try:\n", + " start_date = datetime.strptime(_from, \"%Y-%m-%d\") if _from else None\n", + " end_date = datetime.strptime(to, \"%Y-%m-%d\") if to else None\n", + " \n", + " # Check date range if both dates provided\n", + " # Check if end_date is within 1 month (≈30 days) of today\n", + " if end_date:\n", + " today = datetime.utcnow()\n", + " if (today - end_date).days > 30:\n", + " return {\n", + " \"success\": False,\n", + " \"error\": \"End date must be within the last month.\"\n", + " }\n", + " except ValueError:\n", + " return {\"success\": False, \"error\": \"Invalid date format. Use YYYY-MM-DD.\"}\n", + " \n", + " # Fetch earnings calendar data\n", + " try:\n", + " earnings_data = finnhub_client.earnings_calendar(_from=_from, to=to, symbol=symbol, international=False)\n", + " except Exception as e:\n", + " logger.error(f\"Error fetching earnings calendar: {e}\")\n", + " return {\"success\": False, \"error\": str(e)}\n", + " \n", + " # Check if data exists\n", + " if not earnings_data or \"earningsCalendar\" not in earnings_data:\n", + " return {\"success\": False, \"error\": \"No earnings data available for the specified criteria.\"}\n", + " \n", + " earnings_list = earnings_data[\"earningsCalendar\"]\n", + " \n", + " if not earnings_list:\n", + " return {\"success\": True, \"earnings\": [], \"message\": \"No earnings releases found for the specified period.\"}\n", + " \n", + " # Clean & transform earnings data\n", + " cleaned_earnings = []\n", + " for earning in earnings_list:\n", + " # Format hour description\n", + " hour_map = {\n", + " \"bmo\": \"Before Market Open\",\n", + " \"amc\": \"After Market Close\", \n", + " \"dmh\": \"During Market Hours\"\n", + " }\n", + " \n", + " cleaned_earnings.append({\n", + " \"symbol\": earning.get(\"symbol\"),\n", + " \"date\": earning.get(\"date\"),\n", + " \"quarter\": f\"Q{earning.get('quarter')} {earning.get('year')}\",\n", + " \"announcement_time\": hour_map.get(earning.get(\"hour\", \"\"), earning.get(\"hour\", \"Unknown\")),\n", + " \"eps_actual\": earning.get(\"epsActual\"),\n", + " \"eps_estimate\": earning.get(\"epsEstimate\"),\n", + " \"revenue_actual\": earning.get(\"revenueActual\"),\n", + " \"revenue_estimate\": earning.get(\"revenueEstimate\")\n", + " })\n", + " \n", + " return {\"success\": True, \"earnings\": cleaned_earnings}" + ] + }, + { + "cell_type": "code", + "execution_count": 188, + "id": "9eaeae75-d68f-4160-a26e-c13e40cf756b", + "metadata": {}, + "outputs": [], + "source": [ + "get_earnings_calendar_function = {\n", + " \"name\": \"get_earnings_calendar\",\n", + " \"description\": \"Fetch latest earnings calendar showing historical and upcoming earnings releases for companies. Shows EPS and revenue estimates vs actuals. End date must be within the last month.\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"symbol\": {\n", + " \"type\": \"string\",\n", + " \"description\": \"Stock ticker symbol, e.g., 'AAPL'. Leave empty to get earnings for all companies in the date range.\"\n", + " },\n", + " \"_from\": {\n", + " \"type\": \"string\", \n", + " \"description\": \"Start date in YYYY-MM-DD format. Ensure it is not more than 1 year ago from today. Ensure it is before or equal to the date in to.\"\n", + " },\n", + " \"to\": {\n", + " \"type\": \"string\",\n", + " \"description\": \"End date in YYYY-MM-DD format. Ensure it is not more than 1 year ago. Ensure it is after or equal to the date in from. To date must be within the last month.\"\n", + " }\n", + " },\n", + " \"required\": [\n", + " \"_from\",\n", + " \"to\"\n", + " ]\n", + " }\n", + "}\n", + "\n", + "get_earnings_calendar_tool = {\"type\": \"function\", \"function\": get_earnings_calendar_function}" + ] + }, + { + "cell_type": "code", + "execution_count": 189, "id": "bdca8679-935f-4e7f-97e6-e71a4d4f228c", "metadata": {}, "outputs": [], "source": [ "# List of tools:\n", - "tools = [search_symbol_tool, get_company_financials_tool, get_stock_quote_tool, get_company_news_tool, get_market_news_tool, get_current_time_tool]\n", + "tools = [search_symbol_tool, get_company_financials_tool, get_stock_quote_tool, get_company_news_tool, get_market_news_tool, get_current_time_tool, get_earnings_calendar_tool]\n", "tool_functions = {\n", " \"search_symbol\": search_symbol,\n", " \"get_company_financials\": get_company_financials,\n", " \"get_stock_quote\": get_stock_quote,\n", " \"get_company_news\": get_company_news,\n", " \"get_market_news\": get_market_news,\n", + " \"get_earnings_calendar\": get_earnings_calendar,\n", " \"get_current_time\": get_current_time\n", "}" ] @@ -672,7 +831,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 190, "id": "86f76f57-76c4-4dc7-94a8-cfe7816a39f1", "metadata": {}, "outputs": [], @@ -702,7 +861,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 191, "id": "ce9b0744-9c78-408d-b9df-9f6fd9ed78cf", "metadata": {}, "outputs": [], @@ -710,29 +869,87 @@ "def chat(message, history):\n", " messages = [{\"role\": \"system\", \"content\": system_message}] + history + [{\"role\": \"user\", \"content\": message}]\n", "\n", + " # Skip the first system message\n", + " to_log = messages[1:]\n", + "\n", + " # Print each dict on its own line\n", + " logger.info(\"\\nMessages:\\n\" + \"\\n\".join(str(m) for m in to_log) + \"\\n\")\n", + "\n", " while True:\n", - " # Send to OpenAI\n", - " response = openai.chat.completions.create(model=MODEL, messages=messages, tools=tools)\n", - " ai_message = response.choices[0].message\n", - " finish_reason = response.choices[0].finish_reason\n", - "\n", - " # If no tool calls, this is user-facing output\n", + " response = openai.chat.completions.create(\n", + " model=MODEL, \n", + " messages=messages, \n", + " tools=tools,\n", + " stream=True\n", + " )\n", + " \n", + " content = \"\"\n", + " tool_calls = []\n", + " finish_reason = None\n", + " \n", + " # Process the stream\n", + " for chunk in response:\n", + " choice = chunk.choices[0]\n", + " finish_reason = choice.finish_reason\n", + " \n", + " # Stream content\n", + " if choice.delta.content:\n", + " content += choice.delta.content\n", + " yield content\n", + " \n", + " # Collect tool calls\n", + " if choice.delta.tool_calls:\n", + " for tc_delta in choice.delta.tool_calls:\n", + " # Extend tool_calls list if needed\n", + " while len(tool_calls) <= tc_delta.index:\n", + " tool_calls.append({\n", + " \"id\": \"\",\n", + " \"function\": {\"name\": \"\", \"arguments\": \"\"}\n", + " })\n", + " \n", + " tc = tool_calls[tc_delta.index]\n", + " if tc_delta.id:\n", + " tc[\"id\"] = tc_delta.id\n", + " if tc_delta.function:\n", + " if tc_delta.function.name:\n", + " tc[\"function\"][\"name\"] = tc_delta.function.name\n", + " if tc_delta.function.arguments:\n", + " tc[\"function\"][\"arguments\"] += tc_delta.function.arguments\n", + " \n", + " # If no tool calls, we're done\n", " if finish_reason != \"tool_calls\":\n", - " return ai_message.content # ✅ Only return final assistant content\n", - "\n", - " # Otherwise, handle all tool calls in this message\n", + " return content\n", + " \n", + " # Execute tools\n", + " ai_message = {\n", + " \"role\": \"assistant\", \n", + " \"content\": content,\n", + " \"tool_calls\": [\n", + " {\n", + " \"id\": tc[\"id\"],\n", + " \"type\": \"function\",\n", + " \"function\": tc[\"function\"]\n", + " } for tc in tool_calls\n", + " ]\n", + " }\n", + " \n", " tool_responses = []\n", - " for tool_call in ai_message.tool_calls:\n", - " tool_responses.append(execute_tool_call(tool_call))\n", - "\n", - " # Add tool call request + tool responses to conversation\n", + " for tool_call in ai_message[\"tool_calls\"]:\n", + " # Convert dict back to object for your existing function\n", + " class ToolCall:\n", + " def __init__(self, tc_dict):\n", + " self.id = tc_dict[\"id\"]\n", + " self.function = type('obj', (object,), tc_dict[\"function\"])\n", + " \n", + " tool_responses.append(execute_tool_call(ToolCall(tool_call)))\n", + " \n", " messages.append(ai_message)\n", " messages.extend(tool_responses)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 192, "id": "f4be8a71-b19e-4c2f-80df-f59ff2661f14", "metadata": {}, "outputs": [ @@ -740,22 +957,22 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-08-29 02:29:05,739 [INFO] HTTP Request: GET http://127.0.0.1:7860/gradio_api/startup-events \"HTTP/1.1 200 OK\"\n", - "2025-08-29 02:29:05,746 [INFO] HTTP Request: HEAD http://127.0.0.1:7860/ \"HTTP/1.1 200 OK\"\n" + "2025-08-30 15:06:02,319 [INFO] HTTP Request: GET http://127.0.0.1:7871/gradio_api/startup-events \"HTTP/1.1 200 OK\"\n", + "2025-08-30 15:06:02,322 [INFO] HTTP Request: HEAD http://127.0.0.1:7871/ \"HTTP/1.1 200 OK\"\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "* Running on local URL: http://127.0.0.1:7860\n", + "* Running on local URL: http://127.0.0.1:7871\n", "* To create a public link, set `share=True` in `launch()`.\n" ] }, { "data": { "text/html": [ - "
" + "
" ], "text/plain": [ "" @@ -764,45 +981,120 @@ "metadata": {}, "output_type": "display_data" }, + { + "data": { + "text/plain": [] + }, + "execution_count": 192, + "metadata": {}, + "output_type": "execute_result" + }, { "name": "stderr", "output_type": "stream", "text": [ - "2025-08-29 02:29:07,097 [INFO] HTTP Request: GET https://api.gradio.app/pkg-version \"HTTP/1.1 200 OK\"\n", - "2025-08-29 02:29:17,018 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "2025-08-29 02:29:17,024 [INFO] Executing tool: search_symbol with args: {'query': 'Apple'}\n", - "2025-08-29 02:29:17,025 [INFO] Tool search_symbol called for Apple\n", - "2025-08-29 02:29:17,777 [INFO] Tool search_symbol {'count': 11, 'result': [{'description': 'Apple Inc', 'displaySymbol': 'AAPL', 'symbol': 'AAPL', 'type': 'Common Stock'}, {'description': 'Apple Hospitality REIT Inc', 'displaySymbol': 'APLE', 'symbol': 'APLE', 'type': 'Common Stock'}, {'description': 'Apple iSports Group Inc', 'displaySymbol': 'AAPI', 'symbol': 'AAPI', 'type': 'Common Stock'}, {'description': 'Apple Flavor & Fragrance Group Co Ltd', 'displaySymbol': '603020.SS', 'symbol': '603020.SS', 'type': 'Common Stock'}, {'description': 'Maui Land & Pineapple Company Inc', 'displaySymbol': 'MLP', 'symbol': 'MLP', 'type': 'Common Stock'}, {'description': 'Apple International Co Ltd', 'displaySymbol': '2788.T', 'symbol': '2788.T', 'type': 'Common Stock'}, {'description': 'Applepark Co Ltd', 'displaySymbol': '164A.T', 'symbol': '164A.T', 'type': 'Common Stock'}, {'description': 'Pineapple Inc', 'displaySymbol': 'PNPL', 'symbol': 'PNPL', 'type': 'Common Stock'}, {'description': 'Pineapple Resources Bhd', 'displaySymbol': 'PINEAPP.KL', 'symbol': 'PINEAPP.KL', 'type': 'Common Stock'}, {'description': 'Pineapple Financial Inc', 'displaySymbol': 'PAPL', 'symbol': 'PAPL', 'type': 'Common Stock'}, {'description': 'Pineapple Energy Inc', 'displaySymbol': 'SUNE', 'symbol': 'SUNE', 'type': 'Common Stock'}]}\n", - "2025-08-29 02:29:19,090 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "2025-08-29 02:29:19,096 [INFO] Executing tool: get_current_time with args: {}\n", - "2025-08-29 02:29:20,043 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "2025-08-29 02:29:20,047 [INFO] Executing tool: get_stock_quote with args: {'symbol': 'AAPL'}\n", - "2025-08-29 02:29:20,049 [INFO] Tool get_stock_quote called for AAPL\n", - "2025-08-29 02:29:20,274 [INFO] Tool get_stock_quote {'c': 232.56, 'd': 2.07, 'dp': 0.8981, 'h': 233.41, 'l': 229.335, 'o': 230.82, 'pc': 230.49, 't': 1756411200}\n", - "2025-08-29 02:29:30,843 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "2025-08-29 02:29:44,436 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "2025-08-29 02:29:44,441 [INFO] Executing tool: get_current_time with args: {}\n", - "2025-08-29 02:29:46,801 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "2025-08-29 02:29:46,806 [INFO] Executing tool: get_company_news with args: {'symbol': 'AAPL', '_from': '2025-08-21', 'to': '2025-08-28'}\n", - "2025-08-29 02:29:46,808 [INFO] Tool get_company_news called for AAPL from 2025-08-21 to 2025-08-28\n", - "2025-08-29 02:29:47,767 [INFO] Tool get_company_news [{'category': 'company', 'datetime': 1756408626, 'headline': 'Commentary: Trump’s trade war is hurting most sectors of the economy', 'id': 136563635, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The latest round of earnings reports revealed widespread damage from the Trump tariffs and other attacks on trade.', 'url': 'https://finnhub.io/api/news?id=f79d96aa415027377d39121c37660b242b4665192144f64a93b39b1515e24fdb'}, {'category': 'company', 'datetime': 1756405437, 'headline': 'Trump-Intel deal designed to block sale of chipmaking unit, CFO says', 'id': 136563640, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The Trump administration’s investment in Intel was structured to deter the chipmaker from selling its manufacturing unit, its chief financial...', 'url': 'https://finnhub.io/api/news?id=f0e37125d1ccd2adc8afe9ffb145ccfa0dd2001cbd1d23eaf1c96270c33ab33f'}, {'category': 'company', 'datetime': 1756403740, 'headline': \"Apple–TSMC Chip Pact Builds Firewall Against Trump's Tariffs\", 'id': 136563655, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple Inc (NASDAQ:AAPL) isn\\'t just building the iPhone 18—it\\'s creating a moat. By reportedly securing nearly half of Taiwan Semiconductor Manufacturing Co Ltd\\'s (NYSE:TSM) initial 2nm chip production capacity, Apple has locked in supply for its flagship device while also erecting a \"firewall\" against President Donald Trump\\'s proposed 100% tariffs on imported semiconductors. Track AAPL stock here. The move highlights how Apple\\'s scale, foresight, and U.S. investments could shield it from the pol', 'url': 'https://finnhub.io/api/news?id=080fa7ce38b3b44861946e6973f447bb280a79ea485c2b2f1ae11a938bbccd90'}, {'category': 'company', 'datetime': 1756401279, 'headline': \"What's Going On With Marvell Technology Stock Thursday?\", 'id': 136563649, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Marvell Technology (NASDAQ:MRVL) shares surged Thursday as investors bet on the company to deliver strong second-quarter results, scheduled for after the closing bell. Optimism has been fueled by accelerating demand for artificial intelligence infrastructure and expectations that Marvell will capture a growing share of hyperscale spending. The rally followed industry peer Nvidia’s (NASDAQ:NVDA) blockbuster results, which reinforced expectations of sustained demand from the artificial intelligenc', 'url': 'https://finnhub.io/api/news?id=4cf8c5984bf7ff829223fe47ee62f42082ee29a59dfa95d4b539bfe0fd0a423e'}, {'category': 'company', 'datetime': 1756400124, 'headline': 'Most of the Other Mag 7 Stocks Are Rising After Nvidia Earnings', 'id': 136563657, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'A group of Magnificent Seven stocks buoyed the S&P 500 after Nvidia earnings, but the chip titan wasn’t among them. The Dow was up 50 points, or 0.1%, while the Nasdaq Composite was up 0.5%. Nvidia shares were down 1% after moving up and down at the open.', 'url': 'https://finnhub.io/api/news?id=e89114f6041717edcc3ed7d65565eac2750bc512978233bdc8c6a18dae1bd6e0'}, {'category': 'company', 'datetime': 1756398112, 'headline': 'Stock Market Today: Nasdaq Up As Pure Storage Triggers Breakaway Buy; Nvidia Cuts Losses, Hormel Dives (Live Coverage)', 'id': 136560744, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The Dow Jones index slips in mixed trade Thursday following surprise GDP numbers and jobless claims. Nvidia stock drops after earnings.', 'url': 'https://finnhub.io/api/news?id=58cb2ef567614c88ee8f9a823109d024b43d6de6c4d18baa9bd184de26c931bc'}, {'category': 'company', 'datetime': 1756397760, 'headline': \"A Small Cap In A Big Cap's Clothing\", 'id': 136563776, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/1705316992/image_1705316992.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': 'AAPL is no longer the largest company in the world and now trails both Nvidia and Microsoft in terms of market cap. Click to read.', 'url': 'https://finnhub.io/api/news?id=e809d05668bd6be09e9fc420bf30d52521f1e6e4e7551f49911804ecf2247f3e'}, {'category': 'company', 'datetime': 1756397421, 'headline': 'Trump tariffs are increasingly forcing countries to pick sides between the US and China', 'id': 136560766, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'President Trump’s trade wars are increasingly forcing countries to choose between the US and its main adversaries.', 'url': 'https://finnhub.io/api/news?id=8177e96bbae4398135d97186f74049bba0d0eec4e76863edf5957488c9f737ff'}, {'category': 'company', 'datetime': 1756392896, 'headline': 'Evercore ISI Reiterates Outperform on Apple (AAPL) With $250 PT', 'id': 136560767, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple Inc. (NASDAQ:AAPL) is one of the AI Stocks Analysts Say You Shouldn’t Ignore. On August 22, Evercore ISI reiterated the stock as “Outperform” stating that it likes Apple’s price hikes on Apple TV+. “We think the Apple TV+ price increases could help modestly on services growth, but the real intent is to minimize churn. Services […]', 'url': 'https://finnhub.io/api/news?id=fb1b0e9cc0f40efd15e9b2dfc73b8684dcae4a89f5ba687b678e90e707d05cfb'}, {'category': 'company', 'datetime': 1756391075, 'headline': 'MP Materials: The Defense Establishment Comes A-Calling', 'id': 136562702, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/1428654585/image_1428654585.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': 'MP Materials is strategically positioned as a leading rare earth supplier amid rising US-China tensions and government focus on resource independence. Read the latest stock analysis here.', 'url': 'https://finnhub.io/api/news?id=1727d118f012c8bf42398a37c74b2b2ad9638666dd7efdf80539a5edee7fc302'}, {'category': 'company', 'datetime': 1756390634, 'headline': 'How Trump and Melania meme coins are performing half a year on', 'id': 136557610, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Both tokens launched before the US president's 20 January inauguration and quickly caught fire across crypto forums and political media.\", 'url': 'https://finnhub.io/api/news?id=80aa0488039ed175c0218e44a05e2ea529aed8fb9531d6015adb959f60044895'}, {'category': 'company', 'datetime': 1756389524, 'headline': 'Stock Market Today: Dow Slips, Nasdaq Rises After Surprise GDP, Jobless Claims; Nvidia Drops On Earnings (Live Coverage)', 'id': 136557573, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The Dow Jones index slips in mixed trade Thursday following surprise GDP numbers and jobless claims. Nvidia stock drops after earnings.', 'url': 'https://finnhub.io/api/news?id=aecd19ed894e08a95a5c74ed51c36088b293dda61667fd30342cab56ee8a9c0a'}, {'category': 'company', 'datetime': 1756388700, 'headline': '2 Growth Stocks That Could Be Worth $1 Trillion in 5 Years', 'id': 136557612, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'These two longtime market leaders should continue to perform well.', 'url': 'https://finnhub.io/api/news?id=940ed0a9a05b5d73504f52a9a1da73f837f81ad32f7414fc2ea5ed355f0140fe'}, {'category': 'company', 'datetime': 1756387449, 'headline': \"This Overlooked Stock Market Sector is Getting Hot Ahead of the Fed's Expected September Rate Cut\", 'id': 136560763, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'How to track sector rotation in the market, and why old-school utilities are catching a tailwind after Powell’s speech.', 'url': 'https://finnhub.io/api/news?id=f0053dc1668970117d9f9fb0b6ef53faff354c6079b706205c54497955c19026'}, {'category': 'company', 'datetime': 1756386540, 'headline': \"If You'd Invested $1,000 in Apple Stock 5 Years Ago, Here's How Much You'd Have Today\", 'id': 136557613, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'You might be surprised to see how much your investment would be today.', 'url': 'https://finnhub.io/api/news?id=8c9acc794cd8b231a9233116a3dc9e994a56c1c3a82189d074108e98ab54d68b'}, {'category': 'company', 'datetime': 1756386000, 'headline': 'Avalon GloboCare to Launch Online Sales of KetoAir Breathalyzer in the United Kingdom', 'id': 136557614, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'FREEHOLD, N.J., Aug. 28, 2025 (GLOBE NEWSWIRE) -- Avalon GloboCare Corp. (“Avalon” or the “Company”) (NASDAQ: ALBT), a developer of precision diagnostic consumer products, today announced that it will launch the sales of KetoAir™ breathalyzer device and related accessories in the United Kingdom (“UK”). The products will be available for purchase starting September 1, 2025, at www.KetoAir.uk. KetoAir™ is a handheld breathalyzer designed for ketogenic health management (U.S. Food and Drug Administ', 'url': 'https://finnhub.io/api/news?id=e559b96b92a52447e682c0f47c53fa6a508e7398d5b3e5de911491454985d36e'}, {'category': 'company', 'datetime': 1756385063, 'headline': 'Market Chatter: Apple Warns UK Strategic Market Status Could Harm Users, Developers', 'id': 136557615, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Apple (AAPL) believes that Britain's plans to increase competition in the mobile operating system ma\", 'url': 'https://finnhub.io/api/news?id=16193e567e9dc751ddfab0787f451b0f6978ff34d2d52737bb037964cb3088cc'}, {'category': 'company', 'datetime': 1756383230, 'headline': 'The Swatch Group: Running Out Of Time', 'id': 136559852, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/1791242549/image_1791242549.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': 'Swatch Group struggles with smartwatch disruption, falling EPS, and weak demand. Learn about its challenges, risks, and potential value opportunities.', 'url': 'https://finnhub.io/api/news?id=ca5970ea6e8ed42a4e3691dca273ba9e121de29acb56336c9560a79eabb40437'}, {'category': 'company', 'datetime': 1756382877, 'headline': 'When will iPhone 17 be released? What features to expect? What to know in Tennessee', 'id': 136557616, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The newest iPhone is expected to be announced during a Sept. 9 event, meaning it could hit the market in the coming weeks.', 'url': 'https://finnhub.io/api/news?id=93b0e7100da77cd91b5a784d1f044e99eccd00657935413602ac3754d95e9341'}, {'category': 'company', 'datetime': 1756382470, 'headline': 'As Trump And Intel Make News, This Nvidia, AMD Partner Chips Away At A Breakout', 'id': 136557617, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'With the semiconductor industry in focus as Nvidia reports, the Trump administration takes a stake in Intel and TSMC stock etches a buy point.', 'url': 'https://finnhub.io/api/news?id=0639e7b2512036ffaa5f122e7bccb0a595e35b5f4a85fef22a1f742133d79902'}, {'category': 'company', 'datetime': 1756382400, 'headline': 'Get ready, EV owners: Here come the dongles', 'id': 136557728, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"The transition from CCS to NACS will unlock thousands more fast chargers for many EV drivers, but they'll need to know their adapters to get the most out of it.\", 'url': 'https://finnhub.io/api/news?id=791f3b535a827c891140497cf89f87e37078b485a1c9d281692e6e62701cbbb6'}, {'category': 'company', 'datetime': 1756382400, 'headline': 'Could Buying MP Materials Today Set You Up for Life?', 'id': 136557618, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'MP Materials stock has surged over 300% in 2025. Can it keep that up?', 'url': 'https://finnhub.io/api/news?id=cde8cb7b7e803b646fd2e21292c3e4b0908454b34eabfb4a04c9a2ad56b8a879'}, {'category': 'company', 'datetime': 1756382143, 'headline': 'Morgan Stanley Maintains Equalweight on Skyworks (SWKS), Cuts Price Target Amid Broadcom Content Loss', 'id': 136557619, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Skyworks Solutions, Inc. (NASDAQ:SWKS) ranks among the best 5G stocks to buy now. Morgan Stanley retained its Equalweight rating on Skyworks Solutions, Inc. (NASDAQ:SWKS) and reduced its price target from $68 to $65 on August 6. Based in part on Apple’s previous remarks, the research firm noticed that the supply chain for smartphones has outperformed […]', 'url': 'https://finnhub.io/api/news?id=dd93604c17d502c50685fcce411f0ad5afa787886bc30b3edeebde6530455293'}, {'category': 'company', 'datetime': 1756380630, 'headline': 'Apple says UK mobile market shake-up could harm users and developers', 'id': 136557620, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"LONDON -Apple said on Thursday Britain's plans to increase competition in the mobile operating system market could harm users and developers, and potentially force the company to share its technology with foreign competitors for free. Last month, Britain's competition regulator told Apple and Android-owner Google to be fairer in how they distribute apps on their mobile platforms, setting out possible interventions as it plans to designate the U.S. tech companies with strategic market status over their duopoly.\", 'url': 'https://finnhub.io/api/news?id=4586d9fb5c2a41f4c8105a80667c11835661ad496368946acf15b94c6272ad1d'}, {'category': 'company', 'datetime': 1756378650, 'headline': \"Tesla sales drop 40% across Europe in July as China's BYD sees jump\", 'id': 136557621, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Sales of Tesla cars have continued to decline across Europe, falling 40% in July, as Chinese rival BYD saw a surge in registrations in the region last month.', 'url': 'https://finnhub.io/api/news?id=46d0e09bc4cfda7fd65bf1f247e15ce13082d242766a227b93cc70e92bcf6bf2'}, {'category': 'company', 'datetime': 1756377360, 'headline': 'AGs attack deepfake porn payments', 'id': 136560769, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple, Visa and others must be “more aggressive” in banning payment authorization for nonconsensual deepfake content, state AGs told the companies.', 'url': 'https://finnhub.io/api/news?id=5b99f45abab1c5465df76ca6c27da2afd266ebef62599d480a55d33d7590e981'}, {'category': 'company', 'datetime': 1756376520, 'headline': \"12 Stocks Warren Buffett's Berkshire Hathaway Has Been Loading Up On in 2025\", 'id': 136557622, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Despite a few big stock sales, there have been a lot of additions to Berkshire's portfolio.\", 'url': 'https://finnhub.io/api/news?id=3d261fc0e50b40a48d492134da9a6984c463cd0ba69e573fa387ef3c50489f9f'}, {'category': 'company', 'datetime': 1756376229, 'headline': 'Apple (AAPL): Examining Valuation as AI Concerns and Product Launches Dominate Attention', 'id': 136557623, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple (AAPL) has always had a knack for capturing headlines, but lately, it’s been the company’s moves—or lack of moves—in artificial intelligence that are drawing outsized attention from investors. As Apple prepares for its upcoming product event with new iPhones and wearables expected, multiple reports suggest the tech giant is under mounting pressure to prove it can catch up in the AI race. Recent partnership talks and news of possible acquisitions only add to the drama, as the market...', 'url': 'https://finnhub.io/api/news?id=9a405abfbd5a198d23b48942eeaf8cd2758d491872dc294d2d477e168c22259c'}, {'category': 'company', 'datetime': 1756375801, 'headline': 'How Twilio’s (TWLO) Global RCS Launch Could Shape Its Messaging Platform and Customer Trust', 'id': 136557624, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Twilio recently announced the global general availability of Rich Communication Services (RCS) messaging, enabling more than 349,000 active customers to send branded, verified, and interactive messages across Android and iOS devices through its Programmable Messaging and Verify APIs. This launch, following Apple’s rollout of RCS support and expanding Twilio's reach across 20+ countries, positions the company to address rising messaging fraud by bolstering customer trust and enabling richer,...\", 'url': 'https://finnhub.io/api/news?id=ca2307c8e7be2ecfaff7e462350f223f2840e596cd366e3fe1573e6bd327b14b'}, {'category': 'company', 'datetime': 1756372500, 'headline': 'Prediction: 1 Artificial Intelligence (AI) Stock Will Be Worth More Than Palantir Technologies and Amazon Combined by 2030', 'id': 136557607, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Palantir is one of the most valuable software businesses in the world, while Amazon remains a trillion-dollar giant.', 'url': 'https://finnhub.io/api/news?id=fc96e4f9665522a0c22481cd146e66d9b5ce8ce2934077c86c504f0697260d9a'}, {'category': 'company', 'datetime': 1756370411, 'headline': 'Bitcoin price recovers as Nvidia earnings fuel risk appetite', 'id': 136557626, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'It came as the S&P 500 notched a record high and Nvidia delivered stronger-than-expected quarterly results, reinforcing investor appetite for risk assets.', 'url': 'https://finnhub.io/api/news?id=8c3119a8a72d87a448ff861e8e4d4b8619a0635371e0e3713c949308eb32f044'}, {'category': 'company', 'datetime': 1756368912, 'headline': 'LIVE: Wall Street and European stocks mixed as US GDP revised higher and weekly jobless claims fall', 'id': 136557627, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"US GDP grew at a 3.3% annualised pace last quarter, according to the government's second estimate.\", 'url': 'https://finnhub.io/api/news?id=94bd66317beaa9f8b873ea175cd746f9091c5c1fd8938424b2ca4e20259b5df2'}, {'category': 'company', 'datetime': 1756364760, 'headline': 'Zacks Investment Ideas feature highlights: Apple, Meta Platforms and DoorDash', 'id': 136557628, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple, Meta and DoorDash all smashed Q2 expectations with record-breaking growth, strong margins and bullish post-earnings momentum.', 'url': 'https://finnhub.io/api/news?id=753d4c569e19112422028eb00f371cfd015fbeeca321005775f91b9d77d6b158'}, {'category': 'company', 'datetime': 1756364400, 'headline': 'Apple accuses Britain of ‘EU-style’ crackdown', 'id': 136557629, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple has accused Britain’s competition watchdog of stifling growth with an “EU-style” crackdown on the iPhone maker.', 'url': 'https://finnhub.io/api/news?id=88bb9408c819df29b22469513d47540a5d54f0585fc8caf47ac8288a93fd41b8'}, {'category': 'company', 'datetime': 1756326420, 'headline': 'Apple Teases iPhone 17 Launch With Sept. 9 Showcase', 'id': 136541162, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Event to spotlight slimmer phone, new watches, AirPods and AI', 'url': 'https://finnhub.io/api/news?id=57f533b5c833e80c1d77f63268da8555521d3d5583d5684b46ac7036d8b0d570'}, {'category': 'company', 'datetime': 1756323780, 'headline': \"Warren Buffett's Berkshire Hathaway Trims Apple Stake, Again. What's the Deal?\", 'id': 136541163, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The massive conglomerate now has a cash hoard of $344 billion.', 'url': 'https://finnhub.io/api/news?id=7dc81e41b6376258c7eb512fa47525b93dbc56d436b9acee7318023adae6a69f'}, {'category': 'company', 'datetime': 1756320350, 'headline': 'Apple (AAPL) Buy Rating Maintained Ahead of Potential September Event', 'id': 136541164, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple Inc. (NASDAQ:AAPL) is one of the AI Stocks Analysts Are Tracking Closely. On August 25, Bank of America reiterated the stock as “Buy” and acknowledged that even though there are reports that there is no official iPhone event yet scheduled on September 9 for Apple, investors should tone down their expectations for the next cycle […]', 'url': 'https://finnhub.io/api/news?id=36ef4b48e9a75c5faaad802d9779733bd8eb0d2ed1aff058090ccf2ffbf76544'}, {'category': 'company', 'datetime': 1756317830, 'headline': 'Chipolo, an AirTag rival, debuts rechargeable trackers with a six-month battery life', 'id': 136541165, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Chipolo debuts a lineup of rechargeable trackers to compete with AirTag and others.', 'url': 'https://finnhub.io/api/news?id=058e82cd659bfbb73fd85321d63d0825a8cd02ec4774a2cb53eda240bbffd98d'}, {'category': 'company', 'datetime': 1756315800, 'headline': '[Latest] Global Motion Graphics Market Size/Share Worth USD 280 Billion by 2034 at a 12.2% CAGR: Custom Market Insights (Analysis, Outlook, Leaders, Report, Trends, Forecast, Segmentation, Growth Rate, Value, SWOT Analysis)', 'id': 136539413, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': '[220+ Pages Latest Report] According to a market research study published by Custom Market Insights, the demand analysis of Global Motion Graphics Market size & share revenue was valued at approximately USD 85.5 Billion in 2024 and is expected to reach USD 98.3 Billion in 2025 and is expected to reach around USD 280 Billion by 2034, at a CAGR of 12.2% between 2025 and 2034. The key market players listed in the report with their sales, revenues and strategies are Adobe Inc., Autodesk Inc., Maxon', 'url': 'https://finnhub.io/api/news?id=e6f397e64732b302a0646b559119b00c38feacf9f0c5daffee527ec2fb030208'}, {'category': 'company', 'datetime': 1756315645, 'headline': 'Pfizer: Finally Some Fortune, Plus Twenty High-Quality Dividend Growth Valuations', 'id': 136542130, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/2203006359/image_2203006359.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': \"Discover high-quality dividend-growth stocks near 52-week lows. Explore Pfizer's strong dividend and valuations, plus other top picks like Merck and Qualcomm.\", 'url': 'https://finnhub.io/api/news?id=ec425284e980cf083d7d06feec4294590bc48a5d33b2fdd798c828b58de26570'}, {'category': 'company', 'datetime': 1756312967, 'headline': \"Cracker Barrel logo debacle isn't CEO Julie Masino's only challenge: Opening Bid top takeaway\", 'id': 136538441, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Cracker Barrel has a host of issues.', 'url': 'https://finnhub.io/api/news?id=5d954f41f3cbb1bd20135e12731d5043295f6c7a22381c604c77986feb3e3dd7'}, {'category': 'company', 'datetime': 1756310381, 'headline': 'The Gap Between Nvidia and the Next Largest Company Is Now $700 Billion', 'id': 136539403, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Nvidia's market capitalization stood at about $4.4 trillion this week, about $700 billion ahead of the next most valuable company, Microsoft. The gap between the AI chip giant and the next largest public company has never been wider, according to Dow Jones Market Data.\", 'url': 'https://finnhub.io/api/news?id=f9ce19a19e80e96971dc5bb4e5998b4f73764cfdb89fda81e2cd7672edc77884'}, {'category': 'company', 'datetime': 1756308600, 'headline': 'Q2 Earnings: These 3 Tech Stocks Shattered Expectations', 'id': 136539416, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"The 2025 Q2 earnings cycle is nearing its end, with these three companies' results stealing the spotlight. Can they repeat their stellar performances in the Q3 season?\", 'url': 'https://finnhub.io/api/news?id=c8908ad4d0110207fd887b4cbe53973de66b66981914f3ae3f421964cfd4e39d'}, {'category': 'company', 'datetime': 1756305529, 'headline': 'How Apple investors should weigh India tariffs & ongoing AI lag', 'id': 136539417, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Apple (AAPL) is ramping up production at five factories in India ahead of its iPhone 17 launch, all while facing new 50% tariffs from the US on Indian goods. Yahoo Finance Senior Reporter Ines Ferré and Slatestone Wealth chief market strategist Kenny Polcari, who is also the host of Yahoo Finance's Trader Talk podcast, join Opening Bid host Brian Sozzi to weigh in on the headline risk to Apple. To watch more expert insights and analysis on the latest market action, check out more\\xa0Opening Bid.\", 'url': 'https://finnhub.io/api/news?id=f985e17b57b8661a44209cdab0364c36ab40feed82fbacbada76d466df119581'}, {'category': 'company', 'datetime': 1756303740, 'headline': 'Apple Music Taps TuneIn to Expand Global Access to Its Live Radio Stations', 'id': 136539418, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Beginning today, listeners around the world can stream all six commercial-free Apple Music live radio stations on TuneIn SAN FRANCISCO, Aug. 27, 2025 (GLOBE NEWSWIRE) -- TuneIn, the world’s leader in live audio, today announced a new partnership with Apple to expand access to Apple Music’s commercial-free live radio stations to listeners around the world. This marks the first time Apple’s 24/7 global radio stations are available outside of its own native platform. Starting today, all six free Ap', 'url': 'https://finnhub.io/api/news?id=e0413ec85f8c3aca11dd19d3b50b0f1680a6191a99c9e1760725d09871ab2e5f'}, {'category': 'company', 'datetime': 1756302300, 'headline': 'My 3 Favorite Stocks to Buy Right Now', 'id': 136536616, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Contrary to a common assumption at this time, not every stock is priced too richly or poses too much risk. Several underappreciated and undervalued names are just waiting to be found.', 'url': 'https://finnhub.io/api/news?id=5c9c5ad47420d627cfdffdc181bb0a20b74931b5b9a4ee6e4b598a7fe15ffe94'}, {'category': 'company', 'datetime': 1756300020, 'headline': 'COLLEGE FOR CREATIVE STUDIES LAUNCHES APPLE FOUNDATION PROGRAM, FREE CODING COURSES FOR DETROITERS', 'id': 136536132, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The Apple Foundation Program at CCS will welcome its first cohort in October 2025, offering a free introductory app development course with access to laptops and additional devices. CCS Apple Foundation Lab Courtesy of College for Creative Studies CCS Apple Foundation Lab Courtesy of College for Creative Studies Detroit, MI, Aug. 27, 2025 (GLOBE NEWSWIRE) -- The College for Creative Studies (CCS) is excited to launch the Apple Foundation Program, a free app development program coming to the Coll', 'url': 'https://finnhub.io/api/news?id=c39f266620c5451aea0891907dfe081dc8bad553e13b1175be1a2c1955a20968'}, {'category': 'company', 'datetime': 1756299600, 'headline': 'Apple Makes Music Push in Radio After Losing Ground to Spotify', 'id': 136539420, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The deal with digital radio platform TuneIn marks the first time Apple Music’s six radio stations will be available outside the company’s app.', 'url': 'https://finnhub.io/api/news?id=2b3af74ab5be8c92b9fc60e9ddf9ea2316e2a7b47b4705db59639bc775ff1581'}, {'category': 'company', 'datetime': 1756299600, 'headline': 'ESR to Unveil Game-Changing Tech Innovations at IFA 2025', 'id': 136536133, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'ESR, a global tech brand trusted by over 123 million users, will present its newest innovations at IFA 2025 from September 5–9 at Messe Berlin. Guided by its mission \"Tech Made Easier,\" ESR is set to unveil industry-first accessories that deliver wired-speed magnetic charging, stronger device protection, and more flexible productivity.', 'url': 'https://finnhub.io/api/news?id=ab2ce5abbf3516bc95c82979500217ce98402582a6083375f7b1edb7e0e92ab8'}, {'category': 'company', 'datetime': 1756298700, 'headline': 'Billionaire Bill Ackman Just Bought This Magnificent Artificial Intelligence (AI) Stock, Which Could Join Nvidia, Microsoft, and Apple in the $3 Trillion Club By 2028', 'id': 136536103, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Ackman\\'s hedge fund, Pershing Square, recently added another \"Magnificent Seven\" stock to its portfolio.', 'url': 'https://finnhub.io/api/news?id=0dcbb9593b57a4f988911c73d340dec2c9ee67cf5fe2dc86402a13ec133409be'}, {'category': 'company', 'datetime': 1756298544, 'headline': 'MetaMask Adds Google and Apple Login to Simplify Self-Custodial Wallet Access', 'id': 136536135, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'MetaMask has launched social login functionality, allowing users to create and recover self-custodial wallets using Google or Apple accounts, eliminating the need to manually manage traditional 12-word Secret Recovery Phrases while preserving complete user control over private keys. The feature combines familiar Web2 authentication with advanced cryptographic techniques, including Threshold ...', 'url': 'https://finnhub.io/api/news?id=fefb7a0bd947b9ea884c2ad78bba45b797bbc2fe6e7e419fbc1f41f9bc40b0fe'}, {'category': 'company', 'datetime': 1756297975, 'headline': 'Alphabet At The Crossroads: Legal Minefield Or Money Machine', 'id': 136538321, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/872409924/image_872409924.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': 'Alphabet faces antitrust risk, but a breakup could unlock hidden value.', 'url': 'https://finnhub.io/api/news?id=94344a89f867ac85036a39124e9fd93cc16cff445838394e0d8c309e5273eceb'}, {'category': 'company', 'datetime': 1756295929, 'headline': 'Microsoft vs. Apple: Which Stock Has Performed Better Since Trump Took Office?', 'id': 136536116, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple and Microsoft stocks have surged—but which one performed better? See how these tech giants stack up during Trump’s second term so far.', 'url': 'https://finnhub.io/api/news?id=854230d76b6fd36b2a4ae52e69d5f5bec794619ea75e004e447c9a78ffa760ca'}, {'category': 'company', 'datetime': 1756295100, 'headline': 'As Warren Buffett Continues to Trim Apple Stake, Should Investors Be Worried?', 'id': 136536137, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Apple now comprises 21% of Berkshire's closely monitored equity portfolio.\", 'url': 'https://finnhub.io/api/news?id=5d982d0ed73fdda2a4280275c09cefba88552b34a1299052e0f5263e263ba3a5'}, {'category': 'company', 'datetime': 1756291928, 'headline': 'What happens to your pension if your relationship ends?', 'id': 136536138, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"If there's an overreliance on one partner’s pension and you end up breaking up you could find yourself close to retirement with little in the way of income.\", 'url': 'https://finnhub.io/api/news?id=c3f07c39e3f7a9bf94894372a3977c0b5aad0f22174af5931a31c0f99e318f63'}, {'category': 'company', 'datetime': 1756291569, 'headline': \"Tesla Stock 'Could Fall 90% Tomorrow,' Fund Manager Still Won't Buy — Here's Where He's Investing Instead\", 'id': 136536120, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Tesla Inc (NASDAQ:TSLA) stock has fallen 8% year-to-date in 2025 and some investors and analysts believe the stock remains overvalued with more room to fall. One of the top-performing fund managers thinks Tesla stock could have significant downside ...', 'url': 'https://finnhub.io/api/news?id=434f7927d77afa8219186d9fdcb67ead90bbb30935a3a8e8f48580f5bcbf65a1'}, {'category': 'company', 'datetime': 1756291392, 'headline': 'AI Weekly: grouchy Grok and the wizard of bots', 'id': 136536140, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"STORY: From why Elon Musk says Apple is being mean to Grok, to how bots reinvented the Wizard of Oz, this is AI Weekly.:: AI Weekly:: Sphere Entertainment\\xa0Elon Musk’s xAI is suing Apple and OpenAI, claiming they conspired to thwart competition.He says they gave prominence to ChatGPT in Apple’s app store, while limiting the profile of his competing chatbot Grok.OpenAI said the case was just another example of what it called Musk’s “pattern of harassment”.Meta is set to back political candidates who back lighter regulation of AI.The Facebook parent says it will set up a California-focused political action committee to back state-level candidates from either party.It plans to spend tens of millions of dollars on the effort, potentially putting it among the state's top politicial spenders ahead of a 2026 governor race.\\xa0DeepSeek has unveiled an upgraded model that it says is can be optimised to work with Chinese chips.That may signal it’s positioned to work with the country’s own semiconductor makers, as Beijing pushes to reduce its reliance on U.S. tech.Earlier this year, DeepSeek shook the sector when it released an AI model able to compete with the likes of ChatGPT, but developed at much lower cost.:: Sphere EntertainmentAI has reimagined “The Wizard of Oz”.The famous film will be shown in Las Vegas on a towering spherical screen that surrounds viewers.AI tools preserve the original performances, but also add new elements.Ben Grossman is the boss of visual effects firm Magnopus:“We need to drastically increase the resolution and detail of the original movie, we need to complete the missing parts of the people who were cut off and then we need to create the continuity of the scene so that the performances that you know are there are actually there.”And Google focused on AI when unveiling its latest Pixel phones.:: Google\\xa0That includes a “coach” in the camera app that can help users take better pictures.There’s also an AI assistant that can display useful information before it’s even asked, such as showing a flight confirmation email when the user calls an airline.\", 'url': 'https://finnhub.io/api/news?id=2b6a4d8f83a26751f9c767abe00e26abbabfb1071fff7f699c0518d49891f5ce'}, {'category': 'company', 'datetime': 1756290780, 'headline': 'It’s Trump’s Market Now. How to Navigate Fed Threats, State Stock Buying, Economic Curveballs.', 'id': 136536141, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Trump escalates Fed fight, Apple teases product event next week, Cracker Barrel drops new logo, and more news to start your day.', 'url': 'https://finnhub.io/api/news?id=67a5e0f03199596b736b0f4d450d0b0f50f5413e3f39010b9f387d60351fe739'}, {'category': 'company', 'datetime': 1756288800, 'headline': 'The Best \"Magnificent Seven\" Stock to Buy Right Now, According to Wall Street (Hint: Not Nvidia)', 'id': 136536125, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Almost every analyst agrees this AI giant is a buy with plenty of upside left.', 'url': 'https://finnhub.io/api/news?id=d6cefbf6bd2b81a2d3edda7b925845062de2a510ca2d395594240036c0b0c4dc'}, {'category': 'company', 'datetime': 1756285332, 'headline': 'EU to Propose Removing US Tariffs This Week to Meet Trump Demand', 'id': 136539421, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The European Commission, which handles trade matters for the EU, will also give preferential tariff rates on certain seafood and agricultural goods, according to people familiar with the matter. The EU has conceded that the trade arrangement struck with Trump favors the US but that the accord is necessary to give businesses stability and certainty.', 'url': 'https://finnhub.io/api/news?id=612cccf472079a1f84ac02fea985ed07785463e11fce1542fde2df16313aa3ce'}, {'category': 'company', 'datetime': 1756285263, 'headline': 'Crypto Industry Unites Against Senate Bill Over Protections for Software Devs', 'id': 136536143, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Top crypto and tech groups said they would not support the Senate’s market structure bill without new language shielding developers from criminal liability.', 'url': 'https://finnhub.io/api/news?id=c1422933d13544e8a6ea15de880fcc0b45d85931f54e313abb4d5f1d9dc447c4'}, {'category': 'company', 'datetime': 1756285020, 'headline': 'Prediction: This Unstoppable Vanguard ETF Will Keep Beating the S&P 500 Over the Long Term', 'id': 136536127, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The S&P 500 typically delivers strong long-term returns, but this Vanguard ETF has consistently outperformed it.', 'url': 'https://finnhub.io/api/news?id=de010cb83b6d643dc3697d4fcd9dee466c036b714ed688738a4d10e9b0ab9387'}, {'category': 'company', 'datetime': 1756284300, 'headline': 'Ben Graham Misquoted: The Stock Market Is Never A Weighing Machine', 'id': 136535891, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/1329937320/image_1329937320.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': \"The stock market is not a weighing machine in the long run. Check out Graham's insights on why the stock market operates as a voting machine.\", 'url': 'https://finnhub.io/api/news?id=1f8e990b991e9dd7e08e7bbe07edf4020234609d120abc13241f0507716fe9e4'}, {'category': 'company', 'datetime': 1756282320, 'headline': 'The New Conversational Standard: Rich Communication Services Market Forecast Report 2025-2030, with Profiles of Google, Apple, Twilio, Sinch, Infobip, MessageBird, and GSMA', 'id': 136536145, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The RCS market is poised for rapid growth, driven by Apple\\'s RCS integration in iOS 18, unifying global users. Key opportunities lie in leveraging RCS Business Messaging for enhanced brand-consumer interaction, exploring high-growth regions like Asia-Pacific, and integrating RCS into digital strategies for MNOs, enterprises, and CPaaS providers.Dublin, Aug. 27, 2025 (GLOBE NEWSWIRE) -- The \"New Conversational Standard: Rich Communication Services (RCS) Market Analysis, RBM Opportunities, and Glo', 'url': 'https://finnhub.io/api/news?id=cdf9963e9810636d6dd5ad679403d87a7fe343bdfeb4099a71f0413bebce46b6'}, {'category': 'company', 'datetime': 1756281713, 'headline': 'FTSE 100 LIVE: Stocks mixed as UK energy prices set to rise more than expected', 'id': 136536146, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The increase kicks in at start of October, which campaigners say will mean another winter of relatively high energy bills.', 'url': 'https://finnhub.io/api/news?id=c651e4c616007403c5a8acfaffde18b8820eec9726a0ae66c4e971e13aadc1cf'}, {'category': 'company', 'datetime': 1756279166, 'headline': 'IMAX Corporation (IMAX) Signs Expansion Agreement with Apple Cinemas for New IMAX with Laser Systems', 'id': 136536147, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'With strong upside potential and significant hedge fund interest, IMAX Corporation (NYSE:IMAX) secures a spot on our list of the 10 Must-Buy Canadian Stocks to Invest in. A significant expansion agreement for five new IMAX with Laser systems around the United States was announced by IMAX Corporation (NYSE:IMAX) and Apple Cinemas on August 7, 2025, […]', 'url': 'https://finnhub.io/api/news?id=fbfd81ca0494903d8d382c281080e814876acca5f579b9bc868ceec4ef3aec61'}, {'category': 'company', 'datetime': 1756278300, 'headline': 'Parallels Launches Parallels Desktop 26 with Support for macOS Tahoe 26, Compatibility with Windows 11 25H2, and New IT Management Tools', 'id': 136536131, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The latest release introduces more secure VM management, accurate Mac disk visibility in Windows, renewed SOC 2 Type II compliance, and more simplified deployment and device management for enterprise IT teams Parallels Desktop 26 for Mac Parallels Desktop is the only Microsoft-authorized way to run Windows 11 on Macs with Apple silicon. Parallels Desktop for Mac Enterprise Edition Parallels Desktop 26 introduces powerful enterprise features, making it easier for IT teams to manage, monitor, and', 'url': 'https://finnhub.io/api/news?id=a16e2511406c745e43e1cbd4a820454a72f67143b38c49df587d7f919b067ee8'}, {'category': 'company', 'datetime': 1756274568, 'headline': 'Trump Slaps India With 50% Tariffs, Upending Ties With Modi', 'id': 136536149, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The new tariffs, the highest in Asia, took effect at 12:01 a.m. in Washington on Wednesday, doubling the existing 25% duty on Indian exports. The levies will hit more than 55% of goods shipped to the US — India’s biggest market — and hurt labor-intensive industries like textiles and jewelry the most. Key exports like electronics and pharmaceuticals are exempt, sparing Apple Inc.’s massive new factory investments in India for now.', 'url': 'https://finnhub.io/api/news?id=fe4f2d299dc86ea71bb917b7cd3ca3260f0913917841a08a8b2e61130f156555'}, {'category': 'company', 'datetime': 1756267201, 'headline': 'The Chinese gadget maker taking on Tesla and Apple', 'id': 136536150, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'An electric vehicle factory built by China’s largest smartphone maker has become a tourist attraction in Beijing, with visits to the company...', 'url': 'https://finnhub.io/api/news?id=4cd753b8caeb83784586d510ce431255fbfe91882b4713b02fb81661cecef582'}, {'category': 'company', 'datetime': 1756266829, 'headline': 'Can Apple’s (AAPL) AI Partnerships Revive Investor Sentiment?', 'id': 136536151, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple Inc. (NASDAQ:AAPL) is one of the top stocks to buy and hold forever. Apple Inc. (NASDAQ:AAPL) is often seen as a textbook example of how to build and strengthen a moat over time. Its brand strength, device and services ecosystem lock-in, and customer loyalty enable it to generate recurring revenues, maintain strong pricing power, and consistently […]', 'url': 'https://finnhub.io/api/news?id=3ebfed59c2e2e7119d0b4077fd406bb25fd5f0e2ef25dbf50f73bd57e334546f'}, {'category': 'company', 'datetime': 1756263240, 'headline': 'The Most Overvalued Of Mag7: Why Apple Gets My Sell', 'id': 136534658, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/1705316992/image_1705316992.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': 'Apple is recognized as a leader, but execution lags. Click here to read more about AAPL stock and why it is rated as a Sell.', 'url': 'https://finnhub.io/api/news?id=1926506c568d5cc3875b9c40c9a3b211652036847eb5d504f84db226cf67ade7'}, {'category': 'company', 'datetime': 1756235481, 'headline': 'Alphabet Lands $10B Meta Cloud Deal--Is A Siri-Gemini Deal Close?', 'id': 136532253, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/2210768067/image_2210768067.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': \"Alphabet Inc.'s Google Cloud lands a $10B Meta deal, challenging AWS and Azure. Click for my updated look at GOOGL stock and why I remain bullish.\", 'url': 'https://finnhub.io/api/news?id=86e5017e035d7aea11fa1ea7fec5b5fb9004d28101950c42bee1a638795926d5'}, {'category': 'company', 'datetime': 1756231255, 'headline': \"Apple Promises 'Awe Dropping' Event Sept. 9\", 'id': 136529950, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple announced Tuesday that it will hold its fall product launch event on Sept. 9, likely headlined by the iPhone 17 series handsets.', 'url': 'https://finnhub.io/api/news?id=eb6ebae095d68639321c7bc616ac6707bbdf8b06f84f539109f00dbba2859e61'}, {'category': 'company', 'datetime': 1756228823, 'headline': 'OMAH: A Berkshire Hathaway Copycat With A 15% Distribution Yield', 'id': 136531630, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/1030142522/image_1030142522.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': \"OMAH ETF seeks 15% annual yield via covered calls on Berkshire's holdings, ideal for income investors. Click here to read my most recent analysis of OMAH.\", 'url': 'https://finnhub.io/api/news?id=58990138d8fe8d477a6838738136d46cb3da707c449f5d2bca585ad94a3798e7'}, {'category': 'company', 'datetime': 1756228320, 'headline': \"Can Strong Content Portfolio Drive Apple's Streaming Prospects?\", 'id': 136529951, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple TV+ hits record Emmy nods and box office success as Services revenues jump double digits despite tough streaming competition.', 'url': 'https://finnhub.io/api/news?id=24b80129567e08f81469955913d3e7c594cf01f50aca4b2796eda55dc206bf7a'}, {'category': 'company', 'datetime': 1756228268, 'headline': \"Elon Musk's xAI sues Apple, OpenAI over AI competition and App Store rankings\", 'id': 136529952, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Elon Musk's xAI filed a lawsuit against Apple and OpenAI in federal court, alleging the companies conspired to prevent competition in the market for artificial intelligence tools.\", 'url': 'https://finnhub.io/api/news?id=13d253c2491e234963d5e88a6cbbdf36bf22ffeebb0b00664a073e991643a738'}, {'category': 'company', 'datetime': 1756228243, 'headline': 'Apple product launch, Meta Super PAC, Trump & Cracker Barrel', 'id': 136529953, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Yahoo Finance's John Hyland tracks Tuesday's top moving stocks and biggest market stories in this Market Minute: Apple's (AAPL) upcoming fall product launch on Sept. 9, Meta (META) reportedly launching a Super PAC focused on artificial intelligence (AI), and President Trump weighing in on the new Cracker Barrel (CBRL) logo. Stay up to date on the latest market action, minute-by-minute, with Yahoo Finance's Market Minute.\", 'url': 'https://finnhub.io/api/news?id=35b93c4400f7b555a2910620d9bca12e0bd6cfaa86ba56d5de59646fba94d752'}, {'category': 'company', 'datetime': 1756226940, 'headline': 'Apple’s Annual Event Will Be Sept 9. What to Expect for the iPhone and AI.', 'id': 136529954, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple will host its annual product event on Sept. 9, the company said Tuesday. Investors and customers alike will be looking for announcements regarding the company’s next iPhone launch and artificial intelligence updates. The Apple event—almost always takes place in September—unveils what new products and updates the company will be launching in the weeks to follow.', 'url': 'https://finnhub.io/api/news?id=b5a5a400b786c4cc164f9ec881a2311d566332bdf548a2fc5818ef858d748573'}, {'category': 'company', 'datetime': 1756226127, 'headline': 'Not so fast: German court says Apple can’t call Watch carbon neutral', 'id': 136529955, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Apple's carbon neutral claims are undermined by the short-term nature of carbon credits used to support them, the court said.\", 'url': 'https://finnhub.io/api/news?id=83f2575c7a3b3ada4263ced904f915e73685c92c56a4c9b377936566bd926fdc'}, {'category': 'company', 'datetime': 1756225200, 'headline': 'More Volatility Ahead In This AI Bull Market', 'id': 136531096, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/1388937775/image_1388937775.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': 'Gary Vaughan from Daily Stock PicksÂ\\xa0on buying the dip, crypto long-term and why bonds might now be a once in a lifetime buy.', 'url': 'https://finnhub.io/api/news?id=02e88f1c840a10605837aa875c0e48f3a5667a8415226907fb48b5338249b884'}, {'category': 'company', 'datetime': 1756224432, 'headline': 'Apple to hold fall event on September 9, new iPhones expected', 'id': 136529956, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"The event will be held at the Steve Jobs Theater at Apple's headquarters in Cupertino, California and serve as a showcase of the company's efforts to integrate artificial intelligence into its devices. Media reports have said Apple will also unveil a slimmer version of its latest iPhone, possibly branded as the iPhone Air, echoing its iPad Air and MacBook Air lines. The company is also expected to showcase new entry-level, high-end Apple Watches, upgraded iPad Pros and a faster version of the Vision Pro headset, Bloomberg News has reported recently.\", 'url': 'https://finnhub.io/api/news?id=2f9081e1f78dab4b8fd7ca3a839bced221a1007faee91a43904a3dc0b3927604'}, {'category': 'company', 'datetime': 1756224300, 'headline': 'Apple is holding its iPhone 17 event on September 9', 'id': 136529957, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Along with the iPhones, Apple will likely have updated the Apple Watch Series 11, Ultra 3, and SE 3. The Apple Watch Ultra 3 would be a notable update amid the trio, with a bigger screen and faster charging support.', 'url': 'https://finnhub.io/api/news?id=798c01eeaa99f2a20a2b540332738653ac0ab5e56bb56102f362eb33fba1f0b2'}, {'category': 'company', 'datetime': 1756222621, 'headline': \"GM's $1 billion bet on F1 rolls on with star driver pairing for Cadillac team\", 'id': 136526543, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'GM’s Cadillac F1 team unveiled its driver pairing for the 2026 season, when the Big Three automaker’s big bet on F1 begins.', 'url': 'https://finnhub.io/api/news?id=d5dadf0c2d424b03eb856d6fd5771083fd61b82952d49619bf7ac66d82ee49d5'}, {'category': 'company', 'datetime': 1756221211, 'headline': 'Attorneys general tell AI companies to protect kids', 'id': 136529944, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Attorneys general in a letter highlighted Meta's scandal over its recent AI chatbot policies allowing romantic conversations with minors\", 'url': 'https://finnhub.io/api/news?id=c80eac904cb211ce08b917cdbdb49c14b6e9716c160c11c91f1134b00dd02cf7'}, {'category': 'company', 'datetime': 1756220400, 'headline': '2 High-Conviction Picks For 7.73% Growth And 4.22% Yield Within A Dividend Portfolio', 'id': 136529227, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/2188450078/image_2188450078.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': \"Through DPSTF and META, we increased Dividend Income Accelerator Portfolio's sector diversification and global exposure. Learn more about the portfolio here.\", 'url': 'https://finnhub.io/api/news?id=3452d5cd9b4cf8d4251a0ea48074df10fe22dad78a44764ff71b7843f2de36f2'}, {'category': 'company', 'datetime': 1756219920, 'headline': 'Apple has an AI problem — and a Google partnership could actually make things worse', 'id': 136541516, 'image': '', 'related': 'AAPL', 'source': 'MarketWatch', 'summary': 'Apple has an AI problem — and a Google partnership could actually make things worse', 'url': 'https://finnhub.io/api/news?id=872986dd4f00566feaa310ee2fa0ab6a465476060222213ade9a930c4715aea1'}, {'category': 'company', 'datetime': 1756219440, 'headline': 'The Zacks Analyst Blog Highlights Alphabet, Apple and Garmin', 'id': 136529960, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Alphabet expands its Pixel lineup with new smartphones, watches, and earbuds, but faces fierce competition from Apple's AI push and Garmin's health-focused wearables.\", 'url': 'https://finnhub.io/api/news?id=93db37c7152895bb7d2a2f3d8de26eb915baea8ac2eea26dc76b571b118beb92'}, {'category': 'company', 'datetime': 1756218652, 'headline': 'Trump vs. Lisa Cook and what it really means for the stock market: Opening Bid top takeaway', 'id': 136525458, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The battle is well underway.', 'url': 'https://finnhub.io/api/news?id=6db1fb4523672e793b334b0953a0e3e17809d60f1522dc0a42d6ec9943d2cf40'}, {'category': 'company', 'datetime': 1756218587, 'headline': \"'Sexualized' AI Chatbots Pose Threat to Kids, Warn Attorneys General in Letter\", 'id': 136529961, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'A coalition of 44 state attorneys general have written to 13 AI firms demanding they protect children from sexually suggestive chatbot content.', 'url': 'https://finnhub.io/api/news?id=beae4eff89cbbac582eebe5b2a564df1ab0402115fab0f6ec44b4adcd3948cb6'}, {'category': 'company', 'datetime': 1756217611, 'headline': 'Apple internally discussed buying Mistral, Perplexity, the Information reports', 'id': 136529962, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Apple has trailed rivals such as Alphabet's Google and Samsung in terms of roll-out of AI features in its devices. CEO Tim Cook signaled last month that Apple was open to larger AI-related acquisitions to accelerate its roadmap, a shift from its historically conservative M&A posture. Perplexity, which is backed by Nvidia and Amazon founder Jeff Bezos, said it is unaware of any merger conversations including the company, aside from its own acquisitions.\", 'url': 'https://finnhub.io/api/news?id=9238d3913f4ea061860ef4435dc0e5662ad535c650c489b04e155b56238db7e5'}, {'category': 'company', 'datetime': 1756217332, 'headline': \"Apple To Invest $2.5 Billion For This Company's Glass, Making Its Shares Jump\", 'id': 136525500, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'This fiber-optics stock is in a buy zone after a positive earnings report. Shares are up 40% so far this year.', 'url': 'https://finnhub.io/api/news?id=ff60a2ae2dd68824095f1deab9962e8de096976d954b3edb4561105d00e430c6'}, {'category': 'company', 'datetime': 1756216626, 'headline': 'Only 19 Companies Have More Money Than Elon Musk — Which Are Worth Investing In?', 'id': 136525463, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'These 19 companies top Elon Musk in wealth. See which ones could be solid picks for your investment portfolio.', 'url': 'https://finnhub.io/api/news?id=4905c4e94e17d8585183949d95e9c37c7ddbc86c60581365e44ab2c72bd56384'}, {'category': 'company', 'datetime': 1756216248, 'headline': 'Trump vows retaliation against countries with digital rules targeting US tech', 'id': 136525502, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The Trump administration has long held the EU’s tech regulations in contempt.', 'url': 'https://finnhub.io/api/news?id=486e26a45bbbc11a274fd4612cdc325097aa3e314abca130893d90e6cf31b151'}, {'category': 'company', 'datetime': 1756206060, 'headline': 'Apple’s August Stock Revival Gives Hope to Concerned Investors', 'id': 136524134, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Shares of the tech giant entered August down 17% for the year due in part to concerns about the impact of President Donald Trump’s sweeping levies, which cost the company $800 million in its fiscal third quarter alone. The US president has long criticized Apple for its reliance on overseas production partners, at one point even threatening to punish the company with tariffs if it didn’t make its iPhones in the US. Then, at an event in the Oval Office on Aug. 6, Apple Chief Executive Officer Tim Cook committed to spending an additional $100 billion on manufacturing in the US.', 'url': 'https://finnhub.io/api/news?id=d4af929538b268228162d9bd3115adb945972a5278888c20ddcf0732ece89dc8'}, {'category': 'company', 'datetime': 1756215276, 'headline': \"Is the tide turning on the AI boom's myth of destiny?\", 'id': 136525465, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'For over a year, AI was gospel. Now, Wall Street, Silicon Valley, and regulators are asking the same question: What if it’s not?', 'url': 'https://finnhub.io/api/news?id=c93c2e83ece71b1b0d6f6ea8daae7246a98738e2c7aad1a53853d61b079ea23b'}, {'category': 'company', 'datetime': 1756215114, 'headline': 'Apple: Breakdown Of $600B Investment Commitment (Rating Downgrade)', 'id': 136527045, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/1705316992/image_1705316992.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': \"Apple's $600B US investment bolsters supply chain resilience, AI growth, and govt ties, minimizing risks.\", 'url': 'https://finnhub.io/api/news?id=001db74a945b3e627a70dce9199b32d4b815fdf4e9e58c7354aa60e4eb00f8ef'}, {'category': 'company', 'datetime': 1752586675, 'headline': 'S&P 500 stocks: List of additions and removals in 2025', 'id': 135946875, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'These stocks have been added or removed from the S&P 500 this year.', 'url': 'https://finnhub.io/api/news?id=c82b8aa916b7627eff6a48b9619bcb02464992951170719c78e81c3c1e3cd758'}, {'category': 'company', 'datetime': 1756214040, 'headline': 'Trump Takes Aim at Digital Taxes. What It Means for Tech Stocks.', 'id': 136525506, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Digital taxes largely hit U.S. firms such as Google-parent Alphabet, retailer Amazon, and Facebook-parent Meta.', 'url': 'https://finnhub.io/api/news?id=75278f14b5dfe4ab92541fb57c79de69ac9768b17c951ff637fe0d3865c3e459'}, {'category': 'company', 'datetime': 1756213680, 'headline': 'Atomic Data Expands Leadership Team', 'id': 136525507, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The Additions Will Accelerate Growth Across Three Operating CompaniesMINNEAPOLIS, Aug. 26, 2025 (GLOBE NEWSWIRE) -- Atomic Data, a leading IT services provider and technology teammate, has announced two key leadership appointments that reinforce its long-term strategic vision and strengthen its shared services operating model. Jay Bozicevich, a three-decade veteran of the financial services industry, will step into the dual roles of President of Atomic Data and Chief Operating Officer of Shared', 'url': 'https://finnhub.io/api/news?id=cf6f397f00502ab95b260e3bef757f58fa106e5105c39e77df9b8e0bd803d1ee'}, {'category': 'company', 'datetime': 1756213200, 'headline': 'Level Launches Level Lock Pro: The Ultimate Blend of Design, Performance, and Security', 'id': 136525508, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'REDWOOD CITY, Calif., August 26, 2025--Level, the company that redefined smart home today introduces Level Lock Pro, the ultimate in smart home performance, security and design. Level Lock Pro provides enhanced performance, security, and features such as door status detection to show when a door is left open, all while retaining the same award-winning invisible design Level is known for. There has never before been a smart lock that packs so much technology in the footprint of a traditional dead', 'url': 'https://finnhub.io/api/news?id=ba6aaa945fdf72d7b0ff6ec45454b30944831abf27e68bd11de8db5b8c1fa58e'}, {'category': 'company', 'datetime': 1756212744, 'headline': 'Apple Loses German Case On Green Marketing Pledge', 'id': 136525509, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Apple Watch can't be advertised as CO?-neutral, court rules\", 'url': 'https://finnhub.io/api/news?id=2ce75c880408058d8a276d83753fe01903ac146b8c6b12ab0e798d1b2418f5b2'}, {'category': 'company', 'datetime': 1756212272, 'headline': 'EU Defends Digital Taxes After Trump Calls Them Unfair on US', 'id': 136525510, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': '“It’s the sovereign right of the EU and its member states to regulate our economic activities on our territory that are consistent with our democratic values,” European Commission Spokeswoman Paula Pinho told reporters Tuesday in Brussels. Without specifying any government, Trump threatened export restrictions on US advanced technology and semiconductors and higher tariffs in retaliation for nations’ digital services taxes that hit American companies.', 'url': 'https://finnhub.io/api/news?id=7de834c2295cd83ee6630cf06bc371f15816a768702ce246a190d1133a4baa23'}, {'category': 'company', 'datetime': 1756212208, 'headline': 'Latest News In Cloud AI - Aurasell Transforms CRM Landscape With AI-Native Platform Launch', 'id': 136525493, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Aurasell has launched as the world's first AI-native CRM platform, introducing a significant shift in the landscape of cloud-based business software. The platform integrates a comprehensive suite of tools into a single system, aiming to eliminate the inefficiencies and high costs associated with traditional, fragmented CRM and go-to-market (GTM) systems. By leveraging AI, Aurasell provides enhanced automation and data unification, which can streamline operations from prospecting to contract...\", 'url': 'https://finnhub.io/api/news?id=207ea8323e1b58d3848a4374d82364443f6b0455e6408f0507c116e10ddbf39c'}, {'category': 'company', 'datetime': 1756211520, 'headline': 'AI Powers AR: Spotselfie Debuts Real-World Ad Marketplace for Brands & Creators', 'id': 136525512, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Spotselfie®, the self-funded AR real-world social metaverse with 16 issued patents, is rolling out its next-generation platform. This AI-powered creator marketplace lets brands and independent creators place GPS-anchored brand experiences in the real world. Built for mobile AR and the next wave of XR smart glasses, it opens new income streams for creators and delivers brands unmatched local targeting.', 'url': 'https://finnhub.io/api/news?id=90be422c09d26a51591bdec839617db7929d82f81f97ba77a05df28e656398a3'}, {'category': 'company', 'datetime': 1756210560, 'headline': 'Boring Is Better Than Amazon, Apple, and Alphabet. These 3 Stocks Prove It.', 'id': 136525495, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Torsten Sløk, the chief economist at Apollo Global Management, says some big tech stocks are being outdone by what might be considered ho-hum names.', 'url': 'https://finnhub.io/api/news?id=91abe67ba7809fa434c3ca366e8a93ff76cea29a866a1272fd1007da924b21f8'}, {'category': 'company', 'datetime': 1756206900, 'headline': 'Tech, Media & Telecom Roundup: Market Talk', 'id': 136525514, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Find insight on Samsung SDI, Cambricon Technologies, Nvidia and more in the latest Market Talks covering technology, media and telecom.', 'url': 'https://finnhub.io/api/news?id=6f3c57dee3ef235b9c03327c1368efb31c146d3c0770094cd015d9072c9ee71b'}, {'category': 'company', 'datetime': 1756204680, 'headline': 'Exploring Trends Across Asset Classes, Mega-Caps, And Banks', 'id': 136525746, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/1308271745/image_1308271745.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': \"Equities have stalled out in the last half of August as a buyer's strike ahead of the seasonally weak month of September takes hold. Click to read.\", 'url': 'https://finnhub.io/api/news?id=e261ed2b3678ac77557c1b354cdc074ed03a8137a6ce9fe9d83108f769ba1221'}, {'category': 'company', 'datetime': 1756204200, 'headline': 'Trump Fires Another Shot at the Fed. The Economy Could Be Collateral Damage.', 'id': 136525515, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Trade deals are still in flux, Musk sues Apple, OpenAI, Intel’s deal with U.S. comes with a catch, and more news to start your day.', 'url': 'https://finnhub.io/api/news?id=feea0a87baf07a24584e4e8b8248a325a74996a515c6f040e4bcbf11919f7830'}, {'category': 'company', 'datetime': 1756202400, 'headline': 'Apple-Google Likely Tie-Up for Siri Revamp Puts These ETFs in Focus', 'id': 136523788, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Apple and Google's AI talks lift both stocks, putting ETFs like IYW, FTEC, FCOM and VOX, with heavy exposure to the tech giants, in focus.\", 'url': 'https://finnhub.io/api/news?id=94c168d3e743b209b245da5b32ecc7207d844937d4d278cf72a515e5a0057625'}, {'category': 'company', 'datetime': 1756202400, 'headline': 'Circular Economy Market to Soar from $149.86 Billion in 2024 to $355.44 Billion by 2032, Driven by ESG Adoption and Recycling Innovation | Report by DataM Intelligence', 'id': 136523787, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'According to research report published by DataM Intelligence, \"The Circular Economy Market Size valued US$149.86 billion in 2024, is projected to reach US$355.44 billion by 2032, expanding at a robust CAGR of 11.40% from 2025 to 2032.\" Global concerns over waste management and resource scarcity are significantly driving the circular economy market, as nations and industries face the dual challenge of rising waste volumes and depleting raw materials.', 'url': 'https://finnhub.io/api/news?id=7ae834401cec373cbbebc6770403f421198ff3a98febd8a0a916ffaf4027c8bb'}, {'category': 'company', 'datetime': 1756202329, 'headline': \"Apple Watch not a 'CO2-neutral product,' German court finds\", 'id': 136523789, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'BERLIN (Reuters) -Apple can no longer advertise its Apple Watch as a \"CO2-neutral product\" in Germany, following a court ruling on Tuesday that upheld a complaint from environmentalists, finding that the U.S. tech company had misled consumers. Apple had promoted the device online as \"our first CO2-neutral product,\" a claim found by a panel of judges to be unfounded and in violation of German competition law, according to a statement from a regional court in Frankfurt. An Apple spokesperson said the court ruling \"broadly upheld our rigorous approach to carbon neutrality\" and declined to comment on whether the company would appeal Tuesday\\'s ruling.', 'url': 'https://finnhub.io/api/news?id=6bba43b58fbaa3325141222ddf982d019366b4f7af671d3278bcea9d588d4ec3'}, {'category': 'company', 'datetime': 1756199205, 'headline': 'Elon Musk’s xAI files lawsuit against Apple and OpenAI', 'id': 136523790, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"The lawsuit alleges Apple's ChatGPT integration sidelines rival apps such as xAI's Grok in App Store rankings.\", 'url': 'https://finnhub.io/api/news?id=d4ee4300cb2fbdea35e2495786189edac83b6f9f477ab491f5251d1a371f90e6'}, {'category': 'company', 'datetime': 1756198863, 'headline': \"Elon Musk Sues Apple, OpenAI Over iPhone AI 'Monopoly'\", 'id': 136523791, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"The lawsuit claims Apple and OpenAI's exclusive iPhone AI deal locks out rivals from 80% of the chatbot market.\", 'url': 'https://finnhub.io/api/news?id=eb6c93280471945b15f63b8433082dc950ee64a93ed4fedc248ad5d566b1c58b'}, {'category': 'company', 'datetime': 1756198800, 'headline': 'Labour accused of abandoning UK tech in AI push', 'id': 136523771, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Labour has been accused of abandoning British tech firms despite Sir Keir Starmer’s pledge to transform the country into an artificial intelligence (AI) powerhouse.', 'url': 'https://finnhub.io/api/news?id=afa0535831fcd97266559a9d37f57a658c3075f6d66955f03b2c79cb1ff64bb0'}, {'category': 'company', 'datetime': 1756198015, 'headline': 'Trump threatens tariffs on nations imposing digital taxes on US tech', 'id': 136523778, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The president said the taxes against US firms “give a complete pass to China’s largest tech companies”.View on euronews', 'url': 'https://finnhub.io/api/news?id=b776efdb64af47c5fe1e927b709c73cbe5c9c0d14ced2ac5e16a21f1476bbb8e'}, {'category': 'company', 'datetime': 1756197600, 'headline': \"Prediction: 2 Stocks That'll Be Worth More Than Berkshire Hathaway 5 Years From Now\", 'id': 136523779, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'These two megacap stocks have Berkshire Hathaway in their sights.', 'url': 'https://finnhub.io/api/news?id=f33417a3a5a437980a5180f2bf5f6287f63409452b581252b1955fcea7108cbc'}, {'category': 'company', 'datetime': 1756195620, 'headline': 'Wall Street Breakfast Podcast: Trump Fires Cook,\\xa0Threatens More Tariffs', 'id': 136524231, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/1717444876/image_1717444876.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': 'Trump fires Fed Governor Cook,Â\\xa0threatens more tariffs, andÂ\\xa0Hassett on Fed chair nominee.', 'url': 'https://finnhub.io/api/news?id=dfb538777ae981067d19edc7864c752efabdf58a28713289109d61c75297a09b'}, {'category': 'company', 'datetime': 1756193878, 'headline': 'Heard on the Street Monday Recap: Trump’s New Deal', 'id': 136523795, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'President Trump said he wants to pursue more deals like the government’s equity investment in Intel. The U.S. converted funds previously allocated for manufacturing expansion into a 9.9% stake in the chip maker. The government also obtained a five-year warrant, under which it could receive an additional 5% if Intel spins out or sells off its manufacturing operations.', 'url': 'https://finnhub.io/api/news?id=31535f8995229bc9f0c38c870b6e861a6d0c18dd7d1ea1cab9a0c56060fb920e'}, {'category': 'company', 'datetime': 1756192028, 'headline': \"Elon Musk's xAI sues Apple, OpenAI over competition claims\", 'id': 136523796, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'STORY: Elon Musk’s xAI is suing Apple and OpenAI over claims they conspired to thwart rivals on artificial intelligence.The suit was filed in a Texas court on Monday (August 26).It says the pair “locked up markets to maintain their monopolies” after Apple integrated OpenAI’s ChatGPT into its products.The suit says the partnership led the iPhone maker to promote ChatGPT in its app store, while limiting prominence for Musk’s competing chatbot Grok.In a social media post, Musk said “a million reviews with 4.9 average for Grok and still Apple refuses to mention Grok on any lists”.Apple didn’t respond to a request for comment on the suit.While OpenAI said the case was consistent with what it called Musk’s “ongoing pattern of harassment”.Some legal experts said Apple’s dominant position in the smartphone market could bolster xAI’s allegation that it was suppressing competition.But Ohio State University law professor Amy Schmitz cast doubt on some of Musk’s claims:“The fact remains that Grok is in the app store and it has ranked highly in some months. In fact, one report I looked at had it ranked at, I think, number one on the App Store in February of 2025, which shows that there is competition, right?”Musk cofounded OpenAI with Sam Altman in 2015.Its ChatGPT bot would later become the fastest-growing consumer application in history.But the pair fell out, and Musk went on to found the rival xAI.In a separate case, he’s suing the ChatGPT maker over its plan to convert from a nonprofit to a for-profit entity.', 'url': 'https://finnhub.io/api/news?id=20e1a5980ae6bfeaa51588fb7adf04a8a77455ce6b836af5680092325a6affbf'}, {'category': 'company', 'datetime': 1756191720, 'headline': 'Prediction: This Unstoppable Stock Will Join Nvidia, Microsoft, and Apple in the $3 Trillion Club Before 2028', 'id': 136523782, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Multiple avenues for growth will help this tech stalwart ascend to new heights.', 'url': 'https://finnhub.io/api/news?id=0a902a286165aa31474fa39cd6d738bff751ff0a50ada011825d386ccd1e8ec8'}, {'category': 'company', 'datetime': 1756184435, 'headline': 'How to close the menopause pay gap', 'id': 136523798, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Women experience an average 10% reduction in earnings by the fourth year following a menopause diagnosis.', 'url': 'https://finnhub.io/api/news?id=4a9e22064b284c05ab6ed13378a663bd282d07b3a51b0d5867a7b0d0b20b906d'}, {'category': 'company', 'datetime': 1756181665, 'headline': 'Trump vows retaliation against countries proposing digital taxes or regulation on American tech giants', 'id': 136523799, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The President seeks to curb rules taking aim at U.S. tech conglomerates', 'url': 'https://finnhub.io/api/news?id=ce623059cb32952ee4c09957bbb8fecad99152bf240a69a20402253669f856ee'}, {'category': 'company', 'datetime': 1756180826, 'headline': 'The $5.5bn cup of coffee', 'id': 136523800, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'One thing to start: Elon Musk’s xAI has sued Apple and OpenAI alleging they broke antitrust rules by thwarting competition in artificial intelligence...', 'url': 'https://finnhub.io/api/news?id=b784bf1bbf51f2a7ae66430e9a9fe87f284667b812b7af3558f0ad86558cc92e'}, {'category': 'company', 'datetime': 1756171860, 'headline': 'Phinge®, Home of Netverse® and Netaverse™ With Verified and Safer AI Announces \"Test the Waters\" Campaign for Potential Regulation A+ Offering', 'id': 136523801, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Phinge Corporation today announced its intention to gauge market interest for a potential Regulation A+ offering, referred to as \"testing the waters\" under SEC Rule 255.', 'url': 'https://finnhub.io/api/news?id=23effc0ec59ab92a7532012a0b3ec4f1493fc83f940cb4d7bdc783cc24d844ee'}, {'category': 'company', 'datetime': 1756168269, 'headline': \"Jeff Bezos Said He Would Have 'Felt Icky' Had He Taken Any More Shares Of Amazon: 'I Just Didn't Feel Good...'\", 'id': 136523802, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Jeff Bezos once revealed in an interview that he never needed more stock to stay motivated at Amazon.com and that asking for it would have felt \"icky.\" Jeff Bezos Was ‘Proud’ Of His Compensation Package At Amazon In a 2024 interview at The New York ...', 'url': 'https://finnhub.io/api/news?id=93c751516e3666864e8c2e9ae96f5d91f74e81629b54bd48d507cb0dc4368d85'}, {'category': 'company', 'datetime': 1756154463, 'headline': \"Elon Musk's xAI sues Apple and OpenAI over AI competition\", 'id': 136523803, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Elon Musk\\'s xAI seeks billions in damages from Apple and OpenAI for allegedly “perpetrating their anticompetitive scheme\"', 'url': 'https://finnhub.io/api/news?id=81d1ba51ee5956233684563e8c4b5b066a6bc8955c78796b911b419a6633806f'}, {'category': 'company', 'datetime': 1756153867, 'headline': 'Stock Market Today: Dow Drops, Apple Firm Despite Musk Threat; Cathie Wood Loads Up On This Stock (Live Coverage)', 'id': 136522222, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The Dow fell as Nvidia shined on the stock market today. Apple held up despite an Elon Musk AI move. Cathie Wood bought a diving stock.', 'url': 'https://finnhub.io/api/news?id=741cc617526e6af9d4f9f3bc5a38ad75e609a0e15933233540034f15031a65bc'}, {'category': 'company', 'datetime': 1756153307, 'headline': \"Elon Musk's X & xAI sue Apple & Open AI: What happens next?\", 'id': 136522261, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"X (formerly Twitter) and xAI (XAAI.PVT), owned by Tesla (TSLA) CEO Elon Musk, are suing Apple (AAPL) and OpenAI (OPAI.PVT). Musk's companies allege that Apple and OpenAI's partnership is anti-competitive and that the government should intervene due to antitrust laws. Yahoo Finance Senior Legal Reporter Alexis Keenan outlines the details of the suit. To watch more expert insights and analysis on the latest market action, check out more Market Domination.\", 'url': 'https://finnhub.io/api/news?id=7da38784a0869068ff9d0cb848412665a7729714621f73e14ae7b1b5bc3e5f30'}, {'category': 'company', 'datetime': 1756153296, 'headline': 'Why Apple Stock Could Sell Off After iPhone 17 Reveal', 'id': 136522262, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple stock could sell off after the company announces its iPhone 17 series smartphones next month, a Wall Street analyst said Monday.', 'url': 'https://finnhub.io/api/news?id=33011ae688343f7c45f9f05da64def83f3063e2686e7fa2da5d99883b981b78c'}, {'category': 'company', 'datetime': 1756152841, 'headline': \"Apple's Biggest iPhone Overhaul in a Decade Could Redefine the Stock's Next Growth Cycle\", 'id': 136522263, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Three years, three redesigns, foldables, AI-powered Siri, and a $100B services pivot -- Apple's next chapter begins.\", 'url': 'https://finnhub.io/api/news?id=554f3fddfdd67d0566bf7df68d092df224df5b41f44680af01e3a839730d68e8'}, {'category': 'company', 'datetime': 1756151760, 'headline': 'Apple no longer innovates — it waits. And with AI, anyone playing it safe will get left behind.', 'id': 136541521, 'image': '', 'related': 'AAPL', 'source': 'MarketWatch', 'summary': 'Apple no longer innovates — it waits. And with AI, anyone playing it safe will get left behind.', 'url': 'https://finnhub.io/api/news?id=272058be85f6596bdceae844d391faf2a80d7f1e1321f59ab01ab25b65b1400a'}, {'category': 'company', 'datetime': 1756151544, 'headline': 'Sector Update: Tech Stocks Mixed in Late Afternoon Trading', 'id': 136522229, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Tech stocks were mixed late Monday afternoon, with the Technology Select Sector SPDR Fund (XLK) frac', 'url': 'https://finnhub.io/api/news?id=2c0bfc5d0dd6af1cab926d1fd2505d8d19703009bdda35aef17ff2936d1bda65'}, {'category': 'company', 'datetime': 1756151528, 'headline': 'US Equity Indexes Mixed Amid Higher Treasury Yields, Dollar', 'id': 136522230, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'US equity indexes traded mixed heading into the close on Monday amid gains in both government bond y', 'url': 'https://finnhub.io/api/news?id=c702f097666c85b6e3990aac44ae65118eeb133cd08498eefa5f99174f46f849'}, {'category': 'company', 'datetime': 1756150843, 'headline': \"Inside Elon Musk's suit against Apple and OpenAI: 'This is a tale of two monopolists'\", 'id': 136522266, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Elon Musk followed through on Monday with a warning to sue Apple and OpenAI over their agreement to integrate OpenAI’s chatbot into Apple’s operating systems and prioritize the chatbot in its app store.', 'url': 'https://finnhub.io/api/news?id=bbb6426526db4acbd3ad432e567665510f3ece060f0b6d8a4dd0f3a7036d3ace'}, {'category': 'company', 'datetime': 1756147860, 'headline': 'Elon Musk’s xAI Sues Apple and OpenAI, Alleging They Are Monopolists', 'id': 136522267, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Musk said the partnership between the two companies has given the ChatGPT-maker access to “billions of user prompts.”', 'url': 'https://finnhub.io/api/news?id=c10d9f0635e4eb3fe91f2c5c05a1507f6a9aaeaf682671a9f0d6f767c60f9271'}, {'category': 'company', 'datetime': 1756147440, 'headline': 'Musk Sues OpenAI and Apple Over AI Access in App Store', 'id': 136522268, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'xAI filed suit against OpenAI and Apple, alleging anticompetitive behavior, according to a report from CNBC.', 'url': 'https://finnhub.io/api/news?id=3e8876dd844b1ac11ecfa0256361a8de7798d4d2629948be49edfbeeced54463'}, {'category': 'company', 'datetime': 1756146753, 'headline': 'Musk sues Apple and ChatGPT maker for ‘conspiring’ against him', 'id': 136522269, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Elon Musk has filed a lawsuit against Apple and ChatGPT maker OpenAI, accusing the companies of conspiring against his AI business.', 'url': 'https://finnhub.io/api/news?id=0dcf5c23d8b030b5e284a4fa60a5aabab4e2943880014f0b573c49c8fd96f2dc'}, {'category': 'company', 'datetime': 1756144729, 'headline': 'Elon Musk accuses Apple and OpenAI of stifling AI competition in antitrust lawsuit', 'id': 136522270, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Elon Musk on Monday targeted Apple and OpenAI in an antitrust lawsuit alleging that the iPhone maker and the ChatGPT maker are teaming up to thwart competition in artificial intelligence. The 61-page complaint filed in Texas federal court follows through on a threat that Musk made two weeks ago when he accused Apple of unfairly favoring OpenAI and ChatGPT in the iPhone's app store rankings for top AI apps. Musk's post insinuated that Apple had rigged the system against ChatGPT competitors such as the Grok chatbot made by his own xAI.\", 'url': 'https://finnhub.io/api/news?id=d53b55c1be0e7744d4bab3e799f1456ecca1191cdbe747fccc03753864f98cb9'}, {'category': 'company', 'datetime': 1756143185, 'headline': 'Sector Update: Tech Stocks Mixed Monday Afternoon', 'id': 136522248, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Tech stocks were mixed Monday afternoon, with the Technology Select Sector SPDR Fund (XLK) adding 0.', 'url': 'https://finnhub.io/api/news?id=4f72b52f62dbadbf3a017217986ed454470b3ce6dff0f140a7d02c16d36e871d'}, {'category': 'company', 'datetime': 1756143125, 'headline': 'US Equity Indexes Mixed as Nvidia Helps Lift Nasdaq Composite', 'id': 136522249, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'US equity indexes traded mixed after midday Monday, with the Nasdaq Composite eking out a gain amid', 'url': 'https://finnhub.io/api/news?id=97583c089a3ab8dbbfc9195508c38b6a74ebc23e472c43727b756eaa05a0dcf2'}, {'category': 'company', 'datetime': 1756143038, 'headline': 'Elon Musk’s xAI sues Apple and OpenAI, alleging anticompetitive collusion', 'id': 136522273, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'According to Musk, Apple and OpenAI are colluding to stifle competition from other AI companies.', 'url': 'https://finnhub.io/api/news?id=516a56dece05e72da77f994ec08b1f901e8a1a28c2f28f9a0c0b9412c42a8d70'}, {'category': 'company', 'datetime': 1756142987, 'headline': 'Elon Musk Sues Apple, OpenAI', 'id': 136522274, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Bloomberg\\'s Mark Gurman details the latest on Apple as Elon Musk files a lawsuit against the tech giant and OpenAI, accusing them of unfairly favoring OpenAI on its smartphones. He joins Caroline Hyde on \"Bloomberg Tech.\"', 'url': 'https://finnhub.io/api/news?id=071349467edabf0c07f743af2407158405cc21bc874e0e86ce02f4acd35995be'}, {'category': 'company', 'datetime': 1756141964, 'headline': \"Elon Musk sues Apple & OpenAI, Roblox rises, Alphabet's new high\", 'id': 136522275, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Yahoo Finance's John Hyland tracks Monday's top moving stocks and biggest market stories in this Market Minute: Tesla (TSLA) CEO and xAI (XAAI.PVT) founder Elon Musk suing Apple (AAPL) and OpenAI (OPAI.PVT), Roblox (RBLX) stock rallying, and Alphabet (GOOG, GOOGL) stock hitting a new record. Stay up to date on the latest market action, minute-by-minute, with Yahoo Finance's Market Minute.\", 'url': 'https://finnhub.io/api/news?id=cd37f083513a4b43ce601efcf627712b2ba7c6ced97d0b6ce53bb151c3b93deb'}, {'category': 'company', 'datetime': 1756141742, 'headline': \"Musk's X, xAI Sue Apple, OpenAI for Alleged 'Anticompetitive Scheme'\", 'id': 136522276, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Elon Musk\\'s companies X and xAI on Monday sued Apple and OpenAI in federal court, alleging they have engaged in an \"anticompetitive scheme\" that prevents competitors like xAI\\'s Grok from competing fairly and ascending the App Store charts.', 'url': 'https://finnhub.io/api/news?id=9e539309f995339b843e01c6ce1eb901aea061bde6652385aacec2c901748116'}, {'category': 'company', 'datetime': 1756140046, 'headline': \"Apple iPhone 17 Launch Could Trigger 'Sell The News' Reaction, Analyst Warns\", 'id': 136522277, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Apple Inc. (NASDAQ:AAPL) is gearing up for its next iPhone cycle with a September launch expected to spotlight a new ultra-thin iPhone 17 Air, but muted consumer buzz and restrained carrier promotions suggest the release may lack the blockbuster momentum of past product cycles. Bank of America Securities analyst Wamsi Mohan maintained a Buy rating on Apple (NASDAQ:AAPL) with a price forecast of $250. Mohan said expectations for Apple's next iPhone cycle remain modest despite reports suggesting a\", 'url': 'https://finnhub.io/api/news?id=e4ab774ba6dcf3899d4162abc2facb5d717884b38aef2e050ccb0da3ad3ab090'}, {'category': 'company', 'datetime': 1756139126, 'headline': 'American Eagle downgraded, Puma soars, Musk sues Apple & OpenAI', 'id': 136509512, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Market Catalysts host Allie Canal dives into what's driving interest in some of Monday's trending tickers on Yahoo Finance's platform, including American Eagle Outfitters (AEO), Puma (PUM.DE), Apple (AAPL), and OpenAI (OPAI.PVT). To watch more expert insights and analysis on the latest market action, check out more Market Catalysts.\", 'url': 'https://finnhub.io/api/news?id=624249acd2ebf5c12f5827252807b7ecb625e9f3357bbf43d1947fb2b2a2669d'}, {'category': 'company', 'datetime': 1756137739, 'headline': \"Musk's xAI sues Apple, OpenAI alleging antitrust violations\", 'id': 136522279, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Elon Musk's companies xAI and X filed a sweeping US antitrust lawsuit Monday against Apple and OpenAI, alleging the tech giants formed an illegal partnership to stifle competition in artificial intelligence and smartphone markets.The plaintiffs claim Apple holds 65 percent of the US smartphone market, while OpenAI controls at least 80 percent of the generative AI chatbot market through ChatGPT.\\nApple and OpenAI announced their partnership in June 2024, making ChatGPT the exclusive AI assistant a\", 'url': 'https://finnhub.io/api/news?id=4995a61d78bd0b891e214d004f7d3c718694b4b41939294746f2667f1e98297d'}, {'category': 'company', 'datetime': 1756129771, 'headline': 'Stock Market Today: Dow Falls Ahead Of Nvidia Earnings, Inflation Data; Palantir Sells Off (Live Coverage)', 'id': 136507733, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The Dow Jones index falls Monday ahead of Nvidia earnings and key inflation data. Palantir stock drops.', 'url': 'https://finnhub.io/api/news?id=683641b210c1124848bd7d6581630691a3455bdce5b964676579ed0e2d8aa9bc'}, {'category': 'company', 'datetime': 1756127340, 'headline': 'Apple Plans Foldable, Curved-Glass iPhones: Report. What It Means for the Stock.', 'id': 136507777, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The shares are in a slump as investors wait to see how the company integrates artificial intelligence with its flagship product.', 'url': 'https://finnhub.io/api/news?id=928c434fc143e6e69f0e54225b9c755fc9080278e8da14fe7586966936d419b5'}, {'category': 'company', 'datetime': 1756121820, 'headline': 'What Is the Highest Apple Stock Has Ever Been?', 'id': 136507778, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Apple's all-time high was reached in late 2024, and it is well below this level today.\", 'url': 'https://finnhub.io/api/news?id=9a00ef0f43eb87671050f652a9f1dd0f502d8732e636adc1a6e6f870b57c1713'}, {'category': 'company', 'datetime': 1755870060, 'headline': 'Suze Orman reveals her favorite stock right now and the investing mistake that shaped her strategy', 'id': 136487722, 'image': '', 'related': 'AAPL', 'source': 'MarketWatch', 'summary': 'Suze Orman reveals her favorite stock right now and the investing mistake that shaped her strategy', 'url': 'https://finnhub.io/api/news?id=03c9e876a9f29d950a1dfa70089118437b7e02856f9547f278c249c14c0797fb'}, {'category': 'company', 'datetime': 1756116566, 'headline': 'Could Apple’s (AAPL) Airline Move Reveal a New Approach to Audience Growth?', 'id': 136507780, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"In August 2025, United Airlines announced that full seasons of select Apple TV+ original series, including Severance and Ted Lasso, are now available for free on over 130,000 seatback screens and in the United app, significantly expanding the airline's inflight entertainment content. This partnership could boost awareness and trial of Apple TV+ among United travelers, broadening Apple’s services reach beyond traditional streaming audiences. We'll explore how Berkshire Hathaway’s sizable...\", 'url': 'https://finnhub.io/api/news?id=8d1ec568e2355141d78aad1cadc0dc78a7410789f281182fa35436398a4f81cf'}, {'category': 'company', 'datetime': 1756114020, 'headline': \"If You'd Invested $1,000 in SoFi Technologies (SOFI) Stock 3 Years Ago, Here's How Much You'd Have Today. (Spoiler: Wow.)\", 'id': 136507781, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Spoiler: You'd have a lot.\", 'url': 'https://finnhub.io/api/news?id=cc372f93fc694e46f10bb1bfac7534e774ec28014abef59053ca2fdc87cd1e9d'}, {'category': 'company', 'datetime': 1756111500, 'headline': 'IBM: The Retracement An Opportunity As IBM Has Transformed Its Business', 'id': 136507588, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/1445810162/image_1445810162.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': \"IBM's focus on hybrid cloud, AI, and innovation boosts growth potential. Discover why its undervalued shares offer income & capital appreciation.\", 'url': 'https://finnhub.io/api/news?id=bd07496ca6f4bf66e1a45fb96943d6eda47f5938fe184effb5ca3bd4c30d1ad1'}, {'category': 'company', 'datetime': 1756109296, 'headline': 'BDJ: This Fund Provides Diversification Benefits Along With A High Yield (Rating Downgrade)', 'id': 136507375, 'image': '', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': '', 'url': 'https://finnhub.io/api/news?id=638320c4013e8c18f47c802a7de2f3e0726a7af7dac1e8eae884dee0a4d4eeb2'}, {'category': 'company', 'datetime': 1756102306, 'headline': \"Apple: The Future Is Bright, But That Doesn't Mean To Buy\", 'id': 136507010, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/2203575435/image_2203575435.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': 'Apple shows robust growth and strong margins, driven by its services segment, but a high valuation tempers buy potential.', 'url': 'https://finnhub.io/api/news?id=31f874ee1dcdd39caf82979740b96b0578f9ab14109c20d15d7c1274b63c0b12'}, {'category': 'company', 'datetime': 1756088516, 'headline': 'ETV: Decent Price Right Now, But Not As Diversified As I Would Like', 'id': 136506262, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/2153687482/image_2153687482.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': \"ETV's strategy relies on writing index options, but its heavy technology weighting reduces diversification. Read why ETV CEF is a Hold.\", 'url': 'https://finnhub.io/api/news?id=e609d8759451296d6349d17fdd99438fa94156eeb9a23a86f2d0e912ae4441a0'}, {'category': 'company', 'datetime': 1756083600, 'headline': 'Tech Rally Shows Signs of Losing Steam', 'id': 136507772, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Nvidia and other stocks in the Magnificent Seven have been buffeted recently by growing doubts about their valuations and the potential of artificial intelligence.', 'url': 'https://finnhub.io/api/news?id=0f8fa3e29ac4bd95c89354949c4161a2d35db2381f83831109a9b2f473e5024f'}, {'category': 'company', 'datetime': 1756077120, 'headline': 'Prediction: All \"Ten Titans\" Stocks Will Surpass $1 Trillion in Market Cap by 2030', 'id': 136507773, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The Ten Titans already make up 38% of the S&P 500, but their share could grow if companies keep delivering on investor expectations.', 'url': 'https://finnhub.io/api/news?id=21506a32bd26bd2e8cb299d0693e1834738da72b97c33b4ccc8a045bbd406e21'}, {'category': 'company', 'datetime': 1756072815, 'headline': 'If you bought Bitcoin instead of every new iPhone, you’d have $250M', 'id': 136507784, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Bitcoin or iPhone, which investment would have paid more?', 'url': 'https://finnhub.io/api/news?id=2219010c26b8b851571c82f93c92505738ad14bc5c10403441a6544a640d2cd3'}, {'category': 'company', 'datetime': 1756066081, 'headline': 'Tracking Renaissance Technologies (RenTec) 13F Portfolio - Q2 2025 Update', 'id': 136504690, 'image': '', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': '', 'url': 'https://finnhub.io/api/news?id=5af03a9d2830ba72b2e198c9657b545ae8d7d8941028d9d6e3cde20a2dffefca'}, {'category': 'company', 'datetime': 1756065569, 'headline': 'Netflix’s ‘KPop Demon Hunters’ is probably the biggest movie in theaters', 'id': 136507785, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"This is Netflix's first time winning the domestic box office.\", 'url': 'https://finnhub.io/api/news?id=390d947eadec7e91d89abc8db8b332bcd287771bd8582c26f09c9b33d5e1ad3a'}, {'category': 'company', 'datetime': 1756058400, 'headline': \"Prediction: These 2 Trillion-Dollar Artificial Intelligence (AI) Stocks Could Strike a Megadeal That Wall Street Isn't Ready For\", 'id': 136502572, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Most of the \"Magnificent Seven\" companies have built and scaled legitimate artificial intelligence (AI) platforms, but two outliers in big tech remain.', 'url': 'https://finnhub.io/api/news?id=4aa61de7969df2e537fcbf75911a5d0975ee96cf94d45ea916556d38a6a8a54d'}, {'category': 'company', 'datetime': 1756051200, 'headline': 'Chinese backer of UK tech takeover accused of military ties', 'id': 136502573, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'A Chinese tech giant funding the takeover of a British semiconductor company has been accused of links to the country’s military.', 'url': 'https://finnhub.io/api/news?id=3b55f1aa895d7b89e582f60248f0424a158bb4d34316de66b42018335c7ae2bc'}, {'category': 'company', 'datetime': 1756047600, 'headline': 'The \"Ten Titans\" Stocks Now Make Up 38% of the S&P 500. Here\\'s What It Means for Your Investment Portfolio', 'id': 136502531, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Massive growth stocks are driving the performance of the S&P 500, for better or for worse.', 'url': 'https://finnhub.io/api/news?id=0beed2ea303bafdbcdee6489b172454ab0df5c2c868733b172d80693a4b795d7'}, {'category': 'company', 'datetime': 1756041990, 'headline': 'The Best Ways To Use the Apple Stocks App To Build Your Best Portfolio', 'id': 136502575, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Discover how Apple’s built-in Stocks app can help investing beginners track funds, set alerts and grow their investing skills.', 'url': 'https://finnhub.io/api/news?id=5ca7e4d33ae50bc068d77ba9e3f590dcd3ec53763ff7a803fc9da8abb40fc20c'}, {'category': 'company', 'datetime': 1756034640, 'headline': \"Here's How Many Shares of Apple Stock You'd Need for $10,000 in Yearly Dividends\", 'id': 136502576, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'This powerful consumer brand has found remarkable success because of its ongoing focus on innovation.', 'url': 'https://finnhub.io/api/news?id=b8be2c8adfc45a2581f853334d822802bab801a5392766dc7210bc22fd02c7a9'}, {'category': 'company', 'datetime': 1756033110, 'headline': 'Nvidia will deliver key earnings report this week', 'id': 136502538, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Check out the stocks that propelled last week's huge Dow rally.\", 'url': 'https://finnhub.io/api/news?id=7b86059d86ff84352acd6fae86a8258b87a44dd3f1d25102d65586b83cc7a8d5'}, {'category': 'company', 'datetime': 1756032600, 'headline': 'Why Is Warren Buffett Dumping Apple Stock Right Now?', 'id': 136502578, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Berkshire Hathaway has been rapidly reducing its Apple stock holdings. What's going on?\", 'url': 'https://finnhub.io/api/news?id=73ff48685f460de5f73fe6ecf015179bc929e73c78a4bed4aefadbf48985bb15'}, {'category': 'company', 'datetime': 1756028040, 'headline': 'Best Stock to Buy Right Now: Apple vs. Microsoft', 'id': 136502563, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Which of these roughly half-century-old companies presents a better investment opportunity?', 'url': 'https://finnhub.io/api/news?id=8a5e42a9d73e09b83190dc51513b368fd5f813da7aada8001706e41188f20fa0'}, {'category': 'company', 'datetime': 1756027390, 'headline': \"Ethereum's next upgrade: What you need to know\", 'id': 136502580, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Ethereum is gearing up for another major upgrade with the Fusaka hard fork, set for November 5', 'url': 'https://finnhub.io/api/news?id=b8308a5310cab511f1c7f66260442bcb62a56effedfb06262eb84d6b01983bd5'}, {'category': 'company', 'datetime': 1756022520, 'headline': '‘It’s almost tragic’: Bubble or not, the AI backlash is validating what one researcher and critic has been saying for years', 'id': 136502566, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Gary Marcus told Fortune that AI valuations remind him of Wile E Coyote. \"We are off the cliff.\"', 'url': 'https://finnhub.io/api/news?id=c02f68e789e6c621e714c92b71596e170bad8e3e5e606e8c3dc0c7c7d5e951be'}, {'category': 'company', 'datetime': 1756012944, 'headline': 'No Base iPhone in 2026 as Apple Bets Big on Foldable Launch', 'id': 136502582, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple Inc. (NASDAQ:AAPL) is among the best stocks to buy now according to AI. According to the report by South Korean outlet ETNews, Apple Inc. (NASDAQ:AAPL) will skip the launch schedule in 2026, breaking from its tradition by not releasing its base model. The reason is simple – it’s saving the spotlight for its first-ever […]', 'url': 'https://finnhub.io/api/news?id=808ae2d0c49ab9b03f5ff9655f9330c6676802665ea8750cf5937e302a0d3582'}, {'category': 'company', 'datetime': 1756012786, 'headline': 'Amazon AI Chip Executive Joins Arm to Build Complete Chips', 'id': 136502583, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Amazon.com, Inc. (NASDAQ:AMZN) is among the best stocks to buy now according to AI. On Monday, it was revealed that Arm Holdings has hired Rami Sinno, artificial intelligence chip director at Amazon.com, Inc. (NASDAQ:AMZN), in an effort to develop its own complete chips. Up to this point, Arm has not developed its own chips; rather, […]', 'url': 'https://finnhub.io/api/news?id=2c4675a4789aea76a1abe4ded69dab761cf657957e5b375d54245308b9a8cda2'}, {'category': 'company', 'datetime': 1756011644, 'headline': \"'We quit our jobs to launch a £2.5m tequila cocktail business'\", 'id': 136502584, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Co-founders Alice Parmiter and Wynter Karo quit their corporate jobs to launch premium tequila cocktail brand Pimentae.', 'url': 'https://finnhub.io/api/news?id=6d5de702003b9d1be6bd2638afa73d0025eaf761609e9f36f47ef9ec5d753072'}, {'category': 'company', 'datetime': 1755988028, 'headline': '3 Reasons You Should Buy Apple Stock Ahead of a Major Product Launch', 'id': 136502585, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'When it comes to the rise and fall of Apple stock, there are a number of catalysts investors look out for, and one of them is product launches. Apple consistently moves the market with their new...', 'url': 'https://finnhub.io/api/news?id=94beb6b43d176186a159a51c9c3deeda2a003e3c97a587160b4d0c7c7b64b3cf'}, {'category': 'company', 'datetime': 1755967620, 'headline': 'Prediction: This Quantum Computing Stock Will Still Be Worth More Than Berkshire Hathaway, Palantir, and Tesla Combined in 2030', 'id': 136495839, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Quantum computing could become the next frontier of the artificial intelligence revolution.', 'url': 'https://finnhub.io/api/news?id=963004d4b5e80bab2c5fff729f22be257f34cf9ebb2bedd4c494b9da856a2d25'}, {'category': 'company', 'datetime': 1755964802, 'headline': 'Should You Buy Nvidia Stock Before August 27?', 'id': 136497749, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'While U.S.-China tensions continue, Nvidia remains the undisputed king of AI hardware.', 'url': 'https://finnhub.io/api/news?id=98f85b2449e45b2ff2677d9b64411d13507b8092f83be42f053ed7cdaabb7cb8'}, {'category': 'company', 'datetime': 1755958200, 'headline': 'Warren Buffett Is Selling Apple and Bank of America and Piling Into This Beaten Down Value Stock Instead', 'id': 136495877, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'This stock looks like a classic \"bear greedy when others are fearful\" investment.', 'url': 'https://finnhub.io/api/news?id=aea4c08e323cb64a8b592182ebcbde4ebf32768cce3245433c496ead6e48207f'}, {'category': 'company', 'datetime': 1755957919, 'headline': 'This week in Trumponomics: A government hedge fund?', 'id': 136495842, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Trump wants to nationalize Intel and make other big companies do his bidding. Everybody fine with that?', 'url': 'https://finnhub.io/api/news?id=7197f4b7e60502eeab5cbd8a0a8f7b4c4e183277572e2ee0635531c7ecf46a26'}, {'category': 'company', 'datetime': 1755950400, 'headline': 'How Tech Is Tackling the New Age-Verification Rules', 'id': 136495879, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Selfies, government IDs and AI are all being used by companies in an effort to adhere to new laws and regulations aimed at protecting children.', 'url': 'https://finnhub.io/api/news?id=2ebcad4799efbcb2a4e34a0eec8c391bf65a92be17fe05d73e0f8b732927209d'}, {'category': 'company', 'datetime': 1755943669, 'headline': 'Foxconn’s Recall of More Chinese Staff Tests Apple’s India Push', 'id': 136495880, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The extraction of Chinese workers from the factory of Yuzhan Technology, a Foxconn component unit, in southern Tamil Nadu state is the second such move in a few months. Foxconn has started flying in Taiwanese engineers to replace staff leaving, people familiar with the matter said, asking not to be named as the information is private. Earlier this year, officials in Beijing verbally encouraged regulatory agencies and local governments to curb technology transfers and equipment exports to India and Southeast Asia in what is a potential attempt to prevent companies from shifting manufacturing elsewhere.', 'url': 'https://finnhub.io/api/news?id=ce0350a1cada1abfc2638e13fd6f5ce5d031693e9c391e8c7d25d188f75d151a'}, {'category': 'company', 'datetime': 1755943531, 'headline': 'Did Trump save Intel? Not really, analysts say.', 'id': 136495849, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'SAN FRANCISCO (Reuters) -U.S. President Donald Trump is injecting nearly $9 billion into Intel in exchange for a 9.9% equity stake. What Intel needs is external customers for its so-called cutting-edge 14A manufacturing process - a tough ask, at least in the short term. CEO Lip Bu Tan, who took the top job in March, warned last month that the company may have to quit the chip contracting business if it does not land any big clients.', 'url': 'https://finnhub.io/api/news?id=f9dc938c9ab927a7ae254533f06a600f1daf54df8050ee606becea6f1ec5df0b'}, {'category': 'company', 'datetime': 1755941400, 'headline': 'Warren Buffett Is Selling Apple Stock Again. Should You Follow His Lead?', 'id': 136495882, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Buffett hadn't sold Apple stock in nearly a year.\", 'url': 'https://finnhub.io/api/news?id=67a819077623f6d8344de845e6097c7d733def259f5a1be9305512e41bc53398'}, {'category': 'company', 'datetime': 1755936600, 'headline': \"Goodbye Growth? Here's What I'm Buying As Value Mounts A Comeback\", 'id': 136493917, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/2193071535/image_2193071535.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': 'Recent underperformance in growth tech stocks reflects doubts about AI, while value-oriented dividend stocks have shown resilience and defensiveness. See more here.', 'url': 'https://finnhub.io/api/news?id=cd45534dafc843f5318537f56c7fad06e00d25a8e4c8fbf6789d1ab654d988d8'}, {'category': 'company', 'datetime': 1755935280, 'headline': 'Is Apple Stock Your Ticket to Becoming a Millionaire?', 'id': 136495883, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Shares of the tech giant have produced a total return of 68,660% in the past three decades.', 'url': 'https://finnhub.io/api/news?id=d2eec603ce17842f284932a4a3e5c03aff9daa6de5e5d86ddb6af845553352f9'}, {'category': 'company', 'datetime': 1755930600, 'headline': 'Brace for a Second China Shock. Advanced Manufacturing Is at Risk.', 'id': 136495884, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The U.S. could face a second version of the “China shock” that hollowed out parts of the U.S. manufacturing sector, according to Dan Wang, a veteran China technology analyst. The first China shock kept prices low for Americans and boosted corporate profitability. It also helped China transform into a more formidable rival, feeding the current frictions in the U.S.-China relationship.', 'url': 'https://finnhub.io/api/news?id=850292052d1c0a7a2f63dfb7d5c37273a14e9bc420558fbc9ca6bd344ab50a71'}, {'category': 'company', 'datetime': 1755925257, 'headline': 'The Guns N’ Roses-inspired company helping to make job search less soul-crushing', 'id': 136495885, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'As a fan of rock band Gun N’ Roses, Jérémy Clédat wanted to start his company with a name that resonated with the global job search market.', 'url': 'https://finnhub.io/api/news?id=01ebf524fba8ec60e739cfab45a16b7d5294a516e1158a9db36238ffab7015cd'}, {'category': 'company', 'datetime': 1755921418, 'headline': 'Apple (AAPL) off the Hook on Britain’s iPhone ‘Backdoor’ Push', 'id': 136495886, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple Inc. (NASDAQ:AAPL) is one of the best stocks to buy according to billionaire Ken Fisher. On August 19, U.S. Director of National Intelligence Tulsi Gabbard, confirmed that Britain has dropped its demand for the company to provide a backdoor to its encrypted devices. British authorities were pushing the iPhone maker to provide a backdoor […]', 'url': 'https://finnhub.io/api/news?id=a98cd2b33fc9c36638974f17b290dc1f9f9a5c17ae1a7662d24e54cd8f5f3662'}, {'category': 'company', 'datetime': 1755913206, 'headline': 'Bernstein Reiterates Market Perform on Alphabet (GOOGL) Amid AI Competition', 'id': 136495887, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Alphabet Inc. (NASDAQ:GOOGL) is one of the Must-Watch AI Stocks for Investors. On August 19, Bernstein SocGen Group analyst Mark Shmulik reiterated a Market Perform rating on the stock with a $185.00 price target. Drawing parallels between the current artificial intelligence landscape and the mobile platform wars of the early 2010s, the firm noted that they […]', 'url': 'https://finnhub.io/api/news?id=52e18599d510ed5d44cc4be72d8bce573a555e0a3d6b252b19a42c7a6cb4f948'}, {'category': 'company', 'datetime': 1755909000, 'headline': 'Prediction: This Unstoppable Stock Will Join Nvidia, Microsoft, and Apple in the $3 Trillion Club Before 2029', 'id': 136495867, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'This tech giant is firing on all cylinders.', 'url': 'https://finnhub.io/api/news?id=06994cc452da8b68a81d3fd95c7879eb25b2ad61afb29c7393e040155999f3e9'}, {'category': 'company', 'datetime': 1755901072, 'headline': 'Apple Explores Using Google Gemini AI to Power Siri', 'id': 136495889, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple is in early talks to use Google\\'s Gemini to power a revamped Siri, a potential step toward outsourcing more AI technology. Bloomberg\\'s Mark Gurman speaks with Vonnie Quinn and Caroline Hyde on \"The Close\" about Apple\\'s next moves.', 'url': 'https://finnhub.io/api/news?id=c363ca48e9308ec13ce2347c2fc1cd4819e52806ed374d2df3427bef570f13d1'}, {'category': 'company', 'datetime': 1755896497, 'headline': \"Dow Hits Record High as Powell's Dovish Tilt Fuels Stock Market Rally\", 'id': 136495871, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Wall Street's equity indexes rallied on Friday, with the Dow Jones Industrial Average hitting a reco\", 'url': 'https://finnhub.io/api/news?id=c45ffc6ab579368ee4943ead165a214976c8fd630c32c9e71cd71bd0eb4b2699'}, {'category': 'company', 'datetime': 1755895238, 'headline': 'Apple-Google Talks Heating Up Over Siri-Gemini IPhone Agreement?', 'id': 136495891, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Google stock rose Friday amid a report Apple and Alphabet are in talks over a Gemini-Siri iPhone deal as well as a Meta cloud computing pact.', 'url': 'https://finnhub.io/api/news?id=7bdfa9590bbf6abc5c8bae96c1af4c0d60442f4a5eec8f6169a0bb11714408eb'}, {'category': 'company', 'datetime': 1755894360, 'headline': 'Apple Looks at Using Gemini for AI, Report Says. Alphabet Stock Jumps.', 'id': 136495892, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Alphabet stock jumped to a record high Friday afternoon after a report said Apple is exploring using Google’s Gemini to run the highly anticipated Siri voice assistant. Bloomberg reported that the iPhone maker has approached Google to look into possibly building a custom artificial-intelligence model that would be the foundation of the long-awaited AI-powered Siri. Shares of Alphabet climbed 3.2% to $206.09.', 'url': 'https://finnhub.io/api/news?id=b7caed03521886a7c082609b0a414963bb97e1a8291cc7d3a2f6509f6ff7e550'}, {'category': 'company', 'datetime': 1755892834, 'headline': 'Apple gets ready for AI in the enterprise with new ChatGPT configuration options', 'id': 136495893, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple will let businesses configure ChatGPT enterprise access in the fall.', 'url': 'https://finnhub.io/api/news?id=ff16d935a7e5e70d4af11beac775853b8403fc5f2ca7ac8ae912094e619e5c7d'}, {'category': 'company', 'datetime': 1755892096, 'headline': 'Apple May Use Google AI to Power Revamped Siri', 'id': 136495894, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Apple is in early discussions about using Google Gemini to power a revamped version of its Siri voice assistant. The work is part of an effort to catch up in generative AI, a field where the company arrived late and then struggled to gain traction. Bloomberg's Denitsa Tsekova reports.\", 'url': 'https://finnhub.io/api/news?id=10cb0d9b54ab072a06079afacfbaa7e40b93ffdeeb1addc9744763603cd2ff39'}, {'category': 'company', 'datetime': 1755891483, 'headline': 'Ethereum, Gap, Apple: Trending tickers', 'id': 136495895, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Market Domination Host Josh Lipton and Prairie Operating Co. EVP of market strategy Lou Basenese discuss some of the day's top trending tickers, including Etherium (ETH-USD), Gap (GAP), and Apple (AAPL). To watch more expert insights and analysis on the latest market action, check out more Market Domination.\", 'url': 'https://finnhub.io/api/news?id=513c75a2bddffce5c5da870e661aadeafdcfe6e8b9e9f2fbf9f1cfd5ddec103b'}, {'category': 'company', 'datetime': 1755885259, 'headline': 'Apple reportedly wants Google’s Gemini to power new Siri', 'id': 136478817, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Investing.com -- Apple Inc (NASDAQ:AAPL). is said to be exploring the possibility of using Google’s Gemini model to power a revamped version of its Siri voice assistant, potentially outsourcing more of its artificial intelligence technology.', 'url': 'https://finnhub.io/api/news?id=139913ae884d4863c0bbcee60a33d4d4d9f1e1fbc699de4f12026bbdb69cd234'}, {'category': 'company', 'datetime': 1755885159, 'headline': 'MP Materials (MP) Surges 247% Over Last Quarter Amid Market Optimism', 'id': 136478818, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"MP Materials (MP) has showcased significant developments, including improved quarterly sales and a notable partnership with Apple to supply rare earth magnets. However, despite better sales figures, the company's ongoing losses reflect its challenging financial landscape. While the shares of MP surged 247% over the last quarter, the broader market also saw upward momentum, highlighted by optimism from potential interest rate cuts indicated by Fed Chair Powell. The news of strategic buyback...\", 'url': 'https://finnhub.io/api/news?id=c0a05d2b9539b4bcd299176f87094a644b42b9779339447aa52c38680f183729'}, {'category': 'company', 'datetime': 1755883746, 'headline': \"Stock Market Today: Dow Soars 900 Points As Fed's Powell Raises Rate-Cut Hopes; Nvidia Earnings Loom (Live Coverage)\", 'id': 136478797, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The Dow Jones soared to an all-time Friday on increased hopes of a rate cut at the September Federal Reserve meeting.', 'url': 'https://finnhub.io/api/news?id=a805579fc4172735f665585fd7d8d2a3aee69a6e9ed896a0dacacba43613f053'}, {'category': 'company', 'datetime': 1755883350, 'headline': \"Apple in talks to use Google's Gemini AI to power revamped Siri, Bloomberg News reports\", 'id': 136478822, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Alphabet's shares were up 3.7% while Apple's stock was up 1.6%, both extending gains in afternoon trading following the report. Apple recently approached Alphabet's Google to develop a custom AI model to power a redesigned Siri next year, the report said. Apple remains weeks from deciding whether to stick with in-house Siri models or switch to an external partner, and it has not yet chosen a partner.\", 'url': 'https://finnhub.io/api/news?id=d3f01a1dc2bd8cd8fa3dca65439ad99cb28cdf8a1b5e063380b30e92c19949a6'}, {'category': 'company', 'datetime': 1755883164, 'headline': \"Apple's latest security update directly hits crypto users\", 'id': 136478824, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple urges users to immediately update their devices. Here is how it impacts crypto users.', 'url': 'https://finnhub.io/api/news?id=43dc0a0ae76e081ac38f1854ea4461d80362a55dfa7f6c726aafc7c5b3c1ef44'}, {'category': 'company', 'datetime': 1755883110, 'headline': 'Apple Explores Using Google Gemini AI to Power Revamped Siri', 'id': 136478826, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The iPhone maker recently approached Alphabet Inc.’s Google to explore building a custom AI model that would serve as the foundation of the new Siri next year, according to people familiar with he matter. Google has started training a model that could run on Apple’s servers, said the people, who asked not to be identified because the discussions are private. Earlier this year, Apple also explored partnerships with Anthropic PBC and OpenAI, weighing whether Claude or ChatGPT could serve as Siri’s new brain.', 'url': 'https://finnhub.io/api/news?id=5e934c677d156a05ca72ffc602338342dc5957ea7a3940b1c7f3c9f7cd140763'}, {'category': 'company', 'datetime': 1755883020, 'headline': 'Dell Technologies vs. Apple: Which PC Maker Stock is a Better Buy?', 'id': 136478827, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'DELL or AAPL, which PC maker is a better pick, given the strong demand for AI-powered devices amid rising tariffs?', 'url': 'https://finnhub.io/api/news?id=985c2070d00aa745e59ca55a11d5cf8f10bccddc7ea2a5b87f42435be096d554'}, {'category': 'company', 'datetime': 1755882000, 'headline': 'Y Combinator says Apple’s App Store has hindered startup growth', 'id': 136478829, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Y Combinator is asking the court to deny Apple’s appeal.', 'url': 'https://finnhub.io/api/news?id=5d2b4f1964b618a05375b8680527bf6bc517f240daa4d5075c2794a020440546'}, {'category': 'company', 'datetime': 1755881142, 'headline': 'Masimo files lawsuit against US border patrol amid Apple patent dispute', 'id': 136478830, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Masimo contests that US border patrol inaction over prohibiting the import of Apple Watch’s determined to include features that infringe on its light-based pulse oximetry technology is unlawful.', 'url': 'https://finnhub.io/api/news?id=a12e0b45d7d58437876740c7036ac6c966f4dc171bb3912cc877fe0001f2811c'}, {'category': 'company', 'datetime': 1755870090, 'headline': 'Stock Market Today: Dow Jones Index Rises Ahead Of Big Powell Speech; Nvidia Falls On AI Chip News (Live Coverage)', 'id': 136476309, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"The Dow Jones index rose Friday ahead of Fed Chair Powell's speech. Nvidia stock fell on AI chip news, while Palantir also dropped.\", 'url': 'https://finnhub.io/api/news?id=e0f20dd04abda6bce17068f4b17e56a1a8dcc47f435d132d48fde56d027940e5'}, {'category': 'company', 'datetime': 1755872329, 'headline': 'Apple just indirectly boosted the value of its all-in-one subscription service', 'id': 136478832, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Apple hiked the price of Apple TV+ earlier this week, the third time it’s done so since 2019.', 'url': 'https://finnhub.io/api/news?id=472c9b6e27318765aa4454bee42e36228b952463214fa850d0eb8520c24ea1c0'}, {'category': 'company', 'datetime': 1755872220, 'headline': 'Meta Doubles Down on ‘Superintelligence’ Investment. It’s Good News for AI Stocks.', 'id': 136478814, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Meta Platforms is “investing more and more” into its artificial-intelligence efforts according to chief AI officer Alexandr Wang.', 'url': 'https://finnhub.io/api/news?id=574da7668862eeecb690af573b4e31a3d1517185457513bc7b9f6d0ea9108559'}, {'category': 'company', 'datetime': 1755871202, 'headline': 'How To Make An Iron Condor Fly With Options On Apple Stock', 'id': 136476454, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Apple has had some up-and-down price action, and it's a good bet it will go sideways. This could make for an iron condor setup.\", 'url': 'https://finnhub.io/api/news?id=7222792f96523088014e91d64f3462b712538e9071a0bb7ac00b2dfdb4c592a0'}, {'category': 'company', 'datetime': 1755871200, 'headline': 'Meet the Unstoppable Vanguard ETF With 55% Invested in \"Ten Titans\" Growth Stocks', 'id': 136476419, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The Vanguard S&P 500 Growth ETF has especially high weightings in select \"Ten Titans\" stocks.', 'url': 'https://finnhub.io/api/news?id=5ca186cfc0502126d6873ca3ceec89c7428c922342b104a6f94ff4b550759b22'}, {'category': 'company', 'datetime': 1755870571, 'headline': 'Meta Hires Another Apple AI Leader Amid Headcount Freeze, Report Says', 'id': 136476456, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Meta Platforms is reportedly hiring another senior AI executive from Apple for its Meta Superintelligence Labs, where it is moving to freeze headcount.', 'url': 'https://finnhub.io/api/news?id=03aa9b139c6a4ad64e005804e63597136c919603c45a2cd4352e19874da2e23e'}, {'category': 'company', 'datetime': 1755868678, 'headline': 'What If You’d Invested $500 in Apple Stock Instead of Buying the First iPhone?', 'id': 136476457, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The very first iPhone customers got plenty of use and enjoyment out of it, but they might have felt even better if they had invested that money in Apple stock.', 'url': 'https://finnhub.io/api/news?id=be031bbd19fc281a4c21acc193a683e5434e5f7d0d0e24e9ca71c8477134e368'}, {'category': 'company', 'datetime': 1755866651, 'headline': 'Latest News In Cloud AI - AI-Powered Security Boosts Cloud Protection in New Partnership', 'id': 136476439, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Radware and EPIC Cloud Company have entered into a Managed Security Service Provider (MSSP) agreement aimed at enhancing cloud application security through AI-powered solutions. This collaboration allows EPIC Cloud to integrate Radware’s advanced security services into their offerings, thereby bolstering protection for cloud-based applications and data. Radware’s service includes a comprehensive security platform featuring web application firewalls, bot management, API protection, and DDoS...', 'url': 'https://finnhub.io/api/news?id=314fd848df66c32f01bc147fc013d5799bff38e4d2c32d3c6a92d1dd11874575'}, {'category': 'company', 'datetime': 1755863178, 'headline': \"Mark Zuckerberg Halts AI Hiring After Million-Dollar Talent Poaching Sparks Investor Backlash Amid Meta's 'Superintelligence Efforts:' Report\", 'id': 136476459, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Meta Platforms Inc. (NASDAQ:META) has implemented a hiring freeze in its artificial intelligence division following months of aggressive recruitment that included nine-figure compensation packages. Hiring Moratorium Follows Talent War Spending The ...', 'url': 'https://finnhub.io/api/news?id=8392d7b0547d3be92c922c19b5b9bd2c19f89bd4d75b0cad5df90a38cb53c227'}, {'category': 'company', 'datetime': 1755863100, 'headline': 'Could Uber Become a Trillion-Dollar Company One Day?', 'id': 136476443, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Uber is quietly becoming one of the most powerful transport infrastructure companies.', 'url': 'https://finnhub.io/api/news?id=1a88598da212691416aa7304d8d80ba3f4a1799f409e0516ddd06f76997742b7'}, {'category': 'company', 'datetime': 1755861140, 'headline': 'Russia mandates pre-installation of MAX app', 'id': 136476461, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'The app is designed to integrate with various government services.', 'url': 'https://finnhub.io/api/news?id=ab881b4b983e5a4c86ee13cbc6b2dbcd43f3e5ebe97eabdce44243da948f2b89'}, {'category': 'company', 'datetime': 1755858809, 'headline': \"Broadcom's AI Push Gains Speed With Microsoft, Meta, And Apple Pouring Billions Into Data Infrastructure\", 'id': 136476321, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Broadcom Inc. (NASDAQ:AVGO) is riding the artificial intelligence boom as soaring Big Tech investments in data infrastructure fuel demand for its custom chips and networking solutions, propelling the stock to strong year-to-date gains even as the company faces regulatory challenges in Europe. The custom chipmaker has surged 25% year-to-date, outpacing the NASDAQ Composite’s 9% gain, as booming demand for its networking and Application-Specific Integrated Circuit (ASIC) businesses positions the c', 'url': 'https://finnhub.io/api/news?id=b4fc561e1ea668faf67baf1d647f0ee877585164271fb7c5eaa8eda827e5caa6'}, {'category': 'company', 'datetime': 1755857452, 'headline': 'Investors zero in on Nvidia results as US tech stocks waver', 'id': 136476450, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"NEW YORK (Reuters) -A wobble in U.S. technology shares has raised the stakes for Nvidia Corp's quarterly results on Wednesday, with earnings from the semiconductor giant posing a crucial test for the scorching AI trade. The benchmark S&P 500 has pulled back this week from record levels, dragged lower by a roughly 3% drop so far this week in the heavyweight tech sector after a huge run for the group. Fueled by its dominant artificial intelligence (AI) products, Nvidia's massive share price gains have buoyed both the tech sector and the overall market in recent years.\", 'url': 'https://finnhub.io/api/news?id=8e0bae9104c2d5c3445963999e6df31717d9966102ad20374b5d1646d468c1d4'}, {'category': 'company', 'datetime': 1755856544, 'headline': '6 Stocks That Turned $1,000 Initial Investments Into Millions by Mid-2025', 'id': 136476464, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'These 6 stocks turned modest $1K investments into millions by mid-2025. See which companies delivered massive returns.', 'url': 'https://finnhub.io/api/news?id=066447d8e4c79d6dc79a1f3d956f70e2f43f3a8d059cc46665f961522bf3648d'}, {'category': 'company', 'datetime': 1755853743, 'headline': 'Should CEO pay be capped? Readers have their say', 'id': 136476465, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Pay for CEOs at FTSE 100 firms has hit a record high for the third year in a row, raising questions about equity and fairness.', 'url': 'https://finnhub.io/api/news?id=171ce63d87c11410ef52b55c53490aeee7a4389be2ea324c1cfbfa50c06fc116'}, {'category': 'company', 'datetime': 1755852300, 'headline': 'Do Extreme Concentration And Bad Breadth Signify A Bubble?', 'id': 136475952, 'image': '', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': '', 'url': 'https://finnhub.io/api/news?id=7157f6bce8ab4cae4100f74e195d5e82876e640cbc5f8436d773bb24af2eee88'}, {'category': 'company', 'datetime': 1755850500, 'headline': 'BNY Mellon Equity Income Fund Q2 2025 Commentary', 'id': 136475862, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/2158808037/image_2158808037.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': 'BNY Mellon Equity Income Fund returned -3.31% during the first quarter of 2025. Click here to read more.', 'url': 'https://finnhub.io/api/news?id=49d43786806274bdfd92a192f7ae853e14fd9144cdadf9898889b5496ea6be41'}, {'category': 'company', 'datetime': 1755850413, 'headline': 'FTSE 100 LIVE: Stocks eke out gains as traders await key Jackson Hole speech from Federal Reserve chair', 'id': 136476324, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'Traders look for comments that could help confirm expectations that a US interest rate cut is on the cards.', 'url': 'https://finnhub.io/api/news?id=86dfe633de7c66a75f0be7a6a3f1d3edf5360d215952aa1d0201f141758d78a4'}, {'category': 'company', 'datetime': 1755849060, 'headline': \"Billionaire Warren Buffett Sold 69% of Berkshire's Stake in Apple and Has Loaded Up on This Industry-Leading Stock for 4 Straight Quarters\", 'id': 136476467, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"The Oracle of Omaha is paring down his No. 1 holding, yet again, in favor of a company that's delivered a nearly 48,000% total return since it went public.\", 'url': 'https://finnhub.io/api/news?id=e8e188c0ad3059e6099a6e54429a1a0668c28439de8808827a8dced673eb4c33'}, {'category': 'company', 'datetime': 1755838802, 'headline': 'IBM head of research on how quantum computing will change businesses', 'id': 136476468, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"IBM's Alessandro Curioni says companies must act now to gain an edge from quantum computing.\", 'url': 'https://finnhub.io/api/news?id=2bc8ddfcbb9c7ee49ef066106ef1d70077e630f55f9e2c01828995feadef7955'}, {'category': 'company', 'datetime': 1755837281, 'headline': 'Apple makes move sure to frustrate loyal customers', 'id': 136476469, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Apple's services division is a huge moneymaker and the company is milking it for all it's worth.\", 'url': 'https://finnhub.io/api/news?id=9099051383c0d494301133812162f480bc17fa1987c0999552108ee8c98e5f96'}, {'category': 'company', 'datetime': 1755830400, 'headline': \"The Visible Alpha AI Monitor Update: What's Next For AI?\", 'id': 136474705, 'image': 'https://static.seekingalpha.com/cdn/s3/uploads/getty_images/2151904577/image_2151904577.jpg?io=getty-c-w1536', 'related': 'AAPL', 'source': 'SeekingAlpha', 'summary': 'The Visible Alpha AI Monitor aggregates publicly traded US technology companies, providing a comprehensive measure of the current state and projected growth of the core AI industry.', 'url': 'https://finnhub.io/api/news?id=6fefae13e9d9825b6cf0023b8e57db778fe619013fbe6242efa6e859633469e7'}, {'category': 'company', 'datetime': 1755826084, 'headline': 'Meta makes huge cloud computing deal with Google: source', 'id': 136476470, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': \"Meta has made a cloud computing deal with Google worth more than $10 billion over the course of six years, a source close to the transaction told AFP Thursday.Google parent Alphabet's cloud computing business was on pace to bring in $50 billion over the course of the year, the company said in a recent earnings report.\", 'url': 'https://finnhub.io/api/news?id=c16a5b49617a847ebffe2155701fc8c66b73d16b6238a4e45affc5c246c2d67f'}, {'category': 'company', 'datetime': 1755820705, 'headline': 'Trump administration is not eyeing equity in TSMC, Micron, official says', 'id': 136476471, 'image': 'https://s.yimg.com/rz/stage/p/yahoo_finance_en-US_h_p_finance_2.png', 'related': 'AAPL', 'source': 'Yahoo', 'summary': 'WASHINGTON (Reuters) -The Trump administration is considering taking equity stakes in companies getting funds from the 2022 CHIPS Act but has no similar plans for bigger firms boosting U.S. investments, such as TSMC and Micron, a White House official told Reuters. The official confirmed a Wall Street Journal report that the administration does not intend to seek equity stakes in semiconductor companies, such as Micron and TSMC, that plan to step up investment.', 'url': 'https://finnhub.io/api/news?id=d551c06b88c15bfad192c4d46a69b45d12c9af5300867d14d6d4d269e122b1e9'}]\n", - "2025-08-29 02:30:06,375 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "2025-08-29 02:30:39,933 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "2025-08-29 02:30:39,939 [INFO] Executing tool: get_market_news with args: {'category': 'forex'}\n", - "2025-08-29 02:30:39,941 [INFO] Tool get_market_news called for category 'forex'\n", - "2025-08-29 02:30:40,166 [INFO] Tool get_market_news [{'category': 'forex', 'datetime': 1756412432, 'headline': \"Trump official announces 'transitory' taxes for the next six months\", 'id': 7510362, 'image': 'https://images.investinglive.com/images/Tariff%20Trump_id_6a2dc517-dc8d-4e19-84db-f22c99095372_size975.jpg', 'related': '', 'source': 'Forexlive', 'summary': \"

Senior Trump administration official:

  • Package shipments to U.S. to face flat duties of $80–$200 for six months before shifting to specific duty rates

This is in relation to Trump's removal of the 'de minimis' exemption on buying low value products from overseas. US consumers will now be taxed a minimum of $80, and up to $200, for ordering such items from offshore now.

More now, senior Trump administration official:

  • CBP has collected over $492 million in additional duties on packages from China and Hong Kong since de minimis exemption was ended for them
  • Engaged with foreign partners to ensure there is minimal disruption to shipments
  • Britain, Canada, Ukraine have said there will be no interruption in mail coming to U.S
  • There will not be any exceptions to the end of the de minimis exemption.
\\n This article was written by Eamonn Sheridan at investinglive.com.\", 'url': 'https://investinglive.com/news/trump-official-announces-transitory-taxes-for-the-next-six-months-20250828/'}]\n", - "2025-08-29 02:30:56,552 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n" + "2025-08-30 15:06:03,572 [INFO] HTTP Request: GET https://api.gradio.app/pkg-version \"HTTP/1.1 200 OK\"\n", + "2025-08-30 15:06:07,415 [INFO] \n", + "Messages:\n", + "{'role': 'user', 'content': 'apple stock earnings?'}\n", + "\n", + "2025-08-30 15:06:07,971 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "2025-08-30 15:06:07,979 [INFO] Executing tool: get_current_time with args: {}\n", + "2025-08-30 15:06:08,580 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "2025-08-30 15:06:08,782 [INFO] Executing tool: get_earnings_calendar with args: {'symbol': 'AAPL', '_from': '2025-07-30', 'to': '2025-08-30'}\n", + "2025-08-30 15:06:08,785 [INFO] Tool get_earnings_calendar called for AAPL from 2025-07-30 to 2025-08-30\n", + "2025-08-30 15:06:10,398 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "2025-08-30 15:06:16,366 [INFO] \n", + "Messages:\n", + "{'role': 'user', 'metadata': None, 'content': 'apple stock earnings?', 'options': None}\n", + "{'role': 'assistant', 'metadata': None, 'content': 'Apple (AAPL) reported its Q3 2025 earnings on July 31, 2025, after market close. \\n- Actual EPS: $1.57 (estimate was $1.46) \\n- Actual Revenue: $94.04 billion (estimate was about $91.3 billion)', 'options': None}\n", + "{'role': 'user', 'content': 'nvidia q1 earnings'}\n", + "\n", + "2025-08-30 15:06:17,205 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "2025-08-30 15:06:17,221 [INFO] Executing tool: get_current_time with args: {}\n", + "2025-08-30 15:06:17,775 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "2025-08-30 15:06:18,023 [INFO] Executing tool: get_earnings_calendar with args: {'symbol': 'NVDA', '_from': '2025-05-01', 'to': '2025-08-30'}\n", + "2025-08-30 15:06:18,026 [INFO] Tool get_earnings_calendar called for NVDA from 2025-05-01 to 2025-08-30\n", + "2025-08-30 15:06:18,842 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "2025-08-30 15:06:28,656 [INFO] \n", + "Messages:\n", + "{'role': 'user', 'metadata': None, 'content': 'apple stock earnings?', 'options': None}\n", + "{'role': 'assistant', 'metadata': None, 'content': 'Apple (AAPL) reported its Q3 2025 earnings on July 31, 2025, after market close. \\n- Actual EPS: $1.57 (estimate was $1.46) \\n- Actual Revenue: $94.04 billion (estimate was about $91.3 billion)', 'options': None}\n", + "{'role': 'user', 'metadata': None, 'content': 'nvidia q1 earnings', 'options': None}\n", + "{'role': 'assistant', 'metadata': None, 'content': \"NVIDIA's most recent earnings were for Q2 2026, reported on August 27, 2025: \\n- EPS: $1.05 (estimate was about $1.03) \\n- Revenue: $46.7 billion (estimate was about $46.98 billion) \\n\\nQ1 2026 earnings data is not in the recent range. Would you like details for a different quarter or time frame?\", 'options': None}\n", + "{'role': 'user', 'content': 'q1 2025'}\n", + "\n", + "2025-08-30 15:06:29,790 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "2025-08-30 15:06:29,805 [INFO] Executing tool: get_earnings_calendar with args: {'symbol': 'NVDA', '_from': '2025-01-01', 'to': '2025-03-31'}\n", + "2025-08-30 15:06:29,807 [INFO] Tool get_earnings_calendar called for NVDA from 2025-01-01 to 2025-03-31\n", + "2025-08-30 15:06:29,808 [INFO] Executing tool: get_current_time with args: {}\n", + "2025-08-30 15:06:30,404 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "2025-08-30 15:06:38,997 [INFO] \n", + "Messages:\n", + "{'role': 'user', 'metadata': None, 'content': 'apple stock earnings?', 'options': None}\n", + "{'role': 'assistant', 'metadata': None, 'content': 'Apple (AAPL) reported its Q3 2025 earnings on July 31, 2025, after market close. \\n- Actual EPS: $1.57 (estimate was $1.46) \\n- Actual Revenue: $94.04 billion (estimate was about $91.3 billion)', 'options': None}\n", + "{'role': 'user', 'metadata': None, 'content': 'nvidia q1 earnings', 'options': None}\n", + "{'role': 'assistant', 'metadata': None, 'content': \"NVIDIA's most recent earnings were for Q2 2026, reported on August 27, 2025: \\n- EPS: $1.05 (estimate was about $1.03) \\n- Revenue: $46.7 billion (estimate was about $46.98 billion) \\n\\nQ1 2026 earnings data is not in the recent range. Would you like details for a different quarter or time frame?\", 'options': None}\n", + "{'role': 'user', 'metadata': None, 'content': 'q1 2025', 'options': None}\n", + "{'role': 'assistant', 'metadata': None, 'content': \"I cannot retrieve NVIDIA's Q1 2025 earnings because the data must be from within the last month. I can help with more recent earnings or other stock info if you want.\", 'options': None}\n", + "{'role': 'user', 'content': 'microsoft?'}\n", + "\n", + "2025-08-30 15:06:40,071 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "2025-08-30 15:06:40,327 [INFO] Executing tool: get_current_time with args: {}\n", + "2025-08-30 15:06:40,328 [INFO] Executing tool: get_company_financials with args: {'symbol': 'MSFT'}\n", + "2025-08-30 15:06:40,330 [INFO] Tool get_company_financials called for MSFT\n", + "2025-08-30 15:06:41,437 [INFO] Executing tool: get_earnings_calendar with args: {'symbol': 'MSFT', '_from': '2025-08-01', 'to': '2025-08-29'}\n", + "2025-08-30 15:06:41,439 [INFO] Tool get_earnings_calendar called for MSFT from 2025-08-01 to 2025-08-29\n", + "2025-08-30 15:06:42,284 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "2025-08-30 15:06:47,742 [INFO] \n", + "Messages:\n", + "{'role': 'user', 'metadata': None, 'content': 'apple stock earnings?', 'options': None}\n", + "{'role': 'assistant', 'metadata': None, 'content': 'Apple (AAPL) reported its Q3 2025 earnings on July 31, 2025, after market close. \\n- Actual EPS: $1.57 (estimate was $1.46) \\n- Actual Revenue: $94.04 billion (estimate was about $91.3 billion)', 'options': None}\n", + "{'role': 'user', 'metadata': None, 'content': 'nvidia q1 earnings', 'options': None}\n", + "{'role': 'assistant', 'metadata': None, 'content': \"NVIDIA's most recent earnings were for Q2 2026, reported on August 27, 2025: \\n- EPS: $1.05 (estimate was about $1.03) \\n- Revenue: $46.7 billion (estimate was about $46.98 billion) \\n\\nQ1 2026 earnings data is not in the recent range. Would you like details for a different quarter or time frame?\", 'options': None}\n", + "{'role': 'user', 'metadata': None, 'content': 'q1 2025', 'options': None}\n", + "{'role': 'assistant', 'metadata': None, 'content': \"I cannot retrieve NVIDIA's Q1 2025 earnings because the data must be from within the last month. I can help with more recent earnings or other stock info if you want.\", 'options': None}\n", + "{'role': 'user', 'metadata': None, 'content': 'microsoft?', 'options': None}\n", + "{'role': 'assistant', 'metadata': None, 'content': 'Microsoft (MSFT) key financials: \\n- Market Cap: $3.79 trillion \\n- P/E Ratio (TTM): 37.23 \\n- EPS (TTM): $13.64 \\n- Dividend Yield: 0.65% \\n- 52-Week Range: $344.79 – $555.45 \\n\\nNo Q1 2025 or recent earnings releases found within August 2025. Would you like info on a different date or other details?', 'options': None}\n", + "{'role': 'user', 'content': 'latest earnings'}\n", + "\n", + "2025-08-30 15:06:48,343 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "2025-08-30 15:06:48,368 [INFO] Executing tool: get_current_time with args: {}\n", + "2025-08-30 15:06:48,985 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "2025-08-30 15:06:49,242 [INFO] Executing tool: get_earnings_calendar with args: {'symbol': 'MSFT', '_from': '2025-07-30', 'to': '2025-08-30'}\n", + "2025-08-30 15:06:49,243 [INFO] Tool get_earnings_calendar called for MSFT from 2025-07-30 to 2025-08-30\n", + "2025-08-30 15:06:49,956 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "2025-08-30 15:06:59,770 [INFO] \n", + "Messages:\n", + "{'role': 'user', 'metadata': None, 'content': 'apple stock earnings?', 'options': None}\n", + "{'role': 'assistant', 'metadata': None, 'content': 'Apple (AAPL) reported its Q3 2025 earnings on July 31, 2025, after market close. \\n- Actual EPS: $1.57 (estimate was $1.46) \\n- Actual Revenue: $94.04 billion (estimate was about $91.3 billion)', 'options': None}\n", + "{'role': 'user', 'metadata': None, 'content': 'nvidia q1 earnings', 'options': None}\n", + "{'role': 'assistant', 'metadata': None, 'content': \"NVIDIA's most recent earnings were for Q2 2026, reported on August 27, 2025: \\n- EPS: $1.05 (estimate was about $1.03) \\n- Revenue: $46.7 billion (estimate was about $46.98 billion) \\n\\nQ1 2026 earnings data is not in the recent range. Would you like details for a different quarter or time frame?\", 'options': None}\n", + "{'role': 'user', 'metadata': None, 'content': 'q1 2025', 'options': None}\n", + "{'role': 'assistant', 'metadata': None, 'content': \"I cannot retrieve NVIDIA's Q1 2025 earnings because the data must be from within the last month. I can help with more recent earnings or other stock info if you want.\", 'options': None}\n", + "{'role': 'user', 'metadata': None, 'content': 'microsoft?', 'options': None}\n", + "{'role': 'assistant', 'metadata': None, 'content': 'Microsoft (MSFT) key financials: \\n- Market Cap: $3.79 trillion \\n- P/E Ratio (TTM): 37.23 \\n- EPS (TTM): $13.64 \\n- Dividend Yield: 0.65% \\n- 52-Week Range: $344.79 – $555.45 \\n\\nNo Q1 2025 or recent earnings releases found within August 2025. Would you like info on a different date or other details?', 'options': None}\n", + "{'role': 'user', 'metadata': None, 'content': 'latest earnings', 'options': None}\n", + "{'role': 'assistant', 'metadata': None, 'content': 'Microsoft has not reported any earnings releases in the last month up to August 30, 2025. Would you like me to check a different date range or provide recent earnings for another company?', 'options': None}\n", + "{'role': 'user', 'content': 'nvidia'}\n", + "\n", + "2025-08-30 15:07:00,871 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "2025-08-30 15:07:00,901 [INFO] Executing tool: get_current_time with args: {}\n", + "2025-08-30 15:07:01,680 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "2025-08-30 15:07:01,944 [INFO] Executing tool: get_earnings_calendar with args: {'symbol': 'NVDA', '_from': '2025-07-30', 'to': '2025-08-30'}\n", + "2025-08-30 15:07:01,947 [INFO] Tool get_earnings_calendar called for NVDA from 2025-07-30 to 2025-08-30\n", + "2025-08-30 15:07:02,980 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n" ] } ], "source": [ - "gr.ChatInterface(fn=chat, type=\"messages\", title=\"TickerBot\", description=\"Ask about stock prices, company profiles and market news!\").launch(debug=True)" + "gr.ChatInterface(fn=chat, type=\"messages\", title=\"TickerBot\", description=\"Ask about stock prices, company financials and market news!\").launch()" ] }, { "cell_type": "code", "execution_count": null, - "id": "ef238ae3-353f-462f-a7f7-2378cc482edb", + "id": "5c014d6f-820d-4d58-8527-7d703aad3399", "metadata": {}, "outputs": [], "source": [] @@ -810,525 +1102,10 @@ { "cell_type": "code", "execution_count": null, - "id": "09d7f664-7252-4fa0-b817-10dbda83e3f1", + "id": "40c77d61-3e90-4708-b360-fb58b4211e9b", "metadata": {}, "outputs": [], "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6cd3c913-c486-4d33-8f3d-c110e127fe66", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "id": "473e5b39-da8f-4db1-83ae-dbaca2e9531e", - "metadata": {}, - "source": [ - "# Let's go multi-modal!!\n", - "\n", - "We can use DALL-E-3, the image generation model behind GPT-4o, to make us some images\n", - "\n", - "Let's put this in a function called artist.\n", - "\n", - "### Price alert: each time I generate an image it costs about 4 cents - don't go crazy with images!" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2c27c4ba-8ed5-492f-add1-02ce9c81d34c", - "metadata": {}, - "outputs": [], - "source": [ - "# Some imports for handling images\n", - "\n", - "import base64\n", - "from io import BytesIO\n", - "from PIL import Image" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "773a9f11-557e-43c9-ad50-56cbec3a0f8f", - "metadata": {}, - "outputs": [], - "source": [ - "def artist(city):\n", - " image_response = openai.images.generate(\n", - " model=\"dall-e-3\",\n", - " prompt=f\"An image representing a vacation in {city}, showing tourist spots and everything unique about {city}, in a vibrant pop-art style\",\n", - " size=\"1024x1024\",\n", - " n=1,\n", - " response_format=\"b64_json\",\n", - " )\n", - " image_base64 = image_response.data[0].b64_json\n", - " image_data = base64.b64decode(image_base64)\n", - " return Image.open(BytesIO(image_data))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d877c453-e7fb-482a-88aa-1a03f976b9e9", - "metadata": {}, - "outputs": [], - "source": [ - "image = artist(\"New York City\")\n", - "display(image)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "728a12c5-adc3-415d-bb05-82beb73b079b", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "id": "f4975b87-19e9-4ade-a232-9b809ec75c9a", - "metadata": {}, - "source": [ - "## Audio (NOTE - Audio is optional for this course - feel free to skip Audio if it causes trouble!)\n", - "\n", - "And let's make a function talker that uses OpenAI's speech model to generate Audio\n", - "\n", - "### Troubleshooting Audio issues\n", - "\n", - "If you have any problems running this code below (like a FileNotFound error, or a warning of a missing package), you may need to install FFmpeg, a very popular audio utility.\n", - "\n", - "**For PC Users**\n", - "\n", - "Detailed instructions are [here](https://chatgpt.com/share/6724efee-6b0c-8012-ac5e-72e2e3885905) and summary instructions:\n", - "\n", - "1. Download FFmpeg from the official website: https://ffmpeg.org/download.html\n", - "\n", - "2. Extract the downloaded files to a location on your computer (e.g., `C:\\ffmpeg`)\n", - "\n", - "3. Add the FFmpeg bin folder to your system PATH:\n", - "- Right-click on 'This PC' or 'My Computer' and select 'Properties'\n", - "- Click on 'Advanced system settings'\n", - "- Click on 'Environment Variables'\n", - "- Under 'System variables', find and edit 'Path'\n", - "- Add a new entry with the path to your FFmpeg bin folder (e.g., `C:\\ffmpeg\\bin`)\n", - "- Restart your command prompt, and within Jupyter Lab do Kernel -> Restart kernel, to pick up the changes\n", - "\n", - "4. Open a new command prompt and run this to make sure it's installed OK\n", - "`ffmpeg -version`\n", - "\n", - "**For Mac Users**\n", - "\n", - "1. Install homebrew if you don't have it already by running this in a Terminal window and following any instructions: \n", - "`/bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\"`\n", - "\n", - "2. Then install FFmpeg with `brew install ffmpeg`\n", - "\n", - "3. Verify your installation with `ffmpeg -version` and if everything is good, within Jupyter Lab do Kernel -> Restart kernel to pick up the changes\n", - "\n", - "Message me or email me at ed@edwarddonner.com with any problems!" - ] - }, - { - "cell_type": "markdown", - "id": "4cc90e80-c96e-4dd4-b9d6-386fe2b7e797", - "metadata": {}, - "source": [ - "## To check you now have ffmpeg and can access it here\n", - "\n", - "Excecute the next cell to see if you get a version number. (Putting an exclamation mark before something in Jupyter Lab tells it to run it as a terminal command rather than python code).\n", - "\n", - "If this doesn't work, you may need to actually save and close down your Jupyter lab, and start it again from a new Terminal window (Mac) or Anaconda prompt (PC), remembering to activate the llms environment. This ensures you pick up ffmpeg.\n", - "\n", - "And if that doesn't work, please contact me!" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7b3be0fb-1d34-4693-ab6f-dbff190afcd7", - "metadata": {}, - "outputs": [], - "source": [ - "!ffmpeg -version\n", - "!ffprobe -version\n", - "!ffplay -version" - ] - }, - { - "cell_type": "markdown", - "id": "d91d3f8f-e505-4e3c-a87c-9e42ed823db6", - "metadata": {}, - "source": [ - "# For Mac users - and possibly many PC users too\n", - "\n", - "This version should work fine for you. It might work for Windows users too, but you might get a Permissions error writing to a temp file. If so, see the next section!\n", - "\n", - "As always, if you have problems, please contact me! (You could also comment out the audio talker() in the later code if you're less interested in audio generation)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ffbfe93b-5e86-4e68-ba71-b301cd5230db", - "metadata": {}, - "outputs": [], - "source": [ - "from pydub import AudioSegment\n", - "from pydub.playback import play\n", - "\n", - "def talker(message):\n", - " response = openai.audio.speech.create(\n", - " model=\"tts-1\",\n", - " voice=\"onyx\", # Also, try replacing onyx with alloy\n", - " input=message\n", - " )\n", - " \n", - " audio_stream = BytesIO(response.content)\n", - " audio = AudioSegment.from_file(audio_stream, format=\"mp3\")\n", - " play(audio)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b88d775d-d357-4292-a1ad-5dc5ed567281", - "metadata": {}, - "outputs": [], - "source": [ - "talker(\"Well, hi there\")" - ] - }, - { - "cell_type": "markdown", - "id": "ad89a9bd-bb1e-4bbb-a49a-83af5f500c24", - "metadata": {}, - "source": [ - "# For Windows users (or any Mac users with problems above)\n", - "\n", - "## First try the Mac version above, but if you get a permissions error writing to a temp file, then this code should work instead.\n", - "\n", - "A collaboration between students Mark M. and Patrick H. and Claude got this resolved!\n", - "\n", - "Below are 4 variations - hopefully one of them will work on your PC. If not, message me please!\n", - "\n", - "And for Mac people - all 3 of the below work on my Mac too - please try these if the Mac version gave you problems.\n", - "\n", - "## PC Variation 1" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d104b96a-02ca-4159-82fe-88e0452aa479", - "metadata": {}, - "outputs": [], - "source": [ - "import base64\n", - "from io import BytesIO\n", - "from PIL import Image\n", - "from IPython.display import Audio, display\n", - "\n", - "def talker(message):\n", - " response = openai.audio.speech.create(\n", - " model=\"tts-1\",\n", - " voice=\"onyx\",\n", - " input=message)\n", - "\n", - " audio_stream = BytesIO(response.content)\n", - " output_filename = \"output_audio.mp3\"\n", - " with open(output_filename, \"wb\") as f:\n", - " f.write(audio_stream.read())\n", - "\n", - " # Play the generated audio\n", - " display(Audio(output_filename, autoplay=True))\n", - "\n", - "talker(\"Well, hi there\")" - ] - }, - { - "cell_type": "markdown", - "id": "3a5d11f4-bbd3-43a1-904d-f684eb5f3e3a", - "metadata": {}, - "source": [ - "## PC Variation 2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d59c8ebd-79c5-498a-bdf2-3a1c50d91aa0", - "metadata": {}, - "outputs": [], - "source": [ - "import tempfile\n", - "import subprocess\n", - "from io import BytesIO\n", - "from pydub import AudioSegment\n", - "import time\n", - "\n", - "def play_audio(audio_segment):\n", - " temp_dir = tempfile.gettempdir()\n", - " temp_path = os.path.join(temp_dir, \"temp_audio.wav\")\n", - " try:\n", - " audio_segment.export(temp_path, format=\"wav\")\n", - " time.sleep(3) # Student Dominic found that this was needed. You could also try commenting out to see if not needed on your PC\n", - " subprocess.call([\n", - " \"ffplay\",\n", - " \"-nodisp\",\n", - " \"-autoexit\",\n", - " \"-hide_banner\",\n", - " temp_path\n", - " ], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)\n", - " finally:\n", - " try:\n", - " os.remove(temp_path)\n", - " except Exception:\n", - " pass\n", - " \n", - "def talker(message):\n", - " response = openai.audio.speech.create(\n", - " model=\"tts-1\",\n", - " voice=\"onyx\", # Also, try replacing onyx with alloy\n", - " input=message\n", - " )\n", - " audio_stream = BytesIO(response.content)\n", - " audio = AudioSegment.from_file(audio_stream, format=\"mp3\")\n", - " play_audio(audio)\n", - "\n", - "talker(\"Well hi there\")" - ] - }, - { - "cell_type": "markdown", - "id": "96f90e35-f71e-468e-afea-07b98f74dbcf", - "metadata": {}, - "source": [ - "## PC Variation 3" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8597c7f8-7b50-44ad-9b31-db12375cd57b", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "from pydub import AudioSegment\n", - "from pydub.playback import play\n", - "from io import BytesIO\n", - "\n", - "def talker(message):\n", - " # Set a custom directory for temporary files on Windows\n", - " custom_temp_dir = os.path.expanduser(\"~/Documents/temp_audio\")\n", - " os.environ['TEMP'] = custom_temp_dir # You can also use 'TMP' if necessary\n", - " \n", - " # Create the folder if it doesn't exist\n", - " if not os.path.exists(custom_temp_dir):\n", - " os.makedirs(custom_temp_dir)\n", - " \n", - " response = openai.audio.speech.create(\n", - " model=\"tts-1\",\n", - " voice=\"onyx\", # Also, try replacing onyx with alloy\n", - " input=message\n", - " )\n", - " \n", - " audio_stream = BytesIO(response.content)\n", - " audio = AudioSegment.from_file(audio_stream, format=\"mp3\")\n", - "\n", - " play(audio)\n", - "\n", - "talker(\"Well hi there\")" - ] - }, - { - "cell_type": "markdown", - "id": "e821224c-b069-4f9b-9535-c15fdb0e411c", - "metadata": {}, - "source": [ - "## PC Variation 4\n", - "\n", - "### Let's try a completely different sound library\n", - "\n", - "First run the next cell to install a new library, then try the cell below it." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "69d3c0d9-afcc-49e3-b829-9c9869d8b472", - "metadata": {}, - "outputs": [], - "source": [ - "!pip install simpleaudio" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "28f9cc99-36b7-4554-b3f4-f2012f614a13", - "metadata": {}, - "outputs": [], - "source": [ - "from pydub import AudioSegment\n", - "from io import BytesIO\n", - "import tempfile\n", - "import os\n", - "import simpleaudio as sa\n", - "\n", - "def talker(message):\n", - " response = openai.audio.speech.create(\n", - " model=\"tts-1\",\n", - " voice=\"onyx\", # Also, try replacing onyx with alloy\n", - " input=message\n", - " )\n", - " \n", - " audio_stream = BytesIO(response.content)\n", - " audio = AudioSegment.from_file(audio_stream, format=\"mp3\")\n", - "\n", - " # Create a temporary file in a folder where you have write permissions\n", - " with tempfile.NamedTemporaryFile(suffix=\".wav\", delete=False, dir=os.path.expanduser(\"~/Documents\")) as temp_audio_file:\n", - " temp_file_name = temp_audio_file.name\n", - " audio.export(temp_file_name, format=\"wav\")\n", - " \n", - " # Load and play audio using simpleaudio\n", - " wave_obj = sa.WaveObject.from_wave_file(temp_file_name)\n", - " play_obj = wave_obj.play()\n", - " play_obj.wait_done() # Wait for playback to finish\n", - "\n", - " # Clean up the temporary file afterward\n", - " os.remove(temp_file_name)\n", - " \n", - "talker(\"Well hi there\")" - ] - }, - { - "cell_type": "markdown", - "id": "7986176b-cd04-495f-a47f-e057b0e462ed", - "metadata": {}, - "source": [ - "## PC Users - if none of those 4 variations worked!\n", - "\n", - "Please get in touch with me. I'm sorry this is causing problems! We'll figure it out.\n", - "\n", - "Alternatively: playing audio from your PC isn't super-critical for this course, and you can feel free to focus on image generation and skip audio for now, or come back to it later." - ] - }, - { - "cell_type": "markdown", - "id": "1d48876d-c4fa-46a8-a04f-f9fadf61fb0d", - "metadata": {}, - "source": [ - "# Our Agent Framework\n", - "\n", - "The term 'Agentic AI' and Agentization is an umbrella term that refers to a number of techniques, such as:\n", - "\n", - "1. Breaking a complex problem into smaller steps, with multiple LLMs carrying out specialized tasks\n", - "2. The ability for LLMs to use Tools to give them additional capabilities\n", - "3. The 'Agent Environment' which allows Agents to collaborate\n", - "4. An LLM can act as the Planner, dividing bigger tasks into smaller ones for the specialists\n", - "5. The concept of an Agent having autonomy / agency, beyond just responding to a prompt - such as Memory\n", - "\n", - "We're showing 1 and 2 here, and to a lesser extent 3 and 5. In week 8 we will do the lot!" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ba820c95-02f5-499e-8f3c-8727ee0a6c0c", - "metadata": {}, - "outputs": [], - "source": [ - "def chat(history):\n", - " messages = [{\"role\": \"system\", \"content\": system_message}] + history\n", - " response = openai.chat.completions.create(model=MODEL, messages=messages, tools=tools)\n", - " image = None\n", - " \n", - " if response.choices[0].finish_reason==\"tool_calls\":\n", - " message = response.choices[0].message\n", - " response, city = handle_tool_call(message)\n", - " messages.append(message)\n", - " messages.append(response)\n", - " image = artist(city)\n", - " response = openai.chat.completions.create(model=MODEL, messages=messages)\n", - " \n", - " reply = response.choices[0].message.content\n", - " history += [{\"role\":\"assistant\", \"content\":reply}]\n", - "\n", - " # Comment out or delete the next line if you'd rather skip Audio for now..\n", - " talker(reply)\n", - " \n", - " return history, image" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f38d0d27-33bf-4992-a2e5-5dbed973cde7", - "metadata": {}, - "outputs": [], - "source": [ - "# More involved Gradio code as we're not using the preset Chat interface!\n", - "# Passing in inbrowser=True in the last line will cause a Gradio window to pop up immediately.\n", - "\n", - "with gr.Blocks() as ui:\n", - " with gr.Row():\n", - " chatbot = gr.Chatbot(height=500, type=\"messages\")\n", - " image_output = gr.Image(height=500)\n", - " with gr.Row():\n", - " entry = gr.Textbox(label=\"Chat with our AI Assistant:\")\n", - " with gr.Row():\n", - " clear = gr.Button(\"Clear\")\n", - "\n", - " def do_entry(message, history):\n", - " history += [{\"role\":\"user\", \"content\":message}]\n", - " return \"\", history\n", - "\n", - " entry.submit(do_entry, inputs=[entry, chatbot], outputs=[entry, chatbot]).then(\n", - " chat, inputs=chatbot, outputs=[chatbot, image_output]\n", - " )\n", - " clear.click(lambda: None, inputs=None, outputs=chatbot, queue=False)\n", - "\n", - "ui.launch(inbrowser=True)" - ] - }, - { - "cell_type": "markdown", - "id": "226643d2-73e4-4252-935d-86b8019e278a", - "metadata": {}, - "source": [ - "# Exercises and Business Applications\n", - "\n", - "Add in more tools - perhaps to simulate actually booking a flight. A student has done this and provided their example in the community contributions folder.\n", - "\n", - "Next: take this and apply it to your business. Make a multi-modal AI assistant with tools that could carry out an activity for your work. A customer support assistant? New employee onboarding assistant? So many possibilities! Also, see the week2 end of week Exercise in the separate Notebook." - ] - }, - { - "cell_type": "markdown", - "id": "7e795560-1867-42db-a256-a23b844e6fbe", - "metadata": {}, - "source": [ - "\n", - " \n", - " \n", - " \n", - " \n", - "
\n", - " \n", - " \n", - "

I have a special request for you

\n", - " \n", - " My editor tells me that it makes a HUGE difference when students rate this course on Udemy - it's one of the main ways that Udemy decides whether to show it to others. If you're able to take a minute to rate this, I'd be so very grateful! And regardless - always please reach out to me at ed@edwarddonner.com if I can help at any point.\n", - " \n", - "
" - ] } ], "metadata": { From 9c02e92d45b254a8b603ccad68fc451961d1caac Mon Sep 17 00:00:00 2001 From: Kartik Date: Sat, 30 Aug 2025 15:22:04 +0530 Subject: [PATCH 70/72] move to community folder --- .../day5_stock-assistant-with-tools.ipynb} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename week2/{stock-api-day5.ipynb => community-contributions/day5_stock-assistant-with-tools.ipynb} (100%) diff --git a/week2/stock-api-day5.ipynb b/week2/community-contributions/day5_stock-assistant-with-tools.ipynb similarity index 100% rename from week2/stock-api-day5.ipynb rename to week2/community-contributions/day5_stock-assistant-with-tools.ipynb From 2fb9f44664a7c4eb848cd07445f726fff53e52fc Mon Sep 17 00:00:00 2001 From: Kartik Date: Sat, 30 Aug 2025 15:45:59 +0530 Subject: [PATCH 71/72] clear outputs --- .../day5_stock-assistant-with-tools.ipynb | 186 ++++++------------ 1 file changed, 64 insertions(+), 122 deletions(-) diff --git a/week2/community-contributions/day5_stock-assistant-with-tools.ipynb b/week2/community-contributions/day5_stock-assistant-with-tools.ipynb index 8848482..f0acfd3 100644 --- a/week2/community-contributions/day5_stock-assistant-with-tools.ipynb +++ b/week2/community-contributions/day5_stock-assistant-with-tools.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "code", - "execution_count": 170, + "execution_count": 1, "id": "b7bd1bd7-19d9-4c4b-bc4b-9bc9cca8bd0f", "metadata": {}, "outputs": [ @@ -33,7 +33,7 @@ }, { "cell_type": "code", - "execution_count": 171, + "execution_count": 2, "id": "8b50bbe2-c0b1-49c3-9a5c-1ba7efa2bcb4", "metadata": {}, "outputs": [], @@ -52,7 +52,7 @@ }, { "cell_type": "code", - "execution_count": 172, + "execution_count": 3, "id": "ba0ddc1a-c775-4ed3-9531-ed0c5799e87f", "metadata": {}, "outputs": [ @@ -60,7 +60,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-08-30 15:05:58,159 [INFO] Logger initialized!\n" + "2025-08-30 15:23:48,810 [INFO] Logger initialized!\n" ] } ], @@ -80,7 +80,7 @@ }, { "cell_type": "code", - "execution_count": 173, + "execution_count": 4, "id": "747e8786-9da8-4342-b6c9-f5f69c2e22ae", "metadata": {}, "outputs": [ @@ -88,8 +88,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-08-30 15:05:58,164 [INFO] OpenAI API Key exists and begins sk-proj-\n", - "2025-08-30 15:05:58,164 [INFO] FINNHUB_API_KEY exists!\n" + "2025-08-30 15:23:48,813 [INFO] OpenAI API Key exists and begins sk-proj-\n", + "2025-08-30 15:23:48,814 [INFO] FINNHUB_API_KEY exists!\n" ] } ], @@ -118,7 +118,7 @@ }, { "cell_type": "code", - "execution_count": 174, + "execution_count": 5, "id": "ee3aaa9a-5495-42fd-a382-803fbfa92eaf", "metadata": {}, "outputs": [], @@ -204,7 +204,7 @@ }, { "cell_type": "code", - "execution_count": 175, + "execution_count": 6, "id": "fdf1a2b0-07be-47a0-9ce3-14d21b48c8f2", "metadata": {}, "outputs": [], @@ -226,7 +226,7 @@ }, { "cell_type": "code", - "execution_count": 176, + "execution_count": 7, "id": "12d912fc-91fb-469e-9572-2876a099f5aa", "metadata": {}, "outputs": [], @@ -245,7 +245,7 @@ }, { "cell_type": "code", - "execution_count": 177, + "execution_count": 8, "id": "61a2a15d-b559-4844-b377-6bd5cb4949f6", "metadata": {}, "outputs": [], @@ -287,7 +287,7 @@ }, { "cell_type": "code", - "execution_count": 178, + "execution_count": 9, "id": "173010e3-dfef-4611-8b68-d11256bd5fba", "metadata": {}, "outputs": [], @@ -314,7 +314,7 @@ }, { "cell_type": "code", - "execution_count": 179, + "execution_count": 10, "id": "448bb4ce-8e86-4ceb-ab52-96bddfd33337", "metadata": {}, "outputs": [], @@ -409,7 +409,7 @@ }, { "cell_type": "code", - "execution_count": 180, + "execution_count": 11, "id": "9df7b74e-fec8-4e75-92a9-31acc75e6e97", "metadata": {}, "outputs": [], @@ -437,7 +437,7 @@ }, { "cell_type": "code", - "execution_count": 181, + "execution_count": 12, "id": "cfeeb200-3f30-4855-82b9-cc8b2a950f80", "metadata": {}, "outputs": [], @@ -483,7 +483,7 @@ }, { "cell_type": "code", - "execution_count": 182, + "execution_count": 13, "id": "3724d92a-4515-4267-af6f-2c1ec2b6ed36", "metadata": {}, "outputs": [], @@ -508,7 +508,7 @@ }, { "cell_type": "code", - "execution_count": 183, + "execution_count": 14, "id": "62f5d477-6626-428f-b8eb-d763e736ef5b", "metadata": {}, "outputs": [], @@ -573,7 +573,7 @@ }, { "cell_type": "code", - "execution_count": 184, + "execution_count": 15, "id": "5150ecb6-e3f1-46dc-94fa-2a9abe5165f6", "metadata": {}, "outputs": [], @@ -610,7 +610,7 @@ }, { "cell_type": "code", - "execution_count": 185, + "execution_count": 16, "id": "26dd7375-626f-4235-b4a2-f1926f62cc5e", "metadata": {}, "outputs": [], @@ -657,7 +657,7 @@ }, { "cell_type": "code", - "execution_count": 186, + "execution_count": 17, "id": "5bd1aa28-119c-4c7a-bdc0-161a582ab1cc", "metadata": {}, "outputs": [], @@ -682,7 +682,7 @@ }, { "cell_type": "code", - "execution_count": 187, + "execution_count": 18, "id": "fbe8ef6c-2d88-43a2-94dc-70b507fe9cd2", "metadata": {}, "outputs": [], @@ -761,7 +761,7 @@ }, { "cell_type": "code", - "execution_count": 188, + "execution_count": 19, "id": "9eaeae75-d68f-4160-a26e-c13e40cf756b", "metadata": {}, "outputs": [], @@ -797,7 +797,7 @@ }, { "cell_type": "code", - "execution_count": 189, + "execution_count": 20, "id": "bdca8679-935f-4e7f-97e6-e71a4d4f228c", "metadata": {}, "outputs": [], @@ -831,7 +831,7 @@ }, { "cell_type": "code", - "execution_count": 190, + "execution_count": 21, "id": "86f76f57-76c4-4dc7-94a8-cfe7816a39f1", "metadata": {}, "outputs": [], @@ -861,7 +861,7 @@ }, { "cell_type": "code", - "execution_count": 191, + "execution_count": 22, "id": "ce9b0744-9c78-408d-b9df-9f6fd9ed78cf", "metadata": {}, "outputs": [], @@ -949,7 +949,7 @@ }, { "cell_type": "code", - "execution_count": 192, + "execution_count": 23, "id": "f4be8a71-b19e-4c2f-80df-f59ff2661f14", "metadata": {}, "outputs": [ @@ -957,22 +957,45 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-08-30 15:06:02,319 [INFO] HTTP Request: GET http://127.0.0.1:7871/gradio_api/startup-events \"HTTP/1.1 200 OK\"\n", - "2025-08-30 15:06:02,322 [INFO] HTTP Request: HEAD http://127.0.0.1:7871/ \"HTTP/1.1 200 OK\"\n" + "2025-08-30 15:23:51,219 [INFO] HTTP Request: GET http://127.0.0.1:7860/gradio_api/startup-events \"HTTP/1.1 200 OK\"\n", + "2025-08-30 15:23:51,226 [INFO] HTTP Request: HEAD http://127.0.0.1:7860/ \"HTTP/1.1 200 OK\"\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "* Running on local URL: http://127.0.0.1:7871\n", - "* To create a public link, set `share=True` in `launch()`.\n" + "* Running on local URL: http://127.0.0.1:7860\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-08-30 15:23:52,534 [INFO] HTTP Request: GET https://api.gradio.app/pkg-version \"HTTP/1.1 200 OK\"\n", + "2025-08-30 15:23:52,536 [INFO] HTTP Request: GET https://api.gradio.app/v3/tunnel-request \"HTTP/1.1 200 OK\"\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "* Running on public URL: https://8532ed0b314508005c.gradio.live\n", + "\n", + "This share link expires in 1 week. For free permanent hosting and GPU upgrades, run `gradio deploy` from the terminal in the working directory to deploy to Hugging Face Spaces (https://huggingface.co/spaces)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-08-30 15:23:56,230 [INFO] HTTP Request: HEAD https://8532ed0b314508005c.gradio.live \"HTTP/1.1 200 OK\"\n" ] }, { "data": { "text/html": [ - "
" + "
" ], "text/plain": [ "" @@ -985,7 +1008,7 @@ "data": { "text/plain": [] }, - "execution_count": 192, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" }, @@ -993,102 +1016,21 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-08-30 15:06:03,572 [INFO] HTTP Request: GET https://api.gradio.app/pkg-version \"HTTP/1.1 200 OK\"\n", - "2025-08-30 15:06:07,415 [INFO] \n", + "2025-08-30 15:26:10,184 [INFO] \n", "Messages:\n", - "{'role': 'user', 'content': 'apple stock earnings?'}\n", + "{'role': 'user', 'content': 'Tell me the performance of eli lilly'}\n", "\n", - "2025-08-30 15:06:07,971 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "2025-08-30 15:06:07,979 [INFO] Executing tool: get_current_time with args: {}\n", - "2025-08-30 15:06:08,580 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "2025-08-30 15:06:08,782 [INFO] Executing tool: get_earnings_calendar with args: {'symbol': 'AAPL', '_from': '2025-07-30', 'to': '2025-08-30'}\n", - "2025-08-30 15:06:08,785 [INFO] Tool get_earnings_calendar called for AAPL from 2025-07-30 to 2025-08-30\n", - "2025-08-30 15:06:10,398 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "2025-08-30 15:06:16,366 [INFO] \n", - "Messages:\n", - "{'role': 'user', 'metadata': None, 'content': 'apple stock earnings?', 'options': None}\n", - "{'role': 'assistant', 'metadata': None, 'content': 'Apple (AAPL) reported its Q3 2025 earnings on July 31, 2025, after market close. \\n- Actual EPS: $1.57 (estimate was $1.46) \\n- Actual Revenue: $94.04 billion (estimate was about $91.3 billion)', 'options': None}\n", - "{'role': 'user', 'content': 'nvidia q1 earnings'}\n", - "\n", - "2025-08-30 15:06:17,205 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "2025-08-30 15:06:17,221 [INFO] Executing tool: get_current_time with args: {}\n", - "2025-08-30 15:06:17,775 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "2025-08-30 15:06:18,023 [INFO] Executing tool: get_earnings_calendar with args: {'symbol': 'NVDA', '_from': '2025-05-01', 'to': '2025-08-30'}\n", - "2025-08-30 15:06:18,026 [INFO] Tool get_earnings_calendar called for NVDA from 2025-05-01 to 2025-08-30\n", - "2025-08-30 15:06:18,842 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "2025-08-30 15:06:28,656 [INFO] \n", - "Messages:\n", - "{'role': 'user', 'metadata': None, 'content': 'apple stock earnings?', 'options': None}\n", - "{'role': 'assistant', 'metadata': None, 'content': 'Apple (AAPL) reported its Q3 2025 earnings on July 31, 2025, after market close. \\n- Actual EPS: $1.57 (estimate was $1.46) \\n- Actual Revenue: $94.04 billion (estimate was about $91.3 billion)', 'options': None}\n", - "{'role': 'user', 'metadata': None, 'content': 'nvidia q1 earnings', 'options': None}\n", - "{'role': 'assistant', 'metadata': None, 'content': \"NVIDIA's most recent earnings were for Q2 2026, reported on August 27, 2025: \\n- EPS: $1.05 (estimate was about $1.03) \\n- Revenue: $46.7 billion (estimate was about $46.98 billion) \\n\\nQ1 2026 earnings data is not in the recent range. Would you like details for a different quarter or time frame?\", 'options': None}\n", - "{'role': 'user', 'content': 'q1 2025'}\n", - "\n", - "2025-08-30 15:06:29,790 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "2025-08-30 15:06:29,805 [INFO] Executing tool: get_earnings_calendar with args: {'symbol': 'NVDA', '_from': '2025-01-01', 'to': '2025-03-31'}\n", - "2025-08-30 15:06:29,807 [INFO] Tool get_earnings_calendar called for NVDA from 2025-01-01 to 2025-03-31\n", - "2025-08-30 15:06:29,808 [INFO] Executing tool: get_current_time with args: {}\n", - "2025-08-30 15:06:30,404 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "2025-08-30 15:06:38,997 [INFO] \n", - "Messages:\n", - "{'role': 'user', 'metadata': None, 'content': 'apple stock earnings?', 'options': None}\n", - "{'role': 'assistant', 'metadata': None, 'content': 'Apple (AAPL) reported its Q3 2025 earnings on July 31, 2025, after market close. \\n- Actual EPS: $1.57 (estimate was $1.46) \\n- Actual Revenue: $94.04 billion (estimate was about $91.3 billion)', 'options': None}\n", - "{'role': 'user', 'metadata': None, 'content': 'nvidia q1 earnings', 'options': None}\n", - "{'role': 'assistant', 'metadata': None, 'content': \"NVIDIA's most recent earnings were for Q2 2026, reported on August 27, 2025: \\n- EPS: $1.05 (estimate was about $1.03) \\n- Revenue: $46.7 billion (estimate was about $46.98 billion) \\n\\nQ1 2026 earnings data is not in the recent range. Would you like details for a different quarter or time frame?\", 'options': None}\n", - "{'role': 'user', 'metadata': None, 'content': 'q1 2025', 'options': None}\n", - "{'role': 'assistant', 'metadata': None, 'content': \"I cannot retrieve NVIDIA's Q1 2025 earnings because the data must be from within the last month. I can help with more recent earnings or other stock info if you want.\", 'options': None}\n", - "{'role': 'user', 'content': 'microsoft?'}\n", - "\n", - "2025-08-30 15:06:40,071 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "2025-08-30 15:06:40,327 [INFO] Executing tool: get_current_time with args: {}\n", - "2025-08-30 15:06:40,328 [INFO] Executing tool: get_company_financials with args: {'symbol': 'MSFT'}\n", - "2025-08-30 15:06:40,330 [INFO] Tool get_company_financials called for MSFT\n", - "2025-08-30 15:06:41,437 [INFO] Executing tool: get_earnings_calendar with args: {'symbol': 'MSFT', '_from': '2025-08-01', 'to': '2025-08-29'}\n", - "2025-08-30 15:06:41,439 [INFO] Tool get_earnings_calendar called for MSFT from 2025-08-01 to 2025-08-29\n", - "2025-08-30 15:06:42,284 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "2025-08-30 15:06:47,742 [INFO] \n", - "Messages:\n", - "{'role': 'user', 'metadata': None, 'content': 'apple stock earnings?', 'options': None}\n", - "{'role': 'assistant', 'metadata': None, 'content': 'Apple (AAPL) reported its Q3 2025 earnings on July 31, 2025, after market close. \\n- Actual EPS: $1.57 (estimate was $1.46) \\n- Actual Revenue: $94.04 billion (estimate was about $91.3 billion)', 'options': None}\n", - "{'role': 'user', 'metadata': None, 'content': 'nvidia q1 earnings', 'options': None}\n", - "{'role': 'assistant', 'metadata': None, 'content': \"NVIDIA's most recent earnings were for Q2 2026, reported on August 27, 2025: \\n- EPS: $1.05 (estimate was about $1.03) \\n- Revenue: $46.7 billion (estimate was about $46.98 billion) \\n\\nQ1 2026 earnings data is not in the recent range. Would you like details for a different quarter or time frame?\", 'options': None}\n", - "{'role': 'user', 'metadata': None, 'content': 'q1 2025', 'options': None}\n", - "{'role': 'assistant', 'metadata': None, 'content': \"I cannot retrieve NVIDIA's Q1 2025 earnings because the data must be from within the last month. I can help with more recent earnings or other stock info if you want.\", 'options': None}\n", - "{'role': 'user', 'metadata': None, 'content': 'microsoft?', 'options': None}\n", - "{'role': 'assistant', 'metadata': None, 'content': 'Microsoft (MSFT) key financials: \\n- Market Cap: $3.79 trillion \\n- P/E Ratio (TTM): 37.23 \\n- EPS (TTM): $13.64 \\n- Dividend Yield: 0.65% \\n- 52-Week Range: $344.79 – $555.45 \\n\\nNo Q1 2025 or recent earnings releases found within August 2025. Would you like info on a different date or other details?', 'options': None}\n", - "{'role': 'user', 'content': 'latest earnings'}\n", - "\n", - "2025-08-30 15:06:48,343 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "2025-08-30 15:06:48,368 [INFO] Executing tool: get_current_time with args: {}\n", - "2025-08-30 15:06:48,985 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "2025-08-30 15:06:49,242 [INFO] Executing tool: get_earnings_calendar with args: {'symbol': 'MSFT', '_from': '2025-07-30', 'to': '2025-08-30'}\n", - "2025-08-30 15:06:49,243 [INFO] Tool get_earnings_calendar called for MSFT from 2025-07-30 to 2025-08-30\n", - "2025-08-30 15:06:49,956 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "2025-08-30 15:06:59,770 [INFO] \n", - "Messages:\n", - "{'role': 'user', 'metadata': None, 'content': 'apple stock earnings?', 'options': None}\n", - "{'role': 'assistant', 'metadata': None, 'content': 'Apple (AAPL) reported its Q3 2025 earnings on July 31, 2025, after market close. \\n- Actual EPS: $1.57 (estimate was $1.46) \\n- Actual Revenue: $94.04 billion (estimate was about $91.3 billion)', 'options': None}\n", - "{'role': 'user', 'metadata': None, 'content': 'nvidia q1 earnings', 'options': None}\n", - "{'role': 'assistant', 'metadata': None, 'content': \"NVIDIA's most recent earnings were for Q2 2026, reported on August 27, 2025: \\n- EPS: $1.05 (estimate was about $1.03) \\n- Revenue: $46.7 billion (estimate was about $46.98 billion) \\n\\nQ1 2026 earnings data is not in the recent range. Would you like details for a different quarter or time frame?\", 'options': None}\n", - "{'role': 'user', 'metadata': None, 'content': 'q1 2025', 'options': None}\n", - "{'role': 'assistant', 'metadata': None, 'content': \"I cannot retrieve NVIDIA's Q1 2025 earnings because the data must be from within the last month. I can help with more recent earnings or other stock info if you want.\", 'options': None}\n", - "{'role': 'user', 'metadata': None, 'content': 'microsoft?', 'options': None}\n", - "{'role': 'assistant', 'metadata': None, 'content': 'Microsoft (MSFT) key financials: \\n- Market Cap: $3.79 trillion \\n- P/E Ratio (TTM): 37.23 \\n- EPS (TTM): $13.64 \\n- Dividend Yield: 0.65% \\n- 52-Week Range: $344.79 – $555.45 \\n\\nNo Q1 2025 or recent earnings releases found within August 2025. Would you like info on a different date or other details?', 'options': None}\n", - "{'role': 'user', 'metadata': None, 'content': 'latest earnings', 'options': None}\n", - "{'role': 'assistant', 'metadata': None, 'content': 'Microsoft has not reported any earnings releases in the last month up to August 30, 2025. Would you like me to check a different date range or provide recent earnings for another company?', 'options': None}\n", - "{'role': 'user', 'content': 'nvidia'}\n", - "\n", - "2025-08-30 15:07:00,871 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "2025-08-30 15:07:00,901 [INFO] Executing tool: get_current_time with args: {}\n", - "2025-08-30 15:07:01,680 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "2025-08-30 15:07:01,944 [INFO] Executing tool: get_earnings_calendar with args: {'symbol': 'NVDA', '_from': '2025-07-30', 'to': '2025-08-30'}\n", - "2025-08-30 15:07:01,947 [INFO] Tool get_earnings_calendar called for NVDA from 2025-07-30 to 2025-08-30\n", - "2025-08-30 15:07:02,980 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n" + "2025-08-30 15:26:11,569 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", + "2025-08-30 15:26:11,592 [INFO] Executing tool: get_stock_quote with args: {'symbol': 'LLY'}\n", + "2025-08-30 15:26:11,594 [INFO] Tool get_stock_quote called for LLY\n", + "2025-08-30 15:26:12,419 [INFO] Executing tool: get_company_financials with args: {'symbol': 'LLY'}\n", + "2025-08-30 15:26:12,420 [INFO] Tool get_company_financials called for LLY\n", + "2025-08-30 15:26:14,097 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n" ] } ], "source": [ - "gr.ChatInterface(fn=chat, type=\"messages\", title=\"TickerBot\", description=\"Ask about stock prices, company financials and market news!\").launch()" + "gr.ChatInterface(fn=chat, type=\"messages\", title=\"TickerBot\", description=\"Ask about stock prices, company financials and market news!\").launch(share=True)" ] }, { From 08e7319b0dabe4f8e96b55fe619b5344d8ec143f Mon Sep 17 00:00:00 2001 From: Kartik Date: Sat, 30 Aug 2025 15:48:43 +0530 Subject: [PATCH 72/72] clear outputs --- .../day5_stock-assistant-with-tools.ipynb | 160 +++--------------- 1 file changed, 27 insertions(+), 133 deletions(-) diff --git a/week2/community-contributions/day5_stock-assistant-with-tools.ipynb b/week2/community-contributions/day5_stock-assistant-with-tools.ipynb index f0acfd3..1e129aa 100644 --- a/week2/community-contributions/day5_stock-assistant-with-tools.ipynb +++ b/week2/community-contributions/day5_stock-assistant-with-tools.ipynb @@ -10,30 +10,17 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "b7bd1bd7-19d9-4c4b-bc4b-9bc9cca8bd0f", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: finnhub-python in /opt/anaconda3/envs/llms/lib/python3.11/site-packages (2.4.24)\n", - "Requirement already satisfied: requests>=2.22.0 in /opt/anaconda3/envs/llms/lib/python3.11/site-packages (from finnhub-python) (2.32.3)\n", - "Requirement already satisfied: charset_normalizer<4,>=2 in /opt/anaconda3/envs/llms/lib/python3.11/site-packages (from requests>=2.22.0->finnhub-python) (3.4.2)\n", - "Requirement already satisfied: idna<4,>=2.5 in /opt/anaconda3/envs/llms/lib/python3.11/site-packages (from requests>=2.22.0->finnhub-python) (3.10)\n", - "Requirement already satisfied: urllib3<3,>=1.21.1 in /opt/anaconda3/envs/llms/lib/python3.11/site-packages (from requests>=2.22.0->finnhub-python) (2.4.0)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /opt/anaconda3/envs/llms/lib/python3.11/site-packages (from requests>=2.22.0->finnhub-python) (2025.4.26)\n" - ] - } - ], + "outputs": [], "source": [ "!pip install finnhub-python" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "8b50bbe2-c0b1-49c3-9a5c-1ba7efa2bcb4", "metadata": {}, "outputs": [], @@ -52,18 +39,10 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "ba0ddc1a-c775-4ed3-9531-ed0c5799e87f", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-08-30 15:23:48,810 [INFO] Logger initialized!\n" - ] - } - ], + "outputs": [], "source": [ "import logging\n", "\n", @@ -80,19 +59,10 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "747e8786-9da8-4342-b6c9-f5f69c2e22ae", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-08-30 15:23:48,813 [INFO] OpenAI API Key exists and begins sk-proj-\n", - "2025-08-30 15:23:48,814 [INFO] FINNHUB_API_KEY exists!\n" - ] - } - ], + "outputs": [], "source": [ "# Initialization\n", "\n", @@ -118,7 +88,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "ee3aaa9a-5495-42fd-a382-803fbfa92eaf", "metadata": {}, "outputs": [], @@ -204,7 +174,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "fdf1a2b0-07be-47a0-9ce3-14d21b48c8f2", "metadata": {}, "outputs": [], @@ -226,7 +196,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "12d912fc-91fb-469e-9572-2876a099f5aa", "metadata": {}, "outputs": [], @@ -245,7 +215,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "61a2a15d-b559-4844-b377-6bd5cb4949f6", "metadata": {}, "outputs": [], @@ -287,7 +257,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "173010e3-dfef-4611-8b68-d11256bd5fba", "metadata": {}, "outputs": [], @@ -314,7 +284,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "448bb4ce-8e86-4ceb-ab52-96bddfd33337", "metadata": {}, "outputs": [], @@ -409,7 +379,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "9df7b74e-fec8-4e75-92a9-31acc75e6e97", "metadata": {}, "outputs": [], @@ -437,7 +407,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "cfeeb200-3f30-4855-82b9-cc8b2a950f80", "metadata": {}, "outputs": [], @@ -483,7 +453,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "3724d92a-4515-4267-af6f-2c1ec2b6ed36", "metadata": {}, "outputs": [], @@ -508,7 +478,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "id": "62f5d477-6626-428f-b8eb-d763e736ef5b", "metadata": {}, "outputs": [], @@ -573,7 +543,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "id": "5150ecb6-e3f1-46dc-94fa-2a9abe5165f6", "metadata": {}, "outputs": [], @@ -610,7 +580,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "id": "26dd7375-626f-4235-b4a2-f1926f62cc5e", "metadata": {}, "outputs": [], @@ -657,7 +627,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "id": "5bd1aa28-119c-4c7a-bdc0-161a582ab1cc", "metadata": {}, "outputs": [], @@ -682,7 +652,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "id": "fbe8ef6c-2d88-43a2-94dc-70b507fe9cd2", "metadata": {}, "outputs": [], @@ -761,7 +731,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "id": "9eaeae75-d68f-4160-a26e-c13e40cf756b", "metadata": {}, "outputs": [], @@ -797,7 +767,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "id": "bdca8679-935f-4e7f-97e6-e71a4d4f228c", "metadata": {}, "outputs": [], @@ -831,7 +801,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "id": "86f76f57-76c4-4dc7-94a8-cfe7816a39f1", "metadata": {}, "outputs": [], @@ -861,7 +831,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "id": "ce9b0744-9c78-408d-b9df-9f6fd9ed78cf", "metadata": {}, "outputs": [], @@ -949,86 +919,10 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "id": "f4be8a71-b19e-4c2f-80df-f59ff2661f14", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-08-30 15:23:51,219 [INFO] HTTP Request: GET http://127.0.0.1:7860/gradio_api/startup-events \"HTTP/1.1 200 OK\"\n", - "2025-08-30 15:23:51,226 [INFO] HTTP Request: HEAD http://127.0.0.1:7860/ \"HTTP/1.1 200 OK\"\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "* Running on local URL: http://127.0.0.1:7860\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-08-30 15:23:52,534 [INFO] HTTP Request: GET https://api.gradio.app/pkg-version \"HTTP/1.1 200 OK\"\n", - "2025-08-30 15:23:52,536 [INFO] HTTP Request: GET https://api.gradio.app/v3/tunnel-request \"HTTP/1.1 200 OK\"\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "* Running on public URL: https://8532ed0b314508005c.gradio.live\n", - "\n", - "This share link expires in 1 week. For free permanent hosting and GPU upgrades, run `gradio deploy` from the terminal in the working directory to deploy to Hugging Face Spaces (https://huggingface.co/spaces)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-08-30 15:23:56,230 [INFO] HTTP Request: HEAD https://8532ed0b314508005c.gradio.live \"HTTP/1.1 200 OK\"\n" - ] - }, - { - "data": { - "text/html": [ - "
" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-08-30 15:26:10,184 [INFO] \n", - "Messages:\n", - "{'role': 'user', 'content': 'Tell me the performance of eli lilly'}\n", - "\n", - "2025-08-30 15:26:11,569 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", - "2025-08-30 15:26:11,592 [INFO] Executing tool: get_stock_quote with args: {'symbol': 'LLY'}\n", - "2025-08-30 15:26:11,594 [INFO] Tool get_stock_quote called for LLY\n", - "2025-08-30 15:26:12,419 [INFO] Executing tool: get_company_financials with args: {'symbol': 'LLY'}\n", - "2025-08-30 15:26:12,420 [INFO] Tool get_company_financials called for LLY\n", - "2025-08-30 15:26:14,097 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n" - ] - } - ], + "outputs": [], "source": [ "gr.ChatInterface(fn=chat, type=\"messages\", title=\"TickerBot\", description=\"Ask about stock prices, company financials and market news!\").launch(share=True)" ]