{ "cells": [ { "cell_type": "markdown", "id": "5f947b1b", "metadata": {}, "source": [ "## Imports:" ] }, { "cell_type": "code", "execution_count": 45, "id": "520a3060", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: pip in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (21.2.4)\n", "Collecting pip\n", " Using cached pip-25.3-py3-none-any.whl (1.8 MB)\n", "Requirement already satisfied: setuptools in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (58.0.4)\n", "Collecting setuptools\n", " Using cached setuptools-80.9.0-py3-none-any.whl (1.2 MB)\n", "Requirement already satisfied: wheel in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (0.37.0)\n", "Collecting wheel\n", " Using cached wheel-0.45.1-py3-none-any.whl (72 kB)\n", "Installing collected packages: wheel, setuptools, pip\n", " Attempting uninstall: wheel\n", " Found existing installation: wheel 0.37.0\n", " Uninstalling wheel-0.37.0:\n", " Successfully uninstalled wheel-0.37.0\n", " Attempting uninstall: setuptools\n", " Found existing installation: setuptools 58.0.4\n", " Uninstalling setuptools-58.0.4:\n", " Successfully uninstalled setuptools-58.0.4\n", " Attempting uninstall: pip\n", " Found existing installation: pip 21.2.4\n", " Uninstalling pip-21.2.4:\n", " Successfully uninstalled pip-21.2.4\n", "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", "spyder 5.1.5 requires pyqt5<5.13, which is not installed.\n", "spyder 5.1.5 requires pyqtwebengine<5.13, which is not installed.\n", "conda-repo-cli 1.0.4 requires pathlib, which is not installed.\n", "anaconda-project 0.10.1 requires ruamel-yaml, which is not installed.\n", "numba 0.54.1 requires numpy<1.21,>=1.17, but you have numpy 2.0.2 which is incompatible.\u001b[0m\n", "Successfully installed pip-25.3 setuptools-80.9.0 wheel-0.45.1\n" ] } ], "source": [ "!pip install --upgrade pip setuptools wheel" ] }, { "cell_type": "code", "execution_count": 46, "id": "75f54e63", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: langchain_core in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (0.3.80)\n", "Requirement already satisfied: langchain_community in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (0.3.31)\n", "Requirement already satisfied: langchain_ollama in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (0.3.10)\n", "Requirement already satisfied: langchain_groq in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (0.3.8)\n", "Requirement already satisfied: groq in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (0.36.0)\n", "Requirement already satisfied: pymupdf in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (1.26.5)\n", "Collecting faiss-cpu==1.12.0\n", " Using cached faiss_cpu-1.12.0-cp39-cp39-macosx_13_0_x86_64.whl.metadata (5.1 kB)\n", "Requirement already satisfied: numpy<3.0,>=1.25.0 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from faiss-cpu==1.12.0) (2.0.2)\n", "Requirement already satisfied: packaging in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from faiss-cpu==1.12.0) (25.0)\n", "Requirement already satisfied: langsmith<1.0.0,>=0.3.45 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from langchain_core) (0.4.37)\n", "Requirement already satisfied: tenacity!=8.4.0,<10.0.0,>=8.1.0 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from langchain_core) (9.1.2)\n", "Requirement already satisfied: jsonpatch<2.0.0,>=1.33.0 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from langchain_core) (1.33)\n", "Requirement already satisfied: PyYAML<7.0.0,>=5.3.0 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from langchain_core) (6.0)\n", "Requirement already satisfied: typing-extensions<5.0.0,>=4.7.0 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from langchain_core) (4.15.0)\n", "Requirement already satisfied: pydantic<3.0.0,>=2.7.4 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from langchain_core) (2.12.4)\n", "Requirement already satisfied: jsonpointer>=1.9 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from jsonpatch<2.0.0,>=1.33.0->langchain_core) (3.0.0)\n", "Requirement already satisfied: httpx<1,>=0.23.0 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from langsmith<1.0.0,>=0.3.45->langchain_core) (0.28.1)\n", "Requirement already satisfied: orjson>=3.9.14 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from langsmith<1.0.0,>=0.3.45->langchain_core) (3.11.4)\n", "Requirement already satisfied: requests-toolbelt>=1.0.0 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from langsmith<1.0.0,>=0.3.45->langchain_core) (1.0.0)\n", "Requirement already satisfied: requests>=2.0.0 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from langsmith<1.0.0,>=0.3.45->langchain_core) (2.32.5)\n", "Requirement already satisfied: zstandard>=0.23.0 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from langsmith<1.0.0,>=0.3.45->langchain_core) (0.25.0)\n", "Requirement already satisfied: anyio in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from httpx<1,>=0.23.0->langsmith<1.0.0,>=0.3.45->langchain_core) (4.11.0)\n", "Requirement already satisfied: certifi in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from httpx<1,>=0.23.0->langsmith<1.0.0,>=0.3.45->langchain_core) (2021.10.8)\n", "Requirement already satisfied: httpcore==1.* in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from httpx<1,>=0.23.0->langsmith<1.0.0,>=0.3.45->langchain_core) (1.0.9)\n", "Requirement already satisfied: idna in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from httpx<1,>=0.23.0->langsmith<1.0.0,>=0.3.45->langchain_core) (3.2)\n", "Requirement already satisfied: h11>=0.16 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from httpcore==1.*->httpx<1,>=0.23.0->langsmith<1.0.0,>=0.3.45->langchain_core) (0.16.0)\n", "Requirement already satisfied: annotated-types>=0.6.0 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from pydantic<3.0.0,>=2.7.4->langchain_core) (0.7.0)\n", "Requirement already satisfied: pydantic-core==2.41.5 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from pydantic<3.0.0,>=2.7.4->langchain_core) (2.41.5)\n", "Requirement already satisfied: typing-inspection>=0.4.2 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from pydantic<3.0.0,>=2.7.4->langchain_core) (0.4.2)\n", "Requirement already satisfied: langchain<2.0.0,>=0.3.27 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from langchain_community) (0.3.27)\n", "Requirement already satisfied: SQLAlchemy<3.0.0,>=1.4.0 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from langchain_community) (1.4.22)\n", "Requirement already satisfied: aiohttp<4.0.0,>=3.8.3 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from langchain_community) (3.13.2)\n", "Requirement already satisfied: dataclasses-json<0.7.0,>=0.6.7 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from langchain_community) (0.6.7)\n", "Requirement already satisfied: pydantic-settings<3.0.0,>=2.10.1 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from langchain_community) (2.11.0)\n", "Requirement already satisfied: httpx-sse<1.0.0,>=0.4.0 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from langchain_community) (0.4.3)\n", "Requirement already satisfied: aiohappyeyeballs>=2.5.0 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain_community) (2.6.1)\n", "Requirement already satisfied: aiosignal>=1.4.0 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain_community) (1.4.0)\n", "Requirement already satisfied: async-timeout<6.0,>=4.0 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain_community) (4.0.3)\n", "Requirement already satisfied: attrs>=17.3.0 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain_community) (21.2.0)\n", "Requirement already satisfied: frozenlist>=1.1.1 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain_community) (1.8.0)\n", "Requirement already satisfied: multidict<7.0,>=4.5 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain_community) (6.7.0)\n", "Requirement already satisfied: propcache>=0.2.0 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain_community) (0.4.1)\n", "Requirement already satisfied: yarl<2.0,>=1.17.0 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain_community) (1.22.0)\n", "Requirement already satisfied: marshmallow<4.0.0,>=3.18.0 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from dataclasses-json<0.7.0,>=0.6.7->langchain_community) (3.26.1)\n", "Requirement already satisfied: typing-inspect<1,>=0.4.0 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from dataclasses-json<0.7.0,>=0.6.7->langchain_community) (0.9.0)\n", "Requirement already satisfied: langchain-text-splitters<1.0.0,>=0.3.9 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from langchain<2.0.0,>=0.3.27->langchain_community) (0.3.11)\n", "Requirement already satisfied: python-dotenv>=0.21.0 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from pydantic-settings<3.0.0,>=2.10.1->langchain_community) (1.2.1)\n", "Requirement already satisfied: charset_normalizer<4,>=2 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from requests>=2.0.0->langsmith<1.0.0,>=0.3.45->langchain_core) (2.0.4)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from requests>=2.0.0->langsmith<1.0.0,>=0.3.45->langchain_core) (1.26.7)\n", "Requirement already satisfied: greenlet!=0.4.17 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from SQLAlchemy<3.0.0,>=1.4.0->langchain_community) (1.1.1)\n", "Requirement already satisfied: mypy-extensions>=0.3.0 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from typing-inspect<1,>=0.4.0->dataclasses-json<0.7.0,>=0.6.7->langchain_community) (0.4.3)\n", "Requirement already satisfied: ollama<1.0.0,>=0.5.3 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from langchain_ollama) (0.6.1)\n", "Requirement already satisfied: distro<2,>=1.7.0 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from groq) (1.9.0)\n", "Requirement already satisfied: sniffio in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from groq) (1.2.0)\n", "Requirement already satisfied: exceptiongroup>=1.0.2 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from anyio->httpx<1,>=0.23.0->langsmith<1.0.0,>=0.3.45->langchain_core) (1.3.1)\n", "Using cached faiss_cpu-1.12.0-cp39-cp39-macosx_13_0_x86_64.whl (8.0 MB)\n", "\u001b[33mWARNING: Error parsing dependencies of pyodbc: Invalid version: '4.0.0-unsupported'\u001b[0m\u001b[33m\n", "\u001b[0mInstalling collected packages: faiss-cpu\n", "\u001b[31mERROR: Exception:\n", "Traceback (most recent call last):\n", " File \"/Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages/pip/_internal/cli/base_command.py\", line 107, in _run_wrapper\n", " status = _inner_run()\n", " File \"/Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages/pip/_internal/cli/base_command.py\", line 98, in _inner_run\n", " return self.run(options, args)\n", " File \"/Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages/pip/_internal/cli/req_command.py\", line 85, in wrapper\n", " return func(self, options, args)\n", " File \"/Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages/pip/_internal/commands/install.py\", line 484, in run\n", " installed_versions[distribution.canonical_name] = distribution.version\n", " File \"/Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages/pip/_internal/metadata/pkg_resources.py\", line 189, in version\n", " return parse_version(self._dist.version)\n", " File \"/Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages/pip/_vendor/packaging/version.py\", line 56, in parse\n", " return Version(version)\n", " File \"/Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages/pip/_vendor/packaging/version.py\", line 202, in __init__\n", " raise InvalidVersion(f\"Invalid version: {version!r}\")\n", "pip._vendor.packaging.version.InvalidVersion: Invalid version: '4.0.0-unsupported'\u001b[0m\u001b[31m\n", "\u001b[0m" ] } ], "source": [ "!pip install langchain_core langchain_community langchain_ollama langchain_groq groq pymupdf faiss-cpu==1.12.0" ] }, { "cell_type": "code", "execution_count": 47, "id": "08010c68", "metadata": {}, "outputs": [], "source": [ "# env:\n", "import os\n", "from dotenv import load_dotenv\n", "load_dotenv()\n", "# Chat:\n", "from operator import itemgetter\n", "from langchain_core.documents import Document\n", "from langchain_core.messages import AIMessage, HumanMessage, SystemMessage\n", "from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder\n", "from langchain_core.output_parsers import StrOutputParser\n", "# History\n", "from langchain_core.chat_history import BaseChatMessageHistory\n", "from langchain_community.chat_message_histories import ChatMessageHistory\n", "from langchain_core.messages import trim_messages\n", "from langchain_core.runnables import RunnableWithMessageHistory, RunnablePassthrough\n", "# Load\n", "from langchain_community.document_loaders import PyMuPDFLoader\n", "from langchain_text_splitters import RecursiveCharacterTextSplitter\n", "from langchain.chains.combine_documents import create_stuff_documents_chain\n", "# Store\n", "from langchain_ollama import OllamaEmbeddings\n", "from langchain_community.vectorstores import FAISS\n", "# Retrieve\n", "from langchain.chains import create_retrieval_chain, create_history_aware_retriever" ] }, { "cell_type": "code", "execution_count": 13, "id": "88c8fa42", "metadata": {}, "outputs": [], "source": [ "from IPython.display import Markdown\n", "# from llm import get_response_stream, get_response" ] }, { "cell_type": "code", "execution_count": null, "id": "d9034491", "metadata": {}, "outputs": [], "source": [ "# for chunk in get_response(\"hello\", dummy=True):\n", "# print(chunk, end=\"\", flush=True)" ] }, { "cell_type": "code", "execution_count": null, "id": "aa6e0efe", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "a9fd40ed", "metadata": {}, "source": [ "## LLM:" ] }, { "cell_type": "code", "execution_count": 14, "id": "e5d88e91", "metadata": {}, "outputs": [], "source": [ "MAX_TOKENS = 16000\n", "PER_DOC_TOKENS = 750\n", "SYS_PROMPT_SIZE = 1000 # assumed\n", "TOTAL_DOC_SIZE = 3000\n", "DOC_COUNT = TOTAL_DOC_SIZE // PER_DOC_TOKENS" ] }, { "cell_type": "markdown", "id": "c28166b6", "metadata": {}, "source": [ "### Ollama - Gemma3:4b:" ] }, { "cell_type": "code", "execution_count": 15, "id": "ca5c0e2d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "AIMessage(content=\"Hi there! How's your day going so far? 😊 \\n\\nIs there anything you'd like to chat about, or were you just saying hello?\", additional_kwargs={}, response_metadata={'model': 'gemma3:latest', 'created_at': '2025-11-25T18:59:17.333823Z', 'done': True, 'done_reason': 'stop', 'total_duration': 5791387667, 'load_duration': 3908150709, 'prompt_eval_count': 11, 'prompt_eval_duration': 931925916, 'eval_count': 34, 'eval_duration': 901088459, 'logprobs': None, 'model_name': 'gemma3:latest'}, id='run--bb256a1d-1986-4d2f-b866-b8beeb78e3ee-0', usage_metadata={'input_tokens': 11, 'output_tokens': 34, 'total_tokens': 45})" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from langchain_ollama import ChatOllama\n", "\n", "# Gemma3 context size -> 128K (1,31,072)\n", "# 30k -> 91% RAM, 91% GPU\n", "# 25k -> 82% RAM, 89% GPU\n", "# 15k -> 66% RAM, 87% GPU\n", "\n", "\n", "llm = ChatOllama(\n", " model=\"gemma3:latest\", temperature=1,\n", " # model=\"gemma3:1b\", temperature=1,\n", " # num_predict=MAX_OUTPUT_TOKENS,\n", " num_gpu=35, num_ctx=MAX_TOKENS\n", ")\n", "llm.invoke(\"Hii\")" ] }, { "cell_type": "markdown", "id": "a9e656b3", "metadata": {}, "source": [ "### Groq - Llama3:70B:" ] }, { "cell_type": "code", "execution_count": 21, "id": "4c5b89aa", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: groq in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (0.36.0)\n", "Requirement already satisfied: pydantic<3,>=1.9.0 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from groq) (2.12.4)\n", "Requirement already satisfied: httpx<1,>=0.23.0 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from groq) (0.28.1)\n", "Requirement already satisfied: anyio<5,>=3.5.0 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from groq) (4.11.0)\n", "Requirement already satisfied: typing-extensions<5,>=4.10 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from groq) (4.15.0)\n", "Requirement already satisfied: distro<2,>=1.7.0 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from groq) (1.9.0)\n", "Requirement already satisfied: sniffio in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from groq) (1.2.0)\n", "Requirement already satisfied: idna>=2.8 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from anyio<5,>=3.5.0->groq) (3.2)\n", "Requirement already satisfied: exceptiongroup>=1.0.2 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from anyio<5,>=3.5.0->groq) (1.3.1)\n", "Requirement already satisfied: httpcore==1.* in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from httpx<1,>=0.23.0->groq) (1.0.9)\n", "Requirement already satisfied: certifi in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from httpx<1,>=0.23.0->groq) (2021.10.8)\n", "Requirement already satisfied: h11>=0.16 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from httpcore==1.*->httpx<1,>=0.23.0->groq) (0.16.0)\n", "Requirement already satisfied: typing-inspection>=0.4.2 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from pydantic<3,>=1.9.0->groq) (0.4.2)\n", "Requirement already satisfied: pydantic-core==2.41.5 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from pydantic<3,>=1.9.0->groq) (2.41.5)\n", "Requirement already satisfied: annotated-types>=0.6.0 in /Users/neetikasaxena/opt/anaconda3/lib/python3.9/site-packages (from pydantic<3,>=1.9.0->groq) (0.7.0)\n" ] } ], "source": [ "!pip install groq" ] }, { "cell_type": "code", "execution_count": 23, "id": "76c84435", "metadata": {}, "outputs": [], "source": [ "# from langchain_groq import ChatGroq\n", "# llm = ChatGroq(\n", "# model=\"llama-3.3-70b-versatile\", temperature=\"1\",\n", "# max_tokens=MAX_TOKENS, api_key=os.environ.get(\"GROQ_API_KEY\"),\n", "# )\n", "# llm.invoke('hi')" ] }, { "cell_type": "code", "execution_count": null, "id": "1e663687", "metadata": {}, "outputs": [], "source": [ "# Markdown(llm.invoke(\"write a story\").content)" ] }, { "cell_type": "code", "execution_count": null, "id": "ffa74252", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "aef563fc", "metadata": {}, "source": [ "## Template:\n", "\n", "