diff --git a/supporting-blog-content/building-multimodal-rag-with-elasticsearch-gotham/notebook/01-mmrag-blog-quick-start.ipynb b/supporting-blog-content/building-multimodal-rag-with-elasticsearch-gotham/notebook/01-mmrag-blog-quick-start.ipynb index dbdb88bb..759cdb94 100644 --- a/supporting-blog-content/building-multimodal-rag-with-elasticsearch-gotham/notebook/01-mmrag-blog-quick-start.ipynb +++ b/supporting-blog-content/building-multimodal-rag-with-elasticsearch-gotham/notebook/01-mmrag-blog-quick-start.ipynb @@ -36,7 +36,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "fatal: destination path 'elasticsearch-labs' already exists and is not an empty directory.\n" + "Cloning into 'elasticsearch-labs'...\n", + "remote: Enumerating objects: 4343, done.\u001b[K\n", + "remote: Counting objects: 100% (688/688), done.\u001b[K\n", + "remote: Compressing objects: 100% (239/239), done.\u001b[K\n", + "remote: Total 4343 (delta 546), reused 458 (delta 449), pack-reused 3655 (from 1)\u001b[K\n", + "Receiving objects: 100% (4343/4343), 98.51 MiB | 40.58 MiB/s, done.\n", + "Resolving deltas: 100% (2431/2431), done.\n" ] } ], @@ -65,7 +71,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 3, "metadata": { "id": "PHrDQc0jOOb7" }, @@ -101,7 +107,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": { "id": "U8IuJRQhS7lz" }, @@ -124,7 +130,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": { "id": "ZC4v_SHjMwLa" }, @@ -151,7 +157,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": { "id": "FhPcJYl03eNL" }, @@ -168,54 +174,54 @@ "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.0.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.0.1\u001b[0m\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", "Collecting git+https://github.com/hkchengrex/ImageBind.git\n", - " Cloning https://github.com/hkchengrex/ImageBind.git to /private/var/folders/z9/dz5wy_nd4_v1_gc8dg_5krqr0000gn/T/pip-req-build-4emj3jts\n", - " Running command git clone --filter=blob:none --quiet https://github.com/hkchengrex/ImageBind.git /private/var/folders/z9/dz5wy_nd4_v1_gc8dg_5krqr0000gn/T/pip-req-build-4emj3jts\n", + " Cloning https://github.com/hkchengrex/ImageBind.git to /private/var/folders/z9/dz5wy_nd4_v1_gc8dg_5krqr0000gn/T/pip-req-build-4_8958wu\n", + " Running command git clone --filter=blob:none --quiet https://github.com/hkchengrex/ImageBind.git /private/var/folders/z9/dz5wy_nd4_v1_gc8dg_5krqr0000gn/T/pip-req-build-4_8958wu\n", " Resolved https://github.com/hkchengrex/ImageBind.git to commit 9989650c87d393d7e8c144194182cbf124cd03a0\n", " Installing build dependencies ... \u001b[?25ldone\n", "\u001b[?25h Getting requirements to build wheel ... \u001b[?25ldone\n", "\u001b[?25h Preparing metadata (pyproject.toml) ... \u001b[?25ldone\n", "\u001b[?25hCollecting pytorchvideo@ git+https://github.com/facebookresearch/pytorchvideo.git@ae9cfc6e62ca49eb9721a7a56e1e13e348ad21dc\n", - " Cloning https://github.com/facebookresearch/pytorchvideo.git (to revision ae9cfc6e62ca49eb9721a7a56e1e13e348ad21dc) to /private/var/folders/z9/dz5wy_nd4_v1_gc8dg_5krqr0000gn/T/pip-install-o1gm4gp6/pytorchvideo_2534250cb1054a59849875172f1b4d8a\n", - " Running command git clone --filter=blob:none --quiet https://github.com/facebookresearch/pytorchvideo.git /private/var/folders/z9/dz5wy_nd4_v1_gc8dg_5krqr0000gn/T/pip-install-o1gm4gp6/pytorchvideo_2534250cb1054a59849875172f1b4d8a\n", + " Cloning https://github.com/facebookresearch/pytorchvideo.git (to revision ae9cfc6e62ca49eb9721a7a56e1e13e348ad21dc) to /private/var/folders/z9/dz5wy_nd4_v1_gc8dg_5krqr0000gn/T/pip-install-61j1i73l/pytorchvideo_0d7e0ec9e7e042daadbe7e3b3e37996e\n", + " Running command git clone --filter=blob:none --quiet https://github.com/facebookresearch/pytorchvideo.git /private/var/folders/z9/dz5wy_nd4_v1_gc8dg_5krqr0000gn/T/pip-install-61j1i73l/pytorchvideo_0d7e0ec9e7e042daadbe7e3b3e37996e\n", " Running command git rev-parse -q --verify 'sha^ae9cfc6e62ca49eb9721a7a56e1e13e348ad21dc'\n", " Running command git fetch -q https://github.com/facebookresearch/pytorchvideo.git ae9cfc6e62ca49eb9721a7a56e1e13e348ad21dc\n", " Running command git checkout -q ae9cfc6e62ca49eb9721a7a56e1e13e348ad21dc\n", " Resolved https://github.com/facebookresearch/pytorchvideo.git to commit ae9cfc6e62ca49eb9721a7a56e1e13e348ad21dc\n", " Preparing metadata (setup.py) ... \u001b[?25ldone\n", "\u001b[?25hRequirement already satisfied: torch>=1.13.1 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from imagebind==1.0.0) (2.6.0)\n", - "Requirement already satisfied: timm>=1.0.12 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from imagebind==1.0.0) (1.0.15)\n", - "Requirement already satisfied: numpy>=1.19 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from imagebind==1.0.0) (2.2.3)\n", - "Requirement already satisfied: torchaudio in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from imagebind==1.0.0) (2.6.0)\n", - "Requirement already satisfied: regex in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from imagebind==1.0.0) (2024.11.6)\n", + "Requirement already satisfied: iopath in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from imagebind==1.0.0) (0.1.10)\n", "Requirement already satisfied: einops in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from imagebind==1.0.0) (0.8.1)\n", - "Requirement already satisfied: matplotlib in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from imagebind==1.0.0) (3.10.0)\n", "Requirement already satisfied: types-regex in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from imagebind==1.0.0) (2024.11.6.20241221)\n", + "Requirement already satisfied: ftfy in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from imagebind==1.0.0) (6.3.1)\n", "Requirement already satisfied: torchvision in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from imagebind==1.0.0) (0.21.0)\n", + "Requirement already satisfied: timm>=1.0.12 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from imagebind==1.0.0) (1.0.15)\n", "Requirement already satisfied: cartopy in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from imagebind==1.0.0) (0.24.1)\n", - "Requirement already satisfied: iopath in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from imagebind==1.0.0) (0.1.10)\n", "Requirement already satisfied: fvcore in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from imagebind==1.0.0) (0.1.5.post20221221)\n", - "Requirement already satisfied: ftfy in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from imagebind==1.0.0) (6.3.1)\n", - "Requirement already satisfied: safetensors in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from timm>=1.0.12->imagebind==1.0.0) (0.5.3)\n", + "Requirement already satisfied: torchaudio in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from imagebind==1.0.0) (2.6.0)\n", + "Requirement already satisfied: numpy>=1.19 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from imagebind==1.0.0) (2.2.3)\n", + "Requirement already satisfied: matplotlib in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from imagebind==1.0.0) (3.10.0)\n", + "Requirement already satisfied: regex in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from imagebind==1.0.0) (2024.11.6)\n", "Requirement already satisfied: huggingface_hub in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from timm>=1.0.12->imagebind==1.0.0) (0.29.1)\n", + "Requirement already satisfied: safetensors in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from timm>=1.0.12->imagebind==1.0.0) (0.5.3)\n", "Requirement already satisfied: pyyaml in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from timm>=1.0.12->imagebind==1.0.0) (6.0.2)\n", + "Requirement already satisfied: jinja2 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from torch>=1.13.1->imagebind==1.0.0) (3.1.5)\n", "Requirement already satisfied: networkx in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from torch>=1.13.1->imagebind==1.0.0) (3.4.2)\n", - "Requirement already satisfied: filelock in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from torch>=1.13.1->imagebind==1.0.0) (3.17.0)\n", + "Requirement already satisfied: fsspec in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from torch>=1.13.1->imagebind==1.0.0) (2025.2.0)\n", "Requirement already satisfied: typing-extensions>=4.10.0 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from torch>=1.13.1->imagebind==1.0.0) (4.12.2)\n", + "Requirement already satisfied: filelock in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from torch>=1.13.1->imagebind==1.0.0) (3.17.0)\n", "Requirement already satisfied: sympy==1.13.1 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from torch>=1.13.1->imagebind==1.0.0) (1.13.1)\n", - "Requirement already satisfied: fsspec in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from torch>=1.13.1->imagebind==1.0.0) (2025.2.0)\n", - "Requirement already satisfied: jinja2 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from torch>=1.13.1->imagebind==1.0.0) (3.1.5)\n", "Requirement already satisfied: mpmath<1.4,>=1.1.0 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from sympy==1.13.1->torch>=1.13.1->imagebind==1.0.0) (1.3.0)\n", + "Requirement already satisfied: pyshp>=2.3 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from cartopy->imagebind==1.0.0) (2.3.1)\n", "Requirement already satisfied: pyproj>=3.3.1 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from cartopy->imagebind==1.0.0) (3.7.1)\n", - "Requirement already satisfied: packaging>=21 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from cartopy->imagebind==1.0.0) (24.2)\n", "Requirement already satisfied: shapely>=1.8 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from cartopy->imagebind==1.0.0) (2.0.7)\n", - "Requirement already satisfied: pyshp>=2.3 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from cartopy->imagebind==1.0.0) (2.3.1)\n", - "Requirement already satisfied: pillow>=8 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from matplotlib->imagebind==1.0.0) (11.1.0)\n", - "Requirement already satisfied: contourpy>=1.0.1 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from matplotlib->imagebind==1.0.0) (1.3.1)\n", + "Requirement already satisfied: packaging>=21 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from cartopy->imagebind==1.0.0) (24.2)\n", + "Requirement already satisfied: cycler>=0.10 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from matplotlib->imagebind==1.0.0) (0.12.1)\n", "Requirement already satisfied: python-dateutil>=2.7 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from matplotlib->imagebind==1.0.0) (2.9.0.post0)\n", "Requirement already satisfied: fonttools>=4.22.0 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from matplotlib->imagebind==1.0.0) (4.56.0)\n", - "Requirement already satisfied: cycler>=0.10 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from matplotlib->imagebind==1.0.0) (0.12.1)\n", - "Requirement already satisfied: pyparsing>=2.3.1 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from matplotlib->imagebind==1.0.0) (3.2.1)\n", + "Requirement already satisfied: pillow>=8 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from matplotlib->imagebind==1.0.0) (11.1.0)\n", "Requirement already satisfied: kiwisolver>=1.3.1 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from matplotlib->imagebind==1.0.0) (1.4.8)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from matplotlib->imagebind==1.0.0) (1.3.1)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from matplotlib->imagebind==1.0.0) (3.2.1)\n", "Requirement already satisfied: wcwidth in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from ftfy->imagebind==1.0.0) (0.2.13)\n", "Requirement already satisfied: yacs>=0.1.6 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from fvcore->imagebind==1.0.0) (0.1.8)\n", "Requirement already satisfied: tqdm in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from fvcore->imagebind==1.0.0) (4.67.1)\n", @@ -229,8 +235,8 @@ "Requirement already satisfied: requests in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from huggingface_hub->timm>=1.0.12->imagebind==1.0.0) (2.32.3)\n", "Requirement already satisfied: MarkupSafe>=2.0 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from jinja2->torch>=1.13.1->imagebind==1.0.0) (3.0.2)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from requests->huggingface_hub->timm>=1.0.12->imagebind==1.0.0) (3.4.1)\n", - "Requirement already satisfied: urllib3<3,>=1.21.1 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from requests->huggingface_hub->timm>=1.0.12->imagebind==1.0.0) (2.3.0)\n", "Requirement already satisfied: idna<4,>=2.5 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from requests->huggingface_hub->timm>=1.0.12->imagebind==1.0.0) (3.10)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from requests->huggingface_hub->timm>=1.0.12->imagebind==1.0.0) (2.3.0)\n", "\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.0.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.0.1\u001b[0m\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" @@ -248,7 +254,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": { "id": "LISqDRmE8PpG" }, @@ -269,7 +275,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": { "id": "GGIFHatG9BTP" }, @@ -291,7 +297,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -299,21 +305,21 @@ "output_type": "stream", "text": [ "Requirement already satisfied: openai in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (1.64.0)\n", - "Requirement already satisfied: tqdm>4 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from openai) (4.67.1)\n", - "Requirement already satisfied: httpx<1,>=0.23.0 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from openai) (0.28.1)\n", - "Requirement already satisfied: typing-extensions<5,>=4.11 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from openai) (4.12.2)\n", + "Requirement already satisfied: sniffio in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from openai) (1.3.1)\n", "Requirement already satisfied: jiter<1,>=0.4.0 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from openai) (0.8.2)\n", "Requirement already satisfied: pydantic<3,>=1.9.0 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from openai) (2.10.6)\n", "Requirement already satisfied: anyio<5,>=3.5.0 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from openai) (4.8.0)\n", - "Requirement already satisfied: sniffio in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from openai) (1.3.1)\n", + "Requirement already satisfied: typing-extensions<5,>=4.11 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from openai) (4.12.2)\n", + "Requirement already satisfied: tqdm>4 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from openai) (4.67.1)\n", + "Requirement already satisfied: httpx<1,>=0.23.0 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from openai) (0.28.1)\n", "Requirement already satisfied: distro<2,>=1.7.0 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from openai) (1.9.0)\n", - "Requirement already satisfied: idna>=2.8 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from anyio<5,>=3.5.0->openai) (3.10)\n", "Requirement already satisfied: exceptiongroup>=1.0.2 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from anyio<5,>=3.5.0->openai) (1.2.2)\n", - "Requirement already satisfied: certifi in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from httpx<1,>=0.23.0->openai) (2025.1.31)\n", + "Requirement already satisfied: idna>=2.8 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from anyio<5,>=3.5.0->openai) (3.10)\n", "Requirement already satisfied: httpcore==1.* in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from httpx<1,>=0.23.0->openai) (1.0.7)\n", + "Requirement already satisfied: certifi in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from httpx<1,>=0.23.0->openai) (2025.1.31)\n", "Requirement already satisfied: h11<0.15,>=0.13 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from httpcore==1.*->httpx<1,>=0.23.0->openai) (0.14.0)\n", - "Requirement already satisfied: pydantic-core==2.27.2 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from pydantic<3,>=1.9.0->openai) (2.27.2)\n", "Requirement already satisfied: annotated-types>=0.6.0 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from pydantic<3,>=1.9.0->openai) (0.7.0)\n", + "Requirement already satisfied: pydantic-core==2.27.2 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from pydantic<3,>=1.9.0->openai) (2.27.2)\n", "\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.0.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.0.1\u001b[0m\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" @@ -334,8 +340,8 @@ "output_type": "stream", "text": [ "Requirement already satisfied: soundfile in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (0.13.1)\n", - "Requirement already satisfied: cffi>=1.0 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from soundfile) (1.17.1)\n", "Requirement already satisfied: numpy in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from soundfile) (2.2.3)\n", + "Requirement already satisfied: cffi>=1.0 in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from soundfile) (1.17.1)\n", "Requirement already satisfied: pycparser in /Users/jessgarson/.pyenv/versions/3.10.12/lib/python3.10/site-packages (from cffi>=1.0->soundfile) (2.22)\n", "\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.0.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.0.1\u001b[0m\n", @@ -360,7 +366,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 10, "metadata": { "id": "rZJexfwR4FaT" }, @@ -390,7 +396,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 11, "metadata": { "id": "A6C9IIuA6dlH" }, @@ -434,7 +440,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 13, "metadata": { "id": "3nBsEf7u60bq" }, @@ -445,61 +451,61 @@ "text": [ "INFO:embedding_generator:Testing model with sample input...\n", "INFO:embedding_generator:🤖 ImageBind model initialized successfully\n", - "INFO:elastic_transport.transport:HEAD https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content [status:200 duration:0.092s]\n", - "INFO:elastic_transport.transport:POST https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content/_doc [status:201 duration:0.102s]\n", + "INFO:elastic_transport.transport:HEAD https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content [status:200 duration:0.133s]\n", + "INFO:elastic_transport.transport:POST https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content/_doc [status:201 duration:0.053s]\n", "INFO:__main__:\n", "\n", "Indexed vision: {\n", " \"result\": \"created\",\n", - " \"_id\": \"qBn_SJUBvmLH5RQPKxjd\",\n", + " \"_id\": \"9BkUSZUBvmLH5RQPHhhg\",\n", " \"_index\": \"multimodal_content\"\n", "}\n", - "INFO:elastic_transport.transport:POST https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content/_doc [status:201 duration:0.049s]\n", + "INFO:elastic_transport.transport:POST https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content/_doc [status:201 duration:0.033s]\n", "INFO:__main__:\n", "\n", "Indexed vision: {\n", " \"result\": \"created\",\n", - " \"_id\": \"qRn_SJUBvmLH5RQPLhgX\",\n", + " \"_id\": \"9RkUSZUBvmLH5RQPIBh2\",\n", " \"_index\": \"multimodal_content\"\n", "}\n", - "INFO:elastic_transport.transport:POST https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content/_doc [status:201 duration:0.045s]\n", + "INFO:elastic_transport.transport:POST https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content/_doc [status:201 duration:0.030s]\n", "INFO:__main__:\n", "\n", "Indexed vision: {\n", " \"result\": \"created\",\n", - " \"_id\": \"qhn_SJUBvmLH5RQPMBgk\",\n", + " \"_id\": \"9hkUSZUBvmLH5RQPIhi4\",\n", " \"_index\": \"multimodal_content\"\n", "}\n", - "INFO:elastic_transport.transport:POST https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content/_doc [status:201 duration:0.037s]\n", + "INFO:elastic_transport.transport:POST https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content/_doc [status:201 duration:0.032s]\n", "INFO:__main__:\n", "\n", "Indexed audio: {\n", " \"result\": \"created\",\n", - " \"_id\": \"qxn_SJUBvmLH5RQPMRgX\",\n", + " \"_id\": \"9xkUSZUBvmLH5RQPIxiA\",\n", " \"_index\": \"multimodal_content\"\n", "}\n", - "INFO:elastic_transport.transport:POST https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content/_doc [status:201 duration:0.050s]\n", + "INFO:elastic_transport.transport:POST https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content/_doc [status:201 duration:0.033s]\n", "INFO:__main__:\n", "\n", "Indexed text: {\n", " \"result\": \"created\",\n", - " \"_id\": \"rBn_SJUBvmLH5RQPMRjx\",\n", + " \"_id\": \"-BkUSZUBvmLH5RQPJBgz\",\n", " \"_index\": \"multimodal_content\"\n", "}\n", - "INFO:elastic_transport.transport:POST https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content/_doc [status:201 duration:0.032s]\n", + "INFO:elastic_transport.transport:POST https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content/_doc [status:201 duration:0.031s]\n", "INFO:__main__:\n", "\n", "Indexed text: {\n", " \"result\": \"created\",\n", - " \"_id\": \"rRn_SJUBvmLH5RQPMhix\",\n", + " \"_id\": \"-RkUSZUBvmLH5RQPJRgE\",\n", " \"_index\": \"multimodal_content\"\n", "}\n", - "INFO:elastic_transport.transport:POST https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content/_doc [status:201 duration:0.028s]\n", + "INFO:elastic_transport.transport:POST https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content/_doc [status:201 duration:0.029s]\n", "INFO:__main__:\n", "\n", "Indexed depth: {\n", " \"result\": \"created\",\n", - " \"_id\": \"rhn_SJUBvmLH5RQPMhj5\",\n", + " \"_id\": \"-hkUSZUBvmLH5RQPJRhO\",\n", " \"_index\": \"multimodal_content\"\n", "}\n" ] @@ -527,7 +533,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 14, "metadata": { "id": "7f-MBkFALphP" }, @@ -538,8 +544,8 @@ "text": [ "INFO:embedding_generator:Testing model with sample input...\n", "INFO:embedding_generator:🤖 ImageBind model initialized successfully\n", - "INFO:elastic_transport.transport:HEAD https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content [status:200 duration:0.172s]\n", - "INFO:elastic_transport.transport:POST https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content/_search [status:200 duration:0.090s]\n", + "INFO:elastic_transport.transport:HEAD https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content [status:200 duration:0.183s]\n", + "INFO:elastic_transport.transport:POST https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content/_search [status:200 duration:0.101s]\n", "\n", "🔎 Similar evidence found:\n", "\n", @@ -547,13 +553,13 @@ " Similarity: 0.9987\n", " File path: data/audios/joker_laugh.wav\n", "\n", - "2. The Joker with green hair, white face paint, and a sinister smile in an urban night setting. (vision)\n", - " Similarity: 0.5708\n", - " File path: data/images/joker_laughing.png\n", + "2. A sinister laugh captured near the crime scene (audio)\n", + " Similarity: 0.9987\n", + " File path: data/audios/joker_laugh.wav\n", "\n", - "3. The Joker with green hair, white face paint, and a sinister smile in an urban night setting. (vision)\n", - " Similarity: 0.5666\n", - " File path: data/images/joker_laughing.png\n", + "3. A sinister laugh captured near the crime scene (audio)\n", + " Similarity: 0.9987\n", + " File path: data/audios/joker_laugh.wav\n", "\n" ] } @@ -576,7 +582,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 15, "metadata": { "id": "mm_RwbfYQBGK" }, @@ -587,8 +593,8 @@ "text": [ "INFO:embedding_generator:Testing model with sample input...\n", "INFO:embedding_generator:🤖 ImageBind model initialized successfully\n", - "INFO:elastic_transport.transport:HEAD https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content [status:200 duration:0.121s]\n", - "INFO:elastic_transport.transport:POST https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content/_search [status:200 duration:0.192s]\n", + "INFO:elastic_transport.transport:HEAD https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content [status:200 duration:0.091s]\n", + "INFO:elastic_transport.transport:POST https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content/_search [status:200 duration:0.168s]\n", "\n", "🔎 Similar evidence found:\n", "\n", @@ -673,7 +679,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 16, "metadata": { "id": "Bbm1vWfXQiPZ" }, @@ -684,8 +690,8 @@ "text": [ "INFO:embedding_generator:Testing model with sample input...\n", "INFO:embedding_generator:🤖 ImageBind model initialized successfully\n", - "INFO:elastic_transport.transport:HEAD https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content [status:200 duration:0.168s]\n", - "INFO:elastic_transport.transport:POST https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content/_search [status:200 duration:0.083s]\n", + "INFO:elastic_transport.transport:HEAD https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content [status:200 duration:0.088s]\n", + "INFO:elastic_transport.transport:POST https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content/_search [status:200 duration:0.095s]\n", "\n", "🔎 Similar evidence found:\n", "\n", @@ -697,9 +703,9 @@ " Similarity: 0.5053\n", " File path: data/images/crime_scene1.jpg\n", "\n", - "3. The Joker with green hair, white face paint, and a sinister smile in an urban night setting. (vision)\n", - " Similarity: 0.5006\n", - " File path: data/images/joker_laughing.png\n", + "3. Photo of the crime scene: A dark, rain-soaked alley is filled with playing cards, while a sinister graffiti of the Joker laughing stands out on the brick wall. (vision)\n", + " Similarity: 0.5053\n", + " File path: data/images/crime_scene1.jpg\n", "\n" ] } @@ -723,7 +729,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 17, "metadata": { "id": "A8pmOH31Q2Hc" }, @@ -734,16 +740,16 @@ "text": [ "INFO:embedding_generator:Testing model with sample input...\n", "INFO:embedding_generator:🤖 ImageBind model initialized successfully\n", - "INFO:elastic_transport.transport:HEAD https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content [status:200 duration:0.101s]\n", + "INFO:elastic_transport.transport:HEAD https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content [status:200 duration:0.072s]\n", "INFO:__main__:✅ All components initialized successfully\n", "INFO:__main__:🔍 Collecting evidence...\n", - "INFO:elastic_transport.transport:POST https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content/_search [status:200 duration:0.097s]\n", + "INFO:elastic_transport.transport:POST https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content/_search [status:200 duration:0.095s]\n", "INFO:__main__:✅ Data retrieved for vision: 2 results\n", - "INFO:elastic_transport.transport:POST https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content/_search [status:200 duration:0.024s]\n", + "INFO:elastic_transport.transport:POST https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content/_search [status:200 duration:0.028s]\n", "INFO:__main__:✅ Data retrieved for audio: 2 results\n", - "INFO:elastic_transport.transport:POST https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content/_search [status:200 duration:0.025s]\n", + "INFO:elastic_transport.transport:POST https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content/_search [status:200 duration:0.024s]\n", "INFO:__main__:✅ Data retrieved for text: 2 results\n", - "INFO:elastic_transport.transport:POST https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content/_search [status:200 duration:0.025s]\n", + "INFO:elastic_transport.transport:POST https://getting-started.es.us-east4.gcp.elastic-cloud.com:443/multimodal_content/_search [status:200 duration:0.038s]\n", "INFO:__main__:✅ Data retrieved for depth: 2 results\n", "INFO:__main__:\n", "📝 Generating forensic report...\n", @@ -755,25 +761,25 @@ "\n", "**Evidence Supporting Conclusion:**\n", "\n", - "- **Visual Evidence:** The crime scene photos are highly indicative of the Joker's involvement. The presence of playing cards scattered around a dark, rain-soaked alley and the sinister graffiti of the Joker laughing on a brick wall align closely with the Joker's known penchant for leaving thematic calling cards at his crime scenes. The similarity score of 0.83 for both photos suggests a high degree of confidence in the visual match to known Joker-related crime scenes.\n", + "- **Visual Evidence:** The photos of the crime scene are highly indicative of the Joker's involvement. The presence of playing cards scattered around a dark, rain-soaked alley is a well-known signature of the Joker, serving as both his calling card and a symbol of his chaotic nature. The graffiti depicting the Joker laughing is a visual taunt and a mark of territory, further implicating him. The similarity score of 0.83 for both photos suggests a high degree of confidence in the visual match to known patterns of the Joker's previous crimes.\n", "\n", - "- **Auditory Evidence:** The captured audio of a sinister laugh near the crime scene, with a similarity score of 1.00, directly points to the Joker. His distinctive laugh is a well-documented auditory signature that he leaves at the scenes of his crimes, serving both as a psychological weapon and a marker of his presence.\n", + "- **Auditory Evidence:** The sinister laugh captured near the crime scene, with a similarity score of 1.00, is a direct auditory signature of the Joker. This laugh is not only iconic but has been documented in numerous encounters with law enforcement and victims. The perfect match indicates that the laugh is either directly from the Joker or a recording meant to signify his presence or involvement.\n", "\n", - "- **Textual Evidence:** The mysterious note found at the location, with a similarity score of 0.76, suggests it may contain a message or riddle typical of the Joker's communication style. While the exact content of the note is not detailed, the Joker is known for leaving taunting messages for the authorities and Batman, often as part of his chaotic schemes.\n", + "- **Textual Evidence:** The mysterious note found at the location, with a similarity score of 0.76, suggests a cryptic message or clue left behind by the criminal. While the content of the note is not detailed, the Joker is known for leaving such notes as part of his psychological games and clues to his next move. The similarity score indicates a strong but not perfect match to known writings of the Joker, possibly due to variations in the message or medium used.\n", "\n", - "- **Depth Evidence:** The depth sensor capture of the suspect, with a similarity score of 0.77, indicates a figure that matches the Joker's known physical profile or one of his disguises. While depth sensor data alone might not conclusively identify a suspect due to the lack of facial features or detailed physical markers, in conjunction with the other evidence, it supports the conclusion.\n", + "- **Depth Evidence:** The depth sensor capture of the suspect, with a similarity score of 0.77, suggests a figure that matches the physical profile of the Joker. While depth captures can be less definitive in identifying specific facial features, the height, build, and posture can be compared against known data of the Joker.\n", "\n", "**Behavioral Patterns:**\n", "\n", - "The Joker's criminal signature is evident in the combination of thematic elements (playing cards, laughter), his method of taunting authorities with notes, and the choice of crime scenes that reflect his chaotic and theatrical nature. His motives often revolve around creating chaos, drawing Batman out, and demonstrating his intellectual superiority through complex schemes. The evidence collected aligns with these known patterns and motives.\n", + "The Joker is characterized by his love for chaos, dramatic flair, and leaving symbolic markers at his crime scenes. The combination of playing cards, the sinister laugh, and the cryptic note all align with his known behavioral patterns. His motives often include creating disorder, challenging Batman, and leaving a signature that unmistakably points to him, all of which are evident in this case.\n", "\n", "**Confidence Level:** 95%\n", "\n", - "The evidence strongly suggests the Joker's involvement, with high similarity scores across visual and auditory data, and moderate confidence in the textual and depth evidence. The slight deduction in confidence accounts for the inherent limitations in depth sensor identification without facial recognition and the indirect nature of textual evidence.\n", + "The evidence strongly points to the Joker as the prime suspect due to the convergence of visual, auditory, textual, and depth data that aligns with his known patterns and behaviors. The slight deductions in confidence are due to the inherent limitations in depth sensor identification and the slightly lower similarity score of the textual evidence.\n", "\n", "**Next Steps:** No further evidence required.\n", "\n", - "The combination of multimodal evidence provides a comprehensive profile that matches the Joker's known criminal behavior and modus operandi. While additional evidence could always further solidify the case, the current dataset is sufficient to justify focusing investigative and apprehension efforts on the Joker.\n", + "The combination of multimodal evidence provides a comprehensive and conclusive identification of the Joker as the perpetrator. However, capturing additional direct visual confirmation of the Joker at the scene or obtaining a confession would only serve to reinforce the already strong case.\n", "INFO:llm_analyzer:==================================================\n", "INFO:__main__:✅ Forensic report generated successfully\n", "INFO:__main__:\n", @@ -783,25 +789,25 @@ "\n", "**Evidence Supporting Conclusion:**\n", "\n", - "- **Visual Evidence:** The crime scene photos are highly indicative of the Joker's involvement. The presence of playing cards scattered around a dark, rain-soaked alley and the sinister graffiti of the Joker laughing on a brick wall align closely with the Joker's known penchant for leaving thematic calling cards at his crime scenes. The similarity score of 0.83 for both photos suggests a high degree of confidence in the visual match to known Joker-related crime scenes.\n", + "- **Visual Evidence:** The photos of the crime scene are highly indicative of the Joker's involvement. The presence of playing cards scattered around a dark, rain-soaked alley is a well-known signature of the Joker, serving as both his calling card and a symbol of his chaotic nature. The graffiti depicting the Joker laughing is a visual taunt and a mark of territory, further implicating him. The similarity score of 0.83 for both photos suggests a high degree of confidence in the visual match to known patterns of the Joker's previous crimes.\n", "\n", - "- **Auditory Evidence:** The captured audio of a sinister laugh near the crime scene, with a similarity score of 1.00, directly points to the Joker. His distinctive laugh is a well-documented auditory signature that he leaves at the scenes of his crimes, serving both as a psychological weapon and a marker of his presence.\n", + "- **Auditory Evidence:** The sinister laugh captured near the crime scene, with a similarity score of 1.00, is a direct auditory signature of the Joker. This laugh is not only iconic but has been documented in numerous encounters with law enforcement and victims. The perfect match indicates that the laugh is either directly from the Joker or a recording meant to signify his presence or involvement.\n", "\n", - "- **Textual Evidence:** The mysterious note found at the location, with a similarity score of 0.76, suggests it may contain a message or riddle typical of the Joker's communication style. While the exact content of the note is not detailed, the Joker is known for leaving taunting messages for the authorities and Batman, often as part of his chaotic schemes.\n", + "- **Textual Evidence:** The mysterious note found at the location, with a similarity score of 0.76, suggests a cryptic message or clue left behind by the criminal. While the content of the note is not detailed, the Joker is known for leaving such notes as part of his psychological games and clues to his next move. The similarity score indicates a strong but not perfect match to known writings of the Joker, possibly due to variations in the message or medium used.\n", "\n", - "- **Depth Evidence:** The depth sensor capture of the suspect, with a similarity score of 0.77, indicates a figure that matches the Joker's known physical profile or one of his disguises. While depth sensor data alone might not conclusively identify a suspect due to the lack of facial features or detailed physical markers, in conjunction with the other evidence, it supports the conclusion.\n", + "- **Depth Evidence:** The depth sensor capture of the suspect, with a similarity score of 0.77, suggests a figure that matches the physical profile of the Joker. While depth captures can be less definitive in identifying specific facial features, the height, build, and posture can be compared against known data of the Joker.\n", "\n", "**Behavioral Patterns:**\n", "\n", - "The Joker's criminal signature is evident in the combination of thematic elements (playing cards, laughter), his method of taunting authorities with notes, and the choice of crime scenes that reflect his chaotic and theatrical nature. His motives often revolve around creating chaos, drawing Batman out, and demonstrating his intellectual superiority through complex schemes. The evidence collected aligns with these known patterns and motives.\n", + "The Joker is characterized by his love for chaos, dramatic flair, and leaving symbolic markers at his crime scenes. The combination of playing cards, the sinister laugh, and the cryptic note all align with his known behavioral patterns. His motives often include creating disorder, challenging Batman, and leaving a signature that unmistakably points to him, all of which are evident in this case.\n", "\n", "**Confidence Level:** 95%\n", "\n", - "The evidence strongly suggests the Joker's involvement, with high similarity scores across visual and auditory data, and moderate confidence in the textual and depth evidence. The slight deduction in confidence accounts for the inherent limitations in depth sensor identification without facial recognition and the indirect nature of textual evidence.\n", + "The evidence strongly points to the Joker as the prime suspect due to the convergence of visual, auditory, textual, and depth data that aligns with his known patterns and behaviors. The slight deductions in confidence are due to the inherent limitations in depth sensor identification and the slightly lower similarity score of the textual evidence.\n", "\n", "**Next Steps:** No further evidence required.\n", "\n", - "The combination of multimodal evidence provides a comprehensive profile that matches the Joker's known criminal behavior and modus operandi. While additional evidence could always further solidify the case, the current dataset is sufficient to justify focusing investigative and apprehension efforts on the Joker.\n", + "The combination of multimodal evidence provides a comprehensive and conclusive identification of the Joker as the perpetrator. However, capturing additional direct visual confirmation of the Joker at the scene or obtaining a confession would only serve to reinforce the already strong case.\n", "INFO:__main__:++++++++++++++++++++++++++++++++++++++++++++++++++\n" ] } diff --git a/supporting-blog-content/building-multimodal-rag-with-elasticsearch-gotham/notebook/elasticsearch-labs b/supporting-blog-content/building-multimodal-rag-with-elasticsearch-gotham/notebook/elasticsearch-labs new file mode 160000 index 00000000..c90ba3d0 --- /dev/null +++ b/supporting-blog-content/building-multimodal-rag-with-elasticsearch-gotham/notebook/elasticsearch-labs @@ -0,0 +1 @@ +Subproject commit c90ba3d067e2cd639a1babf9cebbf658cedcad9a