From 8d55f46facfdf8a11f787e23e5606f8a5c4f179d Mon Sep 17 00:00:00 2001 From: Tomoko Uchida Date: Sat, 2 Aug 2025 14:52:41 +0900 Subject: [PATCH 1/8] release embcli-jina 0.1.3 --- packages/embcli-jina/pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/embcli-jina/pyproject.toml b/packages/embcli-jina/pyproject.toml index 07d454e..b4fa022 100644 --- a/packages/embcli-jina/pyproject.toml +++ b/packages/embcli-jina/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "embcli-jina" -version = "0.1.3-dev" +version = "0.1.3" description = "jina plugin for embcli" readme = "README.md" authors = [{ name = "Tomoko Uchida", email = "tomoko.uchida.1111@gmail.com" }] diff --git a/uv.lock b/uv.lock index 6529b39..a98f5c1 100644 --- a/uv.lock +++ b/uv.lock @@ -630,7 +630,7 @@ requires-dist = [ [[package]] name = "embcli-jina" -version = "0.1.3.dev0" +version = "0.1.3" source = { editable = "packages/embcli-jina" } dependencies = [ { name = "embcli-core" }, From 7e09c8bd3cd685acb4ba2f5c913f208e051c856d Mon Sep 17 00:00:00 2001 From: Tomoko Uchida Date: Sat, 2 Aug 2025 15:03:22 +0900 Subject: [PATCH 2/8] set longer timeout --- packages/embcli-jina/src/embcli_jina/jina.py | 3 ++- packages/embcli-jina/src/embcli_jina/jina_multimodal.py | 4 +++- packages/embcli-jina/tests/embcli_jina/test_jina.py | 3 +++ .../tests/embcli_jina/test_jina_multimodal.py | 9 ++++++--- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/packages/embcli-jina/src/embcli_jina/jina.py b/packages/embcli-jina/src/embcli_jina/jina.py index 90224cf..416a104 100644 --- a/packages/embcli-jina/src/embcli_jina/jina.py +++ b/packages/embcli-jina/src/embcli_jina/jina.py @@ -5,6 +5,7 @@ import httpx from embcli_core.models import EmbeddingModel, ModelOption, ModelOptionType +TIMEOUT_SEC = 3 # Default timeout for embedding requests COLBERT_TIMEOUT_SEC = 5 # Timeout for ColBERT model requests @@ -81,7 +82,7 @@ def _embed_one_batch(self, input: list[str], **kwargs) -> Iterator[list[float] | if "embedding_type" in kwargs: data["embedding_type"] = kwargs["embedding_type"] - timeout = COLBERT_TIMEOUT_SEC if self.model_id == "jina-colbert-v2" else None + timeout = COLBERT_TIMEOUT_SEC if self.model_id == "jina-colbert-v2" else TIMEOUT_SEC response = httpx.post(self.endpoint, headers=headers, json=data, timeout=timeout) response.raise_for_status() for item in response.json().get("data", []): diff --git a/packages/embcli-jina/src/embcli_jina/jina_multimodal.py b/packages/embcli-jina/src/embcli_jina/jina_multimodal.py index bd9d4da..0d5c6d1 100644 --- a/packages/embcli-jina/src/embcli_jina/jina_multimodal.py +++ b/packages/embcli-jina/src/embcli_jina/jina_multimodal.py @@ -6,6 +6,8 @@ import httpx from embcli_core.models import Modality, ModelOption, ModelOptionType, MultimodalEmbeddingModel +TIMEOUT_SEC = 3 # Default timeout for embedding requests + def image_to_base64(image_path: str) -> str: """Encodes an image file to a base64 string.""" @@ -74,7 +76,7 @@ def _embed_one_batch_multimodal( if "embedding_type" in kwargs: data["embedding_type"] = kwargs["embedding_type"] - response = httpx.post(self.endpoint, headers=headers, json=data) + response = httpx.post(self.endpoint, headers=headers, json=data, timeout=TIMEOUT_SEC) response.raise_for_status() for item in response.json().get("data", []): if "embedding" in item: diff --git a/packages/embcli-jina/tests/embcli_jina/test_jina.py b/packages/embcli-jina/tests/embcli_jina/test_jina.py index 541b7af..da6d177 100644 --- a/packages/embcli-jina/tests/embcli_jina/test_jina.py +++ b/packages/embcli-jina/tests/embcli_jina/test_jina.py @@ -43,6 +43,7 @@ def test_embed_one_batch_yields_embeddings(jina_models): @skip_if_no_api_key def test_embed_batch_with_options(jina_models, mocker): + mocker.patch("embcli_jina.jina.TIMEOUT_SEC", 30) mocker.patch("embcli_jina.jina.COLBERT_TIMEOUT_SEC", 30) input_data = ["hello", "world"] for model in jina_models: @@ -90,6 +91,7 @@ def test_embed_batch_embedding_types(jina_models): @skip_if_no_api_key def test_embed_batch_for_ingest(jina_models, mocker): + mocker.patch("embcli_jina.jina.TIMEOUT_SEC", 30) mocker.patch("embcli_jina.jina.COLBERT_TIMEOUT_SEC", 30) for model in jina_models: input_data = ["hello", "world"] @@ -106,6 +108,7 @@ def test_embed_batch_for_ingest(jina_models, mocker): @skip_if_no_api_key def test_embed_for_search(jina_models, mocker): + mocker.patch("embcli_jina.jina.TIMEOUT_SEC", 30) mocker.patch("embcli_jina.jina.COLBERT_TIMEOUT_SEC", 30) for model in jina_models: input = "hello world" diff --git a/packages/embcli-jina/tests/embcli_jina/test_jina_multimodal.py b/packages/embcli-jina/tests/embcli_jina/test_jina_multimodal.py index 4452ac7..c1885ff 100644 --- a/packages/embcli-jina/tests/embcli_jina/test_jina_multimodal.py +++ b/packages/embcli-jina/tests/embcli_jina/test_jina_multimodal.py @@ -28,7 +28,8 @@ def test_factory_create_invalid_model(): @skip_if_no_api_key -def test_embed_one_batch_multimodal(jina_multimodal_models): +def test_embed_one_batch_multimodal(jina_multimodal_models, mocker): + mocker.patch("embcli_jina.multimodal.TIMEOUT_SEC", 30) for model in jina_multimodal_models: print(f"Testing model: {model.model_id}") input_data = ["hello", "world"] @@ -42,7 +43,8 @@ def test_embed_one_batch_multimodal(jina_multimodal_models): @skip_if_no_api_key -def test_embed_one_batch_multimodal_image(jina_multimodal_models): +def test_embed_one_batch_multimodal_image(jina_multimodal_models, mocker): + mocker.patch("embcli_jina.multimodal.TIMEOUT_SEC", 30) for model in jina_multimodal_models: image_paths = [ files("tests.embcli_jina").joinpath("flying_cat.jpeg"), @@ -61,7 +63,8 @@ def test_embed_one_batch_multimodal_image(jina_multimodal_models): @skip_if_no_api_key -def test_embed_batch_with_options(jina_multimodal_models): +def test_embed_batch_with_options(jina_multimodal_models, mocker): + mocker.patch("embcli_jina.multimodal.TIMEOUT_SEC", 30) input_data = ["hello", "world"] for model in jina_multimodal_models: options = {"task": "retrieval.query", "dimensions": 512} From a243f937036bfbc5e182e9a0c9f2ece85da60705 Mon Sep 17 00:00:00 2001 From: Tomoko Uchida Date: Sat, 2 Aug 2025 15:13:55 +0900 Subject: [PATCH 3/8] set timeout for tests --- packages/embcli-jina/tests/embcli_jina/test_cli_embed.py | 6 ++++-- .../tests/embcli_jina/test_jina_multimodal.py | 9 +++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/embcli-jina/tests/embcli_jina/test_cli_embed.py b/packages/embcli-jina/tests/embcli_jina/test_cli_embed.py index 3277c86..95383e9 100644 --- a/packages/embcli-jina/tests/embcli_jina/test_cli_embed.py +++ b/packages/embcli-jina/tests/embcli_jina/test_cli_embed.py @@ -14,9 +14,10 @@ @skip_if_no_api_key def test_embed_command_text(plugin_manager, mocker): + mocker.patch("embcli_jina.jina.TIMEOUT_SEC", 30) mocker.patch("embcli_core.cli._pm", plugin_manager) runner = CliRunner() - result = runner.invoke(embed, ["--model", "jina-v4", "flying cat"]) + result = runner.invoke(embed, ["--model", "jina-v3", "flying cat"]) assert result.exit_code == 0 embeddings = json.loads(result.output) @@ -27,10 +28,11 @@ def test_embed_command_text(plugin_manager, mocker): @skip_if_no_api_key def test_embed_command_image(plugin_manager, mocker): + mocker.patch("embcli_jina.jina_multimodal.TIMEOUT_SEC", 30) mocker.patch("embcli_core.cli._pm", plugin_manager) runner = CliRunner() image_path = files("tests.embcli_jina").joinpath("flying_cat.jpeg") - result = runner.invoke(embed, ["--model", "jina-v4", "--image", str(image_path)]) + result = runner.invoke(embed, ["--model", "jina-clip-v2", "--image", str(image_path)]) assert result.exit_code == 0 embeddings = json.loads(result.output) diff --git a/packages/embcli-jina/tests/embcli_jina/test_jina_multimodal.py b/packages/embcli-jina/tests/embcli_jina/test_jina_multimodal.py index c1885ff..34b6c92 100644 --- a/packages/embcli-jina/tests/embcli_jina/test_jina_multimodal.py +++ b/packages/embcli-jina/tests/embcli_jina/test_jina_multimodal.py @@ -29,7 +29,7 @@ def test_factory_create_invalid_model(): @skip_if_no_api_key def test_embed_one_batch_multimodal(jina_multimodal_models, mocker): - mocker.patch("embcli_jina.multimodal.TIMEOUT_SEC", 30) + mocker.patch("embcli_jina.jina_multimodal.TIMEOUT_SEC", 30) for model in jina_multimodal_models: print(f"Testing model: {model.model_id}") input_data = ["hello", "world"] @@ -44,7 +44,7 @@ def test_embed_one_batch_multimodal(jina_multimodal_models, mocker): @skip_if_no_api_key def test_embed_one_batch_multimodal_image(jina_multimodal_models, mocker): - mocker.patch("embcli_jina.multimodal.TIMEOUT_SEC", 30) + mocker.patch("embcli_jina.jina_multimodal.TIMEOUT_SEC", 30) for model in jina_multimodal_models: image_paths = [ files("tests.embcli_jina").joinpath("flying_cat.jpeg"), @@ -64,7 +64,7 @@ def test_embed_one_batch_multimodal_image(jina_multimodal_models, mocker): @skip_if_no_api_key def test_embed_batch_with_options(jina_multimodal_models, mocker): - mocker.patch("embcli_jina.multimodal.TIMEOUT_SEC", 30) + mocker.patch("embcli_jina.jina_multimodal.TIMEOUT_SEC", 30) input_data = ["hello", "world"] for model in jina_multimodal_models: options = {"task": "retrieval.query", "dimensions": 512} @@ -77,7 +77,8 @@ def test_embed_batch_with_options(jina_multimodal_models, mocker): @skip_if_no_api_key -def test_embed_batch_embedding_types(jina_multimodal_models): +def test_embed_batch_embedding_types(jina_multimodal_models, mocker): + mocker.patch("embcli_jina.jina_multimodal.TIMEOUT_SEC", 30) input_data = ["hello", "world"] for model in jina_multimodal_models: # Test binary embedding type From f4fcd13616a78540bd8562e60883d709b86bc933 Mon Sep 17 00:00:00 2001 From: Tomoko Uchida Date: Sat, 2 Aug 2025 15:20:18 +0900 Subject: [PATCH 4/8] set max-paralell to 2 --- .github/workflows/ci-jina.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci-jina.yml b/.github/workflows/ci-jina.yml index d363f9a..e08f544 100644 --- a/.github/workflows/ci-jina.yml +++ b/.github/workflows/ci-jina.yml @@ -8,6 +8,7 @@ jobs: strategy: fail-fast: false + max-parallel: 1 matrix: os: [ubuntu-latest, macos-latest] python-version: ["3.10", "3.11", "3.12", "3.13"] From f48b078fdc8336415c86ade6badb2b7a2bcccb77 Mon Sep 17 00:00:00 2001 From: Tomoko Uchida Date: Sat, 2 Aug 2025 15:23:19 +0900 Subject: [PATCH 5/8] fix test --- packages/embcli-jina/tests/embcli_jina/test_cli_embed.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/embcli-jina/tests/embcli_jina/test_cli_embed.py b/packages/embcli-jina/tests/embcli_jina/test_cli_embed.py index 95383e9..104589d 100644 --- a/packages/embcli-jina/tests/embcli_jina/test_cli_embed.py +++ b/packages/embcli-jina/tests/embcli_jina/test_cli_embed.py @@ -22,7 +22,7 @@ def test_embed_command_text(plugin_manager, mocker): embeddings = json.loads(result.output) assert isinstance(embeddings, list) - assert len(embeddings) == 2048 + assert len(embeddings) == 1024 assert all(isinstance(val, float) for val in embeddings) @@ -37,5 +37,5 @@ def test_embed_command_image(plugin_manager, mocker): embeddings = json.loads(result.output) assert isinstance(embeddings, list) - assert len(embeddings) == 2048 + assert len(embeddings) == 1024 assert all(isinstance(val, float) for val in embeddings) From 7d89e227b19fdbf346dc4b5636472b6f20f41c51 Mon Sep 17 00:00:00 2001 From: Tomoko Uchida Date: Sat, 2 Aug 2025 15:31:01 +0900 Subject: [PATCH 6/8] set longer timeout for test --- packages/embcli-jina/tests/embcli_jina/test_jina.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/embcli-jina/tests/embcli_jina/test_jina.py b/packages/embcli-jina/tests/embcli_jina/test_jina.py index da6d177..e8224b9 100644 --- a/packages/embcli-jina/tests/embcli_jina/test_jina.py +++ b/packages/embcli-jina/tests/embcli_jina/test_jina.py @@ -26,7 +26,9 @@ def test_factory_create_invalid_model(): @skip_if_no_api_key -def test_embed_one_batch_yields_embeddings(jina_models): +def test_embed_one_batch_yields_embeddings(jina_models, mocker): + mocker.patch("embcli_jina.jina.TIMEOUT_SEC", 30) + mocker.patch("embcli_jina.jina.COLBERT_TIMEOUT_SEC", 30) for model in jina_models: print(f"Testing model: {model.model_id}") input_data = ["hello", "world"] @@ -69,7 +71,9 @@ def test_embed_batch_with_options(jina_models, mocker): @skip_if_no_api_key -def test_embed_batch_embedding_types(jina_models): +def test_embed_batch_embedding_types(jina_models, mocker): + mocker.patch("embcli_jina.jina.TIMEOUT_SEC", 30) + mocker.patch("embcli_jina.jina.COLBERT_TIMEOUT_SEC", 30) input_data = ["hello", "world"] for model in jina_models: # Test binary embedding type From da13abc0d9b353f7da3f6e0938de986b7047f722 Mon Sep 17 00:00:00 2001 From: Tomoko Uchida Date: Sat, 2 Aug 2025 15:37:39 +0900 Subject: [PATCH 7/8] set longer timeout for multimodal models --- packages/embcli-jina/tests/embcli_jina/test_cli_embed.py | 2 +- .../embcli-jina/tests/embcli_jina/test_jina_multimodal.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/embcli-jina/tests/embcli_jina/test_cli_embed.py b/packages/embcli-jina/tests/embcli_jina/test_cli_embed.py index 104589d..d4b5307 100644 --- a/packages/embcli-jina/tests/embcli_jina/test_cli_embed.py +++ b/packages/embcli-jina/tests/embcli_jina/test_cli_embed.py @@ -28,7 +28,7 @@ def test_embed_command_text(plugin_manager, mocker): @skip_if_no_api_key def test_embed_command_image(plugin_manager, mocker): - mocker.patch("embcli_jina.jina_multimodal.TIMEOUT_SEC", 30) + mocker.patch("embcli_jina.jina_multimodal.TIMEOUT_SEC", 60) mocker.patch("embcli_core.cli._pm", plugin_manager) runner = CliRunner() image_path = files("tests.embcli_jina").joinpath("flying_cat.jpeg") diff --git a/packages/embcli-jina/tests/embcli_jina/test_jina_multimodal.py b/packages/embcli-jina/tests/embcli_jina/test_jina_multimodal.py index 34b6c92..8912752 100644 --- a/packages/embcli-jina/tests/embcli_jina/test_jina_multimodal.py +++ b/packages/embcli-jina/tests/embcli_jina/test_jina_multimodal.py @@ -29,7 +29,7 @@ def test_factory_create_invalid_model(): @skip_if_no_api_key def test_embed_one_batch_multimodal(jina_multimodal_models, mocker): - mocker.patch("embcli_jina.jina_multimodal.TIMEOUT_SEC", 30) + mocker.patch("embcli_jina.jina_multimodal.TIMEOUT_SEC", 60) for model in jina_multimodal_models: print(f"Testing model: {model.model_id}") input_data = ["hello", "world"] @@ -44,7 +44,7 @@ def test_embed_one_batch_multimodal(jina_multimodal_models, mocker): @skip_if_no_api_key def test_embed_one_batch_multimodal_image(jina_multimodal_models, mocker): - mocker.patch("embcli_jina.jina_multimodal.TIMEOUT_SEC", 30) + mocker.patch("embcli_jina.jina_multimodal.TIMEOUT_SEC", 60) for model in jina_multimodal_models: image_paths = [ files("tests.embcli_jina").joinpath("flying_cat.jpeg"), From f53b9c2d4664c54befba9616e8a1173498f3f92c Mon Sep 17 00:00:00 2001 From: Tomoko Uchida Date: Sat, 2 Aug 2025 15:49:22 +0900 Subject: [PATCH 8/8] bump embcli-jina 0.1.4-dev --- packages/embcli-jina/pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/embcli-jina/pyproject.toml b/packages/embcli-jina/pyproject.toml index b4fa022..30e55f4 100644 --- a/packages/embcli-jina/pyproject.toml +++ b/packages/embcli-jina/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "embcli-jina" -version = "0.1.3" +version = "0.1.4-dev" description = "jina plugin for embcli" readme = "README.md" authors = [{ name = "Tomoko Uchida", email = "tomoko.uchida.1111@gmail.com" }] diff --git a/uv.lock b/uv.lock index a98f5c1..fa52c0d 100644 --- a/uv.lock +++ b/uv.lock @@ -630,7 +630,7 @@ requires-dist = [ [[package]] name = "embcli-jina" -version = "0.1.3" +version = "0.1.4.dev0" source = { editable = "packages/embcli-jina" } dependencies = [ { name = "embcli-core" },