From 535e8feff301dfe8acbb8da675a8bab205b4f601 Mon Sep 17 00:00:00 2001 From: James Braza Date: Wed, 8 Oct 2025 13:01:41 -0700 Subject: [PATCH 1/7] Added validate_image helper method with extra for pillow --- packages/lmi/pyproject.toml | 5 ++++- packages/lmi/src/lmi/utils.py | 22 ++++++++++++++++++++++ uv.lock | 9 +++++++-- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/packages/lmi/pyproject.toml b/packages/lmi/pyproject.toml index 6a2d1e40..17404afb 100644 --- a/packages/lmi/pyproject.toml +++ b/packages/lmi/pyproject.toml @@ -40,7 +40,7 @@ requires-python = ">=3.11" [project.optional-dependencies] dev = [ "fhaviary[xml]", - "fhlmi[local,progress,typing,vcr]", + "fhlmi[image,local,progress,typing,vcr]", "httpx-aiohttp", "ipython>=8", # Pin to keep recent "litellm>=1.71", # Lower pin for aiohttp transport adoption @@ -59,6 +59,9 @@ dev = [ "refurb>=2", # Pin to keep recent "typeguard", ] +image = [ + "pillow>=10.3.0", # Pin for py.typed +] local = [ "numpy", "sentence-transformers", diff --git a/packages/lmi/src/lmi/utils.py b/packages/lmi/src/lmi/utils.py index 8332d228..424a435f 100644 --- a/packages/lmi/src/lmi/utils.py +++ b/packages/lmi/src/lmi/utils.py @@ -15,7 +15,10 @@ tqdm = None # type: ignore[assignment,misc] if TYPE_CHECKING: + from typing import IO + import vcr.request + from PIL._typing import StrOrBytesPath def configure_llm_logs() -> None: @@ -127,3 +130,22 @@ def update_litellm_max_callbacks(value: int = 1000) -> None: SEE: https://github.com/BerriAI/litellm/issues/9792 """ litellm.litellm_core_utils.logging_callback_manager.LoggingCallbackManager.MAX_CALLBACKS = value + + +def validate_image(path: "StrOrBytesPath | IO[bytes]") -> None: + """ + Validate that the file at the given path is a valid image. + + Raises: + OSError: If the image file is truncated. + """ # noqa: DOC502 + try: + from PIL import Image + except ImportError as exc: + raise ImportError( + "Image validation requires the 'image' extra for 'pillow'. Please:" + " `pip install fhlmi[image]`." + ) from exc + + with Image.open(path) as img: + img.load() diff --git a/uv.lock b/uv.lock index f4e63dc6..d5e3ae69 100644 --- a/uv.lock +++ b/uv.lock @@ -727,6 +727,7 @@ dev = [ { name = "litellm" }, { name = "mypy" }, { name = "numpy" }, + { name = "pillow" }, { name = "pre-commit" }, { name = "pylint-pydantic" }, { name = "pytest" }, @@ -745,6 +746,9 @@ dev = [ { name = "types-tqdm" }, { name = "vcrpy" }, ] +image = [ + { name = "pillow" }, +] local = [ { name = "numpy" }, { name = "sentence-transformers" }, @@ -769,7 +773,7 @@ requires-dist = [ { name = "coredis" }, { name = "fhaviary", specifier = ">=0.14.0" }, { name = "fhaviary", extras = ["xml"], marker = "extra == 'dev'" }, - { name = "fhlmi", extras = ["local", "progress", "typing", "vcr"], marker = "extra == 'dev'", editable = "packages/lmi" }, + { name = "fhlmi", extras = ["image", "local", "progress", "typing", "vcr"], marker = "extra == 'dev'", editable = "packages/lmi" }, { name = "httpx-aiohttp", marker = "extra == 'dev'" }, { name = "ipython", marker = "extra == 'dev'", specifier = ">=8" }, { name = "limits", specifier = ">=4.8" }, @@ -777,6 +781,7 @@ requires-dist = [ { name = "litellm", marker = "extra == 'dev'", specifier = ">=1.71" }, { name = "mypy", marker = "extra == 'dev'", specifier = ">=1.8" }, { name = "numpy", marker = "extra == 'local'" }, + { name = "pillow", marker = "extra == 'image'", specifier = ">=10.3.0" }, { name = "pre-commit", marker = "extra == 'dev'", specifier = ">=3.4" }, { name = "pydantic", specifier = "~=2.0,>=2.10.1" }, { name = "pylint-pydantic", marker = "extra == 'dev'" }, @@ -798,7 +803,7 @@ requires-dist = [ { name = "typing-extensions", marker = "python_full_version < '3.12'" }, { name = "vcrpy", marker = "extra == 'vcr'", specifier = ">=6" }, ] -provides-extras = ["dev", "local", "progress", "typing", "vcr"] +provides-extras = ["dev", "image", "local", "progress", "typing", "vcr"] [package.metadata.requires-dev] dev = [{ name = "fhlmi", extras = ["dev"], editable = "packages/lmi" }] From 19e3d62acd73904b4e113bd473ebe12ffe6a6fda Mon Sep 17 00:00:00 2001 From: James Braza Date: Wed, 8 Oct 2025 13:03:30 -0700 Subject: [PATCH 2/7] Added bytes_to_string/string_to_bytes conversion utilities --- packages/lmi/src/lmi/utils.py | 16 ++++++++++++++++ packages/lmi/tests/test_utils.py | 25 +++++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 packages/lmi/tests/test_utils.py diff --git a/packages/lmi/src/lmi/utils.py b/packages/lmi/src/lmi/utils.py index 424a435f..b09cb86a 100644 --- a/packages/lmi/src/lmi/utils.py +++ b/packages/lmi/src/lmi/utils.py @@ -1,4 +1,5 @@ import asyncio +import base64 import contextlib import logging import logging.config @@ -132,6 +133,21 @@ def update_litellm_max_callbacks(value: int = 1000) -> None: litellm.litellm_core_utils.logging_callback_manager.LoggingCallbackManager.MAX_CALLBACKS = value +def bytes_to_string(value: bytes) -> str: + """Convert bytes to a base64-encoded string.""" + # 1. Convert bytes to base64 bytes + # 2. Convert base64 bytes to base64 string, + # using UTF-8 since base64 produces ASCII characters + return base64.b64encode(value).decode("utf-8") + + +def string_to_bytes(value: str) -> bytes: + """Convert a base64-encoded string to bytes.""" + # 1. Convert base64 string to base64 bytes (the noqa comment is to make this clear) + # 2. Convert base64 bytes to original bytes + return base64.b64decode(value.encode("utf-8")) # noqa: FURB120 + + def validate_image(path: "StrOrBytesPath | IO[bytes]") -> None: """ Validate that the file at the given path is a valid image. diff --git a/packages/lmi/tests/test_utils.py b/packages/lmi/tests/test_utils.py new file mode 100644 index 00000000..306d00ef --- /dev/null +++ b/packages/lmi/tests/test_utils.py @@ -0,0 +1,25 @@ +import base64 + +import pytest + +from lmi.utils import bytes_to_string, string_to_bytes + + +@pytest.mark.parametrize( + "value", + [ + pytest.param(b"Hello, World!", id="simple-text"), + pytest.param(b"", id="empty-bytes"), + pytest.param(bytes([0, 1, 2, 255, 128, 64]), id="binary-data"), + pytest.param(b"Test data for base64 encoding", id="base64-validation"), + pytest.param("Hello δΈ–η•Œ 🌍".encode(), id="utf8-text"), + ], +) +def test_str_bytes_conversions(value: bytes) -> None: + # Test round-trip conversion + encoded_string = bytes_to_string(value) + decoded_bytes = string_to_bytes(encoded_string) + assert decoded_bytes == value + + # Validate that encoded string is valid base64 + assert base64.b64decode(encoded_string) == value From eb96e207fe6a01feab9e44953fa8bdfa193cb577 Mon Sep 17 00:00:00 2001 From: James Braza Date: Wed, 8 Oct 2025 16:24:57 -0700 Subject: [PATCH 3/7] Created utils for working with URL-encoded images --- packages/lmi/src/lmi/utils.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/lmi/src/lmi/utils.py b/packages/lmi/src/lmi/utils.py index b09cb86a..7c4ce1ba 100644 --- a/packages/lmi/src/lmi/utils.py +++ b/packages/lmi/src/lmi/utils.py @@ -165,3 +165,17 @@ def validate_image(path: "StrOrBytesPath | IO[bytes]") -> None: with Image.open(path) as img: img.load() + + +def encode_image_as_url(image_type: str, image_data: bytes | str) -> str: + """Convert image data to an RFC 2397 data URL format.""" + if isinstance(image_data, bytes): + image_data = bytes_to_string(image_data) + return f"data:image/{image_type};base64,{image_data}" + + +def is_encoded_image(image: str) -> bool: + """Check if the given image is a GCS URL or a RFC 2397 data URL.""" + return image.startswith("gs://") or ( + image.startswith("data:image/") and ";base64," in image + ) From dc527a8484deab5dcf514bf27b90df06dc57994a Mon Sep 17 00:00:00 2001 From: James Braza Date: Wed, 8 Oct 2025 13:19:42 -0700 Subject: [PATCH 4/7] Added SF districts map from 'https://commons.wikimedia.org/wiki/File:San_francisco_districts.png' to LMI stub_data folder --- packages/lmi/tests/conftest.py | 7 +++++++ packages/lmi/tests/stub_data/sf_districts.png | Bin 0 -> 142345 bytes 2 files changed, 7 insertions(+) create mode 100644 packages/lmi/tests/stub_data/sf_districts.png diff --git a/packages/lmi/tests/conftest.py b/packages/lmi/tests/conftest.py index b6349fa6..8ba879bf 100644 --- a/packages/lmi/tests/conftest.py +++ b/packages/lmi/tests/conftest.py @@ -23,6 +23,7 @@ TESTS_DIR = Path(__file__).parent CASSETTES_DIR = TESTS_DIR / "cassettes" +STUB_DATA_DIR = TESTS_DIR / "stub_data" @pytest.fixture(autouse=True, scope="session") @@ -84,6 +85,12 @@ def fixture_reset_log_levels(caplog) -> Iterator[None]: logger.propagate = True +@pytest.fixture(name="png_image", scope="session") +def fixture_png_image() -> bytes: + with (STUB_DATA_DIR / "sf_districts.png").open("rb") as f: + return f.read() + + class PreReadCompatibleAiohttpResponseStream( httpx_aiohttp.transport.AiohttpResponseStream ): diff --git a/packages/lmi/tests/stub_data/sf_districts.png b/packages/lmi/tests/stub_data/sf_districts.png new file mode 100644 index 0000000000000000000000000000000000000000..70dccf61427d0af6d76bc48944ad1722c437cab0 GIT binary patch literal 142345 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%0D@%f7ONcR>eGDA9lg5^TY}z?A+~#!Q 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 Date: Thu, 9 Oct 2025 13:10:42 -0700 Subject: [PATCH 5/7] Created GCS image fixture in conftest.py, with Google's Python dependencies --- .github/workflows/tests.yml | 3 + packages/lmi/pyproject.toml | 2 + packages/lmi/tests/conftest.py | 18 ++++ pyproject.toml | 1 + uv.lock | 169 +++++++++++++++++++++++++++++++++ 5 files changed, 193 insertions(+) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index b479a7d2..3670b27a 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -89,6 +89,9 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 + - uses: google-github-actions/auth@v3 + with: + credentials_json: ${{ secrets.GCP_CREDENTIALS }} - uses: astral-sh/setup-uv@v7 with: enable-cache: true diff --git a/packages/lmi/pyproject.toml b/packages/lmi/pyproject.toml index 17404afb..baf9f070 100644 --- a/packages/lmi/pyproject.toml +++ b/packages/lmi/pyproject.toml @@ -41,6 +41,8 @@ requires-python = ">=3.11" dev = [ "fhaviary[xml]", "fhlmi[image,local,progress,typing,vcr]", + "google-auth>=2", # Pin to keep recent + "google-cloud-storage>=3", # Pin to keep recent "httpx-aiohttp", "ipython>=8", # Pin to keep recent "litellm>=1.71", # Lower pin for aiohttp transport adoption diff --git a/packages/lmi/tests/conftest.py b/packages/lmi/tests/conftest.py index 8ba879bf..0a11b000 100644 --- a/packages/lmi/tests/conftest.py +++ b/packages/lmi/tests/conftest.py @@ -11,6 +11,7 @@ import pytest import vcr.stubs.httpx_stubs from dotenv import load_dotenv +from google.cloud.storage import Client from lmi.utils import ( ANTHROPIC_API_KEY_HEADER, @@ -91,6 +92,23 @@ def fixture_png_image() -> bytes: return f.read() +TMP_LMI_TEST_GCS_BUCKET = "tmp-lmi-test" + + +@pytest.fixture(name="png_image_gcs", scope="session") +def fixture_png_image_gcs(png_image: bytes) -> str: + """Get or create a temporary GCS bucket, upload test image, and return GCS URL.""" + client = Client() + bucket = client.bucket(TMP_LMI_TEST_GCS_BUCKET) + if not bucket.exists(): # Get or create the bucket + bucket = client.create_bucket(bucket) + blob_name = "sf_districts.png" + blob = bucket.blob(blob_name) + if not blob.exists(client): + blob.upload_from_string(png_image, content_type="image/png") + return f"gs://{TMP_LMI_TEST_GCS_BUCKET}/{blob_name}" + + class PreReadCompatibleAiohttpResponseStream( httpx_aiohttp.transport.AiohttpResponseStream ): diff --git a/pyproject.toml b/pyproject.toml index 5c9b40fe..e4ebfea2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -183,6 +183,7 @@ ignore_missing_imports = true module = [ "accelerate.*", # SEE: https://github.com/huggingface/accelerate/issues/2396 "dask_cuda", + "google.cloud.storage", # SEE: https://github.com/googleapis/python-storage/issues/393 "networkx", # SEE: https://github.com/networkx/networkx/issues/3988 "pydot", "transformers.*", # SEE: https://github.com/huggingface/transformers/pull/18485 diff --git a/uv.lock b/uv.lock index d5e3ae69..9c470eae 100644 --- a/uv.lock +++ b/uv.lock @@ -250,6 +250,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/96/2a/a4773109619010192e72f48e95165b14790413a51f513c879c8d63f67e17/beartype-0.22.2-py3-none-any.whl", hash = "sha256:12077afe3528eba5c5b801f816712f7ff06f6da5509994c79561e29b48bcedb8", size = 1317280, upload-time = "2025-10-04T06:37:53.99Z" }, ] +[[package]] +name = "cachetools" +version = "6.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/61/e4fad8155db4a04bfb4734c7c8ff0882f078f24294d42798b3568eb63bff/cachetools-6.2.0.tar.gz", hash = "sha256:38b328c0889450f05f5e120f56ab68c8abaf424e1275522b138ffc93253f7e32", size = 30988, upload-time = "2025-08-25T18:57:30.924Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/56/3124f61d37a7a4e7cc96afc5492c78ba0cb551151e530b54669ddd1436ef/cachetools-6.2.0-py3-none-any.whl", hash = "sha256:1c76a8960c0041fcc21097e357f882197c79da0dbff766e7317890a65d7d8ba6", size = 11276, upload-time = "2025-08-25T18:57:29.684Z" }, +] + [[package]] name = "certifi" version = "2025.10.5" @@ -722,6 +731,8 @@ dependencies = [ [package.optional-dependencies] dev = [ { name = "fhaviary", extra = ["xml"] }, + { name = "google-auth" }, + { name = "google-cloud-storage" }, { name = "httpx-aiohttp" }, { name = "ipython" }, { name = "litellm" }, @@ -774,6 +785,8 @@ requires-dist = [ { name = "fhaviary", specifier = ">=0.14.0" }, { name = "fhaviary", extras = ["xml"], marker = "extra == 'dev'" }, { name = "fhlmi", extras = ["image", "local", "progress", "typing", "vcr"], marker = "extra == 'dev'", editable = "packages/lmi" }, + { name = "google-auth", marker = "extra == 'dev'", specifier = ">=2" }, + { name = "google-cloud-storage", marker = "extra == 'dev'", specifier = ">=3" }, { name = "httpx-aiohttp", marker = "extra == 'dev'" }, { name = "ipython", marker = "extra == 'dev'", specifier = ">=8" }, { name = "limits", specifier = ">=4.8" }, @@ -1004,6 +1017,117 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/01/61/d4b89fec821f72385526e1b9d9a3a0385dda4a72b206d28049e2c7cd39b8/gitpython-3.1.45-py3-none-any.whl", hash = "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77", size = 208168, upload-time = "2025-07-24T03:45:52.517Z" }, ] +[[package]] +name = "google-api-core" +version = "2.26.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-auth" }, + { name = "googleapis-common-protos" }, + { name = "proto-plus" }, + { name = "protobuf" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/32/ea/e7b6ac3c7b557b728c2d0181010548cbbdd338e9002513420c5a354fa8df/google_api_core-2.26.0.tar.gz", hash = "sha256:e6e6d78bd6cf757f4aee41dcc85b07f485fbb069d5daa3afb126defba1e91a62", size = 166369, upload-time = "2025-10-08T21:37:38.39Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/ad/f73cf9fe9bd95918502b270e3ddb8764e4c900b3bbd7782b90c56fac14bb/google_api_core-2.26.0-py3-none-any.whl", hash = "sha256:2b204bd0da2c81f918e3582c48458e24c11771f987f6258e6e227212af78f3ed", size = 162505, upload-time = "2025-10-08T21:37:36.651Z" }, +] + +[[package]] +name = "google-auth" +version = "2.41.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cachetools" }, + { name = "pyasn1-modules" }, + { name = "rsa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a8/af/5129ce5b2f9688d2fa49b463e544972a7c82b0fdb50980dafee92e121d9f/google_auth-2.41.1.tar.gz", hash = "sha256:b76b7b1f9e61f0cb7e88870d14f6a94aeef248959ef6992670efee37709cbfd2", size = 292284, upload-time = "2025-09-30T22:51:26.363Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/a4/7319a2a8add4cc352be9e3efeff5e2aacee917c85ca2fa1647e29089983c/google_auth-2.41.1-py2.py3-none-any.whl", hash = "sha256:754843be95575b9a19c604a848a41be03f7f2afd8c019f716dc1f51ee41c639d", size = 221302, upload-time = "2025-09-30T22:51:24.212Z" }, +] + +[[package]] +name = "google-cloud-core" +version = "2.4.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-api-core" }, + { name = "google-auth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d6/b8/2b53838d2acd6ec6168fd284a990c76695e84c65deee79c9f3a4276f6b4f/google_cloud_core-2.4.3.tar.gz", hash = "sha256:1fab62d7102844b278fe6dead3af32408b1df3eb06f5c7e8634cbd40edc4da53", size = 35861, upload-time = "2025-03-10T21:05:38.948Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/86/bda7241a8da2d28a754aad2ba0f6776e35b67e37c36ae0c45d49370f1014/google_cloud_core-2.4.3-py2.py3-none-any.whl", hash = "sha256:5130f9f4c14b4fafdff75c79448f9495cfade0d8775facf1b09c3bf67e027f6e", size = 29348, upload-time = "2025-03-10T21:05:37.785Z" }, +] + +[[package]] +name = "google-cloud-storage" +version = "3.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-api-core" }, + { name = "google-auth" }, + { name = "google-cloud-core" }, + { name = "google-crc32c" }, + { name = "google-resumable-media" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bd/ef/7cefdca67a6c8b3af0ec38612f9e78e5a9f6179dd91352772ae1a9849246/google_cloud_storage-3.4.1.tar.gz", hash = "sha256:6f041a297e23a4b485fad8c305a7a6e6831855c208bcbe74d00332a909f82268", size = 17238203, upload-time = "2025-10-08T18:43:39.665Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/6e/b47d83d3a35231c6232566341b0355cce78fd4e6988a7343725408547b2c/google_cloud_storage-3.4.1-py3-none-any.whl", hash = "sha256:972764cc0392aa097be8f49a5354e22eb47c3f62370067fb1571ffff4a1c1189", size = 290142, upload-time = "2025-10-08T18:43:37.524Z" }, +] + +[[package]] +name = "google-crc32c" +version = "1.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/ae/87802e6d9f9d69adfaedfcfd599266bf386a54d0be058b532d04c794f76d/google_crc32c-1.7.1.tar.gz", hash = "sha256:2bff2305f98846f3e825dbeec9ee406f89da7962accdb29356e4eadc251bd472", size = 14495, upload-time = "2025-03-26T14:29:13.32Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/94/220139ea87822b6fdfdab4fb9ba81b3fff7ea2c82e2af34adc726085bffc/google_crc32c-1.7.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:6fbab4b935989e2c3610371963ba1b86afb09537fd0c633049be82afe153ac06", size = 30468, upload-time = "2025-03-26T14:32:52.215Z" }, + { url = "https://files.pythonhosted.org/packages/94/97/789b23bdeeb9d15dc2904660463ad539d0318286d7633fe2760c10ed0c1c/google_crc32c-1.7.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:ed66cbe1ed9cbaaad9392b5259b3eba4a9e565420d734e6238813c428c3336c9", size = 30313, upload-time = "2025-03-26T14:57:38.758Z" }, + { url = "https://files.pythonhosted.org/packages/81/b8/976a2b843610c211e7ccb3e248996a61e87dbb2c09b1499847e295080aec/google_crc32c-1.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee6547b657621b6cbed3562ea7826c3e11cab01cd33b74e1f677690652883e77", size = 33048, upload-time = "2025-03-26T14:41:30.679Z" }, + { url = "https://files.pythonhosted.org/packages/c9/16/a3842c2cf591093b111d4a5e2bfb478ac6692d02f1b386d2a33283a19dc9/google_crc32c-1.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d68e17bad8f7dd9a49181a1f5a8f4b251c6dbc8cc96fb79f1d321dfd57d66f53", size = 32669, upload-time = "2025-03-26T14:41:31.432Z" }, + { url = "https://files.pythonhosted.org/packages/04/17/ed9aba495916fcf5fe4ecb2267ceb851fc5f273c4e4625ae453350cfd564/google_crc32c-1.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:6335de12921f06e1f774d0dd1fbea6bf610abe0887a1638f64d694013138be5d", size = 33476, upload-time = "2025-03-26T14:29:10.211Z" }, + { url = "https://files.pythonhosted.org/packages/dd/b7/787e2453cf8639c94b3d06c9d61f512234a82e1d12d13d18584bd3049904/google_crc32c-1.7.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2d73a68a653c57281401871dd4aeebbb6af3191dcac751a76ce430df4d403194", size = 30470, upload-time = "2025-03-26T14:34:31.655Z" }, + { url = "https://files.pythonhosted.org/packages/ed/b4/6042c2b0cbac3ec3a69bb4c49b28d2f517b7a0f4a0232603c42c58e22b44/google_crc32c-1.7.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:22beacf83baaf59f9d3ab2bbb4db0fb018da8e5aebdce07ef9f09fce8220285e", size = 30315, upload-time = "2025-03-26T15:01:54.634Z" }, + { url = "https://files.pythonhosted.org/packages/29/ad/01e7a61a5d059bc57b702d9ff6a18b2585ad97f720bd0a0dbe215df1ab0e/google_crc32c-1.7.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19eafa0e4af11b0a4eb3974483d55d2d77ad1911e6cf6f832e1574f6781fd337", size = 33180, upload-time = "2025-03-26T14:41:32.168Z" }, + { url = "https://files.pythonhosted.org/packages/3b/a5/7279055cf004561894ed3a7bfdf5bf90a53f28fadd01af7cd166e88ddf16/google_crc32c-1.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6d86616faaea68101195c6bdc40c494e4d76f41e07a37ffdef270879c15fb65", size = 32794, upload-time = "2025-03-26T14:41:33.264Z" }, + { url = "https://files.pythonhosted.org/packages/0f/d6/77060dbd140c624e42ae3ece3df53b9d811000729a5c821b9fd671ceaac6/google_crc32c-1.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:b7491bdc0c7564fcf48c0179d2048ab2f7c7ba36b84ccd3a3e1c3f7a72d3bba6", size = 33477, upload-time = "2025-03-26T14:29:10.94Z" }, + { url = "https://files.pythonhosted.org/packages/8b/72/b8d785e9184ba6297a8620c8a37cf6e39b81a8ca01bb0796d7cbb28b3386/google_crc32c-1.7.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:df8b38bdaf1629d62d51be8bdd04888f37c451564c2042d36e5812da9eff3c35", size = 30467, upload-time = "2025-03-26T14:36:06.909Z" }, + { url = "https://files.pythonhosted.org/packages/34/25/5f18076968212067c4e8ea95bf3b69669f9fc698476e5f5eb97d5b37999f/google_crc32c-1.7.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:e42e20a83a29aa2709a0cf271c7f8aefaa23b7ab52e53b322585297bb94d4638", size = 30309, upload-time = "2025-03-26T15:06:15.318Z" }, + { url = "https://files.pythonhosted.org/packages/92/83/9228fe65bf70e93e419f38bdf6c5ca5083fc6d32886ee79b450ceefd1dbd/google_crc32c-1.7.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:905a385140bf492ac300026717af339790921f411c0dfd9aa5a9e69a08ed32eb", size = 33133, upload-time = "2025-03-26T14:41:34.388Z" }, + { url = "https://files.pythonhosted.org/packages/c3/ca/1ea2fd13ff9f8955b85e7956872fdb7050c4ace8a2306a6d177edb9cf7fe/google_crc32c-1.7.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b211ddaf20f7ebeec5c333448582c224a7c90a9d98826fbab82c0ddc11348e6", size = 32773, upload-time = "2025-03-26T14:41:35.19Z" }, + { url = "https://files.pythonhosted.org/packages/89/32/a22a281806e3ef21b72db16f948cad22ec68e4bdd384139291e00ff82fe2/google_crc32c-1.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:0f99eaa09a9a7e642a61e06742856eec8b19fc0037832e03f941fe7cf0c8e4db", size = 33475, upload-time = "2025-03-26T14:29:11.771Z" }, + { url = "https://files.pythonhosted.org/packages/b8/c5/002975aff514e57fc084ba155697a049b3f9b52225ec3bc0f542871dd524/google_crc32c-1.7.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32d1da0d74ec5634a05f53ef7df18fc646666a25efaaca9fc7dcfd4caf1d98c3", size = 33243, upload-time = "2025-03-26T14:41:35.975Z" }, + { url = "https://files.pythonhosted.org/packages/61/cb/c585282a03a0cea70fcaa1bf55d5d702d0f2351094d663ec3be1c6c67c52/google_crc32c-1.7.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e10554d4abc5238823112c2ad7e4560f96c7bf3820b202660373d769d9e6e4c9", size = 32870, upload-time = "2025-03-26T14:41:37.08Z" }, + { url = "https://files.pythonhosted.org/packages/16/1b/1693372bf423ada422f80fd88260dbfd140754adb15cbc4d7e9a68b1cb8e/google_crc32c-1.7.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85fef7fae11494e747c9fd1359a527e5970fc9603c90764843caabd3a16a0a48", size = 28241, upload-time = "2025-03-26T14:41:45.898Z" }, + { url = "https://files.pythonhosted.org/packages/fd/3c/2a19a60a473de48717b4efb19398c3f914795b64a96cf3fbe82588044f78/google_crc32c-1.7.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6efb97eb4369d52593ad6f75e7e10d053cf00c48983f7a973105bc70b0ac4d82", size = 28048, upload-time = "2025-03-26T14:41:46.696Z" }, +] + +[[package]] +name = "google-resumable-media" +version = "2.7.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-crc32c" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/5a/0efdc02665dca14e0837b62c8a1a93132c264bd02054a15abb2218afe0ae/google_resumable_media-2.7.2.tar.gz", hash = "sha256:5280aed4629f2b60b847b0d42f9857fd4935c11af266744df33d8074cae92fe0", size = 2163099, upload-time = "2024-08-07T22:20:38.555Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/35/b8d3baf8c46695858cb9d8835a53baa1eeb9906ddaf2f728a5f5b640fd1e/google_resumable_media-2.7.2-py2.py3-none-any.whl", hash = "sha256:3ce7551e9fe6d99e9a126101d2536612bb73486721951e9562fee0f90c6ababa", size = 81251, upload-time = "2024-08-07T22:20:36.409Z" }, +] + +[[package]] +name = "googleapis-common-protos" +version = "1.70.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/39/24/33db22342cf4a2ea27c9955e6713140fedd51e8b141b5ce5260897020f1a/googleapis_common_protos-1.70.0.tar.gz", hash = "sha256:0e1b44e0ea153e6594f9f394fef15193a68aaaea2d843f83e2742717ca753257", size = 145903, upload-time = "2025-04-14T10:17:02.924Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/f1/62a193f0227cf15a920390abe675f386dec35f7ae3ffe6da582d3ade42c7/googleapis_common_protos-1.70.0-py3-none-any.whl", hash = "sha256:b8bfcca8c25a2bb253e0e0b0adaf8c00773e5e6af6fd92397576680b807e0fd8", size = 294530, upload-time = "2025-04-14T10:17:01.271Z" }, +] + [[package]] name = "h11" version = "0.16.0" @@ -2623,6 +2747,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305, upload-time = "2025-10-08T19:49:00.792Z" }, ] +[[package]] +name = "proto-plus" +version = "1.26.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f4/ac/87285f15f7cce6d4a008f33f1757fb5a13611ea8914eb58c3d0d26243468/proto_plus-1.26.1.tar.gz", hash = "sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012", size = 56142, upload-time = "2025-03-10T15:54:38.843Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/6d/280c4c2ce28b1593a19ad5239c8b826871fc6ec275c21afc8e1820108039/proto_plus-1.26.1-py3-none-any.whl", hash = "sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66", size = 50163, upload-time = "2025-03-10T15:54:37.335Z" }, +] + [[package]] name = "protobuf" version = "6.32.1" @@ -2671,6 +2807,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, ] +[[package]] +name = "pyasn1" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/e9/01f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018/pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034", size = 145322, upload-time = "2024-09-10T22:41:42.55Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", size = 83135, upload-time = "2024-09-11T16:00:36.122Z" }, +] + +[[package]] +name = "pyasn1-modules" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyasn1" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload-time = "2025-03-28T02:41:22.17Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload-time = "2025-03-28T02:41:19.028Z" }, +] + [[package]] name = "pydantic" version = "2.12.0" @@ -3377,6 +3534,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ce/08/4349bdd5c64d9d193c360aa9db89adeee6f6682ab8825dca0a3f535f434f/rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:dc23e6820e3b40847e2f4a7726462ba0cf53089512abe9ee16318c366494c17a", size = 556523, upload-time = "2025-08-27T12:16:12.188Z" }, ] +[[package]] +name = "rsa" +version = "4.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyasn1" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/da/8a/22b7beea3ee0d44b1916c0c1cb0ee3af23b700b6da9f04991899d0c555d4/rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75", size = 29034, upload-time = "2025-04-16T09:51:18.218Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696, upload-time = "2025-04-16T09:51:17.142Z" }, +] + [[package]] name = "safetensors" version = "0.6.2" From 1fc5a0a0ce51511e0998339e5afa779fd9e700fe Mon Sep 17 00:00:00 2001 From: James Braza Date: Thu, 9 Oct 2025 13:11:10 -0700 Subject: [PATCH 6/7] Added support for multimodal embeddings, with tests --- packages/lmi/src/lmi/embeddings.py | 46 ++++++++++++---- packages/lmi/tests/test_embeddings.py | 76 ++++++++++++++++++++++++++- 2 files changed, 111 insertions(+), 11 deletions(-) diff --git a/packages/lmi/src/lmi/embeddings.py b/packages/lmi/src/lmi/embeddings.py index b3c8c579..5fb13c07 100644 --- a/packages/lmi/src/lmi/embeddings.py +++ b/packages/lmi/src/lmi/embeddings.py @@ -13,7 +13,37 @@ from lmi.cost_tracker import track_costs from lmi.llms import PassThroughRouter from lmi.rate_limiter import GLOBAL_LIMITER -from lmi.utils import get_litellm_retrying_config +from lmi.utils import get_litellm_retrying_config, is_encoded_image + +URL_ENCODED_IMAGE_TOKEN_ESTIMATE = 85 # tokens + + +def estimate_tokens( + document: str + | list[str] + | list[litellm.ChatCompletionImageObject] + | list[litellm.types.llms.vertex_ai.PartType], +) -> float: + """Estimate token count for rate limiting purposes.""" + if isinstance(document, str): # Text or a data URL + return ( + URL_ENCODED_IMAGE_TOKEN_ESTIMATE + if is_encoded_image(document) + else len(document) / CHARACTERS_PER_TOKEN_ASSUMPTION + ) + # For multimodal content, estimate based on text parts and add fixed cost for images + token_count = 0.0 + for part in document: + if isinstance(part, str): # Part of a batch of text or data URLs + token_count += estimate_tokens(part) + # Handle different multimodal formats + elif part.get("type") == "image_url": # OpenAI format + token_count += URL_ENCODED_IMAGE_TOKEN_ESTIMATE + elif ( # Gemini text format -- https://ai.google.dev/api#text-only-prompt + "text" in part + ): + token_count += len(part["text"]) / CHARACTERS_PER_TOKEN_ASSUMPTION # type: ignore[typeddict-item] + return token_count class EmbeddingModes(StrEnum): @@ -39,7 +69,7 @@ def set_mode(self, mode: EmbeddingModes) -> None: @abstractmethod async def embed_documents(self, texts: list[str]) -> list[list[float]]: - pass + """Embed a list of documents.""" async def embed_document(self, text: str) -> list[float]: return (await self.embed_documents([text]))[0] @@ -138,7 +168,7 @@ def _truncate_if_large(self, texts: list[str]) -> list[str]: # heuristic about ratio of tokens to characters conservative_char_token_ratio = 3 maybe_too_large = max_tokens * conservative_char_token_ratio - if any(len(t) > maybe_too_large for t in texts): + if any(len(t) > maybe_too_large for t in texts if not is_encoded_image(t)): try: enct = tiktoken.encoding_for_model("cl100k_base") enc_batch = enct.encode_ordinary_batch(texts) @@ -154,16 +184,12 @@ async def embed_documents(self, texts: list[str]) -> list[list[float]]: N = len(texts) embeddings = [] for i in range(0, N, batch_size): - await self.check_rate_limit( - sum( - len(t) / CHARACTERS_PER_TOKEN_ASSUMPTION - for t in texts[i : i + batch_size] - ) - ) + batch = texts[i : i + batch_size] + await self.check_rate_limit(sum(estimate_tokens(t) for t in batch)) response = await track_costs(self.router.aembedding)( model=self.name, - input=texts[i : i + batch_size], + input=batch, dimensions=self.ndim, **self.config.get("kwargs", {}), ) diff --git a/packages/lmi/tests/test_embeddings.py b/packages/lmi/tests/test_embeddings.py index 242c4593..4bb9218f 100644 --- a/packages/lmi/tests/test_embeddings.py +++ b/packages/lmi/tests/test_embeddings.py @@ -4,6 +4,7 @@ import litellm import pytest +import tiktoken from litellm.caching import Cache, InMemoryCache from pytest_subtests import SubTests @@ -15,8 +16,34 @@ SentenceTransformerEmbeddingModel, SparseEmbeddingModel, embedding_model_factory, + estimate_tokens, ) -from lmi.utils import VCR_DEFAULT_MATCH_ON +from lmi.utils import VCR_DEFAULT_MATCH_ON, encode_image_as_url + + +def test_estimate_tokens(subtests: SubTests, png_image: bytes) -> None: + with subtests.test(msg="text only"): + text_only = "Hello world" + text_only_estimated_token_count = estimate_tokens(text_only) + assert text_only_estimated_token_count == 2.75, ( + "Expected a reasonable token estimate" + ) + text_only_actual_token_count = len( + tiktoken.get_encoding("cl100k_base").encode(text_only) + ) + assert text_only_estimated_token_count == pytest.approx( + text_only_actual_token_count, abs=1 + ), "Estimation should be within one token of what tiktoken" + + # Test multimodal (text + image) + with subtests.test(msg="multimodal"): # Text + image + multimodal = [ + "What is in this image?", + encode_image_as_url(image_type="png", image_data=png_image), + ] + assert estimate_tokens(multimodal) == 90.5, ( + "Expected a reasonable token estimate" + ) class TestLiteLLMEmbeddingModel: @@ -231,6 +258,53 @@ async def test_router_usage( # Confirm use of the sentinel timeout in the Router's model_list or pass through assert mock_aembedding.call_args.kwargs["timeout"] == self.SENTINEL_TIMEOUT + @pytest.mark.asyncio + async def test_multimodal_embedding( + self, subtests: SubTests, png_image_gcs: str + ) -> None: + multimodal_model = LiteLLMEmbeddingModel( + name=f"{litellm.LlmProviders.VERTEX_AI.value}/multimodalembedding@001" + ) + + with subtests.test(msg="text or image only"): + embedding_text_only = await multimodal_model.embed_document("Some text") + assert len(embedding_text_only) == 1408 + assert all(isinstance(x, float) for x in embedding_text_only) + + embedding_image_only = await multimodal_model.embed_document(png_image_gcs) + assert len(embedding_image_only) == 1408 + assert all(isinstance(x, float) for x in embedding_image_only) + + assert embedding_image_only != embedding_text_only + + with subtests.test(msg="text and image mixing"): + (embedding_image_text,) = await multimodal_model.embed_documents([ + "What is in this image?", + png_image_gcs, + ]) + assert len(embedding_image_text) == 1408 + assert all(isinstance(x, float) for x in embedding_image_text) + + (embedding_two_images,) = await multimodal_model.embed_documents([ + png_image_gcs, + png_image_gcs, + ]) + assert len(embedding_two_images) == 1408 + assert all(isinstance(x, float) for x in embedding_two_images) + + assert embedding_image_text != embedding_two_images + + with subtests.test(msg="batching"): + multimodal_model.config["batch_size"] = 1 + embeddings = await multimodal_model.embed_documents([ + "Some text", + png_image_gcs, + ]) + assert len(embeddings) == 2 + for embedding in embeddings: + assert len(embedding) == 1408 + assert all(isinstance(x, float) for x in embedding) + @pytest.mark.asyncio async def test_sparse_embedding_model(subtests: SubTests): From 60f74f3c227f11e0fc130521d22c192377ef07a9 Mon Sep 17 00:00:00 2001 From: James Braza Date: Thu, 9 Oct 2025 15:02:39 -0700 Subject: [PATCH 7/7] Added assertion that 2+ texts or 2+ images in one request gets denied --- packages/lmi/tests/test_embeddings.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/lmi/tests/test_embeddings.py b/packages/lmi/tests/test_embeddings.py index 4bb9218f..6dced56a 100644 --- a/packages/lmi/tests/test_embeddings.py +++ b/packages/lmi/tests/test_embeddings.py @@ -277,6 +277,14 @@ async def test_multimodal_embedding( assert embedding_image_only != embedding_text_only + with ( + subtests.test(msg="denies two texts"), + pytest.raises(litellm.BadRequestError, match="one instance"), + ): + # This is more of a confirmation/demonstration that Vertex AI denies any + # embedding request containing >1 text or >1 image + await multimodal_model.embed_documents(["A", "B"]) + with subtests.test(msg="text and image mixing"): (embedding_image_text,) = await multimodal_model.embed_documents([ "What is in this image?",