From 0ea251219ccea34c42cc53d12c47be5d0b03c3f9 Mon Sep 17 00:00:00 2001 From: Yiorgis Gozadinos Date: Tue, 23 Jun 2026 11:51:48 +0300 Subject: [PATCH 1/4] Add explicit multimodal embedding flag, decoupled from provider name --- CHANGELOG.md | 5 ++ haiku_rag_slim/haiku/rag/config/models.py | 6 ++- haiku_rag_slim/haiku/rag/doctor.py | 5 +- .../haiku/rag/embeddings/__init__.py | 54 ++++++++++++++++--- haiku_rag_slim/haiku/rag/embeddings/vllm.py | 7 +-- tests/test_doctor.py | 14 +++-- tests/test_embedder.py | 35 ++++++++++++ 7 files changed, 111 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 477a083c..33bcdd70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,11 @@ ### Added - `haiku-rag doctor` checks a database for consistency (orphaned chunks/items, chunk-less documents classified by content and embedder modality, dangling `doc_item_refs`, vector-dimension mismatch, unembedded chunks, missing picture data, settings/embedding drift, pending migrations, vector-index coverage, provider API keys) and probes configured provider endpoints (Ollama `/api/tags` with model presence, docling-serve `/health`, OpenAI-compatible/vLLM `/models`); exits 1 when any check fails. +- `embeddings.model.multimodal` (bool, default false) gates image embedding; `supports_images` derives from it instead of the provider name. + +### Changed + +- `provider: vllm` is text-only unless `embeddings.model.multimodal: true` is set. Existing multimodal vLLM configs must add the flag. ## [0.60.0] - 2026-06-22 diff --git a/haiku_rag_slim/haiku/rag/config/models.py b/haiku_rag_slim/haiku/rag/config/models.py index f6caa659..08622db7 100644 --- a/haiku_rag_slim/haiku/rag/config/models.py +++ b/haiku_rag_slim/haiku/rag/config/models.py @@ -39,16 +39,20 @@ class EmbeddingModelConfig(BaseModel): """Configuration for an embedding model. Attributes: - provider: Model provider (ollama, openai, voyageai, cohere, sentence-transformers) + provider: Model provider (ollama, openai, voyageai, cohere, sentence-transformers, vllm) name: Model name/identifier vector_dim: Vector dimensions produced by the model base_url: Optional base URL for OpenAI-compatible servers (vLLM, LM Studio, etc.) + multimodal: Whether the model embeds images into the same vector space as + text. Supported on the vllm, voyageai, and cohere providers; other + providers raise when this is set. """ provider: str = "ollama" name: str = "qwen3-embedding:4b" vector_dim: int = 2560 base_url: str | None = None + multimodal: bool = False class StorageConfig(BaseModel): diff --git a/haiku_rag_slim/haiku/rag/doctor.py b/haiku_rag_slim/haiku/rag/doctor.py index 275b167e..71d1c1d1 100644 --- a/haiku_rag_slim/haiku/rag/doctor.py +++ b/haiku_rag_slim/haiku/rag/doctor.py @@ -209,7 +209,10 @@ def _classify_unchunked( f"{len(picture_docs)} image-only document(s) have no chunks; " "a text-only embedder cannot index images." ), - remediation="Configure a multimodal embedder and rebuild to index images.", + remediation=( + "Set embeddings.model.multimodal: true on a vllm, voyageai, or " + "cohere model and rebuild to index images." + ), details=_sample(sorted(picture_docs)), ) ) diff --git a/haiku_rag_slim/haiku/rag/embeddings/__init__.py b/haiku_rag_slim/haiku/rag/embeddings/__init__.py index ce3e9e4a..21115575 100644 --- a/haiku_rag_slim/haiku/rag/embeddings/__init__.py +++ b/haiku_rag_slim/haiku/rag/embeddings/__init__.py @@ -10,6 +10,7 @@ from haiku.rag.config import AppConfig, Config if TYPE_CHECKING: from PIL import Image as PILImage + from haiku.rag.config.models import EmbeddingModelConfig from haiku.rag.store.models.chunk import Chunk @@ -19,15 +20,21 @@ ImageInput = "bytes | PILImage.Image" class EmbedderWrapper: """Wrapper around pydantic-ai Embedder with explicit query/document methods. - Subclasses set ``supports_images = True`` and override the image methods - when the underlying model can encode pictures into the same vector space. + Subclasses pass ``supports_images=True`` and override the image methods when + the underlying model can encode pictures into the same vector space. """ supports_images: bool = False - def __init__(self, embedder: Embedder | None, vector_dim: int): + def __init__( + self, + embedder: Embedder | None, + vector_dim: int, + supports_images: bool = False, + ): self._embedder = embedder self._vector_dim = vector_dim + self.supports_images = supports_images @property def vector_dim(self) -> int: @@ -159,6 +166,9 @@ def get_embedder(config: AppConfig = Config) -> EmbedderWrapper: model_name = embedding_model.name vector_dim = embedding_model.vector_dim + if embedding_model.multimodal: + return _get_multimodal_embedder(embedding_model) + if provider == "ollama": # Use model-level base_url if set, otherwise fall back to providers config base_url = embedding_model.base_url or config.providers.ollama.base_url @@ -193,9 +203,39 @@ def get_embedder(config: AppConfig = Config) -> EmbedderWrapper: if provider == "vllm": from haiku.rag.embeddings.vllm import VLLMMultimodalEmbedder - base_url = embedding_model.base_url or "http://localhost:8000/v1" - if not base_url.rstrip("/").endswith("/v1"): - base_url = base_url.rstrip("/") + "/v1" - return VLLMMultimodalEmbedder(model_name, vector_dim, base_url=base_url) + base_url = _vllm_base_url(embedding_model.base_url) + return VLLMMultimodalEmbedder( + model_name, vector_dim, base_url=base_url, supports_images=False + ) raise ValueError(f"Unsupported embedding provider: {provider}") + + +def _vllm_base_url(base_url: str | None) -> str: + base_url = base_url or "http://localhost:8000/v1" + if not base_url.rstrip("/").endswith("/v1"): + base_url = base_url.rstrip("/") + "/v1" + return base_url + + +def _get_multimodal_embedder( + embedding_model: "EmbeddingModelConfig", +) -> EmbedderWrapper: + """Build an image-capable embedder for providers that support multimodal. + + Each provider passes images in its own wire format, so the capability lives + in a per-provider embedder rather than a generic flag. + """ + provider = embedding_model.provider + model_name = embedding_model.name + vector_dim = embedding_model.vector_dim + + if provider == "vllm": + from haiku.rag.embeddings.vllm import VLLMMultimodalEmbedder + + base_url = _vllm_base_url(embedding_model.base_url) + return VLLMMultimodalEmbedder( + model_name, vector_dim, base_url=base_url, supports_images=True + ) + + raise ValueError(f"Provider '{provider}' does not support multimodal embedding.") diff --git a/haiku_rag_slim/haiku/rag/embeddings/vllm.py b/haiku_rag_slim/haiku/rag/embeddings/vllm.py index 6535f7ec..00023bed 100644 --- a/haiku_rag_slim/haiku/rag/embeddings/vllm.py +++ b/haiku_rag_slim/haiku/rag/embeddings/vllm.py @@ -24,8 +24,6 @@ if TYPE_CHECKING: class VLLMMultimodalEmbedder(EmbedderWrapper): - supports_images = True - def __init__( self, model_name: str, @@ -33,8 +31,11 @@ class VLLMMultimodalEmbedder(EmbedderWrapper): base_url: str, api_key: str | None = None, timeout: float = 60.0, + supports_images: bool = True, ): - super().__init__(embedder=None, vector_dim=vector_dim) + super().__init__( + embedder=None, vector_dim=vector_dim, supports_images=supports_images + ) self._model_name = model_name self._base_url = base_url.rstrip("/") self._api_key = api_key diff --git a/tests/test_doctor.py b/tests/test_doctor.py index c1760f03..d9a6fa62 100644 --- a/tests/test_doctor.py +++ b/tests/test_doctor.py @@ -49,11 +49,19 @@ VECTOR_DIM = 4 ChunkRecord = create_chunk_model(VECTOR_DIM) -def _config(provider: str = "ollama", name: str = "test", vector_dim: int = VECTOR_DIM): +def _config( + provider: str = "ollama", + name: str = "test", + vector_dim: int = VECTOR_DIM, + multimodal: bool = False, +): return AppConfig( embeddings=EmbeddingsConfig( model=EmbeddingModelConfig( - provider=provider, name=name, vector_dim=vector_dim + provider=provider, + name=name, + vector_dim=vector_dim, + multimodal=multimodal, ) ) ) @@ -312,7 +320,7 @@ async def test_image_only_document_multimodal_embedder_warns(temp_db_path): ], ) report = await run_doctor( - _config(provider="vllm", name="qwen-vl"), temp_db_path, {} + _config(provider="vllm", name="qwen-vl", multimodal=True), temp_db_path, {} ) result = _result(report, "documents_pictures_no_chunks") assert result.severity is Severity.WARN diff --git a/tests/test_embedder.py b/tests/test_embedder.py index 2f20db9c..3276db7c 100644 --- a/tests/test_embedder.py +++ b/tests/test_embedder.py @@ -630,6 +630,7 @@ async def test_vllm_get_embedder_routes_to_multimodal(): name="Qwen/Qwen3-VL-Embedding-2B", vector_dim=2048, base_url="http://my-vllm:8000/v1", + multimodal=True, ) ) ) @@ -638,6 +639,40 @@ async def test_vllm_get_embedder_routes_to_multimodal(): assert embedder._base_url == "http://my-vllm:8000/v1" # type: ignore[attr-defined] # ty: ignore[unresolved-attribute] +def test_multimodal_defaults_to_false(): + model = EmbeddingModelConfig(provider="vllm", name="x", vector_dim=2) + assert model.multimodal is False + assert "multimodal" in model.model_dump() + + +async def test_vllm_text_only_when_multimodal_unset(): + config = AppConfig( + embeddings=EmbeddingsConfig( + model=EmbeddingModelConfig( + provider="vllm", + name="qwen3-embedding:4b", + vector_dim=2560, + base_url="http://my-vllm:8000/v1", + ) + ) + ) + embedder = get_embedder(config) + assert embedder.supports_images is False + + +@pytest.mark.parametrize("provider", ["ollama", "openai", "sentence-transformers"]) +async def test_multimodal_unsupported_provider_raises(provider): + config = AppConfig( + embeddings=EmbeddingsConfig( + model=EmbeddingModelConfig( + provider=provider, name="x", vector_dim=2, multimodal=True + ) + ) + ) + with pytest.raises(ValueError, match="does not support multimodal"): + get_embedder(config) + + @pytest.mark.vcr() async def test_vllm_embed_text_and_image_end_to_end(): """End-to-end against a real vLLM ``/v1/embeddings`` server: confirm From a1ec310bf45de47df47f89334eded0bebf989b98 Mon Sep 17 00:00:00 2001 From: Yiorgis Gozadinos Date: Tue, 23 Jun 2026 14:47:17 +0300 Subject: [PATCH 2/4] Add VoyageAI multimodal embedder --- CHANGELOG.md | 1 + haiku_rag_slim/haiku/rag/client/search.py | 5 +- .../haiku/rag/embeddings/__init__.py | 29 ++-- haiku_rag_slim/haiku/rag/embeddings/vllm.py | 5 + .../haiku/rag/embeddings/voyageai.py | 68 ++++++++ ...oyage_embed_text_and_image_end_to_end.yaml | 132 ++++++++++++++++ tests/test_embedder.py | 149 +++++++++++++++++- 7 files changed, 377 insertions(+), 12 deletions(-) create mode 100644 haiku_rag_slim/haiku/rag/embeddings/voyageai.py create mode 100644 tests/cassettes/test_embedder/test_voyage_embed_text_and_image_end_to_end.yaml diff --git a/CHANGELOG.md b/CHANGELOG.md index 33bcdd70..d36fe90e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ - `haiku-rag doctor` checks a database for consistency (orphaned chunks/items, chunk-less documents classified by content and embedder modality, dangling `doc_item_refs`, vector-dimension mismatch, unembedded chunks, missing picture data, settings/embedding drift, pending migrations, vector-index coverage, provider API keys) and probes configured provider endpoints (Ollama `/api/tags` with model presence, docling-serve `/health`, OpenAI-compatible/vLLM `/models`); exits 1 when any check fails. - `embeddings.model.multimodal` (bool, default false) gates image embedding; `supports_images` derives from it instead of the provider name. +- VoyageAI multimodal embedder (`provider: voyageai`, `multimodal: true`, e.g. `voyage-multimodal-3`) embedding text and pictures into a shared vector space. ### Changed diff --git a/haiku_rag_slim/haiku/rag/client/search.py b/haiku_rag_slim/haiku/rag/client/search.py index 20a867a2..a90ddcbc 100644 --- a/haiku_rag_slim/haiku/rag/client/search.py +++ b/haiku_rag_slim/haiku/rag/client/search.py @@ -58,8 +58,9 @@ async def search( embedder = client.embedder if not embedder.supports_images: raise ValueError( - "Image queries require a multimodal embedder. Configure " - "provider='vllm' (or another image-capable provider)." + "Image queries require a multimodal embedder. Set " + "embeddings.model.multimodal: true on a vllm, voyageai, or cohere " + "model." ) query_vector = await embedder.embed_image(query) chunk_results = await client.chunk_repository.search( diff --git a/haiku_rag_slim/haiku/rag/embeddings/__init__.py b/haiku_rag_slim/haiku/rag/embeddings/__init__.py index 21115575..ef6c8894 100644 --- a/haiku_rag_slim/haiku/rag/embeddings/__init__.py +++ b/haiku_rag_slim/haiku/rag/embeddings/__init__.py @@ -20,8 +20,9 @@ ImageInput = "bytes | PILImage.Image" class EmbedderWrapper: """Wrapper around pydantic-ai Embedder with explicit query/document methods. - Subclasses pass ``supports_images=True`` and override the image methods when - the underlying model can encode pictures into the same vector space. + Subclasses that can encode pictures into the same vector space as text either + set the ``supports_images`` class attribute or pass ``supports_images=True``, + and override the image methods. """ supports_images: bool = False @@ -30,11 +31,12 @@ class EmbedderWrapper: self, embedder: Embedder | None, vector_dim: int, - supports_images: bool = False, + supports_images: bool | None = None, ): self._embedder = embedder self._vector_dim = vector_dim - self.supports_images = supports_images + if supports_images is not None: + self.supports_images = supports_images @property def vector_dim(self) -> int: @@ -62,8 +64,8 @@ class EmbedderWrapper: ``messages`` superset. Callers loop when they need many. """ raise NotImplementedError( - f"{type(self).__name__} does not support image embedding. " - "Configure a multimodal provider (e.g. provider='vllm')." + f"{type(self).__name__} does not support image embedding. Set " + "embeddings.model.multimodal: true on a vllm, voyageai, or cohere model." ) @@ -124,8 +126,9 @@ async def embed_chunks( if picture_chunks: if not embedder.supports_images: raise ValueError( - "Picture chunks require a multimodal embedder. Configure " - "provider='vllm', or omit picture chunks." + "Picture chunks require a multimodal embedder. Set " + "embeddings.model.multimodal: true on a vllm, voyageai, or cohere " + "model, or omit picture chunks." ) for chunk in picture_chunks: picture_embeddings.append(await embedder.embed_image(chunk._picture_data)) @@ -238,4 +241,12 @@ def _get_multimodal_embedder( model_name, vector_dim, base_url=base_url, supports_images=True ) - raise ValueError(f"Provider '{provider}' does not support multimodal embedding.") + if provider == "voyageai": + from haiku.rag.embeddings.voyageai import VoyageMultimodalEmbedder + + return VoyageMultimodalEmbedder(model_name, vector_dim) + + raise ValueError( + f"Provider '{provider}' does not support multimodal embedding. Set " + "embeddings.model.multimodal: true on a vllm, voyageai, or cohere model." + ) diff --git a/haiku_rag_slim/haiku/rag/embeddings/vllm.py b/haiku_rag_slim/haiku/rag/embeddings/vllm.py index 00023bed..b8e81ba7 100644 --- a/haiku_rag_slim/haiku/rag/embeddings/vllm.py +++ b/haiku_rag_slim/haiku/rag/embeddings/vllm.py @@ -100,6 +100,11 @@ class VLLMMultimodalEmbedder(EmbedderWrapper): ) async def embed_image(self, image: "bytes | PILImage.Image") -> list[float]: + if not self.supports_images: + raise NotImplementedError( + "This vLLM embedder is text-only. Set " + "embeddings.model.multimodal: true to embed images." + ) rows = await self._post( { "model": self._model_name, diff --git a/haiku_rag_slim/haiku/rag/embeddings/voyageai.py b/haiku_rag_slim/haiku/rag/embeddings/voyageai.py new file mode 100644 index 00000000..e908fa89 --- /dev/null +++ b/haiku_rag_slim/haiku/rag/embeddings/voyageai.py @@ -0,0 +1,68 @@ +"""Multimodal embedder backed by VoyageAI's ``multimodal_embed`` endpoint. + +``voyage-multimodal-3`` maps text and images into a shared vector space. Text is +embedded as single-element content lists; images are passed as ``PIL.Image`` +objects (the SDK accepts them directly). The API key is read from the +environment (``VOYAGE_API_KEY``) like the text-only Voyage path. +""" + +import io +from typing import TYPE_CHECKING + +from haiku.rag.embeddings import EmbedderWrapper + +if TYPE_CHECKING: + from PIL import Image as PILImage + + +class VoyageMultimodalEmbedder(EmbedderWrapper): + def __init__( + self, + model_name: str, + vector_dim: int, + api_key: str | None = None, + ): + super().__init__(embedder=None, vector_dim=vector_dim, supports_images=True) + import voyageai + + self._model_name = model_name + self._client = voyageai.AsyncClient(api_key=api_key) + + async def embed_query(self, text: str) -> list[float]: + result = await self._client.multimodal_embed( + inputs=[[text]], + model=self._model_name, + input_type="query", + output_dimension=self._vector_dim, + ) + return list(result.embeddings[0]) + + async def embed_documents(self, texts: list[str]) -> list[list[float]]: + if not texts: + return [] + result = await self._client.multimodal_embed( + inputs=[[text] for text in texts], + model=self._model_name, + input_type="document", + output_dimension=self._vector_dim, + ) + return [list(e) for e in result.embeddings] + + async def embed_image(self, image: "bytes | PILImage.Image") -> list[float]: + result = await self._client.multimodal_embed( + inputs=[[_to_pil(image)]], + model=self._model_name, + input_type="document", + output_dimension=self._vector_dim, + ) + return list(result.embeddings[0]) + + +def _to_pil(image: "bytes | PILImage.Image") -> "PILImage.Image": + from PIL import Image as PILImageModule + + if isinstance(image, bytes): + return PILImageModule.open(io.BytesIO(image)) + if isinstance(image, PILImageModule.Image): + return image + raise TypeError(f"Unsupported image type: {type(image)!r}") diff --git a/tests/cassettes/test_embedder/test_voyage_embed_text_and_image_end_to_end.yaml b/tests/cassettes/test_embedder/test_voyage_embed_text_and_image_end_to_end.yaml new file mode 100644 index 00000000..bb8c7d3d --- /dev/null +++ b/tests/cassettes/test_embedder/test_voyage_embed_text_and_image_end_to_end.yaml @@ -0,0 +1,132 @@ +interactions: +- request: + headers: + content-type: + - application/json + method: post + parsed_body: + encoding_format: base64 + input_type: query + inputs: + - content: + - text: a photo of a red square + type: text + model: voyage-multimodal-3 + output_dimension: 1024 + output_dtype: null + truncation: true + uri: https://api.voyageai.com/v1/multimodalembeddings + response: + headers: + alt-svc: + - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 + content-length: + - '5657' + content-type: + - application/json + parsed_body: + data: + - embedding: AABtOwAAC7wAAKu8AAC9PAAAFb0AADE8AAA/vAAAbz0AAHc8AAALPQAAsTwAAJw8AABhPQAAfL0AAIW9AADROwAAhbwAAHk9AACxPAAALbwAADm9AACpOgAA9DsAAAW9AABVPQAAP70AAIq9AAClvAAA/zsAAIA8AAA7vQAA9LwAACy8AADjPAAAMboAAME8AAAMPQAADzsAABW9AABPugAAvLwAAME8AAAiPQAAaDsAAFc8AADdOgAAgL0AAGC9AAD1uwAAtLwAAAu9AAAnvQAAt7wAAAu9AAClPAAAa7sAALW7AADVPAAADz0AADG5AAAxOwAA/bwAAMw8AACDvQAA/7wAAM27AACauwAAx7sAAOi4AAAAvAAASb0AAPy6AACpvAAAJT0AAJe9AAAHvAAAaDwAAJq8AAC4uwAAPz0AAL+8AACqPAAAAz0AAHy8AADVuwAAl70AALE8AAAfvAAAmrsAALi7AADcvAAADTwAAOM8AACSPAAAlrwAAGg8AADLugAAor0AAAG9AADEvAAAN7wAALs7AACgvQAAfLwAAAU8AADpvAAAGrsAAHk9AABzPAAASDwAAL28AACjvAAASTsAAK88AAAxPAAAeD0AAJu8AAAauwAAJTsAAES9AADIOQAApTsAAAG9AAA4vQAAgzwAAA+8AADvPAAAbz0AAEG9AACBOwAAgrwAAMG7AADvOwAABT0AAE29AACVuwAAlT0AAHG6AAC5vAAAGb0AAKU8AAD5vAAAHbwAAKM8AABjPAAAszsAANE9AADtuwAAwbwAAAo8AABfPQAAAzwAABa9AACBPQAAf7sAAAk9AAA/PQAAoDsAAPO8AAAHvQAAmjwAALe8AAARvQAAETwAAD09AAACvQAAWD0AAGM9AAAcvQAASLwAAAC9AAC1PQAAwDsAAJy7AACcvAAAU70AAM+8AACXuwAAnzwAANg8AAAevQAAoD0AAFc9AAAfvQAAZ70AAIq7AAAnvAAAuzsAAG28AAAwvAAAIDwAAA27AAAsPAAAc70AACc9AAASvQAAhDwAAKM8AAAUvQAAyDwAAJk6AAD5PAAA+DwAAAs9AACGvQAAbz0AACk7AACFPQAA7LsAAA+8AADsvAAA97sAAGy8AAAfvQAAAroAAI26AACFOwAA7zwAAGc9AABNvAAAojsAAAS8AABnvAAAGToAAOk7AAA3vAAAizwAAMM7AABRPAAAmTsAALS9AAA4PAAAjLwAABI9AAAfOwAAczwAAA28AABYuwAAX7wAACI8AACKvAAA+bwAALM8AADDvAAAGzwAAAk9AAARvAAAYzsAAGE8AAALOwAAQ7sAAHQ8AAAjPQAATL0AADg5AADLPAAABrwAABe8AAA3vQAACT0AAFQ9AAAWPAAAKj0AAKS9AAB8PQAAfTwAAL08AABvPQAAOLsAAFw7AACqPAAAm7sAANW8AADRvAAAozwAAGe9AADnuwAAnzwAABe8AACzPAAAGjsAAMM8AACrPAAAEb0AABc9AAB4PAAAgbwAAAG9AAA0vAAAkLwAACE9AACFuwAAJbkAAHk6AADBOgAAhDwAAAk8AABoPQAAhr0AAAy7AAAvvQAAfz0AAKq8AAAaPQAA1LsAAJY8AAAaPQAAXL0AACI7AAAwPQAAPLoAAGA9AADNvAAAC70AAI+8AAAfOQAALD0AAPG8AAA5PQAAi7wAAI29AAAnvQAAPbwAAHW8AACpPAAAP7wAAB68AAAMvQAAzToAACO8AAAXPAAAw7sAAAI9AADDPAAAybwAAOO8AACVuwAAwDkAAEO9AAAhPQAACz0AAKW8AAAvvQAAx7sAABu8AABAPQAAHz0AAGg8AADNvAAARDwAAOA8AAAGPQAAuDsAAH09AAAJvQAA/LkAAIy7AADtPAAAOb0AAGe8AACeOwAAvbwAAEw7AACOuwAAnzwAAO07AAASvAAAlbwAAAq9AACKuwAAGjwAAFS8AAACPQAAND0AAGi9AACnOwAANzsAACG8AAALPQAAJToAAGO8AACiPAAAi7wAANy7AADYvAAAML0AANc7AACKPAAAM7sAAIe8AABMuwAAz7sAAMy8AAA5vQAAlrsAACe9AAAPvQAAibsAAOQ8AAApvQAAtLsAAIm8AAAavQAA9TsAAGC9AAAsPQAALD0AAAc9AAATvAAA8bwAAOG4AABoPAAABTwAAJu9AABJvQAAlbwAABK9AADcPAAAdTwAAMG8AABRPQAA4DsAANQ8AACnvAAABDwAAB68AADnOwAAnLwAAJ28AAAJPQAAQz0AAIe9AACUOwAAQ7wAAIE9AAA7PAAAATsAAAe9AABJPAAA3LwAABo9AADfOwAA9bwAAGM9AABfPAAA4zwAAIW7AAAzPQAAi70AAII9AAD/vAAAybwAABI8AAAgPQAAlLwAACu8AACPvAAA/bwAAHG9AADIPAAAor0AAA49AAAqPAAAHLwAAC29AABBvQAAHz0AAIM8AAC0uwAAXTwAAEe9AABcOgAAbL0AAKu8AABnPAAAhrwAAFU8AACzPAAA2DwAAMs8AACpPAAAhDwAAAG9AABxPAAAVT0AAKw8AADfPAAA6bsAAFQ8AAA8vAAAM70AAP08AACPuwAAMb0AAIC9AADHPAAAS7sAAOE8AADJPAAA+bwAAJk8AAA8PQAAIrwAAFQ7AAAHPAAAHzwAANW8AAAGPQAAG7sAAGM8AADXvAAAUz0AAIk6AAAKOwAAt7sAANw7AACwOgAAqTwAANw8AACBuwAAszwAAHc8AACBPAAA/zwAAKE7AAB3PQAANTsAACW8AADBvAAAK70AAAs8AAAbugAA37wAAGi7AAA0PAAAjzsAAIU8AAB/vQAALb0AANO7AAApvQAAAT0AANi8AADBuwAAAz0AAO28AACDvQAA/TsAAK08AABdPQAARz0AAMe8AAA8PQAAQLwAAHM7AACtPQAASLsAAOA8AADMvAAALbsAACA9AAACvAAAkLwAAE08AAAZuwAApzwAAOg8AACGvAAAB70AALM8AAB8ugAAV7wAAKa9AADZPAAAXzwAAIw8AACPPQAAwzwAAIy8AAC9vAAASTwAAB+9AADXOwAAI70AADQ8AAA0vQAAxDwAAPM8AAALPQAA2b0AALO8AACePAAAFb0AADm7AAAHvQAAYb0AAKE8AAA0PAAALDwAACu9AADTvAAARLwAAJI8AAAUPQAA47sAAFm8AAAJPQAATTwAAAu9AABVvAAAlDsAAM+8AAA5PQAA77sAAGC9AAC9OwAAGz0AAKS8AABpPAAAWD0AADQ9AADoOwAAdzwAAMu7AACJvQAAbDwAAEC8AABfPQAA/LwAADW9AACEvQAAED0AACE8AACfvQAAlbwAADC9AAAEvQAACr0AAAm9AABJPQAAFj0AAMg8AABzvQAAVb0AAIu8AADoPAAAUbwAAD09AAB9vAAAS70AAGC8AABnOgAA17wAAEG9AAC8ugAA3TwAAAu9AABtvQAAt7wAAMe8AABYvQAAH7wAALW7AAAwPQAAAbwAAIG6AABMvQAAobsAAHi9AACmvQAAVL0AAM88AAARvQAAkbsAAD29AAB8PAAA0zoAAJe7AADPPAAATDwAADU8AAAsPAAAiTwAALW7AAAbOwAAkr0AAHw8AACfOgAAkb0AAM+8AAB8PAAAxLwAAAm8AAAxPQAATzwAAEQ8AAC4vAAAJj0AACw8AACQPAAAAT0AACK9AAAsPQAAo7wAAAs8AAAkOwAACjwAAI+8AADPvAAAuzsAABe8AADzPAAAKrsAAHc9AAD4PAAA4zwAAEE9AAAPPQAAfL0AAJu8AAATvAAAPToAAJ+9AABRPQAAYb0AAHM8AACxvAAA47wAADy9AACauwAAJLwAAMu7AACzuwAA6DsAAA+7AAA8vAAA4bwAALu8AAB4PAAAS7wAAEw9AACLvAAA17wAADk9AAChvAAAhjwAAAO9AADVOwAAAjsAAHw5AAApvQAA4LwAAOe8AAAFvQAASL0AABq9AACXPAAADL0AAEk9AAC3vAAA3DwAAFc7AACJvAAAdzwAAEC7AAAZvAAAHbwAAMk8AACDPAAA2LwAAL88AACWPAAA1TwAAFU8AAC0vAAABz0AAAE8AAC/PAAAVDsAAJ88AAA5PQAAEbwAADM9AAAbPAAAx7wAADM9AABpPQAANz0AAP86AABrvAAAF70AAKI8AACKPQAAAr0AAAk9AADJuwAAeDwAAIU9AAAkuwAAqTwAAAG9AADTvAAAWTwAALW8AAC3PAAA/TsAAEc8AADdvAAA7zsAAEQ9AACzuwAAL7sAAC08AACTPAAAITsAAEA9AACBvQAA0bwAADi9AADTPAAAHL0AALM7AAClvAAABj0AAAW9AAAMPQAAOD0AAJG8AACQPAAA77wAAM09AADdvAAAvzwAAIS8AABTPQAAw7wAAFw8AACpvAAAEL0AAEA8AACvPAAA1DwAAF07AADBPAAAzTwAALs8AABtvQAAobwAAH+8AABZvQAAqjsAAC09AADAvAAA4bsAAAS8AABkuwAAHLwAAD89AABnuwAAkr0AAHc7AAB0vAAAorwAACo9AACGOwAAsLwAAGu7AAADvQAAAL0AAIm8AAARvQAAHb0AAGS8AAC5uwAA5zwAALc5AAAvPAAAaL0AAPe7AACzPAAAJT0AAJY8AAAVPQAAjzwAAHS8AAAivQAAQLwAADc9AAAZPQAAlb0AAOs8AAAdPAAAu7wAANE5AACvPAAArzwAAGS8AADIPAAAfzwAAFW9AAAXvQAAOL0AAKa8AABpvAAAJr0AALO6AAAFPAAAZLwAAAO8AAB9vQAA2TwAAFU6AACwvAAAP7wAAMG8AAAMPQAAKbsAAAm8AADLPAAAKbwAADE9AADnvAAAF70AAOS8AADPPAAA4DsAAJ+8AACZvAAAfD0AAIk7AABjOwAARD0AAKc8AAA3PQAAqrwAAIG7AABRPAAAF7sAADk9AADHvAAAfbwAANc8AACGvQAAuDwAAIm8AAD0vAAAnrsAAJG8AADcOwAAAbwAAKM9AAB0vAAAGTwAAAy7AAAgPQAAQb0AAJW8AAAZvQAANz0AAJK4AADBPAAAxzwAAIS8AAAsPQAAdTwAAKs8AAD9OAAA1zwAAK08AAAPvQAAAb0AALG8AADUPAAAED0AAMS8AAA8PAAAFT0AAAW7AACVPAAA1DoAAAe8AACtvAAAlLwAAIy9AACbuwAAjbwAAJA6AAAxuwAAuTsAAAu9AADZPAAAPzwAACI9AAADPQAA8TwAAMO8AACKugAAyDwAAKq6AABHPQAAprsAAEk7AACNvQAAEb0AAPS8AAAgvAAAszwAAAS9AACLvAAAcbwAACw9AACRuwAAlrwAAMu9AAAePQAAYL0AAP+8AADDugAAl70AACG9AAD5uwAA+bwAAK28AAC9vA== + index: 0 + object: embedding + text: null + model: voyage-multimodal-3 + object: list + usage: + image_pixels: 0 + text_tokens: 5 + total_tokens: 5 + video_pixels: 0 + status: + code: 200 + message: OK +- request: + headers: + content-type: + - application/json + method: post + parsed_body: + encoding_format: base64 + input_type: document + inputs: + - content: + - text: hello world + type: text + - content: + - text: another doc + type: text + model: voyage-multimodal-3 + output_dimension: 1024 + output_dtype: null + truncation: true + uri: https://api.voyageai.com/v1/multimodalembeddings + response: + headers: + alt-svc: + - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 + content-length: + - '11181' + content-type: + - application/json + parsed_body: + data: + - embedding: AAAePQAAEb0AAPs8AABavAAAHL0AALK8AAAMvQAAtbsAAAQ8AABSOwAA4LwAAJA8AAChPQAA2L0AADS8AAAePQAADj0AAFY9AAAlPQAAvbwAAIK8AAA7vAAAFb0AAOS8AAD/OwAAmbwAAGC8AAA3vAAAKb0AAB08AAA3vQAAKbwAACk8AAA3PAAAPL0AAA68AADLvAAA1bsAACK9AABWOwAA6bsAAAm9AADzPAAA2rwAAHi9AAAwvQAA6TwAAES9AACZvAAAsjsAAK28AACKvAAAQDwAABW8AAALvAAAJLwAAJS7AABhvAAAhDwAAPA8AAAOvQAADDwAAIQ6AACEPAAAMr0AAD88AAABPAAA6zwAAAO9AAA3vQAAQr0AAN+7AADmvAAATbwAAJq8AADKvAAACL0AAD89AACYvAAATz0AAAI7AACEPAAANzwAANe8AACTPQAAtbwAAIo9AADLuwAAhT0AADU8AACWvAAAGD0AALk7AADAvAAArbsAAAC9AAAauwAA6bwAAPS8AAAhvQAAHz0AANW8AAASvAAAszsAAMK8AAA6vAAAMrwAACU9AACgOgAAST0AALO8AACGvAAAWbwAABg9AAAnOwAA2TwAAAE9AAAvvQAAlLsAAIm9AAALvAAABD0AACq9AACjPAAAlLkAAPq7AAABPAAAqTwAALO9AAAjPAAA7zwAALU8AAAmPQAACD0AAB26AADpOgAA+zsAALg8AACqvAAA7rwAABm8AADQOwAAEzsAAG89AAD+OwAA/TwAAIw9AAAxPQAA67oAAHY8AAClPAAAEb0AAB69AACZPAAAEj0AAFS9AACVvAAAFjwAACQ7AACeOgAAXDwAABG9AACcOwAArTwAAKE8AAAMPAAAvjwAABU9AACzvAAAvLwAAJm8AABHPQAAobwAAL08AADnuwAAM7wAAHs7AADiuwAAkTsAADU9AACMvQAAczwAAIQ8AAAUvQAAjLwAAC09AAC0vAAAIL0AAKm7AADgvAAA67wAABS6AACFPQAAL7wAANY8AAD4vAAADz0AAMs8AACjPAAAaTwAAAy9AAAgPQAASzwAAIy7AAAMvQAArzwAAKQ8AACFPQAAj7sAABa9AAC4vAAAfbwAAIU7AAAWvQAAmLwAAFO8AADGuwAAprsAAFY9AACXvQAAVzwAAKC8AACEugAAgzwAAMg8AACtvAAA/TwAADw9AADouwAAcT0AAL28AADUPAAAursAAII7AADMPAAACDwAAAw8AACmvQAA6LwAAIs8AACfvAAAwjwAAP47AACrOwAAhDwAANC5AAAyvAAA8DwAAG49AAAvPQAA4bwAAFc7AAC1uwAA1LwAAIE9AAD/PAAAljwAAF88AAAOvQAAA7wAAJ68AAAUvAAAyzwAAKy8AADnPAAA+DwAABw9AABHPQAAYzwAAA89AAAOvQAAAzwAAPS7AABCvQAAC7wAADC9AADXvAAAGj0AABK7AACEuwAASjwAAIA8AAAPPQAAkTsAANq7AAAGvQAATTwAADI8AACwOwAARzwAAA+9AADFPAAAOLwAAIo7AACPOgAA3LwAAJk6AACVPQAAdb0AAA69AABjvAAAkj0AAFW8AABTvAAALj0AAOU7AAAzPQAAlbwAAPc8AABAPQAAMr0AAAw9AACRvQAAK7wAALo8AADouwAAfD0AAPU7AAAtPAAAsboAAJ48AAC0vAAAorsAAIA7AAAxPAAAR70AABg8AACVvAAA6LwAAJg7AADBPAAAnzwAAFY9AACjPAAAobwAAEW8AABIvQAAijwAABm9AABTPQAA6LwAAFq8AAABuwAAy70AAGi7AAB4OwAAJT0AABY7AACcvQAANzkAALw8AADOPAAAgbsAAIq7AACvvAAAR70AAGk7AACFvQAAnrwAADE7AAAyvAAAvLsAABw9AAAMPAAA+rsAAHM7AABivAAAdj0AAE28AACluwAA2LwAAHQ9AACFPQAA2DsAAHy9AADJuwAAELwAAGS8AADIPAAAprwAAJw8AACPuwAAM7wAAL67AAAmPQAAH7wAAIE8AAAcPQAAqTsAAIO9AAASuwAAwLwAAIi8AAAMvQAAOjsAAMe7AADUuwAAGL0AADo8AADuvAAAkzwAAKu9AAAEuwAAAzwAAJy5AAC8PQAAujsAANQ8AADEvAAAqrsAAKW8AAA7PAAAhTwAAOS9AAA8vQAAQrsAAMK8AABKvAAABD0AAAi9AACsvAAAhDwAAJq7AADxvAAAObwAAN87AAAwvQAAurwAAIY8AAA4vAAA3DgAACG9AABhPAAATrsAAMg8AAACPQAAlrwAAEW8AADcvAAA67sAAFy5AACXvAAA3bwAAJ48AACJOwAA9TwAAEE8AAArvAAAhb0AAO06AADLvAAArDwAAA47AADXPAAAjjwAAEq8AADtOgAALjwAAC68AADZuwAAVboAAAk9AABvPAAAi7wAAL87AAB7PAAAPz0AADm8AAAxuwAAJL0AAOS6AABlPQAAX70AAMC8AAC6uwAA2zwAAPQ8AABQPQAABT0AALs8AABQPQAAAjwAAMm8AAAFvAAATzwAADo9AADKPAAAAT0AALI7AAATPQAAJ70AAAG9AADBPAAAI70AACq9AAAvvQAAYDwAALo8AAC8uQAAnjwAAB88AAAjPQAAgb0AAHQ9AAD3PAAAM70AADe9AAD8OwAANT0AAE28AADBvAAApjwAAG67AABhvQAAcjwAAAw9AACmvAAAS7wAABw9AAAavQAA9rsAABK7AAAMvQAABj0AACO9AACCPQAA8TwAAPw8AAABPAAAy7wAAKE8AABUvAAAdDwAAIw8AACZOwAAF70AABi9AAC9vAAAhrwAAMy8AACzvAAApj0AAFC8AAAdvAAA8TwAAN+8AAArvAAApLoAAEE9AADHPAAAujwAACC7AACMPAAA7jsAAA49AABMPQAACj0AAF07AACRvAAAZroAAOo7AABlOwAAv7wAAEK8AABTvAAA2jwAAEa9AAAMuwAAHDgAAMI8AAAEvAAAK70AACC9AAAlPQAAXD0AANy8AABxPQAAhjwAAFO8AAAwvQAAXzwAAOe5AABMvAAAFboAAIS8AAAPvAAAezoAAKm7AACmOwAA6bwAAKE8AABkvAAAPL0AAHQ8AAD2vAAAOr0AABg9AADWvAAAprwAAFu8AAAxuwAAKbwAAAG9AAAnvQAAMTwAAG+7AADXPAAAUzwAAK68AAAJvQAAKj0AANi8AADZPAAATzwAALK8AACSPQAAzrwAADq9AAAYvAAAwjwAANg8AAAEvAAAAzwAADE9AAAPPQAAYj0AAD89AAA3PQAAib0AANI8AABgPAAAJz0AANY8AAA4vQAAMDwAAI+9AAAwvQAAOr0AAIo8AAByPAAAtDwAAIA9AADbvAAAVTwAAH08AADCvAAAwjwAAAO9AACsvQAA2roAAN08AACQOgAADDwAAAQ9AADlOwAATT0AAJe8AABBvQAAOLwAALe7AABkvQAAorwAAB29AAC7PAAAMr0AACY9AAAMOwAA2LwAAIe9AAAgvQAAdrwAAI89AABNvQAAIDwAAPy8AAATvQAAobwAAPO7AAAevAAAh7sAAKG7AACcuwAA1LwAAGk7AAAPPQAAVLwAABa8AACOvAAAnrwAAJG9AAAePAAAJr0AAB08AAAFPQAABT0AACu9AABnPAAAlrwAACY9AACRvAAAxjwAACW8AAD/uwAAeDsAAKQ8AABVPQAAtzwAANs8AADaugAAmL0AACG9AAD0vAAACjkAALq4AAAqPQAA9zsAAG08AABCvAAAIr0AAPq8AADIvAAATTsAAOW7AADCPAAA87wAACM9AAD9vAAAEjsAAP86AAAjvQAAPbsAAEQ8AAD3uwAAobsAABc8AAAlPAAAC7wAAGA8AAAEvQAAEL0AAC87AAArvAAALj0AAJW7AACOvAAAg70AAJ88AAAlPAAAf7wAAJA8AAACvQAALLwAALq8AAAXvQAAt7wAAGO9AADJuwAAoDwAAOE8AACsOwAAEz0AAPG8AACcvAAA7rsAAIo9AABZvQAA4TwAAHA9AADTPAAAW7sAAFM7AAByvQAAhTsAAJG8AAByPAAAJj0AAJK8AAB+PAAAQLwAAIc7AAAgvAAAJr0AAAI9AABXPAAAjj0AAA88AABEPQAANT0AAPU8AAAcPQAAODwAABk8AACRvAAA/LwAABU9AAC0vAAAojwAAKc8AADXuwAAJD0AADe8AADPuwAAybwAABm9AABgPAAAxjsAAEs8AAArvQAAQrwAAME8AADjuwAAGD0AAD89AAAsPAAAVzwAAM09AAAZvQAAEz0AAAq9AAAuvQAASDsAAA49AAAvPAAACbwAAA88AAC5vAAAP7sAACW9AACKPQAACzsAAFA9AAAavQAApjoAADC6AAB7PQAA9zwAAKC8AAB7ugAA6LwAAAU9AAA8PAAA8zwAAP48AACUPAAAJL0AAEG9AAD0vAAAlToAAOA5AACJvQAAojwAAHG7AABoOwAAnrwAAJC7AACevAAAhbwAADo9AACBuwAA9rwAAOo8AAArvQAAnLwAAHc9AACWPAAAcjwAAOu8AACRPAAA2zsAAFi8AAA5OwAAQL0AAEi8AADdvAAAFbwAADS7AADZPAAAHT0AAGU8AAAzOwAAvD0AANc8AAATPAAAWT0AAB68AAAqvQAA4TwAAMW8AADWPAAAkL0AALK8AAA4PQAAZjwAABC9AAD2uwAAzjwAAHi9AAABvAAAzjwAAL07AADhvAAAtLwAAJG8AABEugAASz0AABA8AAD6PAAA9bwAAF29AADlvAAARbwAAEe9AAAcvQAATzwAAHO9AACjOwAAaDwAAJ47AAChvAAAO7wAABA9AAD9vAAA6DsAAA68AACzOwAAprwAAEq9AACJvQAAxzwAADu8AACrvAAAsTwAADM7AACAvAAAXL0AAAY9AAAhPQAAvjwAAKe8AABVOwAAnTwAAFs9AACPvQAAoD0AAJw7AABQvAAAyrsAAHy9AACAvAAAhLwAAIQ9AACFPAAA17wAAGq9AAAgPQAAoTwAABW8AAD3vAAAcjwAAOM8AAAuPQAAvbwAAAO9AAAiPQAABLsAAHA9AABUPAAAIT0AAP48AABgvQAAsboAAHS7AAArPQAAEDwAAMC8AACEvAAAnzwAAAw9AAClPAAATjwAAH28AADWvAAA3DsAAIS8AACQvAAA4rwAAFc8AAALvQAAe7sAAMi8AAAkvQAAGj0AANI9AAA1OwAAPT0AAMa7AAAKPAAAfzwAAFu9AAAWPQAAAL0AAAm8AABZvQAAl7wAABe9AACwvAAAczwAAEa9AAABvQAAvTwAAEQ9AAC8PAAAlTwAAFi9AADZPAAAJr0AABe9AAAsvQAAkjwAAOI8AAAcPQAATrsAAIS9AADgPQ== + index: 0 + object: embedding + text: null + - embedding: AABLPAAA8bwAAOe7AABtvAAAE7sAADm8AAAfvQAAjrsAANK7AAACPQAAGjwAAM87AACXPQAAoL0AAB+9AABVPQAAzDkAAOg8AAD4PAAANDsAAMe6AAAsvQAAPb0AAEy9AACGvAAAPzsAAHs8AAA2vQAAsLwAAJI7AACovAAAgbsAAOw8AADgPAAAf70AAOG8AADYvAAAxDsAAJA8AAD4vAAATrwAAGe9AAALPQAAjbwAAOc7AAALvQAARzwAAD+9AAC5uwAAdrwAABK9AAAIvQAAATsAAFy9AAAzPAAAWDsAADi9AAAqvQAAcD0AADA9AAA9vQAA+ToAALy7AAAAvQAA8LwAAMc8AADZPAAAkDwAACW9AACAvAAACbwAAOS8AAAcvAAAB7oAADC9AADMuwAAzzwAADo9AACLOgAAqDwAAPK8AAC8vAAANDwAACq7AADkPAAAP7wAAG09AADbvAAAPT0AAAk9AABVvQAAIrwAABg7AAA6vQAAErsAANi8AABFvAAAF70AAMq8AAAJvQAAIT0AAAu9AAByvQAA57wAAGU7AABsvQAAODwAAJI8AAC9vAAANT0AAFc7AACFPAAAsbwAAHU9AABUOwAAnTwAAJM8AAA4uwAAHT0AAAi9AADQvAAAz7sAAEK9AAABvQAAmTsAAFY8AABDvAAAgTwAAJy8AAA1PQAABzwAAHE8AACnPAAAmzwAAGo8AAAXvQAAKj0AABe8AADmPAAAqbwAAEU6AABQvAAAVLwAABQ9AACYvAAAFD0AAIA9AADOPAAAYTwAAJQ8AADevAAAkbsAALi8AABLOwAAnTwAAFu9AAAovAAACz0AAAq9AAAovQAAgj0AALO8AACgOwAA8jwAANQ8AADxOwAAizwAAFM8AABuvAAA8TsAAFA8AABePQAAQzsAAC09AADEvAAAd7wAAJw6AACwvAAArDwAABy8AACUvAAAijwAAIM9AAB+vAAA47wAAJE9AAAkvAAAeTwAANA7AACnPAAA2zwAAMQ8AAAtPQAAg7wAAEU9AACDvQAAQj0AACI9AABXOwAAHzwAANS8AAAUvAAAjLwAAOC7AAB6vAAAJz0AAKg8AADLPAAAszsAALm8AAALvQAAvzoAAKc8AAB5vAAAFL0AAM08AADIvAAAwjsAAGA9AAAxvQAA1jwAAH28AABOPQAAED0AAGY8AAAQvQAAYDwAAJc8AAApvAAAijwAAAu9AACDvAAAIjoAAMG8AAAdPQAAkDwAAJM8AAASvQAAMbsAAK48AABluwAAVT0AAOm8AABbvAAAMT0AAL28AAAFvQAAmTsAABI8AAD7OwAAVb0AAJq8AADDPAAAC70AALI8AACBOwAA1TwAAI88AACGvQAAgb0AAKw7AADquwAA3zwAAAa8AAAIuwAAVj0AAPQ8AAB/PQAAIjwAAKm8AADZuwAAVz0AAAe9AAAAvQAAdzwAADC9AAD0vAAAlzwAAJk8AACDuwAAuTwAAJq7AAAQPQAAerwAAJq7AAAWvQAAzrwAAMY7AACGOwAAR7wAAEq9AACZPQAA2zwAAA67AACBPAAAs7wAALM7AAC5PQAAar0AAAo8AAA0vAAAhj0AAJ+8AAAsPQAA4zwAAFI8AABvuwAAD7wAALa7AACGuwAAo7sAAJM9AABxvQAA4zoAAFW9AACCPAAAQbwAAIk7AABlPAAAGj0AANg8AACBvQAARDwAABa8AAACPQAANL0AADo9AACyOwAAKTwAAAm8AAB/PAAA1TwAAGQ9AABePAAAGb0AAK08AACYuwAA07kAABC9AABBPQAAbr0AANW7AABdOwAALL0AAJG8AABCuwAATD0AAAI8AACFvQAAsbwAAEU8AABGPQAAlzwAAFC8AACBOAAAMb0AALw8AABUvQAAubwAAGq8AADKvAAAs7wAAJs8AACDPAAAMT0AAHs5AAA+vQAAjDsAAPu7AACfvAAAxzwAAFY9AAA+PQAAnzwAADW9AAChPAAAMb0AAOq8AACOPAAADDwAACA9AABnuwAAlL0AABQ9AAA0vAAAzzsAAJS8AAChPQAAPj0AALg6AAD/vAAAIb0AAOC8AAABvQAAiL0AAJ+8AAC2OwAAM70AAFA9AACSvAAAh7wAAFO9AABQuwAArboAAPG8AACOPQAAVLwAABk8AADQOAAAgzwAAOq8AABtvQAAGD0AABe9AADPPAAAgrwAAAq9AADlPAAA9zsAALW9AADsvAAAKD0AADY9AAAFvQAAAjwAAPY8AAD+uwAA5rwAAG88AAABvQAAeT0AADE8AADgOwAAm7wAAFY9AAB2uwAA6LkAABm9AADyvAAALL0AAKq8AAB9uwAAKb0AACA8AAAivAAAlzwAAEs8AAAZPQAArL0AAAM9AAC+vAAAVTwAAMc5AACEPAAATbwAAF88AADQuwAAVT0AAOa8AAAJvAAAzrwAADU9AAAAvQAAq7wAAO47AAB+vQAAVD0AAMq8AAB5OwAAubwAAOM8AACKPQAAfb0AAFm8AAD2PAAAw7wAAOU7AAD2PAAApDwAAOQ8AAADPQAAF7wAAMK6AACxPAAAsjwAALs8AACLOwAAhzwAAOY7AABUPAAAVb0AAN48AAD1PAAAFr0AAJS9AAC1uQAAubwAAKQ7AABGPQAAz7sAAFS7AAABvAAAIrwAAE09AADbPAAAILwAABq9AAAuPQAAiTwAAAC9AAB4vAAALD0AAPg7AAArvQAAhjwAAM48AAAXvAAARL0AABM6AADjvAAAm7wAAPU8AAA2vQAABj0AABq9AAAdPQAAzDwAAA89AABEvQAABbsAAIM9AACpPAAAbTwAALg8AAC6uwAAFLwAABs8AADQPAAA27wAADO9AABjvAAA1D0AABC9AAAZvAAAOj0AACq7AACpOwAAebwAAKE8AAC8ugAAAz0AAJK9AAAZPQAAhbwAACI9AACMPQAAjDwAAFA8AADQvAAAEbsAAII8AAAGPAAAGbwAAPS7AACGvAAAKz0AAHW8AACFvAAAYToAAE08AACPvQAAar0AAGy9AAD7PAAA3LsAAPq8AABHPQAA5TwAAFw6AABjvQAAjLkAAIQ8AABXPAAABz0AAIK7AADqOwAASD0AAAW9AAApvAAAZrwAAHI8AABkPAAA1LsAAAY9AAAjvAAAKrwAADM9AAAQvAAAAr0AAKi8AAADvQAAiDwAAMy6AACxvAAAVT0AALa7AADwPAAAxjwAAOo8AABYvQAAEj0AABy7AAACOwAAv7wAACu9AABCvAAACr0AAC28AADTPAAAyjwAACI9AAD2uwAA6TsAAHI8AABDPQAAqjwAAAi8AACPPQAAqL0AANW8AAAWvQAALD0AACM9AABNvQAAATwAAKK9AABgvQAAGr0AALo7AACFPAAA5jwAABQ8AACyvQAAEL0AAIC7AAA+PAAAvbwAAOQ8AAAkvQAAMr0AACM9AAC2PAAAibwAAEY8AACTOwAAvTwAAOa8AAClvQAAQrwAAJC8AACPvQAAYLsAAH07AACNvAAAg70AAEU9AAATvAAA3rwAAJm7AAA5vQAAkboAALk9AACLvAAAxrsAAFa8AADfuwAAXbwAANW8AACTOwAAsTwAAF47AACYuwAAGL0AAPY6AAAWPQAAvboAAMM8AAAHOwAAq7wAADS8AAB7vAAAeDwAAIA8AABBPAAAETwAAH28AACMPAAAY70AABE9AABUPQAAGDwAAFI6AAASvAAA1zwAAOE7AACsPAAAOD0AAOG8AABgvQAA+bwAAI67AAAYvQAAiLsAANw7AAA8PQAAuzwAAEE9AAAsvAAAG70AABA7AABEPAAAQbwAANC8AACBPAAAIbsAAJa8AACOvAAAODsAAGU8AAANvAAAmTsAAL08AADHvAAAOb0AAAG9AACXvAAAi70AAH07AABHvAAAsr0AAOc7AAAPPAAAcTwAAMq7AACtugAA+LwAAMM8AABNPQAAODwAAIC8AAA2vQAAmbwAABi9AAAYvQAAMLwAAMO8AAAcvQAAED0AAKC8AABVvQAA4LoAALI8AAAjPAAAEL0AAMU8AACHvQAAAbwAAOY8AAAxvAAAdToAAJM8AADqvAAAFzwAALE8AADMuwAAFrwAAD67AADEPAAAGr0AAL+7AAALvQAAar0AACo9AAAnOwAAursAAIE7AAAdvQAAhz0AAFO8AACIvAAAeDoAAHo8AAAOvAAAirsAADA9AAASvQAART0AAOa8AACYPAAAkDwAAA+9AAApvAAAVDwAAAy9AABdvAAAMj0AABq9AAAwvQAA7jsAAEY8AADpPAAARbwAAG08AABpPAAA0DsAAPs8AADyvAAAoDwAACu8AAAJvQAAeTwAAO87AABpOwAAzLsAAL+8AAAFPAAAkDwAAGC9AACrPQAAHL0AAAA9AADqvAAAibsAAIq9AACNPQAA3bsAANy8AAARvQAAQ70AAJk9AAAFPQAAkjwAAAc7AACFvAAA7rwAAHY8AAAgvAAAGbwAAMw8AACcvAAAxzwAACG8AAAMuwAAzzwAAL06AADEPAAA3LsAALo8AAAuugAAjL0AANA6AABIvQAAULwAACw9AAA7vAAAG7oAAKw8AACkOwAAoTsAAJq8AACFuwAAIL0AAOk8AACxvAAA2LwAAL28AAAEOwAAhTwAANw8AADuPAAAXj0AAHK8AACXPAAAGj0AAIs8AAAavQAAHD0AAIc8AAALPQAAdL0AAJ08AAA2OwAAZj0AADi9AAC0PAAAsbwAAKu8AAAluwAApLwAAAY8AAAfvQAAgbwAALG8AADfvAAAXDsAAIy8AAB7PQAAG70AAPu5AABDPAAAJLwAAIG7AAD4vAAAnDwAAEi9AAD1PAAAtLwAAC08AAB/vAAAEL0AAFI9AABNvAAAR7wAALS8AAD2uwAAtbsAAHG8AAAxvQAA+TwAALa8AABNvAAASj0AAP27AACkOwAALbwAAMw8AADwvAAANj0AANO7AABQPAAAtDwAACU9AABNvQAAgD0AAHi8AADqOgAAgzwAALW8AAAfOwAAg7wAAJA9AAA8vAAAsDwAADi9AAD9PQAAgjwAAPk7AAAFvQAAZ7oAACo8AACQPQAA5zsAAKq7AAB+PQAA1LwAAGw9AAAwPAAAoz0AANk7AAD3uwAAIL0AAE48AACUPQAAyzsAABA9AAA5OwAA5zwAADM9AAClvAAAhT0AABa8AAApOwAADz0AALq6AAASvAAAHLwAAKQ8AACYvAAAujwAAIM7AADxPAAAkDwAAE89AACwOwAA1DwAAKk8AACMuwAADT0AAIe9AABLPAAAl7sAAAc5AAABvQAApLsAALy7AABTOgAAiDwAALA8AABjvQAAGj0AAI49AADEPAAAS7wAAKk8AADTOwAATr0AAJu8AADnvAAATjwAAKM7AADsPAAA+DsAABS9AACzPA== + index: 1 + object: embedding + text: null + model: voyage-multimodal-3 + object: list + usage: + image_pixels: 0 + text_tokens: 2 + total_tokens: 2 + video_pixels: 0 + status: + code: 200 + message: OK +- request: + headers: + content-type: + - application/json + method: post + parsed_body: + encoding_format: base64 + input_type: document + inputs: + - content: + - image_base64: data:image/webp;base64,UklGRiIAAABXRUJQVlA4TBUAAAAvP8APAAcQ/Y/+B4CE8P+9FtH/1A8A + type: image_base64 + model: voyage-multimodal-3 + output_dimension: 1024 + output_dtype: null + truncation: true + uri: https://api.voyageai.com/v1/multimodalembeddings + response: + headers: + alt-svc: + - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 + content-length: + - '5662' + content-type: + - application/json + parsed_body: + data: + - embedding: AADMPAAAIb0AABE9AADqOwAAvrwAAF29AADMPAAAGr0AALq8AABbPQAAvTsAALq7AAAnuwAAvrwAADA9AACCPQAA4bwAAPE8AADWuwAAerwAAFu7AAA3vQAAyLwAAEE8AACPvAAA+zwAAHi8AAAEvAAAmTwAALg8AACXuwAAabwAAF49AAAvvQAAvrwAABc9AADaOgAABj0AAPK8AACFvQAAKz0AAMc7AABavAAANT0AALw8AADdvAAAPzwAAPa8AABTPAAAqLwAAGg8AACIPAAAHD0AAB49AAA5vQAAQ7wAAI29AAAGvQAAqjwAAJ+8AACFOgAAXL0AAMi8AACHPAAAUr0AABc9AACBPAAAjjoAABk9AAA1vQAAPT0AAKk8AAAKPAAAQ70AABW9AAAhvQAAkTwAADS9AADrvAAAtjwAAJu8AAALPAAAZL0AAPu8AADzPAAA6rsAAKI9AABLvAAAKL0AAIo7AAC0uwAAPboAABS9AAApOwAAITwAAFQ8AAA2vQAAOLsAAJO9AAANvAAAPDwAAES9AADjvAAADz0AACY9AADevAAA1LwAAME8AAC4vAAAJrsAAC49AACvvAAAbL0AAG09AABrPAAAHDwAAIu9AACnvAAA6zwAAPY6AACAOgAAczoAAOU7AABVvQAA+7wAADk9AADpugAANj0AADe9AABMPQAAsDwAAPq8AACQPQAAQT0AAH08AAB5uwAAHDwAADg8AAAePAAApDwAAAK9AAApPQAA2rgAAKQ8AADavAAARDwAAHO8AADMPAAAnDsAANK8AAAxPQAAHjwAALa8AABRvQAASz0AAOm8AACrvQAAj7wAAA69AAA8vAAAkLwAAIU8AAAEvQAAWrwAAES8AABRvQAAYzwAAL+8AADbvAAAATwAAKE7AACrvAAATTwAACM9AACovAAAD70AAIK7AABNPQAAmrwAAHi8AAB3vQAA+zwAAFU9AADAPAAATDwAAKI9AACLOwAANr0AANs8AACVvQAADb0AAJw7AABkPQAANz0AAHM9AADUPAAAzTsAAJE8AADIOwAAWz0AAL27AACRvAAALb0AAE+9AAAmvQAAxTwAAD49AABBPQAAGbwAAPu7AAAJvAAAH70AAPa7AAAVPQAAobwAANI8AABlPQAAsDwAAGw8AAA6PAAAG7sAAFW8AACYPAAAyzsAAO08AABavAAAqLwAAPQ8AAANPQAAnzwAAI68AABTvAAAIjwAAL67AACJPQAAQTwAAC69AACFuwAATr0AAME8AACMvAAATj0AAPG8AACVvQAA+LsAAES9AADHPAAAQT0AAIM9AAAAvQAAnLwAAPC8AACpuwAAKDwAAGs9AABNPQAA2jwAACE9AADPvAAAg70AAIE8AACqOwAAR70AAK88AAD0uwAADjsAANq8AABoPQAAB7wAAFq8AAAHvQAAOLwAAMy8AADwPAAAe7oAAIC5AADgOwAA+LwAAGK9AABLPAAAKz0AALY8AADlvAAASD0AAAe6AAApvQAANL0AACA9AABjPQAAKbwAAKs6AAAAvQAApDwAACC9AABsPAAAI70AALq8AAASPQAASLoAABM9AAAqPQAArjwAAFk8AAC+uwAABjwAAEa5AAB+PAAAD7sAAJM7AACKugAAcLwAABI9AABRvQAAlL0AAO08AACMPAAA3rwAALC8AAAOuwAA9jwAAII8AAD/PAAAUjwAAIm7AACjvAAAT70AAKg9AAAjvAAArb0AAJK8AADwOwAA4DwAAGe8AACnvAAA57wAAI89AABwPAAATrwAANq8AAAZvQAAjTwAAKm8AACLOwAA3LwAAGu8AAAhvQAAWrwAAAc9AABRvQAAqzsAAEO8AACQPAAA4LsAAIK8AAD6uwAAG70AAMo8AAAUPQAAVLwAAOc8AABSvAAAWrkAADc9AABrPQAAdrwAALS8AADWOwAAOTwAAPI7AABFPQAA2TwAAH09AAAoPQAA2rwAAOi8AACNOwAADr0AACo9AACGvAAA/7sAAMG8AAASvAAAXrwAADE8AAAtvQAAaj0AAK69AABhvAAAKbwAAL48AADaPAAA5TwAANo8AAAoPAAAqrwAAIC8AABaPQAAEbwAADk9AADrvAAA+zwAADk9AAA6PAAAED0AADQ8AAB6PQAARDwAAKG8AAAmuwAAQTwAAOM8AADnuwAAjLwAAEi8AACJvAAAnDwAAMa8AADAvAAAB70AAH69AABKvQAABD0AACM9AAD9vAAA4zsAAP06AACquwAAB70AAJ+8AAD9PAAA2TsAADm8AAAMOwAAzDwAABu9AABePAAA1bwAAJe8AABOPAAAEbwAALy8AAAfPAAAsL0AAK27AABBPAAABj0AADS8AAAZPQAAWzoAABW8AACVvAAAEDwAANm8AABDvQAANz0AAIk8AAAnPQAAYrwAAIo8AACVPAAASjoAADE9AAAJPAAAzbwAAGM9AADwugAAIDwAAC89AADbvAAAFbsAAF49AADvPAAA6DwAACi9AACJvAAApLwAACe8AABKvAAAwTwAAF49AACuPAAAPz0AALk8AADiugAAzbsAAO28AACYvAAA2zwAAMo8AACTPQAAATwAAJg8AAD/uwAAOTsAANc8AABiPAAAEr0AAOA6AAAHPQAA8LsAAIK8AAA4OQAAaTwAAC49AADTvAAAv7sAAG+8AABkPAAAmz0AALe8AABSvQAAP7wAAIg8AAAxvAAAnz0AAHI8AAA+PAAAXjwAAP08AACtvAAAC7wAAMG8AADNugAAVD0AAM68AAAGuwAA0rwAADE9AABVvQAAcDwAAOo8AADAPAAA6LgAANU8AAAGuwAAOjwAAM07AAAbPQAAjjwAAFq7AACKPAAAGT0AAAM8AADevAAAjjoAAJm7AAA/PQAADj0AANa7AADjPAAA0TsAAFu4AAAwuwAAPLsAANS8AACXOwAA/jwAAA49AACaPQAAKD0AAP88AACvvAAAar0AABk9AACGvAAAqTsAACu9AAAFPAAAcDwAAA69AAAGvQAACL0AALG7AACmPAAASz0AAAe9AAAYPQAAmLsAANo8AAAavAAAF7wAACE7AAAHvAAA1bsAAKQ7AACEOwAAjzwAABq9AAAovAAAfb0AAFI7AAAjPQAAUb0AAAM9AAA+uwAA8bwAAIi8AADLPAAAGLwAAAo9AAAevAAAmboAANE8AAAZvQAAJD0AAO+6AAD9PAAAwTwAAAg9AABEvQAAJD0AACG9AACCvAAAiD0AABy9AABvPQAAXb0AAN66AAA+OQAAdrsAAJg8AACbvAAAujwAAMi8AAC2PAAAzbwAAIc8AACBPAAAmLwAAJg9AADVvAAA4DwAAC+7AAAXOwAAjT0AAES7AAA5PAAAmTwAABs8AAC5PAAAAL0AADE9AACHvAAAiDwAAKo9AAD4vAAARLoAAH46AACvvAAAmbsAAMc8AAARPAAAirwAAK08AABaPQAAlzwAAAa9AAAyvQAAVj0AAKO8AAA6PQAAAz0AAKC7AAAQPQAAa70AAEs9AACLPQAA87wAADm8AAA4vQAA1zsAAKg8AACKuwAAp7wAADE8AAAXvQAAm7sAAAo8AAABPQAA6LwAAFU8AAAkvQAAfb0AAII8AABrPQAAtbwAAIG9AABbvQAAwLwAAL08AADBOgAAE7wAAFq8AAAAPAAAGT0AAB48AACYvAAAkzwAAME7AABSPQAAsrwAAKQ8AABNOwAAvDwAANa7AADbvAAAZTsAAAS9AACIvAAAhzwAAOA8AABaPQAAnLsAAE+8AACvugAAIL0AABk9AADEvAAAmTwAACs9AAASvAAAGzwAAME8AACyPAAAMT0AAFS8AAChPQAA4bwAABg9AADhvAAAOrwAALa7AACbPAAAD70AAK+8AAAUvQAATLwAALA8AAABvQAAxbwAADY8AADrvAAADz0AAK47AAAiOwAAy7wAAMg8AABBPAAA07wAAI08AACtOwAAMT0AACi9AAAjvQAAKD0AAFa8AAD/vAAAIj0AADy8AACgvAAAx7wAAAu9AAA1uwAAzrwAAPI8AADzvAAA4zwAAHg9AABKvQAASrwAABs9AADPvAAAGrwAALS8AAACvQAA87wAAIm6AAAIPQAASjwAAD69AADrPAAAeL0AAA09AAB6OwAAKT0AAKS8AAAPuwAADrsAAEe8AAAbOwAAXTwAALS8AAA/vAAA4TkAAA68AAB2OwAAkr0AAAW8AAAwPQAAHr0AAKA8AAAHPQAAm7wAAIk8AADtPAAAsbwAAJ49AABSPAAAtzwAABI9AAAcvAAAPDsAAL68AABcvAAAXrwAABk9AACmvAAAbbsAABs9AABpOwAAprsAAJi9AAAaPQAADbsAABg8AACfPAAAt7wAAE+9AADiPAAAoTwAAD49AACfvAAAz7sAAIo9AADKPAAAaL0AALo7AAADPQAAYDwAAHY8AAAZPAAApjwAABO8AADLvAAAKr0AAI+8AAArPQAAOTwAAB89AABBPAAAED0AAMy8AAAkvQAAhzkAAEa8AABcPAAAKT0AAGm8AAC0uwAAILwAADk9AACUvAAADDwAAOy7AAAmugAAqTwAAJg8AAA5PQAAgbwAAJI7AAC0PAAAH7wAABQ9AAAfOwAA+LoAAKC8AAA0vQAAaDsAADG9AABBPAAAQzwAAFm8AABhPQAAmjwAAB89AADrvAAAmD0AAES8AABbPQAAkLoAAL68AABGvAAAMj0AACE8AACpvAAADT0AAH69AADWOgAA/TsAAO+8AACNvQAAKj0AAPI7AAD2vAAAjTwAAIW8AACxOgAAvT0AANK8AACCPQAAjzwAAFQ8AACfOwAAmrwAAH47AACGvAAAiDwAAKe8AAD0PAAAr7wAABk8AAB7PAAAfzwAAD68AACovAAAhrwAAK28AADyvAAArrsAAAE9AAA2vQAADD0AAIi8AAAGPAAAfrsAALK7AAChPQAAQzsAABe8AADLuwAA6boAABA9AAAZvQAAED0AAEQ9AABrvAAAYDwAAFW9AACtvAAA7TwAAAq8AABwvAAAEr0AABO8AADjPAAAkj0AAA49AACruQAA4TwAAGS9AACBPQAAB70AANa6AACuPAAAZLwAADE9AACIvAAAODwAADg8AAAhPQAAWj0AAOC8AAC5vAAAFT0AAH09AAANPQAA2jwAABs9AAAgPAAApDwAAM28AAA9vQAA57wAAOM6AAAYPAAA9zwAABI9AACDvQAAp7wAAFu7AADDPAAARDwAAAu9AAAIvQAANroAAP88AADMvAAAg7wAADk8AABkPQAA1rwAAOK8AACmuwAAhrsAABW9AADrvAAAwTsAADa8AADxuwAAQT0AAFs9AACXPAAAsb0AADa9AACPPAAARb0AAHi8AABSvAAAYz0AAGM8AACcuwAAoD0AAAI8AAC+vA== + index: 0 + object: embedding + text: null + model: voyage-multimodal-3 + object: list + usage: + image_pixels: 50000 + text_tokens: 0 + total_tokens: 89 + video_pixels: 0 + status: + code: 200 + message: OK +version: 1 diff --git a/tests/test_embedder.py b/tests/test_embedder.py index 3276db7c..a4f82fc2 100644 --- a/tests/test_embedder.py +++ b/tests/test_embedder.py @@ -308,7 +308,7 @@ def _ollama_text_only_config(): async def test_text_only_embedder_does_not_support_images(): embedder = get_embedder(_ollama_text_only_config()) assert embedder.supports_images is False - with pytest.raises(NotImplementedError, match="multimodal provider"): + with pytest.raises(NotImplementedError, match="multimodal"): await embedder.embed_image(b"\x89PNG\r\n\x1a\n") @@ -417,6 +417,20 @@ async def test_vllm_supports_images_flag(): assert embedder.supports_images is True +async def test_vllm_text_only_embed_image_raises(): + from haiku.rag.embeddings.vllm import VLLMMultimodalEmbedder + + embedder = VLLMMultimodalEmbedder( + model_name="x", + vector_dim=2, + base_url="http://localhost:8000/v1", + supports_images=False, + ) + assert embedder.supports_images is False + with pytest.raises(NotImplementedError, match="text-only"): + await embedder.embed_image(b"\x89PNG\r\n\x1a\n") + + async def test_vllm_connect_error_surfaces_helpful_message(monkeypatch): import httpx @@ -707,3 +721,136 @@ async def test_vllm_embed_text_and_image_end_to_end(): image_vec = await embedder.embed_image(image) assert len(image_vec) == 4096 assert any(abs(x) > 1e-6 for x in image_vec), "image embedding is all zeros" + + +class _FakeVoyageResult: + def __init__(self, embeddings): + self.embeddings = embeddings + + +def _fake_voyage_client(captured, embeddings): + class FakeAsyncClient: + def __init__(self, *args, **kwargs): + captured["init"] = kwargs + + async def multimodal_embed(self, **kwargs): + captured.update(kwargs) + return _FakeVoyageResult(embeddings) + + return FakeAsyncClient + + +async def test_voyage_embed_documents_request_shape(monkeypatch): + from haiku.rag.embeddings.voyageai import VoyageMultimodalEmbedder + + captured: dict = {} + monkeypatch.setattr( + "voyageai.AsyncClient", + _fake_voyage_client(captured, [[0.1, 0.2], [0.3, 0.4]]), + ) + + embedder = VoyageMultimodalEmbedder("voyage-multimodal-3", vector_dim=2) + vecs = await embedder.embed_documents(["a cat", "a dog"]) + + assert vecs == [[0.1, 0.2], [0.3, 0.4]] + assert captured["model"] == "voyage-multimodal-3" + assert captured["input_type"] == "document" + assert captured["inputs"] == [["a cat"], ["a dog"]] + assert captured["output_dimension"] == 2 + + +async def test_voyage_embed_query_request_shape(monkeypatch): + from haiku.rag.embeddings.voyageai import VoyageMultimodalEmbedder + + captured: dict = {} + monkeypatch.setattr( + "voyageai.AsyncClient", _fake_voyage_client(captured, [[0.5, 0.6]]) + ) + + embedder = VoyageMultimodalEmbedder("voyage-multimodal-3", vector_dim=2) + vec = await embedder.embed_query("find the cat") + + assert vec == [0.5, 0.6] + assert captured["model"] == "voyage-multimodal-3" + assert captured["input_type"] == "query" + assert captured["inputs"] == [["find the cat"]] + + +async def test_voyage_embed_image_passes_pil(monkeypatch): + from PIL import Image + + from haiku.rag.embeddings.voyageai import VoyageMultimodalEmbedder + + captured: dict = {} + monkeypatch.setattr( + "voyageai.AsyncClient", _fake_voyage_client(captured, [[0.7, 0.8]]) + ) + + embedder = VoyageMultimodalEmbedder("voyage-multimodal-3", vector_dim=2) + import io + + buf = io.BytesIO() + Image.new("RGB", (4, 4), "red").save(buf, format="PNG") + vec = await embedder.embed_image(buf.getvalue()) + + assert vec == [0.7, 0.8] + assert captured["model"] == "voyage-multimodal-3" + inputs = captured["inputs"] + assert len(inputs) == 1 and len(inputs[0]) == 1 + assert isinstance(inputs[0][0], Image.Image) + assert captured["input_type"] == "document" + + +async def test_voyage_embed_documents_empty_list_skips_request(monkeypatch): + from haiku.rag.embeddings.voyageai import VoyageMultimodalEmbedder + + captured: dict = {} + monkeypatch.setattr("voyageai.AsyncClient", _fake_voyage_client(captured, [])) + + embedder = VoyageMultimodalEmbedder("voyage-multimodal-3", vector_dim=2) + assert await embedder.embed_documents([]) == [] + assert "inputs" not in captured + + +async def test_voyage_get_embedder_routes_to_multimodal(monkeypatch): + monkeypatch.setattr("voyageai.AsyncClient", _fake_voyage_client({}, [])) + from haiku.rag.embeddings.voyageai import VoyageMultimodalEmbedder + + config = AppConfig( + embeddings=EmbeddingsConfig( + model=EmbeddingModelConfig( + provider="voyageai", + name="voyage-multimodal-3", + vector_dim=1024, + multimodal=True, + ) + ) + ) + embedder = get_embedder(config) + assert isinstance(embedder, VoyageMultimodalEmbedder) + assert embedder.supports_images is True + + +@pytest.mark.vcr() +async def test_voyage_embed_text_and_image_end_to_end(): + """End-to-end against the real VoyageAI ``multimodal_embed`` API: text and + image inputs return embeddings of the configured dimension in a shared + vector space. To re-record, set ``VOYAGE_API_KEY`` and run with + ``--record-mode=rewrite``.""" + from PIL import Image + + from haiku.rag.embeddings.voyageai import VoyageMultimodalEmbedder + + embedder = VoyageMultimodalEmbedder("voyage-multimodal-3", vector_dim=1024) + + text_vec = await embedder.embed_query("a photo of a red square") + assert len(text_vec) == 1024 + assert any(abs(x) > 1e-6 for x in text_vec), "text embedding is all zeros" + + text_batch = await embedder.embed_documents(["hello world", "another doc"]) + assert len(text_batch) == 2 + assert all(len(v) == 1024 for v in text_batch) + + image_vec = await embedder.embed_image(Image.new("RGB", (64, 64), (255, 0, 0))) + assert len(image_vec) == 1024 + assert any(abs(x) > 1e-6 for x in image_vec), "image embedding is all zeros" From 3586ac30a7e2b01c41d6b43de365d75c0b8a857b Mon Sep 17 00:00:00 2001 From: Yiorgis Gozadinos Date: Tue, 23 Jun 2026 14:59:31 +0300 Subject: [PATCH 3/4] Add Cohere multimodal embedder --- CHANGELOG.md | 1 + .../haiku/rag/embeddings/__init__.py | 24 + haiku_rag_slim/haiku/rag/embeddings/cohere.py | 66 + haiku_rag_slim/haiku/rag/embeddings/vllm.py | 21 +- ...ohere_embed_text_and_image_end_to_end.yaml | 6339 +++++++++++++++++ tests/test_embedder.py | 132 + 6 files changed, 6563 insertions(+), 20 deletions(-) create mode 100644 haiku_rag_slim/haiku/rag/embeddings/cohere.py create mode 100644 tests/cassettes/test_embedder/test_cohere_embed_text_and_image_end_to_end.yaml diff --git a/CHANGELOG.md b/CHANGELOG.md index d36fe90e..8d8760c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - `haiku-rag doctor` checks a database for consistency (orphaned chunks/items, chunk-less documents classified by content and embedder modality, dangling `doc_item_refs`, vector-dimension mismatch, unembedded chunks, missing picture data, settings/embedding drift, pending migrations, vector-index coverage, provider API keys) and probes configured provider endpoints (Ollama `/api/tags` with model presence, docling-serve `/health`, OpenAI-compatible/vLLM `/models`); exits 1 when any check fails. - `embeddings.model.multimodal` (bool, default false) gates image embedding; `supports_images` derives from it instead of the provider name. - VoyageAI multimodal embedder (`provider: voyageai`, `multimodal: true`, e.g. `voyage-multimodal-3`) embedding text and pictures into a shared vector space. +- Cohere multimodal embedder (`provider: cohere`, `multimodal: true`, e.g. `embed-v4.0`) embedding text and pictures into a shared vector space. ### Changed diff --git a/haiku_rag_slim/haiku/rag/embeddings/__init__.py b/haiku_rag_slim/haiku/rag/embeddings/__init__.py index ef6c8894..362ab3e9 100644 --- a/haiku_rag_slim/haiku/rag/embeddings/__init__.py +++ b/haiku_rag_slim/haiku/rag/embeddings/__init__.py @@ -1,3 +1,5 @@ +import base64 +import io from typing import TYPE_CHECKING, Any from pydantic_ai.embeddings import Embedder @@ -69,6 +71,23 @@ class EmbedderWrapper: ) +def _to_data_uri(image: "bytes | PILImage.Image") -> str: + """Render an image as a ``data:image/png;base64,...`` URI.""" + if isinstance(image, bytes): + return f"data:image/png;base64,{base64.b64encode(image).decode('ascii')}" + + from PIL import Image as PILImageModule + + if isinstance(image, PILImageModule.Image): + buf = io.BytesIO() + image.save(buf, format="PNG") + return ( + f"data:image/png;base64,{base64.b64encode(buf.getvalue()).decode('ascii')}" + ) + + raise TypeError(f"Unsupported image type: {type(image)!r}") + + def contextualize(chunks: list["Chunk"]) -> list[str]: """Prepare chunk content for embedding/FTS by adding context. @@ -246,6 +265,11 @@ def _get_multimodal_embedder( return VoyageMultimodalEmbedder(model_name, vector_dim) + if provider == "cohere": + from haiku.rag.embeddings.cohere import CohereMultimodalEmbedder + + return CohereMultimodalEmbedder(model_name, vector_dim) + raise ValueError( f"Provider '{provider}' does not support multimodal embedding. Set " "embeddings.model.multimodal: true on a vllm, voyageai, or cohere model." diff --git a/haiku_rag_slim/haiku/rag/embeddings/cohere.py b/haiku_rag_slim/haiku/rag/embeddings/cohere.py new file mode 100644 index 00000000..5f8f84dd --- /dev/null +++ b/haiku_rag_slim/haiku/rag/embeddings/cohere.py @@ -0,0 +1,66 @@ +"""Multimodal embedder backed by Cohere's ``embed`` API (``embed-v4.0``). + +``embed-v4.0`` maps text and images into a shared vector space. Text uses the +``search_document``/``search_query`` input types; images are passed as base64 +data URIs with the ``image`` input type. The API key is read from the +environment (``CO_API_KEY``) like the text-only Cohere path. +""" + +from typing import TYPE_CHECKING + +from haiku.rag.embeddings import EmbedderWrapper, _to_data_uri + +if TYPE_CHECKING: + from PIL import Image as PILImage + + +class CohereMultimodalEmbedder(EmbedderWrapper): + def __init__( + self, + model_name: str, + vector_dim: int, + api_key: str | None = None, + ): + super().__init__(embedder=None, vector_dim=vector_dim, supports_images=True) + import cohere + + self._model_name = model_name + self._client = cohere.AsyncClientV2(api_key=api_key) + + async def _embed_texts( + self, texts: list[str], input_type: str + ) -> list[list[float]]: + result = await self._client.embed( + model=self._model_name, + input_type=input_type, + texts=texts, + output_dimension=self._vector_dim, + embedding_types=["float"], + ) + return _floats(result) + + async def embed_query(self, text: str) -> list[float]: + rows = await self._embed_texts([text], "search_query") + return rows[0] + + async def embed_documents(self, texts: list[str]) -> list[list[float]]: + if not texts: + return [] + return await self._embed_texts(texts, "search_document") + + async def embed_image(self, image: "bytes | PILImage.Image") -> list[float]: + result = await self._client.embed( + model=self._model_name, + input_type="image", + images=[_to_data_uri(image)], + output_dimension=self._vector_dim, + embedding_types=["float"], + ) + return _floats(result)[0] + + +def _floats(result: object) -> list[list[float]]: + floats = result.embeddings.float_ # type: ignore[attr-defined] # ty: ignore[unresolved-attribute] + if floats is None: + raise ValueError("Cohere returned no float embeddings.") + return [list(e) for e in floats] diff --git a/haiku_rag_slim/haiku/rag/embeddings/vllm.py b/haiku_rag_slim/haiku/rag/embeddings/vllm.py index b8e81ba7..a5ea4d5a 100644 --- a/haiku_rag_slim/haiku/rag/embeddings/vllm.py +++ b/haiku_rag_slim/haiku/rag/embeddings/vllm.py @@ -11,13 +11,11 @@ Models like ``Qwen/Qwen3-VL-Embedding-8B`` and ``jinaai/jina-embeddings-v4`` ship with chat templates that map both shapes into a shared vector space. """ -import base64 -import io from typing import TYPE_CHECKING, Any import httpx -from haiku.rag.embeddings import EmbedderWrapper +from haiku.rag.embeddings import EmbedderWrapper, _to_data_uri if TYPE_CHECKING: from PIL import Image as PILImage @@ -123,20 +121,3 @@ class VLLMMultimodalEmbedder(EmbedderWrapper): } ) return rows[0] - - -def _to_data_uri(image: "bytes | PILImage.Image") -> str: - """Render an image as a ``data:image/png;base64,...`` URI.""" - if isinstance(image, bytes): - return f"data:image/png;base64,{base64.b64encode(image).decode('ascii')}" - - from PIL import Image as PILImageModule - - if isinstance(image, PILImageModule.Image): - buf = io.BytesIO() - image.save(buf, format="PNG") - return ( - f"data:image/png;base64,{base64.b64encode(buf.getvalue()).decode('ascii')}" - ) - - raise TypeError(f"Unsupported image type: {type(image)!r}") diff --git a/tests/cassettes/test_embedder/test_cohere_embed_text_and_image_end_to_end.yaml b/tests/cassettes/test_embedder/test_cohere_embed_text_and_image_end_to_end.yaml new file mode 100644 index 00000000..f883c9c9 --- /dev/null +++ b/tests/cassettes/test_embedder/test_cohere_embed_text_and_image_end_to_end.yaml @@ -0,0 +1,6339 @@ +interactions: +- request: + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate, zstd + connection: + - keep-alive + content-length: + - '138' + content-type: + - application/json + host: + - api.cohere.com + method: POST + parsed_body: + embedding_types: + - float + input_type: search_query + model: embed-v4.0 + output_dimension: 1536 + texts: + - a photo of a red square + uri: https://api.cohere.com/v2/embed + response: + headers: + access-control-expose-headers: + - X-Debug-Trace-ID + alt-svc: + - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 + cache-control: + - no-cache, no-store, no-transform, must-revalidate, private, max-age=0 + content-length: + - '19543' + content-type: + - application/json + expires: + - Thu, 01 Jan 1970 00:00:00 GMT + num_chars: + - '23' + num_tokens: + - '6' + pragma: + - no-cache + transfer-encoding: + - chunked + vary: + - Origin,Accept-Encoding + parsed_body: + embeddings: + float: + - - -0.007904941 + - -0.0327101 + - 0.037071448 + - -0.018862827 + - -0.0040887627 + - -0.00861366 + - -0.0022624487 + - 0.03968826 + - 0.03598111 + - -0.019407995 + - 0.03619918 + - 0.008831727 + - -0.018644758 + - -0.013302107 + - -0.042741198 + - 0.0046066726 + - -0.011339502 + - 0.0320559 + - 0.010576266 + - 0.030529428 + - 0.0216977 + - -0.0014583253 + - 0.015482781 + - 0.009485929 + - 0.0053426498 + - 0.01602795 + - 0.012647906 + - 0.018535724 + - 0.023442239 + - -0.026277116 + - -0.015700849 + - -0.0075778402 + - 0.0032846394 + - 0.005042807 + - -0.019517027 + - -0.05975045 + - -0.011448535 + - -0.007032672 + - -0.015700849 + - 0.009758513 + - 0.011775637 + - 0.040778596 + - -0.005697009 + - -0.048192885 + - 0.06323953 + - 0.018644758 + - 0.034018505 + - 0.029657159 + - -0.017445387 + - -0.020389298 + - 0.010794334 + - -0.010576266 + - -0.029657159 + - 0.01842669 + - 0.0008416037 + - -0.008559143 + - 0.02758552 + - -0.0046611894 + - -0.025295813 + - 0.050809693 + - 0.003202864 + - 0.034890775 + - -0.011284986 + - -0.013901793 + - 0.0008927132 + - 0.013302107 + - 0.008668177 + - -0.02311514 + - 0.014719546 + - 0.006405728 + - 0.025077743 + - 0.008232042 + - -0.041214727 + - 0.005015549 + - -0.020389298 + - -0.030965563 + - -0.053862635 + - -0.018208623 + - -0.014174378 + - -0.00053835375 + - -0.018208623 + - -0.0148285795 + - 0.043831535 + - -0.008013975 + - -0.045139942 + - 0.06149499 + - 0.0058060433 + - -0.037725653 + - -0.0015741737 + - -0.0064602452 + - 0.05517104 + - -0.014937612 + - 0.013193075 + - -0.052990366 + - 0.051027756 + - 0.0029847967 + - -0.012975007 + - 0.026822284 + - -0.017336354 + - 0.019407995 + - 0.018644758 + - -0.04165086 + - -0.006978155 + - 0.007359773 + - 0.011775637 + - -0.051463895 + - 0.009267862 + - 0.035108842 + - -0.012975007 + - 0.011230469 + - -0.013847276 + - 0.010194649 + - 0.039034054 + - -0.0032710102 + - 0.02082543 + - 0.039906327 + - -0.023442239 + - -0.029657159 + - 0.015918916 + - -0.0010426345 + - 0.00861366 + - -0.0047974815 + - 0.026059046 + - -0.0017309095 + - 0.008559143 + - 0.014610512 + - -0.018317658 + - -0.0058605596 + - -0.013847276 + - 0.021370599 + - -0.040996663 + - 0.03619918 + - -0.0145014785 + - -0.017881522 + - -0.013029523 + - 0.018535724 + - -0.0039524706 + - -0.004497639 + - 0.010739817 + - 0.018862827 + - -0.01155757 + - 0.014610512 + - -0.0066783126 + - -0.0060241106 + - -0.06149499 + - -0.011830154 + - -0.030529428 + - -0.0060241106 + - 0.027149383 + - 0.00031517545 + - -0.043831535 + - 0.015046647 + - -0.044921875 + - 0.046448346 + - 0.0057515264 + - 0.008395593 + - -0.041868933 + - -0.023987407 + - 0.017118286 + - 0.03968826 + - -0.0053699086 + - 0.034236573 + - -0.04623028 + - 0.022460938 + - 0.0014378816 + - 0.029439092 + - 0.058878183 + - -0.006432987 + - -0.008886245 + - -0.010140131 + - -0.008286559 + - -0.012375322 + - -0.039034054 + - 0.048410952 + - -0.010903367 + - 0.029002957 + - 0.027149383 + - -0.034236573 + - 0.030093294 + - -0.0024668868 + - -0.017336354 + - -0.011121434 + - -0.013901793 + - 0.048410952 + - 0.025404846 + - 0.0320559 + - 0.05669751 + - -0.032273967 + - 0.012756939 + - 0.08024878 + - 0.0021806734 + - -0.010957884 + - -0.044267673 + - 0.0055879755 + - 0.028784888 + - 0.041214727 + - -0.020389298 + - 0.02791262 + - -0.018317658 + - -0.012647906 + - 0.008559143 + - -0.029221024 + - 0.02289707 + - 0.014174378 + - -0.044485737 + - -0.024532575 + - -0.008559143 + - -0.063675664 + - 0.028566822 + - -0.013629209 + - 0.0003066572 + - -0.0053699086 + - 0.025950015 + - -0.033364303 + - 0.0081230085 + - -0.03445464 + - -0.005560717 + - 0.05669751 + - 0.019189926 + - 0.0077959076 + - -0.005288133 + - -0.027367452 + - -0.040996663 + - 0.0045521557 + - -0.026604215 + - -0.062803395 + - -0.009267862 + - -0.019407995 + - 0.024096442 + - -0.014065344 + - 0.010903367 + - 0.00023851116 + - -0.012048221 + - 0.017881522 + - -0.011284986 + - 0.0084501095 + - 8.220117e-05 + - -0.0044703805 + - -0.08024878 + - -0.037289515 + - -0.0019080893 + - 0.0148285795 + - -0.011830154 + - -0.03685338 + - 0.07370676 + - -0.017445387 + - 0.027476486 + - -0.010957884 + - -0.03619918 + - -0.018862827 + - -0.013683726 + - 0.03554498 + - 0.040342458 + - -0.044485737 + - 0.019189926 + - -0.024532575 + - -0.0091043115 + - -0.0010971513 + - 0.0061604027 + - -0.0125933895 + - 0.017336354 + - 0.004906515 + - 0.033364303 + - 0.0081230085 + - 0.026495183 + - -2.8536157e-05 + - -0.0145014785 + - 0.0029984259 + - 0.040342458 + - -0.0029166506 + - 0.02464161 + - 0.027367452 + - 0.022133837 + - 0.012865974 + - -0.011612087 + - 0.0018126848 + - -0.008668177 + - 0.0025350328 + - 0.010467233 + - -0.011394018 + - -0.023878373 + - -0.025731947 + - -0.008995278 + - -0.0210435 + - -0.0040615043 + - 0.034018505 + - 0.010576266 + - 0.03947019 + - -0.011066918 + - 0.006269436 + - 0.021588668 + - 0.014937612 + - -0.0327101 + - 0.015046647 + - 0.035108842 + - -0.021915767 + - 0.017336354 + - -0.005915077 + - 0.014283411 + - -0.010249166 + - -0.0043340884 + - 0.022024803 + - -0.018644758 + - 0.0145014785 + - -0.0030393137 + - 0.0041432795 + - 0.044485737 + - 0.029002957 + - -0.020934466 + - -0.013683726 + - -0.015264714 + - -0.004361347 + - -0.01602795 + - -0.009540446 + - 0.0060786274 + - -0.011503053 + - -0.019298961 + - -0.013084041 + - -0.038161784 + - -0.011884671 + - -0.020171229 + - 0.0033255268 + - -0.0050700656 + - -0.03925212 + - 0.020062195 + - -0.024532575 + - 0.0016082467 + - 0.009376897 + - -0.0017990555 + - -0.03118363 + - 0.016791185 + - 0.021806734 + - -0.017663455 + - -0.028130688 + - 0.026168082 + - 0.0148285795 + - -0.0023169655 + - -0.021915767 + - 0.011284986 + - -0.016682152 + - -0.027258419 + - -0.037289515 + - 0.024532575 + - -0.0043886052 + - -0.03445464 + - -0.020171229 + - -0.010358199 + - -0.018535724 + - -0.030965563 + - -0.018317658 + - 0.018971859 + - -0.027476486 + - -0.009867547 + - 0.039034054 + - -0.029439092 + - 0.010085614 + - -0.010249166 + - 0.016136983 + - 0.0327101 + - 0.017445387 + - 0.011721119 + - -0.02496871 + - 0.03598111 + - 0.061058857 + - -0.0043340884 + - -0.03554498 + - -0.032492034 + - 0.0064875036 + - 0.009322379 + - 0.02791262 + - -0.012647906 + - 0.0041432795 + - -0.012702423 + - 0.019080892 + - -0.006269436 + - -0.020607363 + - -0.020716397 + - -0.024532575 + - 0.058878183 + - 0.05669751 + - -0.024532575 + - 0.04710255 + - -0.017118286 + - 0.020498332 + - 0.005151841 + - -0.023442239 + - 0.018535724 + - -0.028784888 + - -0.05255423 + - -0.009594963 + - 0.007686874 + - -0.040778596 + - -0.013302107 + - 0.039034054 + - -0.0327101 + - -0.0075233234 + - -0.022569971 + - 0.035763044 + - 0.038597923 + - -0.030311361 + - 0.018971859 + - -0.019080892 + - 0.025840981 + - 0.013193075 + - -0.005124583 + - 0.050155487 + - 0.0032573808 + - -0.0071417056 + - -0.018535724 + - -0.058878183 + - 0.0010903367 + - 0.03925212 + - -0.019735094 + - 0.05844205 + - -0.032273967 + - -0.012375322 + - -0.0051790993 + - 0.0065147616 + - -0.026931318 + - 0.01809959 + - 0.009594963 + - 0.017009253 + - 0.015264714 + - 0.024859678 + - -0.031837832 + - -0.011884671 + - 0.025295813 + - -0.021588668 + - -0.046448346 + - 0.025513878 + - 0.0035435944 + - -0.030093294 + - -0.020716397 + - -0.011394018 + - 0.009594963 + - 0.013738243 + - -0.012102738 + - 0.0029439093 + - -0.046448346 + - -0.017663455 + - -0.015700849 + - 0.02431451 + - 0.0043886052 + - -0.009922065 + - -0.011775637 + - -0.028348755 + - 0.012484355 + - 0.012375322 + - 0.016136983 + - -0.032492034 + - -0.03947019 + - 0.013629209 + - 0.046884477 + - 0.0641118 + - 0.010303682 + - -0.043831535 + - 0.003202864 + - -0.0023305947 + - -0.020934466 + - -0.04012439 + - 0.009376897 + - 0.026277116 + - 0.032492034 + - 0.014174378 + - -0.056261376 + - -0.08199333 + - 0.06629247 + - -0.018971859 + - 0.034890775 + - -0.041868933 + - 0.026277116 + - -0.024859678 + - 0.052336164 + - 0.008668177 + - 0.016136983 + - 0.01984413 + - -0.02638615 + - -0.0022624487 + - 0.009649481 + - 0.012266288 + - 0.06978155 + - 0.019735094 + - -0.013683726 + - -0.0145014785 + - 0.0040069874 + - 0.0011925558 + - 0.0216977 + - 0.038161784 + - -0.00053494645 + - 0.015591815 + - -0.015373748 + - 0.06236726 + - -0.04252313 + - -0.005151841 + - 0.0013901793 + - -0.0148285795 + - -0.033364303 + - -0.024750644 + - -0.015482781 + - 0.019298961 + - 0.048847083 + - -0.021588668 + - 0.009158829 + - -0.047538683 + - 0.0320559 + - -0.026168082 + - -0.012429839 + - -0.039906327 + - 0.022351902 + - -0.02082543 + - 0.0641118 + - -0.0052063577 + - 0.058005914 + - -0.06498407 + - 0.011066918 + - -0.012647906 + - -0.0038706954 + - -0.026495183 + - 0.007087189 + - -0.022569971 + - -0.025840981 + - 0.017663455 + - 0.07108996 + - 0.015482781 + - 0.0058878185 + - -0.028348755 + - 0.0034890776 + - -0.028566822 + - -0.034236573 + - 0.023224173 + - -0.024532575 + - -0.04862902 + - -0.0034209315 + - 0.0026168083 + - 0.0026304375 + - -0.005778785 + - -0.037289515 + - 0.025186779 + - -0.01379276 + - 0.010739817 + - 0.009758513 + - -0.051027756 + - -0.034890775 + - -0.0008927132 + - 0.110778205 + - -0.0016286904 + - -0.013193075 + - 0.0022897073 + - -0.020934466 + - 0.019517027 + - 0.013738243 + - 0.020934466 + - 0.012048221 + - -0.0044431225 + - 0.027476486 + - 0.014937612 + - -0.018753793 + - 0.011503053 + - 0.0106852995 + - 0.037507586 + - -0.022569971 + - 0.018644758 + - 0.039906327 + - -0.0077413907 + - 0.019080892 + - 0.012756939 + - 0.005288133 + - -0.0148285795 + - -0.0077959076 + - 0.009976582 + - -0.016791185 + - 0.00017377241 + - 0.018753793 + - 0.012211771 + - -0.03358237 + - 0.00053835375 + - 0.031837832 + - 0.02311514 + - -0.026822284 + - 0.014719546 + - 0.03881599 + - -0.034236573 + - 0.011339502 + - -0.033146236 + - 0.046448346 + - -0.004034246 + - 0.0006303509 + - 0.0018535724 + - 0.0097039975 + - -0.011775637 + - 0.063675664 + - -0.014283411 + - -0.051681962 + - 0.00861366 + - -0.007359773 + - 0.060622722 + - -0.01602795 + - -0.015482781 + - 0.029875224 + - 0.0032710102 + - -0.021915767 + - 0.014174378 + - -0.013356625 + - 0.0084501095 + - 0.020062195 + - 0.02311514 + - -0.044049606 + - 0.013084041 + - 0.02082543 + - 0.049719356 + - -0.06454793 + - 0.0006269436 + - 0.02791262 + - -0.019080892 + - 0.014174378 + - 0.0065147616 + - 0.0010153761 + - -0.006760088 + - 0.02082543 + - -0.036417246 + - -0.026059046 + - -0.010957884 + - -0.03925212 + - -0.019735094 + - -0.0081230085 + - -0.0048247403 + - 0.013193075 + - 0.022242868 + - 0.014392444 + - -0.011666602 + - 0.009922065 + - 0.025950015 + - 0.005697009 + - 0.011230469 + - -0.05844205 + - 0.00055879756 + - -0.05975045 + - 0.052336164 + - 0.012975007 + - -0.0028621338 + - -0.04165086 + - 0.043177336 + - -0.00039865435 + - 0.0036253696 + - 0.0016355051 + - -0.0032982687 + - -0.005151841 + - 0.047320616 + - 0.03598111 + - 0.0320559 + - 0.028130688 + - -0.010739817 + - -0.061931126 + - 0.045576073 + - -0.0327101 + - -0.0064875036 + - -0.017009253 + - 0.0050973245 + - -0.019735094 + - -0.010412715 + - 0.025950015 + - -0.0145014785 + - 0.0068691215 + - 0.0026440665 + - -0.0026031788 + - 0.016791185 + - 0.034890775 + - -0.0028348756 + - 0.011884671 + - 0.035763044 + - -0.037289515 + - 0.030093294 + - -0.0062966947 + - 0.031619765 + - -0.016791185 + - -0.0071417056 + - 0.014610512 + - 0.019735094 + - 0.0008722694 + - -0.014174378 + - 0.018753793 + - 0.021370599 + - -0.014065344 + - 0.013029523 + - 0.007959458 + - -0.02496871 + - 0.007632357 + - -0.018753793 + - 0.016136983 + - 0.063675664 + - 0.008068492 + - -0.05517104 + - -0.016573118 + - 0.013847276 + - 0.028348755 + - -0.047538683 + - -0.0024123702 + - 0.026168082 + - 0.005697009 + - 0.030093294 + - 0.0040887627 + - -0.02464161 + - -0.0027258417 + - -0.006705571 + - -0.0216977 + - 0.043831535 + - -0.023878373 + - -0.009485929 + - 0.030529428 + - 0.00053153915 + - -0.014610512 + - -0.024750644 + - -0.018535724 + - 0.020389298 + - 0.023224173 + - 0.010412715 + - 0.01842669 + - 0.037507586 + - 0.011284986 + - -0.0068146046 + - -0.0028893924 + - -0.030747496 + - -0.027694551 + - -0.018644758 + - 0.06236726 + - 0.011721119 + - -0.017009253 + - -0.020607363 + - 0.034018505 + - -0.03532691 + - -0.04601221 + - -0.0044703805 + - 0.049719356 + - 0.015700849 + - -0.026604215 + - -0.016464084 + - 0.017663455 + - 0.0060786274 + - -0.032273967 + - -0.011121434 + - 0.02431451 + - 0.038161784 + - -0.014283411 + - 0.007087189 + - 0.033364303 + - -0.033364303 + - -0.035763044 + - 0.011775637 + - -0.017881522 + - 0.034018505 + - 0.03292817 + - -0.04623028 + - 0.006133144 + - 0.050809693 + - 0.03619918 + - -0.007196222 + - 0.020171229 + - 0.034890775 + - -0.0064875036 + - -0.015373748 + - 0.016791185 + - 0.0036798865 + - 0.007087189 + - 0.017009253 + - -0.014065344 + - 0.011066918 + - -0.012811456 + - 0.015373748 + - -0.014937612 + - -0.008177525 + - 0.022133837 + - -0.028566822 + - 0.023333205 + - -0.053862635 + - -0.017663455 + - -0.025404846 + - 0.027149383 + - 0.027803587 + - 0.022351902 + - 0.039034054 + - 0.028130688 + - 0.009758513 + - 0.03685338 + - 0.05517104 + - 0.023333205 + - -0.03925212 + - -0.019953163 + - 0.017990556 + - 0.007196222 + - -0.03554498 + - -0.02082543 + - 0.030093294 + - -0.011448535 + - -0.004988291 + - -0.028784888 + - 0.07370676 + - -0.030747496 + - 0.096821904 + - 0.048192885 + - 0.010412715 + - 0.014283411 + - -0.0032301226 + - -0.012647906 + - 0.014174378 + - 0.037071448 + - 0.017118286 + - -0.013356625 + - -0.024532575 + - -0.017009253 + - -0.009158829 + - 0.011175951 + - -0.022679005 + - -0.005778785 + - 0.044921875 + - 0.035108842 + - -0.0767597 + - 0.042741198 + - 0.0106852995 + - 0.0066237957 + - -0.023878373 + - -0.0035435944 + - -0.008068492 + - -0.012157255 + - 0.00026236227 + - 0.034236573 + - 0.031619765 + - -0.04295927 + - -0.019298961 + - 0.03532691 + - -0.0009881177 + - 0.021152532 + - 0.023333205 + - 0.014283411 + - 0.045576073 + - 0.009758513 + - 0.024532575 + - -0.0026576957 + - 0.0064875036 + - -0.023333205 + - -0.040778596 + - -0.018862827 + - -0.030311361 + - 0.009322379 + - -0.0054516834 + - 0.011012401 + - -0.020607363 + - -0.0058060433 + - 0.024859678 + - 0.0052336166 + - 0.02758552 + - 0.037943717 + - 0.039034054 + - -0.00981303 + - 0.026495183 + - -0.01722732 + - -0.043177336 + - 0.007904941 + - 0.021479635 + - 0.009158829 + - -0.013520176 + - 0.01052175 + - 8.262708e-05 + - 0.03554498 + - -0.02464161 + - -0.028566822 + - 0.028130688 + - -0.010630783 + - -0.005015549 + - -0.005669751 + - -0.031401698 + - -0.0048792567 + - 0.068473145 + - 0.0028893924 + - -0.027476486 + - 0.028566822 + - -0.028784888 + - 0.033800438 + - -0.0064875036 + - -0.0091043115 + - -0.011503053 + - 0.012266288 + - -0.026495183 + - 0.017663455 + - 0.00030836085 + - 0.031837832 + - 0.0534265 + - -0.0011652973 + - -0.00057583407 + - 0.0029847967 + - 0.0028757632 + - 0.057133645 + - 0.009867547 + - -4.770223e-05 + - -0.028784888 + - 0.0210435 + - 0.0052063577 + - -0.017881522 + - -0.03445464 + - 0.006978155 + - 0.029875224 + - -0.01809959 + - 0.003380044 + - 0.001567359 + - 0.0020034937 + - 0.020607363 + - -0.042741198 + - -0.0135746915 + - -0.02289707 + - 0.043613467 + - -0.016464084 + - 0.029221024 + - 0.0023305947 + - -0.014065344 + - -0.050373558 + - 0.015700849 + - 0.01052175 + - 0.0210435 + - 0.009649481 + - -0.0025214036 + - -0.017336354 + - -0.08591854 + - 0.018971859 + - -0.010194649 + - 0.035763044 + - -0.038161784 + - 0.017881522 + - 0.03881599 + - -0.009867547 + - -0.0059423354 + - 0.008504626 + - -0.011612087 + - 0.0019080893 + - -0.063675664 + - -0.0047429646 + - -0.013302107 + - -0.013738243 + - 0.0008858986 + - -0.022351902 + - 0.0015196569 + - 0.0151556805 + - 0.030529428 + - -0.016900219 + - -0.069345415 + - 0.017009253 + - -0.002017123 + - -0.037943717 + - 0.012702423 + - 0.010957884 + - -0.011339502 + - -0.03968826 + - -0.00861366 + - 0.012375322 + - 0.023006106 + - 0.025295813 + - -0.0049337735 + - 0.018753793 + - 0.034890775 + - 0.0045248973 + - -0.019080892 + - -0.029439092 + - -0.023006106 + - 0.009922065 + - 0.020934466 + - -0.0067873457 + - -0.031401698 + - -0.062803395 + - -0.029875224 + - 0.01395631 + - 0.015264714 + - -0.0327101 + - -0.0035435944 + - -0.050373558 + - 0.040560525 + - -0.009867547 + - -0.011830154 + - 0.030311361 + - -0.008232042 + - -0.042087 + - -0.040996663 + - 0.0038706954 + - -0.023224173 + - -0.0032437518 + - 0.023769341 + - 0.01809959 + - -0.04906515 + - -0.0017717972 + - 0.021588668 + - 0.026495183 + - -0.029439092 + - 0.023660308 + - -0.030093294 + - 0.018644758 + - -0.005015549 + - -0.03881599 + - -0.020934466 + - -0.020607363 + - -0.0036798865 + - -0.033146236 + - 0.0081230085 + - 0.008559143 + - -0.012157255 + - 0.025404846 + - -0.0011380389 + - -0.020171229 + - -0.030747496 + - 0.051463895 + - 0.012211771 + - -0.008286559 + - -0.041868933 + - 0.035763044 + - 0.012538872 + - -0.04623028 + - 0.00022488194 + - 0.040996663 + - -0.014174378 + - 0.0031074598 + - -0.046884477 + - -0.0320559 + - -0.015264714 + - -0.013193075 + - 0.015591815 + - -0.019407995 + - 0.033364303 + - -0.015591815 + - 0.012484355 + - 0.0025895496 + - -0.01809959 + - 0.014065344 + - -0.010739817 + - 0.04295927 + - 0.0015469153 + - -0.009049795 + - 0.011612087 + - -0.0022079318 + - -0.015373748 + - -0.035108842 + - 0.008886245 + - 0.030311361 + - -0.021479635 + - 0.008177525 + - 0.007359773 + - -0.013302107 + - -0.009540446 + - -0.010794334 + - -0.033800438 + - 0.04993742 + - 0.015700849 + - -0.016464084 + - 0.015918916 + - 0.007686874 + - -0.02082543 + - -0.0023714823 + - 0.017990556 + - 0.011830154 + - 0.0030120553 + - -0.014174378 + - 0.04252313 + - -0.0023169655 + - -0.0106852995 + - 0.028130688 + - 0.035763044 + - 0.010194649 + - -0.010903367 + - -0.010085614 + - -0.01084885 + - 0.005533459 + - -0.047756746 + - 0.037725653 + - 0.051463895 + - 0.0059968517 + - -0.039906327 + - 0.003066572 + - 0.044485737 + - -0.034890775 + - -0.0010017469 + - 0.02791262 + - 0.016464084 + - 0.026604215 + - -0.00011925558 + - -0.0037889201 + - 0.0033118979 + - 0.044485737 + - 0.01777249 + - -1.9166075e-06 + - 0.033146236 + - -0.0077959076 + - -0.019189926 + - -0.04710255 + - 0.035108842 + - 0.0051790993 + - 0.013247591 + - -0.061058857 + - -0.019189926 + - -0.003652628 + - -0.042305063 + - 0.0534265 + - -0.034672707 + - 0.0007973087 + - -0.02311514 + - -0.014174378 + - 0.021370599 + - 0.013411142 + - -0.010249166 + - 0.0065420205 + - -0.044921875 + - 0.03358237 + - -0.009485929 + - 0.0216977 + - -0.017009253 + - 0.008068492 + - -0.005642493 + - -0.03881599 + - 0.036417246 + - -0.024859678 + - 0.024096442 + - -0.020716397 + - 0.00039865435 + - 0.034672707 + - -0.034890775 + - 2.5554767e-05 + - 0.007359773 + - -0.0040069874 + - 0.013356625 + - -0.0011584827 + - -0.007850424 + - 0.009049795 + - 0.011993703 + - -0.040560525 + - -0.0009267862 + - -0.008559143 + - -0.025186779 + - 0.029875224 + - 0.011230469 + - -0.00430683 + - -0.00012692201 + - -0.042741198 + - -0.00096085924 + - 0.008286559 + - -0.012484355 + - -0.02464161 + - 0.011503053 + - -0.01777249 + - 0.010903367 + - -0.04535801 + - -0.0017309095 + - 0.0058605596 + - -0.022679005 + - -0.034672707 + - 0.016464084 + - 0.00082456716 + - -0.025950015 + - -0.007632357 + - -0.0018535724 + - 0.015918916 + - -0.010412715 + - -0.011666602 + - 0.025186779 + - -0.036635317 + - 0.013738243 + - -0.011612087 + - 0.0067328294 + - 0.025840981 + - -0.0023714823 + - -0.0018808309 + - 0.019735094 + - -0.0024941454 + - -0.0044703805 + - -0.023006106 + - 0.025295813 + - -0.04623028 + - 0.033364303 + - -0.0129204905 + - 0.0023714823 + - -0.0148285795 + - -0.00861366 + - 0.013901793 + - 0.028784888 + - -0.035763044 + - 0.031619765 + - -0.030747496 + - -0.018753793 + - 0.018971859 + - -0.0075778402 + - -0.011230469 + - -0.0058605596 + - -0.00056561216 + - -0.020389298 + - 0.036635317 + - -0.025622912 + - -0.0040069874 + - -0.008286559 + - 0.0035708528 + - 0.01395631 + - 0.0014106232 + - -0.032273967 + - 0.04601221 + - 0.05517104 + - 0.007850424 + - -0.016900219 + - -0.01722732 + - 0.023006106 + - -0.0065420205 + - -0.0018535724 + - 0.043613467 + - -0.008668177 + - -0.02638615 + - -0.004170538 + - 0.004497639 + - 0.014719546 + - 0.044049606 + - 0.033800438 + - 0.0025622915 + - -0.0327101 + - 0.021479635 + - -0.0053153913 + - -0.057133645 + - 0.0066510537 + - 0.0038161785 + - -0.022024803 + - 0.033364303 + - -0.0072507393 + - -0.023333205 + - -0.010303682 + - -0.015264714 + - -0.013683726 + - -0.04579414 + - 0.0041977963 + - 0.003925212 + - -0.0028076172 + - -0.03837985 + - -0.01777249 + - -0.025513878 + - 0.044921875 + - -0.041868933 + - 0.0054516834 + - -0.0061058854 + - -0.018971859 + - -0.015264714 + - -0.036635317 + - 0.0065965373 + - 0.0048792567 + - -0.021915767 + - 0.014065344 + - 0.0433954 + - 0.029439092 + - -0.019735094 + - -0.0071417056 + - -0.023551274 + - 0.026822284 + - -0.016900219 + - -0.0148285795 + - 0.045576073 + - -0.011339502 + - -0.018753793 + - -0.012811456 + - -0.03947019 + - 0.027803587 + - -0.0060241106 + - -0.023333205 + - -0.0061604027 + - -0.008831727 + - -0.046448346 + - 0.01602795 + - -0.028784888 + - 0.0021261566 + - -0.0040615043 + - -0.0320559 + - 0.013411142 + - 0.03554498 + - -0.005124583 + - -0.030311361 + - -0.0027531004 + - 0.009158829 + - 0.010794334 + - 0.00861366 + - 0.026495183 + - 0.0031483474 + - -0.0057242676 + - -0.0006576094 + - -0.006569279 + - 0.00689638 + - -0.0040615043 + - -0.012538872 + - 0.05320843 + - -0.0043340884 + - -0.012865974 + - -0.003925212 + - -0.014610512 + - 0.010739817 + - -0.023333205 + - -0.011448535 + - -0.030093294 + - -0.037071448 + - -0.044485737 + - -0.0011721121 + - 0.011721119 + - -0.024096442 + - 0.005397167 + - 0.014719546 + - -0.0027531004 + - 0.011012401 + - 0.029002957 + - -0.0320559 + - 0.007904941 + - -0.020607363 + - 0.011448535 + - 0.014937612 + - -0.024859678 + - 0.0327101 + - -0.0047157067 + - -0.013465659 + - 0.003066572 + - -0.016464084 + - -0.0433954 + - 0.0026713249 + - -0.018208623 + - 0.0433954 + - 0.03685338 + - -0.03947019 + - -0.029221024 + - 0.021261565 + - -0.0011039659 + - -0.007959458 + - 0.02311514 + - 0.008177525 + - -0.024750644 + - -0.04165086 + - 0.01395631 + - -0.009376897 + - 0.006923638 + - -0.010194649 + - 0.030311361 + - 0.02431451 + - -0.001962606 + - -0.013683726 + - -0.015482781 + - 0.0016355051 + - -0.0061604027 + - 0.022242868 + - 0.0039524706 + - -0.024532575 + - 0.011339502 + - 0.017118286 + - -0.0059695933 + - 0.007359773 + - 0.012429839 + - 0.010140131 + - -0.0033255268 + - 0.036417246 + - 0.003598111 + - 0.014174378 + - 0.008722694 + - -0.015046647 + - 0.023333205 + - -0.053862635 + - 0.0058060433 + - 0.026495183 + - -0.044703804 + - 0.0087772105 + - 0.019298961 + - 0.010467233 + - -0.029221024 + - 0.010194649 + - 0.048192885 + - -0.012975007 + - 0.0026304375 + - 0.012211771 + - 0.082429454 + - 0.01602795 + - -0.00861366 + - 0.025950015 + - -0.03118363 + - -0.052336164 + - 0.00079390145 + - -0.0029030216 + - 0.030747496 + - 0.033800438 + - 0.0019217185 + - -0.020498332 + - -0.016791185 + - 0.014937612 + - 0.0033527855 + - 0.0097039975 + - -0.0084501095 + - 0.026277116 + - 0.043177336 + - -0.016682152 + - 0.01395631 + - -0.020062195 + - 0.011993703 + - 0.02289707 + - 0.022679005 + - 0.020389298 + - -0.0035435944 + - 0.018208623 + - 0.03532691 + - 0.020498332 + - -0.0033118979 + - 0.023878373 + - -0.047538683 + - -0.025513878 + - 0.008559143 + - -0.01842669 + - 0.0059423354 + - 0.008831727 + - 0.013901793 + - -0.0037071449 + - -0.0038161785 + - -0.042741198 + - -0.005015549 + - 0.009758513 + - 0.01809959 + - 0.038597923 + - -0.00097448844 + - -0.026931318 + - 0.007359773 + - -0.029439092 + - -0.036635317 + - -0.009976582 + - -0.015591815 + - 0.015591815 + - 0.018317658 + - 0.01809959 + - -0.0035708528 + - 0.0049610324 + - -0.015482781 + - -0.009376897 + - 0.009376897 + - 0.0069508967 + - 0.00040206168 + - 0.010576266 + - 0.013138558 + - 0.009594963 + - 0.023987407 + - -0.0011652973 + - -0.027694551 + - -0.0014787692 + - 0.026604215 + - 0.011012401 + - 0.01084885 + - -0.0064875036 + - 0.027040351 + - -0.04012439 + - -0.0125933895 + - -0.015264714 + - 0.016900219 + - -0.019189926 + - -0.0013492918 + - -0.03925212 + - 0.0106852995 + - -0.00047361501 + - -0.0063784695 + - -0.028130688 + - -0.015700849 + - 0.029221024 + - 0.037725653 + - -0.014937612 + - -0.007686874 + - 0.0018399432 + - 0.02082543 + - 0.031401698 + - -0.0060786274 + - 0.007087189 + - -0.022679005 + - 0.033364303 + - 0.0025622915 + - 0.0040887627 + - 0.017336354 + - 0.0037616617 + - -0.032273967 + - -0.019080892 + - -0.03968826 + - -0.030965563 + - 0.030747496 + - -0.020171229 + - 0.000913157 + - -0.027258419 + - -0.03358237 + - 0.030965563 + - -0.004034246 + - -0.014937612 + - 0.020389298 + - -0.019080892 + - 0.010085614 + - 0.015700849 + - 0.010031098 + - 0.026168082 + - 0.005642493 + - 0.017554421 + - 0.011939187 + - 0.0087772105 + - 0.024859678 + - 0.022351902 + - -0.0048792567 + - -0.017445387 + - -0.0129204905 + - -0.021152532 + - 0.016682152 + - -0.011339502 + - 0.016573118 + - 0.005833301 + - 0.043613467 + - -0.031837832 + - 0.015373748 + - 0.015264714 + - 0.0048247403 + - -0.0053153913 + - -0.0051790993 + - 0.00861366 + - 0.01084885 + - -0.013520176 + - -0.023006106 + - -0.009976582 + - 0.026822284 + - -0.018208623 + - -0.0056152344 + - -0.011666602 + - -0.03619918 + - 0.007305256 + - -0.0062421774 + - -0.009594963 + - 0.020062195 + - 0.011775637 + - 0.01722732 + - -0.03925212 + - 0.0433954 + - -0.00021721552 + - 0.010303682 + - 0.010903367 + - 0.009758513 + - -0.0077959076 + - 0.0059423354 + - -0.030093294 + - 0.008886245 + - -0.061931126 + - 0.0011925558 + id: 3f4c3e8c-c6b1-4e09-b0e3-6ef081ab24f2 + meta: + api_version: + version: '2' + billed_units: + image_tokens: 0 + input_tokens: 6 + response_type: embeddings_by_type + texts: + - a photo of a red square + status: + code: 200 + message: OK +- request: + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate, zstd + connection: + - keep-alive + content-length: + - '143' + content-type: + - application/json + host: + - api.cohere.com + method: POST + parsed_body: + embedding_types: + - float + input_type: search_document + model: embed-v4.0 + output_dimension: 1536 + texts: + - hello world + - another doc + uri: https://api.cohere.com/v2/embed + response: + headers: + access-control-expose-headers: + - X-Debug-Trace-ID + alt-svc: + - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 + cache-control: + - no-cache, no-store, no-transform, must-revalidate, private, max-age=0 + content-length: + - '38706' + content-type: + - application/json + expires: + - Thu, 01 Jan 1970 00:00:00 GMT + num_chars: + - '22' + num_tokens: + - '4' + pragma: + - no-cache + transfer-encoding: + - chunked + vary: + - Origin,Accept-Encoding + parsed_body: + embeddings: + float: + - - -0.017646952 + - 0.0136056645 + - -0.012730054 + - 0.012864762 + - -0.003889738 + - 0.023439461 + - -0.041759964 + - -0.008318315 + - -0.013875085 + - -0.005489414 + - -0.02707662 + - 0.06358291 + - -0.04553183 + - -0.02128411 + - 0.04553183 + - -0.043645896 + - 0.04634009 + - 0.020745272 + - -0.002256385 + - -0.0006146123 + - -0.014818052 + - 0.02748075 + - -0.011046183 + - -0.013403601 + - -0.023439461 + - 0.0007577412 + - 0.02141882 + - 0.010103216 + - 0.053614404 + - 0.0041591576 + - -0.031522036 + - 0.01663663 + - -0.019937014 + - 0.015761018 + - -0.07382084 + - -0.0017512242 + - -0.018724628 + - -0.0068365103 + - 0.034755062 + - 0.013942439 + - 0.0338121 + - -0.008958185 + - 0.0034519322 + - -0.0013891923 + - 0.04580125 + - 0.010237927 + - 0.024921266 + - 0.0069712196 + - -0.094296694 + - -0.018994048 + - 0.034755062 + - 0.058463946 + - -0.034350935 + - -0.014077148 + - 0.017108114 + - 0.008149928 + - 0.020745272 + - 0.033677388 + - 0.009092895 + - 0.0101705715 + - -0.06843246 + - -0.0015491599 + - -0.020610562 + - 0.00092612824 + - 0.004681157 + - 0.021149399 + - -0.034755062 + - 0.01704076 + - 0.0049168984 + - 0.01791637 + - -0.0101705715 + - 0.016232502 + - -0.013470956 + - 0.022765916 + - 0.041490544 + - -0.005556769 + - -0.02384359 + - -0.02128411 + - 0.0101705715 + - 0.017108114 + - -0.004681157 + - 0.008453025 + - 0.02438243 + - -0.0045801247 + - -0.0040581254 + - 0.0019953852 + - -0.0146159865 + - -0.02101469 + - -0.012595343 + - 0.0019027726 + - 0.008823476 + - 0.049842533 + - -0.034755062 + - -0.07220432 + - 0.042298798 + - 0.04822602 + - -0.013268891 + - -0.008082573 + - -0.04202938 + - -0.003923416 + - 0.016097793 + - -0.027346041 + - 0.013201537 + - 0.019802304 + - -0.040412866 + - 0.020475853 + - 0.00464748 + - 0.027346041 + - -0.017512243 + - 0.020745272 + - 0.012056505 + - -0.02775017 + - -0.013807729 + - -0.07058781 + - -0.002475288 + - -0.047148347 + - 0.011517666 + - 0.043915313 + - -0.0051526404 + - 0.019937014 + - -0.061696976 + - 0.0075437347 + - -0.0025426429 + - -0.038796354 + - -0.0091602495 + - 0.034485646 + - 0.0005388382 + - 0.0033003842 + - -0.0009345475 + - -0.07382084 + - 0.010305281 + - 0.027346041 + - -0.0073079932 + - 0.014279213 + - -0.023035333 + - -0.035563324 + - -0.011517666 + - 0.02465185 + - 0.053883824 + - -0.04202938 + - 0.0061966395 + - -0.017646952 + - -0.0026605139 + - 0.029366683 + - -0.0011450312 + - -0.029097263 + - -0.0033003842 + - -0.021149399 + - 0.0068701874 + - 0.002256385 + - -0.023574173 + - 0.05550034 + - 0.0023910946 + - 0.005624124 + - -0.014683342 + - 0.04580125 + - 0.0023405785 + - 0.006735478 + - -0.0045801247 + - -0.012325925 + - 0.040412866 + - -0.0023069012 + - 0.037449256 + - 0.050381374 + - 0.013470956 + - 0.007712122 + - 0.00031151585 + - -0.027884878 + - -0.03583274 + - -0.031117905 + - 0.0070722518 + - 0.03327326 + - 0.025055978 + - 0.031656746 + - 0.021149399 + - -0.012730054 + - -0.03852693 + - 0.007880509 + - -0.010642055 + - 0.046609506 + - -0.03340797 + - -0.001018741 + - 0.025864236 + - -0.014818052 + - -0.030848488 + - -0.007105929 + - 0.015895728 + - 0.00542206 + - -0.01690605 + - 0.03340797 + - -0.015424244 + - 0.046609506 + - 0.02451714 + - 0.004074964 + - 0.004007609 + - 0.02128411 + - -0.049842533 + - -0.021957656 + - -0.046878923 + - 0.02384359 + - 0.028558426 + - 0.02451714 + - -0.007105929 + - -0.014279213 + - -0.013201537 + - -0.019263465 + - -0.025055978 + - -0.004714834 + - -0.006365027 + - -0.007712122 + - 0.01663663 + - 0.015020115 + - 0.016838694 + - -0.013807729 + - 0.016703986 + - -0.0030309649 + - 0.008890831 + - 0.0019280305 + - 0.017242823 + - -0.011113538 + - 0.008318315 + - 0.035563324 + - 0.004344383 + - 0.0014397083 + - -0.016569275 + - -0.03300384 + - -0.0020795788 + - -0.013875085 + - -0.010911474 + - -0.03286913 + - 0.028289007 + - -0.0031656744 + - -0.026133653 + - 0.04014345 + - -0.0048495443 + - -0.012730054 + - 0.035024486 + - -0.02748075 + - -0.048495438 + - 0.02707662 + - -0.010507345 + - -0.010642055 + - 0.01805108 + - -0.016838694 + - 0.020071724 + - -0.027615458 + - 0.02411301 + - 0.014211858 + - -0.07058781 + - -0.03273442 + - 0.03691042 + - 0.008149928 + - -0.03313855 + - 0.014346568 + - 0.030713778 + - 0.025998944 + - -0.032060873 + - 0.01818579 + - 0.03717984 + - -0.013268891 + - 0.020879982 + - 0.021149399 + - -0.0070722518 + - -0.023574173 + - -0.023574173 + - 0.0062303166 + - -0.020206433 + - 0.011113538 + - -0.039335188 + - -0.0020795788 + - 0.008385669 + - 0.017108114 + - 0.039604608 + - 0.031522036 + - 0.03583274 + - 0.022361787 + - -0.0096317325 + - 0.019802304 + - 0.04876486 + - 0.0037887064 + - -0.03300384 + - -0.002694191 + - 0.008823476 + - 0.03717984 + - 0.032060873 + - 0.011046183 + - -0.017175468 + - -0.01704076 + - -0.0061966395 + - -0.031791456 + - -0.022361787 + - 0.008621411 + - 0.0015828372 + - 0.041221123 + - -0.022496495 + - -0.021553528 + - 0.0023405785 + - -0.026537782 + - -0.007947864 + - -0.0004293867 + - 0.038796354 + - 0.028289007 + - 0.064121746 + - -0.03286913 + - -0.0075437347 + - 0.043915313 + - 0.012191215 + - 0.010507345 + - -0.028558426 + - -0.02141882 + - 0.011719731 + - -0.007880509 + - -0.00902554 + - -0.011921795 + - 0.0026099978 + - 0.035563324 + - -0.03273442 + - 0.010507345 + - -0.0014818051 + - 0.017512243 + - -0.000631451 + - -0.024921266 + - 0.04876486 + - -0.0076784445 + - 0.02465185 + - -0.0150874695 + - -0.020745272 + - 0.04256822 + - -0.03691042 + - -0.03327326 + - -0.012325925 + - -0.02990552 + - -0.0031319973 + - -0.0072743157 + - -0.03852693 + - -0.03138733 + - -0.037718672 + - 0.022496495 + - 0.022092367 + - -0.0014649663 + - -0.020745272 + - -0.03004023 + - -0.014750696 + - -0.0004272819 + - -0.009766443 + - 0.009968507 + - -0.033677388 + - -0.019937014 + - 0.028693136 + - 0.0025426429 + - -0.015289535 + - -0.034755062 + - -0.01791637 + - -0.0121238595 + - 0.02168824 + - 0.040412866 + - 0.0030141263 + - -0.015558952 + - -0.026941912 + - 0.030309651 + - 0.04903428 + - -0.0014397083 + - 0.01198915 + - -0.012864762 + - 0.010776764 + - 0.012595343 + - -0.043915313 + - 0.02168824 + - 0.018859336 + - -0.014279213 + - -0.01858992 + - 0.011248248 + - -0.02168824 + - -0.0051526404 + - -0.010507345 + - 0.026133653 + - 0.014818052 + - -0.007105929 + - 0.02748075 + - 0.010103216 + - 0.022900624 + - 0.0101705715 + - -0.014683342 + - -0.0040918025 + - 0.023170045 + - 0.04526241 + - 0.01805108 + - -0.018859336 + - -0.07435968 + - 0.060619302 + - 0.0034687712 + - 0.0121238595 + - 0.014211858 + - -0.07705386 + - 0.0070048966 + - -0.0033003842 + - 0.0013723535 + - 0.019532885 + - 0.03906577 + - 0.015491598 + - -0.02128411 + - -0.03340797 + - 0.00825096 + - -0.003889738 + - 0.019263465 + - -0.047148347 + - -0.022361787 + - -0.04014345 + - -0.011046183 + - -0.015222181 + - 0.010372636 + - -0.00747638 + - -0.016973402 + - 0.010978828 + - -0.01070941 + - 0.009497024 + - 0.031656746 + - -0.022496495 + - 0.0028794166 + - -0.05550034 + - 0.013268891 + - -0.026537782 + - -0.01562631 + - 0.02101469 + - -0.028962554 + - 0.009497024 + - 0.02451714 + - -0.019667594 + - -0.018724628 + - 0.03583274 + - -0.058194526 + - 0.0048158662 + - -0.05415324 + - -0.030713778 + - 0.044184733 + - 0.028154297 + - -0.0015828372 + - 0.0015407406 + - -0.0016754501 + - -0.039604608 + - -0.0549615 + - 1.999595e-05 + - -0.031791456 + - 0.042298798 + - -0.026537782 + - 0.02141882 + - 0.028558426 + - 0.018320499 + - 0.0052873497 + - -0.0028289007 + - -0.006129285 + - -0.0096317325 + - -0.0049842536 + - -0.055230916 + - 0.06304407 + - 0.015828373 + - 0.02411301 + - -0.016165147 + - 0.02465185 + - -0.028693136 + - 0.013201537 + - 0.033677388 + - -0.02411301 + - 0.0035529644 + - -0.029231973 + - 0.0058935434 + - 0.014413922 + - -0.005691479 + - -0.0034350937 + - 0.024921266 + - 0.03987403 + - -0.01791637 + - -0.019128757 + - -0.0802869 + - -0.043915313 + - -0.008554057 + - -0.01818579 + - -0.011382958 + - 0.003856061 + - 0.02411301 + - 0.05684743 + - 0.07382084 + - -0.003249868 + - 0.031791456 + - -0.015222181 + - -0.04499299 + - -0.014279213 + - -0.05738627 + - 0.023035333 + - -0.002812062 + - -0.02451714 + - -0.020071724 + - 0.0121238595 + - 0.026941912 + - 0.01791637 + - -0.0026268363 + - -0.017108114 + - -0.025594816 + - -0.011921795 + - -0.029097263 + - -0.0141445035 + - -0.023574173 + - 0.027346041 + - 0.011921795 + - -0.0035361259 + - -0.028423715 + - 0.0034350937 + - 0.013740375 + - -0.0060956073 + - -0.014413922 + - 0.03340797 + - 0.033677388 + - 0.03906577 + - 0.02451714 + - -0.020206433 + - 0.014750696 + - 0.01858992 + - 0.013942439 + - 0.030713778 + - 0.011517666 + - 0.029097263 + - -0.037988096 + - 0.01791637 + - -0.006398704 + - -0.03057907 + - 0.015693665 + - -0.005051608 + - -0.04553183 + - 0.0009724345 + - -0.026537782 + - 0.02411301 + - -0.032060873 + - -0.043107055 + - 0.054422658 + - -0.050381374 + - 0.014077148 + - 0.00056830596 + - -0.049573116 + - -0.02465185 + - -0.035293903 + - 0.016097793 + - 0.05981104 + - -0.02411301 + - -0.0136730205 + - 0.14764167 + - -0.02384359 + - 0.01198915 + - -0.06546884 + - 0.016973402 + - -0.009564378 + - -0.007779476 + - 0.01663663 + - 0.033677388 + - 0.01495276 + - 0.00852038 + - 0.006365027 + - -0.0037550288 + - 0.009497024 + - -0.0049842536 + - 0.13902025 + - -0.006432381 + - 0.0058935434 + - 0.029097263 + - 0.001843837 + - 0.020071724 + - 0.013066826 + - -0.0023910946 + - -0.016165147 + - 0.024786558 + - -0.023304753 + - -0.01858992 + - -0.004378061 + - 0.026807202 + - 0.008756122 + - -0.01818579 + - -0.007442703 + - -0.009497024 + - -0.020879982 + - -0.01084412 + - -0.02438243 + - 0.034755062 + - 0.0136056645 + - 0.023035333 + - -0.024921266 + - 0.011113538 + - -0.019532885 + - -0.011719731 + - 0.0021553528 + - -0.04553183 + - 0.004748512 + - 0.0066344454 + - 0.009766443 + - 0.017781662 + - 0.035293903 + - 0.028423715 + - 0.046878923 + - 0.0051526404 + - -0.018994048 + - 0.049573116 + - -0.044454154 + - 0.028289007 + - -0.0062976717 + - 0.015761018 + - 0.005489414 + - -0.017242823 + - -0.014885406 + - -0.013740375 + - -0.03906577 + - 0.049842533 + - 0.037449256 + - 0.01353831 + - 0.016097793 + - 0.012056505 + - -0.015491598 + - -0.00271103 + - 0.017377531 + - -0.013470956 + - -0.0136730205 + - 0.0037718674 + - -0.00029467713 + - -0.0059272205 + - 0.0029972875 + - -0.0029130941 + - 0.04256822 + - -0.025594816 + - -0.035024486 + - 0.03421623 + - 0.020341143 + - 0.009833797 + - -0.021553528 + - -0.038257513 + - 0.021553528 + - 0.0049842536 + - 0.035024486 + - 0.023708882 + - -0.007341671 + - -0.0069375425 + - 0.0048495443 + - -0.03313855 + - 0.03421623 + - 0.012325925 + - 0.01818579 + - 0.008318315 + - 0.01084412 + - 0.0091602495 + - -0.0010860957 + - 0.0011281925 + - 0.009497024 + - 0.0019196111 + - 0.028019587 + - 0.02384359 + - 0.02101469 + - -0.006668123 + - 0.035293903 + - -0.038796354 + - -0.0033003842 + - -0.011248248 + - 0.010978828 + - 0.014750696 + - -0.0017007081 + - 0.004344383 + - 0.011854441 + - 0.017175468 + - -0.013201537 + - -0.007341671 + - 0.012460633 + - 0.0012292246 + - -0.0549615 + - 0.012527989 + - -0.022631206 + - 0.056578014 + - 0.001599676 + - 0.008890831 + - 0.005388382 + - -0.0072743157 + - -0.009092895 + - -0.003856061 + - 0.019802304 + - 0.0013134181 + - 0.015693665 + - -0.020610562 + - 0.01858992 + - 0.028693136 + - 0.016434565 + - -0.06008046 + - -0.014413922 + - -0.024921266 + - -0.014481277 + - -0.006432381 + - 0.040412866 + - 0.0041591576 + - 0.0020879982 + - -0.012932118 + - -0.014211858 + - 0.0070722518 + - 0.040682286 + - 0.01805108 + - -0.015222181 + - 0.03906577 + - -0.0020122242 + - -0.04526241 + - 0.0136056645 + - -0.020206433 + - 0.0024079331 + - 0.012932118 + - 0.054422658 + - 0.015020115 + - -0.049573116 + - -0.0020964174 + - -0.031926163 + - 0.0059272205 + - -0.04580125 + - -0.0549615 + - 0.0096317325 + - -0.019937014 + - 0.023574173 + - 0.01858992 + - -0.012393279 + - -0.01495276 + - -0.015424244 + - 0.031117905 + - 0.011719731 + - 0.029097263 + - -0.0006567091 + - -0.022227077 + - 0.015895728 + - -0.01858992 + - 0.0039907703 + - -0.003367739 + - 0.0029130941 + - 0.015356889 + - 0.042298798 + - -0.0040581254 + - -0.035563324 + - -0.0026773524 + - -0.022361787 + - -0.0024247721 + - 0.016703986 + - 0.014683342 + - 0.04553183 + - 0.0070048966 + - -0.07435968 + - -0.032060873 + - 0.0062303166 + - 0.040951706 + - 0.000812467 + - 0.0019364498 + - 0.00030520133 + - 0.012797408 + - -0.026268363 + - -0.019263465 + - -0.023439461 + - 0.0023405785 + - -0.027346041 + - -0.007745799 + - 0.051459048 + - 0.011113538 + - -0.030309651 + - -0.019263465 + - 0.0066007683 + - 0.0011366119 + - 0.030848488 + - 0.006398704 + - 0.029501392 + - 0.0075774128 + - 0.010642055 + - 0.03987403 + - 0.020610562 + - 0.005186318 + - -0.013268891 + - -0.0016838695 + - 0.0028962556 + - -0.014346568 + - -0.018320499 + - -0.041221123 + - 0.046878923 + - 0.0045464477 + - -0.047148347 + - -0.08621411 + - -0.038257513 + - 0.023170045 + - -0.0076110903 + - 0.0072406386 + - 0.02438243 + - -0.029366683 + - 0.01791637 + - -0.0023069012 + - -0.01791637 + - 0.0008671928 + - -0.033677388 + - 0.019532885 + - -0.004344383 + - -0.0010734667 + - -0.003856061 + - -0.00026205217 + - -0.0239783 + - -0.02411301 + - 0.017646952 + - 0.01845521 + - 0.01636721 + - 0.0035024483 + - 0.027615458 + - -0.0014228697 + - 0.007947864 + - -0.012056505 + - -0.008116251 + - 0.0049168984 + - -0.022227077 + - 0.017377531 + - 0.046070665 + - 0.028423715 + - -0.006331349 + - 0.012797408 + - -0.024786558 + - 0.073281996 + - 0.018859336 + - 0.050111957 + - 0.0026268363 + - -0.017646952 + - -0.023170045 + - -0.0022900624 + - -0.022092367 + - -0.018724628 + - 0.031656746 + - -0.00034519323 + - -0.0016586113 + - -0.03691042 + - -0.00082509604 + - -0.015356889 + - -0.011315603 + - 0.0096317325 + - -0.028827844 + - 0.024921266 + - 0.0131341815 + - 0.040682286 + - 0.07112665 + - -0.02141882 + - -0.050920215 + - -0.0052536726 + - 0.0027952234 + - -0.01650192 + - 0.01845521 + - 0.031926163 + - -0.0037718674 + - 0.029366683 + - -0.004411738 + - 0.0060282527 + - -0.012527989 + - -0.021957656 + - 0.032060873 + - -0.008453025 + - 0.011719731 + - 0.005994575 + - 0.010642055 + - 0.04014345 + - -0.028019587 + - -0.014211858 + - -0.028423715 + - -0.01198915 + - 0.010642055 + - -0.0075437347 + - -0.0027952234 + - 0.04202938 + - -0.015020115 + - -0.041221123 + - 0.010642055 + - -0.0041759964 + - 0.02438243 + - -0.02128411 + - 0.022900624 + - -0.019532885 + - 0.0146159865 + - 0.023035333 + - -0.012999472 + - 0.0031151583 + - -0.02465185 + - -0.025729524 + - 0.0239783 + - -0.003199352 + - 0.0031825134 + - -0.032465003 + - -0.00232374 + - -0.01818579 + - 0.0096990885 + - 0.008958185 + - 0.027884878 + - 0.10668997 + - 0.005354705 + - 0.023574173 + - 0.030983197 + - -0.017242823 + - 0.0070048966 + - -0.04499299 + - -0.02384359 + - 0.03637158 + - 0.040682286 + - 1.0524183e-05 + - -0.008015218 + - -0.0038728996 + - -0.01650192 + - 0.017646952 + - 0.04256822 + - 0.003367739 + - 0.0041759964 + - 0.028019587 + - 0.0007030155 + - -0.0068028322 + - -0.01198915 + - -0.01704076 + - 0.007173284 + - -0.018320499 + - -0.022765916 + - -0.011854441 + - 0.01562631 + - -0.01650192 + - -0.04256822 + - 0.0059272205 + - 0.0015828372 + - -0.0034856098 + - -0.0041759964 + - -0.058463946 + - -0.0052199955 + - -0.011382958 + - -0.017646952 + - 0.03987403 + - 0.050381374 + - 0.004714834 + - 0.029366683 + - -0.032060873 + - 0.03852693 + - 0.010642055 + - 0.0037550288 + - -0.012191215 + - 0.011382958 + - 0.008587734 + - -0.026537782 + - -0.0014986438 + - 0.0060619297 + - -0.0034856098 + - 0.0051526404 + - 0.007375348 + - 0.052806146 + - -0.026941912 + - -0.010103216 + - 0.027884878 + - -0.010372636 + - -0.006466059 + - 0.019263465 + - -0.0042096735 + - 0.0076447674 + - 0.015020115 + - 0.044184733 + - -0.0015407406 + - 0.0050852858 + - -0.020745272 + - 0.011382958 + - 0.03057907 + - -0.008149928 + - 0.007947864 + - -0.028693136 + - 0.013807729 + - 0.0008082574 + - 0.040412866 + - 0.0012713214 + - 0.0066007683 + - -0.0101705715 + - -0.0150874695 + - 0.0021890304 + - -0.020610562 + - -0.0021385143 + - 0.025460107 + - -0.03057907 + - 0.0007619509 + - 0.022227077 + - -0.023304753 + - 0.040412866 + - -0.03340797 + - 0.003957093 + - 0.0056578014 + - -0.010978828 + - 0.008554057 + - 0.015356889 + - 0.028962554 + - -0.0076110903 + - 0.007981541 + - 0.008958185 + - -0.0016586113 + - -0.026268363 + - -0.005556769 + - 0.008183605 + - 0.0059608975 + - 0.013470956 + - 0.033542678 + - -0.031926163 + - -0.0101705715 + - 0.02411301 + - -0.0013639343 + - 0.019398177 + - -0.014683342 + - 0.022227077 + - 0.010237927 + - -0.03313855 + - -0.0027783846 + - -0.016973402 + - -0.008183605 + - 0.009968507 + - -0.01818579 + - -0.013470956 + - -0.005354705 + - 0.015828373 + - 0.014346568 + - -0.012864762 + - -0.028558426 + - 0.023170045 + - -0.004411738 + - 0.01791637 + - 0.011854441 + - -0.0075774128 + - -0.019802304 + - 0.016838694 + - -0.028558426 + - 0.019667594 + - -0.005388382 + - 0.033542678 + - 0.05792511 + - 0.017377531 + - 0.023304753 + - 0.00052199955 + - -0.037718672 + - 0.028558426 + - 0.01225857 + - -0.023304753 + - -0.01805108 + - -0.03286913 + - 0.03408152 + - -0.025998944 + - -0.021553528 + - -4.630641e-05 + - 0.007914186 + - -0.026672492 + - -0.01818579 + - -0.007947864 + - -0.032599714 + - -0.02775017 + - -0.0076784445 + - -0.054422658 + - -0.026133653 + - 0.009564378 + - 0.025325395 + - 0.0068028322 + - 0.026941912 + - 0.010911474 + - 0.012527989 + - -0.023708882 + - 0.007173284 + - 0.01650192 + - 0.0020543206 + - -0.034350935 + - 0.030713778 + - -0.02411301 + - 0.008419347 + - -0.01818579 + - -0.034755062 + - 0.052536726 + - 0.0111808935 + - -0.041490544 + - 0.00090087013 + - 0.014346568 + - 0.0141445035 + - -0.009429668 + - -0.026941912 + - -0.020745272 + - 0.011787087 + - -0.07004897 + - -0.026941912 + - -0.04526241 + - 0.01805108 + - -0.02748075 + - -0.026133653 + - 0.032599714 + - 0.0055904468 + - 0.006769155 + - 0.007173284 + - -0.021957656 + - -0.022765916 + - 0.012932118 + - 0.0060619297 + - -0.02168824 + - -0.017781662 + - 0.009833797 + - -0.032330293 + - -0.00271103 + - 0.0037887064 + - 0.0022900624 + - -0.034485646 + - 0.02465185 + - -0.024921266 + - -0.011113538 + - 0.04903428 + - 0.005388382 + - -0.014077148 + - -0.007442703 + - 0.015491598 + - 0.039335188 + - 0.008048897 + - 0.013807729 + - -0.010372636 + - 0.04822602 + - 0.012864762 + - -0.006432381 + - -0.0034350937 + - -0.00232374 + - 0.04580125 + - -0.0040244483 + - -0.023574173 + - -0.027211329 + - 0.00451277 + - 0.015963081 + - 0.014413922 + - -0.00049463665 + - 0.0018354177 + - -0.029636104 + - -0.02438243 + - -0.03421623 + - -0.018320499 + - 0.017377531 + - -0.02384359 + - -0.011585022 + - 0.010642055 + - 0.026672492 + - -0.025460107 + - 0.03125262 + - -0.0065670907 + - 0.017242823 + - -0.006398704 + - -0.053614404 + - -0.023170045 + - -0.01562631 + - -0.007813155 + - 0.003199352 + - 0.02748075 + - -0.006398704 + - 0.054422658 + - -0.01084412 + - -0.026672492 + - 0.013403601 + - -0.056039173 + - 0.022900624 + - -0.0068365103 + - 0.03327326 + - 0.011585022 + - 0.0131341815 + - -0.033542678 + - -0.02411301 + - 0.004782189 + - 0.01663663 + - 0.040951706 + - -0.029231973 + - -0.026133653 + - 0.01845521 + - -0.03906577 + - 0.0062639946 + - 0.008318315 + - -0.009497024 + - 0.0069712196 + - -0.032330293 + - 0.010103216 + - 0.054422658 + - 0.004293867 + - -0.021822948 + - 0.028693136 + - 0.010305281 + - -0.016299857 + - -0.009497024 + - 0.0044790925 + - -0.007409026 + - 0.015828373 + - 0.028962554 + - 0.028693136 + - -0.010507345 + - -0.026403073 + - -0.00064828974 + - 0.0049842536 + - 0.008015218 + - 0.0038223837 + - -0.0001999595 + - 0.043107055 + - -0.035563324 + - -0.06115814 + - -0.020341143 + - 0.032195587 + - -0.008116251 + - 0.012595343 + - -0.012662698 + - 0.018994048 + - 0.020206433 + - 0.0493037 + - -0.0028289007 + - -0.007779476 + - -0.017108114 + - -0.0024079331 + - -0.008149928 + - 0.0013134181 + - 0.0024921268 + - -0.038796354 + - 0.0027615458 + - -0.005388382 + - 0.019263465 + - 0.00042517702 + - -0.027211329 + - 0.014346568 + - 0.002694191 + - -0.027346041 + - 0.030983197 + - -0.03637158 + - -0.033542678 + - 0.03057907 + - -0.010305281 + - -0.04014345 + - 0.03273442 + - -0.01636721 + - -0.008958185 + - 0.008385669 + - -0.0010566281 + - -0.060619302 + - -0.02168824 + - 0.026403073 + - 0.0075774128 + - 0.011315603 + - 0.046609506 + - -0.0061966395 + - -0.0076447674 + - 0.021957656 + - 0.017781662 + - -0.010305281 + - 0.012325925 + - -0.0059272205 + - -0.0011955473 + - -0.005017931 + - -0.020475853 + - 0.0058598653 + - 0.014548631 + - 0.033677388 + - -0.034755062 + - 0.023035333 + - -0.0048158662 + - -0.021149399 + - -0.053344984 + - 0.052806146 + - 0.0052873497 + - -0.0069375425 + - 0.03340797 + - 0.0032667066 + - -0.010035862 + - 0.014279213 + - -0.046609506 + - 0.02384359 + - -0.006533413 + - -0.018994048 + - -0.014818052 + - 0.04202938 + - -0.016299857 + - -0.008688766 + - -0.0009892733 + - 0.028423715 + - 0.013268891 + - 0.013201537 + - 0.01791637 + - -0.016232502 + - 0.022900624 + - -0.010439991 + - -0.013740375 + - -0.007173284 + - 0.011113538 + - -0.01805108 + - -0.008890831 + - 0.02438243 + - -0.03987403 + - -0.025864236 + - -0.0011197731 + - -0.012527989 + - 0.01353831 + - -0.011921795 + - 0.015491598 + - -0.011854441 + - -0.0015744179 + - 0.012191215 + - -0.0040581254 + - 0.047417764 + - -0.010237927 + - -0.0033509003 + - -0.010237927 + - -0.0072406386 + - 0.018859336 + - 0.019128757 + - -0.016097793 + - 0.03583274 + - 0.011382958 + - -0.015828373 + - 0.008351993 + - 0.015356889 + - -0.028154297 + - 0.020206433 + - -0.019802304 + - 0.0031151583 + - -0.025998944 + - -0.0027278685 + - -0.0076447674 + - 0.012595343 + - -0.01858992 + - 0.0031656744 + - -0.02748075 + - 0.006432381 + - 0.023035333 + - -0.010507345 + - -0.023304753 + - 0.014009793 + - 0.07166548 + - 0.006365027 + - -0.034485646 + - -0.015424244 + - -0.005186318 + - 0.025864236 + - -0.016838694 + - -0.0116523765 + - 0.019667594 + - 0.011113538 + - 0.020745272 + - -0.0036371578 + - -0.016232502 + - -0.01791637 + - -0.007813155 + - 0.015491598 + - 0.011585022 + - -0.0033509003 + - -0.041221123 + - 0.0036203193 + - 0.010103216 + - 0.04876486 + - -0.008015218 + - -0.007981541 + - 0.0338121 + - -0.048495438 + - -0.04256822 + - 0.01353831 + - -0.011382958 + - 0.022092367 + - -0.00064828974 + - 0.04499299 + - -0.021553528 + - 0.0025089656 + - -0.0042265123 + - 0.014077148 + - 0.031791456 + - -0.06573826 + - -0.0014144504 + - 0.026537782 + - 0.055230916 + - 0.01791637 + - 0.022092367 + - 0.010439991 + - 0.0091602495 + - -0.015895728 + - 0.0096317325 + - -0.0055904468 + - -0.0050852858 + - -0.049573116 + - 0.053075563 + - 0.0121238595 + - -0.00825096 + - 0.008587734 + - 0.03637158 + - -0.008217283 + - -0.04283764 + - 0.017242823 + - 0.00902554 + - -0.0013807729 + - -0.031117905 + - -0.025325395 + - -0.0024247721 + - -0.01663663 + - -0.0239783 + - -0.038796354 + - -0.019667594 + - 0.0025763202 + - -0.010237927 + - 0.0026268363 + - 0.016973402 + - 0.0076784445 + - -0.04202938 + - 0.0065670907 + - 0.008217283 + - -0.0010945152 + - 0.007105929 + - 0.031926163 + - 0.055230916 + - -0.032599714 + - -0.044454154 + - -0.050111957 + - 0.0031488359 + - -0.029231973 + - 0.004293867 + - -0.030848488 + - -0.0011534506 + - -0.020475853 + - 0.0029467717 + - 0.044723574 + - 0.0033509003 + - -0.039335188 + - 0.029636104 + - 0.020745272 + - -0.020879982 + - 0.0136730205 + - -0.013942439 + - -0.032465003 + - 0.07705386 + - -0.022900624 + - 0.043107055 + - -0.0052199955 + - 0.0029804488 + - 0.009766443 + - -0.014683342 + - 0.027211329 + - 0.013066826 + - 0.020071724 + - 0.008958185 + - -0.0011955473 + - -0.01845521 + - 0.011719731 + - 0.01791637 + - -0.060349878 + - 0.06573826 + - 0.021553528 + - -0.019263465 + - 0.027884878 + - -0.01791637 + - -0.00064408005 + - -0.013336246 + - -0.004007609 + - 0.013942439 + - 0.024786558 + - 0.03286913 + - 0.020610562 + - 0.0023910946 + - 0.014211858 + - 0.02451714 + - 0.0044454155 + - -0.00902554 + - -0.021957656 + - 0.02438243 + - 0.021149399 + - -0.050111957 + - -0.0039907703 + - -0.005792511 + - -0.0091602495 + - 0.04580125 + - 0.031656746 + - -0.015424244 + - 0.06816304 + - 0.031117905 + - -0.012932118 + - -0.019263465 + - -0.015761018 + - 0.00542206 + - -0.012460633 + - 0.0052536726 + - -0.032465003 + - 0.0034014161 + - -0.015963081 + - 0.002862578 + - 0.008554057 + - -0.03852693 + - 0.018859336 + - -0.022900624 + - 0.009362314 + - 0.024921266 + - -0.017646952 + - -0.053075563 + - -0.0096990885 + - 0.0040244483 + - -0.015693665 + - 0.0017512242 + - -0.009227605 + - 0.0026268363 + - -0.03057907 + - -0.015491598 + - -0.015222181 + - 0.039604608 + - 0.019937014 + - 0.028827844 + - -0.017242823 + - 0.009429668 + - -0.0037550288 + - 0.0018017403 + - -0.0026268363 + - -0.041490544 + - 0.015020115 + - -0.0007156445 + - -0.0060282527 + - -0.016097793 + - 0.05711685 + - 0.005994575 + - -0.01805108 + - 0.022496495 + - 0.008958185 + - -0.008890831 + - 0.024921266 + - 0.008890831 + - 0.0042770286 + - 0.02101469 + - 0.029366683 + - -0.0023910946 + - -0.0048832214 + - -0.005489414 + - -0.022900624 + - 0.007880509 + - -0.0007787896 + - -0.00025468526 + - -0.0075100577 + - 0.012662698 + - -0.020206433 + - 0.0005325237 + - 0.008621411 + - 0.011046183 + - 0.012999472 + - 0.029366683 + - -0.025325395 + - 0.01070941 + - -0.03340797 + - -0.039335188 + - -0.010237927 + - 0.031656746 + - 0.03340797 + - 0.013066826 + - -0.04768718 + - 0.0026436748 + - - 0.010667933 + - 0.018848864 + - -0.0041886363 + - 0.014725675 + - -0.02251392 + - 0.018717967 + - -0.05445227 + - -0.00818093 + - -0.002797878 + - -0.01616552 + - -0.030105822 + - -0.027095241 + - 0.011453303 + - -0.026571661 + - -0.033116408 + - 0.024215553 + - 0.0018079856 + - 0.023953764 + - -0.0053339666 + - -0.010209801 + - 0.013220383 + - -0.012565909 + - -0.029320452 + - -0.04371889 + - -0.014332989 + - 0.014791123 + - -0.012565909 + - 0.024608238 + - 0.018325282 + - 0.012500461 + - -0.046598576 + - 0.029058663 + - -0.017278124 + - 0.009162641 + - 0.025655398 + - 0.020943182 + - -0.0028469637 + - -0.039006677 + - 0.02382287 + - -0.006381125 + - -0.041362785 + - -0.015052911 + - -0.019372443 + - -0.027095241 + - 0.023561079 + - -0.012042329 + - -0.029058663 + - 0.0042868075 + - -0.037959516 + - -0.0036650565 + - 0.00034973476 + - 0.015249254 + - -0.0281424 + - -0.04371889 + - -0.036126986 + - 0.036388777 + - 0.003975932 + - 0.036126986 + - -0.003174201 + - 0.014922016 + - 0.00059311744 + - -0.0140712 + - -0.007722798 + - 0.009620774 + - -0.037959516 + - -0.034032673 + - -0.043457102 + - 0.013613068 + - 0.023430184 + - 0.008639062 + - -0.020812286 + - 0.058640905 + - -0.03507983 + - 0.04633679 + - 0.008311825 + - -0.0056939274 + - -0.011584197 + - -0.02277571 + - -0.010602485 + - 0.003403267 + - 0.019503338 + - -0.0015707386 + - 0.0081154825 + - 0.0033214577 + - 0.033378195 + - 0.010406143 + - 0.009555326 + - -0.033116408 + - -0.03193835 + - 0.0121077765 + - 0.040053833 + - -0.0008589977 + - 0.036388777 + - -0.05680838 + - 0.024739133 + - 0.03481804 + - 0.025262713 + - 0.02892777 + - 0.0032232865 + - -0.01740902 + - -0.0048758346 + - -0.027095241 + - 0.0056612035 + - -0.0036814187 + - -0.028796874 + - 0.020157812 + - -0.035341617 + - 0.0074282847 + - 0.017539915 + - -0.019765127 + - 0.040053833 + - -0.005399414 + - 0.025655398 + - -0.024477342 + - -0.008246377 + - 0.011518749 + - 0.012042329 + - -0.0089663 + - 0.0048431107 + - 0.010471591 + - -0.016100071 + - -0.008508168 + - -0.015052911 + - -0.035341617 + - 0.0025033646 + - 0.07906051 + - 0.026964346 + - -0.018063493 + - -0.009751669 + - -0.008311825 + - -0.019765127 + - 0.04581321 + - 0.015249254 + - 0.0026669833 + - 0.0042213597 + - -0.032200143 + - -0.048692897 + - 0.030891191 + - 0.02945135 + - 0.013743963 + - -0.0081154825 + - -0.017016336 + - -0.057331957 + - -0.03115298 + - 0.054975852 + - 0.0027160689 + - -0.02120497 + - 0.0035505237 + - -0.014594779 + - -0.0010962447 + - -0.024739133 + - 0.01845618 + - 0.07487187 + - 0.01636186 + - -0.071206816 + - 0.05680838 + - 0.030367615 + - 0.010144354 + - 0.0034850764 + - -0.014005752 + - 0.0255245 + - -0.018717967 + - 0.030367615 + - 0.046860367 + - 0.0013334916 + - 0.013154936 + - -0.027357029 + - -0.026702557 + - -0.024215553 + - 0.0062829545 + - 0.013678514 + - 0.01380941 + - -0.041886363 + - -0.013678514 + - 0.042148154 + - -0.04293352 + - -0.015445596 + - 0.025262713 + - -0.050001845 + - 0.050263636 + - 0.0022579366 + - -0.018063493 + - 0.046860367 + - -0.038483094 + - -0.022906605 + - 0.014005752 + - 0.035603408 + - 0.0048431107 + - -0.0009653497 + - -0.014202095 + - 0.026964346 + - 0.031414773 + - 0.0029451349 + - -0.0048431107 + - -0.014987464 + - -0.036650565 + - -0.015772834 + - -0.0093589835 + - -0.006381125 + - 0.005006729 + - 0.011060618 + - 0.0027651545 + - -0.004450426 + - 0.0010389781 + - 0.0035341617 + - -0.030891191 + - -0.0053012427 + - -0.015380149 + - 0.046598576 + - 0.02277571 + - -0.0140712 + - 0.02761882 + - 0.03429446 + - -0.021074077 + - -0.022383025 + - -0.0066429153 + - -0.007951864 + - 0.032854613 + - -0.00140712 + - 0.01099517 + - 0.024346448 + - 0.020943182 + - -0.014398437 + - 0.04293352 + - 0.015511043 + - -0.05576122 + - -0.008213653 + - 0.029713139 + - 0.014987464 + - -0.008835404 + - 0.020943182 + - 0.005006729 + - -0.02146676 + - -0.030760298 + - 0.021335866 + - 0.014791123 + - 0.02251392 + - -0.01616552 + - -0.041362785 + - -0.025786292 + - 0.011715092 + - 0.038221303 + - -0.00791914 + - -0.018194389 + - 0.032854613 + - -0.01616552 + - 0.029320452 + - -0.00818093 + - -0.04502784 + - -0.025786292 + - -0.010406143 + - -0.0081154825 + - -0.02277571 + - -0.027226135 + - 0.0072973897 + - 0.009620774 + - 0.007788245 + - 0.03115298 + - 0.036388777 + - -0.0026669833 + - 0.0064792964 + - -0.0013171298 + - -0.017670808 + - 3.681419e-05 + - -0.01276225 + - 0.0081154825 + - -0.03691236 + - -0.041362785 + - 0.004417702 + - -0.04555142 + - 0.010602485 + - 0.02788061 + - 0.048692897 + - 0.024477342 + - -0.020288708 + - 0.004450426 + - 0.009620774 + - 0.0056612035 + - 0.052096166 + - -0.03246193 + - -0.04476605 + - -0.027749715 + - -0.019372443 + - 0.032854613 + - 0.009620774 + - -0.008050036 + - 0.041624572 + - -0.0015543768 + - -0.014463885 + - 0.0035996092 + - -0.0042868075 + - -0.02225213 + - -0.016034622 + - -0.013743963 + - -0.056546587 + - -0.06963608 + - 0.029582245 + - -0.03481804 + - -0.014529332 + - -0.020288708 + - -0.02199034 + - 0.03429446 + - 0.029058663 + - 0.020157812 + - 0.0006667458 + - -0.003975932 + - -0.014202095 + - -0.0108642755 + - -0.015314702 + - -0.024608238 + - 0.043457102 + - 0.006675639 + - -0.03691236 + - -0.016034622 + - 0.00063811254 + - 0.015445596 + - -0.04293352 + - 0.046860367 + - -0.030367615 + - 0.029582245 + - 0.023691973 + - -0.022906605 + - 0.0589027 + - 0.004712216 + - 0.031414773 + - 0.0052030715 + - -0.0051049003 + - 0.02251392 + - -0.011911435 + - -0.03272372 + - 0.021335866 + - -0.014005752 + - 0.0052030715 + - 0.04319531 + - -0.019372443 + - -0.047122158 + - -0.011976882 + - 0.016230965 + - 0.062044173 + - 0.0179326 + - 0.009555326 + - -0.004548597 + - 0.04581321 + - 0.013482173 + - 0.010471591 + - 0.01740902 + - -0.024870029 + - -0.039268464 + - 0.046860367 + - -0.0010798827 + - 0.021597655 + - -0.010798828 + - 0.038483094 + - 0.038744885 + - -0.013154936 + - 0.0035668856 + - -0.00075264554 + - 0.021335866 + - -0.027357029 + - 0.013351278 + - 0.050001845 + - -0.0014562055 + - 0.019765127 + - -0.010013458 + - 0.034032673 + - -0.017539915 + - -0.03691236 + - 0.041624572 + - -0.0084427195 + - -0.018587073 + - -0.040053833 + - -0.01276225 + - -0.016689098 + - -0.006217507 + - -0.05602301 + - 0.03429446 + - -0.002683345 + - 0.037959516 + - 0.0037632277 + - -0.039268464 + - 0.0358652 + - -0.023037499 + - -0.016230965 + - -0.0026015358 + - -0.028011505 + - 0.0060211644 + - 0.008377273 + - -0.05707017 + - -0.0015707386 + - 0.02683345 + - 0.054714058 + - 0.006675639 + - 0.05523764 + - -0.04319531 + - 0.0022579366 + - -0.005595756 + - -0.023430184 + - -0.0052357954 + - 0.030760298 + - -0.00075673603 + - 0.020812286 + - 7.362838e-05 + - -0.0072319424 + - 0.028665978 + - -0.0019716043 + - 0.0042213597 + - -0.008900852 + - -0.07487187 + - 0.027487926 + - 0.0358652 + - -0.016558204 + - -0.026048083 + - -0.011060618 + - 0.019896023 + - -0.027226135 + - 0.0022742986 + - 0.016754545 + - -0.027487926 + - -2.6588023e-05 + - -0.022383025 + - 0.005595756 + - -0.018587073 + - -0.00043563455 + - -0.00536669 + - 0.050001845 + - -0.053405114 + - 0.01099517 + - -0.019503338 + - 0.00062993163 + - 0.04319531 + - -0.039006677 + - 0.0026178977 + - -0.017016336 + - -0.01714723 + - 0.0006544744 + - 0.013285831 + - -0.011715092 + - 0.0048431107 + - 0.005399414 + - 0.019372443 + - -0.019110652 + - 0.062567756 + - -0.013089488 + - 0.0102752475 + - -0.014791123 + - 0.036126986 + - 0.020943182 + - -0.015969176 + - 0.027487926 + - -0.025000922 + - -0.018325282 + - 0.005464861 + - 0.029713139 + - -0.00039268465 + - 0.0028796874 + - -0.0046467683 + - -0.003174201 + - 0.021597655 + - 0.017278124 + - -0.029320452 + - 0.02945135 + - 0.031807456 + - 0.012435014 + - 0.024477342 + - -0.043457102 + - 0.041886363 + - 0.0015052911 + - -0.024084657 + - 0.0048431107 + - 0.009620774 + - 0.039268464 + - -0.0019388804 + - -0.0020043277 + - -0.0717304 + - -0.024477342 + - -0.00058084604 + - -0.023561079 + - 0.040577415 + - 0.018063493 + - 0.060211644 + - -0.026309872 + - 0.030367615 + - -0.0099480115 + - -0.004908558 + - -0.008148206 + - -0.039530255 + - 0.013547621 + - -0.07068323 + - -0.004139551 + - -0.017278124 + - -0.017670808 + - -0.0024215553 + - 0.002683345 + - 0.015183807 + - -0.040839203 + - 0.019503338 + - -0.0255245 + - 0.025917185 + - -0.008017311 + - -0.01276225 + - -0.014529332 + - 0.00028428732 + - 0.050001845 + - 0.0061193355 + - 0.038221303 + - -0.020419601 + - 0.0043849787 + - -0.0054321378 + - 0.01099517 + - -0.015707387 + - 0.03691236 + - 0.057593748 + - 0.09005568 + - -0.0029778588 + - 0.033770878 + - -0.014725675 + - -0.0067083626 + - 0.039268464 + - -0.011911435 + - 0.006381125 + - 0.007853693 + - -0.047383945 + - 0.014725675 + - -0.03507983 + - -0.013351278 + - 0.018848864 + - 0.02382287 + - -0.026440766 + - -0.015641939 + - -0.017539915 + - 0.023430184 + - 0.0073628374 + - -0.005595756 + - 0.042671733 + - -0.007461008 + - 0.000818093 + - 0.009817116 + - 0.0075919037 + - -0.008835404 + - -0.015183807 + - 0.011126065 + - 0.038744885 + - 0.029582245 + - 0.009162641 + - 0.107857384 + - -0.019110652 + - -0.0018161664 + - 0.011060618 + - 0.0026669833 + - 0.012369567 + - -0.009031747 + - 0.016689098 + - 0.025655398 + - -0.030760298 + - 0.024215553 + - 0.0073628374 + - 0.0011944157 + - 0.021859445 + - 0.018194389 + - 0.13089488 + - 0.0021434037 + - -0.016885439 + - 0.0028469637 + - 0.019241547 + - -0.026571661 + - -0.009097194 + - 0.00026588026 + - -0.014791123 + - -0.0017425382 + - -0.01740902 + - -0.018325282 + - 0.020681392 + - 0.05602301 + - -0.0072319424 + - 0.004810387 + - 0.008639062 + - 0.007624627 + - 0.0007730979 + - -0.016885439 + - 0.0019225186 + - 0.020943182 + - -0.032200143 + - 0.02277571 + - -0.0076900744 + - 0.0034523525 + - -0.046598576 + - -0.021074077 + - 0.0011289683 + - -0.007951864 + - 0.0034850764 + - -0.019896023 + - -0.008377273 + - 0.021859445 + - 0.009162641 + - 0.03350909 + - 0.039006677 + - -0.015903728 + - -0.021597655 + - 0.038483094 + - -0.024215553 + - 0.037435934 + - -0.017278124 + - -0.043457102 + - 0.0148565695 + - -0.020157812 + - -0.059426278 + - -0.019372443 + - -0.07644261 + - -0.010537039 + - 0.057331957 + - 0.003174201 + - 0.023430184 + - 0.066232815 + - 0.019110652 + - 0.0070683234 + - 0.00091626414 + - -0.023691973 + - 0.0117805395 + - -0.011715092 + - 0.025131818 + - -0.029058663 + - -0.031283878 + - -0.032592826 + - 0.06073523 + - -0.0047449395 + - 0.0068719815 + - -0.0041722744 + - 0.0064138495 + - 0.014463885 + - 0.010798828 + - -0.0008344549 + - -0.019241547 + - -0.0023724698 + - 0.03272372 + - -0.04581321 + - -0.02788061 + - -0.014398437 + - -0.021859445 + - 0.026440766 + - -0.040315624 + - -0.0033378196 + - 0.0066101914 + - 0.0074282847 + - 0.022644814 + - 0.02788061 + - 0.01845618 + - -0.0281424 + - -0.030105822 + - -0.0019225186 + - 0.02761882 + - 0.009293537 + - 0.0064138495 + - 0.0038941226 + - 0.017016336 + - -0.0046467683 + - 0.001873433 + - -0.029974928 + - 0.015118359 + - 0.00791914 + - 0.017016336 + - -0.011911435 + - 0.010406143 + - -0.0039432086 + - 0.028273294 + - 0.010929722 + - 0.016754545 + - -0.023561079 + - -0.0062502306 + - 0.010471591 + - 0.0006994695 + - 0.02761882 + - 0.04450426 + - 0.031283878 + - -0.014202095 + - -0.017539915 + - 0.012369567 + - 0.00448315 + - 0.001865252 + - 0.031283878 + - -0.006446573 + - -0.040315624 + - 0.0006544744 + - 0.02788061 + - 0.0023397459 + - -0.036388777 + - 0.028665978 + - 0.014136647 + - 0.0042213597 + - -0.039792046 + - 0.018979758 + - 0.010471591 + - 0.002683345 + - -0.022383025 + - -0.05576122 + - 0.0013171298 + - -0.0099480115 + - -0.01073338 + - 0.016885439 + - -0.0033869052 + - -0.023037499 + - -0.068065345 + - -0.0052357954 + - 0.00395957 + - -0.01845618 + - 0.046598576 + - 0.061782382 + - 0.0015625576 + - -0.006544744 + - 0.01557649 + - 0.025262713 + - 0.014398437 + - -0.014005752 + - -0.006839257 + - -0.020943182 + - 0.0035178 + - -0.017016336 + - -0.0016934526 + - -0.001521653 + - 0.0015707386 + - -0.01714723 + - 0.023037499 + - 0.013874858 + - 0.004548597 + - -0.0025197265 + - -0.009686221 + - 0.037435934 + - -0.018063493 + - -0.0010471591 + - 0.061258808 + - 0.019372443 + - 0.019634232 + - 0.012631357 + - 0.008900852 + - -0.0060211644 + - -0.007951864 + - -0.03350909 + - -0.011911435 + - -0.018979758 + - 0.00087945 + - 0.03429446 + - -0.014332989 + - -0.07068323 + - -0.025655398 + - -0.011126065 + - 0.040053833 + - -0.051310796 + - 0.0057593747 + - -0.0047449395 + - 0.011387855 + - 6.0334358e-05 + - -0.039530255 + - -0.040577415 + - 0.007788245 + - 0.011387855 + - -0.0035996092 + - 0.0036486948 + - 0.026440766 + - -0.0041886363 + - 0.0063156784 + - -0.019372443 + - -0.011387855 + - 0.014529332 + - -0.0102752475 + - 0.008508168 + - 0.04398068 + - 0.009620774 + - -0.0062829545 + - 0.0332473 + - -0.0026015358 + - -0.023168394 + - -0.006544744 + - -0.01845618 + - -0.011387855 + - 0.01740902 + - -0.01740902 + - 0.030498508 + - -0.0281424 + - -0.030105822 + - -0.054190483 + - -0.021597655 + - -0.0117805395 + - 0.014791123 + - -0.018063493 + - -0.012565909 + - 0.013089488 + - -0.009031747 + - 0.052096166 + - -0.0011126065 + - 0.042148154 + - -0.0014562055 + - 0.012173224 + - 0.014529332 + - 0.046074998 + - -0.02146676 + - 0.019372443 + - 0.013940305 + - 0.010406143 + - 0.009424432 + - 0.06413849 + - -0.012042329 + - -0.01380941 + - -0.011976882 + - -0.026702557 + - -0.030498508 + - -0.040839203 + - 0.01073338 + - 0.017016336 + - -0.0084427195 + - -0.008769957 + - 0.020550495 + - 0.010209801 + - 0.039006677 + - -0.0025033646 + - -0.02225213 + - 0.049216475 + - -0.006217507 + - -0.013154936 + - 0.017801704 + - -0.021597655 + - 0.014005752 + - -0.0025360885 + - -0.015380149 + - -0.004810387 + - 0.010667933 + - -0.0002075911 + - -0.029189559 + - -0.026964346 + - -0.006904705 + - -0.03298551 + - -0.020419601 + - 0.0019552424 + - 0.0041068266 + - 0.034032673 + - -0.047383945 + - 0.04450426 + - 0.048169315 + - -0.023561079 + - 0.0067410865 + - 0.020943182 + - -0.013678514 + - -0.015445596 + - -0.010798828 + - 0.019241547 + - -0.005170348 + - 0.036650565 + - 0.012173224 + - -0.03246193 + - -0.04476605 + - -0.009882564 + - -0.021597655 + - -0.02251392 + - 0.01616552 + - -0.0075919037 + - 0.0021434037 + - 0.006544744 + - 0.025655398 + - -0.011191512 + - 0.00042949885 + - 0.0014153009 + - -0.0037795897 + - 0.020681392 + - 0.006675639 + - 0.057331957 + - 0.003861399 + - 0.0022742986 + - -0.036650565 + - 0.010602485 + - -0.016558204 + - -0.0032069248 + - 0.011191512 + - 0.03246193 + - 0.018979758 + - 0.041362785 + - -0.018979758 + - 0.0070356 + - -0.017670808 + - -0.029058663 + - 0.0069701527 + - -0.040839203 + - -0.02277571 + - -0.02120497 + - 0.014398437 + - -0.005170348 + - -0.0037959518 + - -0.0016198241 + - -0.0062502306 + - 0.07434829 + - -0.052096166 + - -0.011126065 + - 0.0093589835 + - -0.04110099 + - 0.01583828 + - -0.011715092 + - -0.002127042 + - 0.015380149 + - 0.03272372 + - 0.028796874 + - 0.020288708 + - 0.0075591793 + - -0.0004642678 + - 0.006381125 + - -0.01380941 + - -0.0017425382 + - 0.0032069248 + - 0.03481804 + - 0.014136647 + - -0.01099517 + - -0.028273294 + - -0.024084657 + - -0.0042868075 + - -0.04110099 + - -0.026178977 + - 0.019372443 + - 0.025655398 + - -0.0031251153 + - -0.024608238 + - -0.028665978 + - 0.0064792964 + - 0.013613068 + - 0.011322407 + - -0.03691236 + - 0.03429446 + - -0.036126986 + - -0.012827699 + - 0.038483094 + - -0.010406143 + - -0.025393607 + - 0.019765127 + - -0.013024041 + - 0.061258808 + - -0.0010798827 + - 0.010144354 + - -0.02251392 + - 0.03350909 + - 0.057593748 + - -0.03233104 + - 0.0089663 + - -0.033116408 + - 0.0032232865 + - 0.018325282 + - 0.028796874 + - 0.04502784 + - 0.0035996092 + - -0.07644261 + - -0.002454279 + - -0.025131818 + - 0.057593748 + - 0.016689098 + - -0.026702557 + - 0.038483094 + - 0.027095241 + - 0.050001845 + - -0.025262713 + - 0.031022087 + - -0.048954684 + - 0.026309872 + - 0.061782382 + - 7.6184915e-05 + - -0.011976882 + - -5.470997e-05 + - 0.015445596 + - -0.012304119 + - 0.048954684 + - 0.027487926 + - 0.018587073 + - 0.0053012427 + - 0.0061193355 + - -0.00021679465 + - -0.008377273 + - 0.004319531 + - 0.04450426 + - 0.00037427756 + - 0.010078906 + - 0.020812286 + - -0.0121077765 + - -0.0031905626 + - 0.006675639 + - 0.0084427195 + - 0.02382287 + - 0.0011944157 + - -0.027357029 + - 0.007951864 + - -0.04319531 + - -0.009162641 + - -0.023037499 + - 0.035341617 + - -0.002470641 + - 0.030498508 + - -0.009489879 + - 0.008573615 + - -0.0042868075 + - 0.017801704 + - 0.028273294 + - -0.010340696 + - -0.009162641 + - -0.0022579366 + - 0.010537039 + - 0.024346448 + - -0.007493732 + - 0.018325282 + - -0.0089663 + - -0.016754545 + - 0.016427306 + - 0.04633679 + - 0.011322407 + - -0.03507983 + - -0.040053833 + - -0.02761882 + - -0.016492754 + - 0.0043849787 + - 0.041362785 + - -0.038221303 + - -0.01616552 + - -0.013220383 + - -0.006937429 + - 0.020681392 + - 0.027226135 + - 0.009097194 + - -0.03233104 + - -0.001873433 + - -0.022906605 + - 0.009489879 + - 0.02277571 + - 0.0016034624 + - 0.029058663 + - 0.009620774 + - -0.014791123 + - 0.04240994 + - -0.0009039928 + - 0.01845618 + - 0.019110652 + - 0.00075264554 + - -0.011715092 + - -0.030367615 + - 0.0017916237 + - 0.016100071 + - 0.001873433 + - -0.046598576 + - 0.0037795897 + - -0.010537039 + - -0.035603408 + - 0.028273294 + - -0.006446573 + - 0.004025018 + - -0.0281424 + - -0.047122158 + - 0.020288708 + - 0.0070356 + - 0.0010717019 + - 0.0025688119 + - 0.046074998 + - 0.004941282 + - 0.0064138495 + - 0.015183807 + - -0.013089488 + - -0.0056939274 + - 0.040053833 + - -0.06963608 + - 0.06361491 + - -0.034032673 + - 0.019241547 + - -0.018979758 + - -0.018325282 + - 0.04502784 + - 0.006675639 + - -0.046598576 + - -0.010798828 + - -0.004417702 + - 0.015641939 + - -0.012958593 + - -0.024608238 + - -0.017539915 + - -0.049478266 + - -0.071206816 + - -0.018063493 + - -0.026309872 + - -0.0017670809 + - -0.020812286 + - -0.018717967 + - 0.020681392 + - 0.005988441 + - -0.008311825 + - -0.014922016 + - -0.026571661 + - 0.020288708 + - -0.009555326 + - -0.010471591 + - -0.022906605 + - -0.0358652 + - 0.054975852 + - -0.01616552 + - -0.033770878 + - 0.012958593 + - -0.018194389 + - -0.0021597655 + - -0.01099517 + - -0.023691973 + - -0.0057920986 + - 0.05680838 + - -0.0015543768 + - 0.004908558 + - 0.006577468 + - -0.040315624 + - 0.018717967 + - -0.008508168 + - -0.0076900744 + - -0.0036814187 + - 0.029189559 + - 0.02251392 + - -0.01557649 + - -0.002127042 + - 0.009162641 + - 0.012958593 + - -0.0060211644 + - 0.0007730979 + - -0.04110099 + - 0.0093589835 + - 0.05288153 + - 0.020288708 + - 0.019110652 + - 0.008639062 + - -0.00087945 + - -0.000439725 + - -0.010340696 + - 0.015707387 + - -0.0018979759 + - 0.012304119 + - -0.011845986 + - -0.008279102 + - 0.0148565695 + - -0.046074998 + - 0.012304119 + - 0.0061193355 + - 0.04371889 + - 0.012304119 + - -0.035341617 + - -0.007264666 + - -0.025917185 + - -0.0067738104 + - -0.030498508 + - 0.015903728 + - 0.020943182 + - 0.010340696 + - -0.009817116 + - -0.013220383 + - 0.013678514 + - -0.10576306 + - 0.00202069 + - -0.0042868075 + - 0.014725675 + - -0.025131818 + - 0.015118359 + - -0.025655398 + - 0.0020370516 + - 0.04110099 + - 4.090465e-06 + - 0.013482173 + - -0.023299288 + - -0.04293352 + - 0.031414773 + - -0.018848864 + - 0.06361491 + - 0.020550495 + - 0.003174201 + - -0.009424432 + - 0.014267542 + - -0.0012516823 + - 0.034556247 + - 0.015380149 + - -0.0036159712 + - -0.010602485 + - -0.007951864 + - -0.012435014 + - 0.009817116 + - -0.060211644 + - -0.018848864 + - -0.0052357954 + - 0.048169315 + - 0.03350909 + - 0.007493732 + - -0.026702557 + - 0.024477342 + - 0.0032069248 + - -0.013874858 + - -0.021728551 + - -0.018063493 + - 0.014005752 + - -0.038483094 + - -0.058379117 + - -0.03350909 + - 0.0071664946 + - 0.020419601 + - -0.0025033646 + - -0.014005752 + - 0.030891191 + - -0.0052685193 + - 0.07068323 + - -0.0108642755 + - 0.005170348 + - -0.023168394 + - -0.023561079 + - 0.015903728 + - -0.011387855 + - 0.010602485 + - 0.0012516823 + - 0.010602485 + - -0.00808276 + - -0.00870451 + - 0.0051376238 + - 0.017670808 + - 0.019896023 + - -0.021859445 + - -0.047122158 + - 0.026571661 + - -0.043457102 + - 0.0065120207 + - 0.002928773 + - 0.0064138495 + - 0.02120497 + - 0.0040577413 + - -0.0037959518 + - 0.015380149 + - -0.0017834428 + - -0.011584197 + - -0.035603408 + - -0.07068323 + - -0.0034850764 + - 0.040315624 + - 0.02683345 + - -0.027226135 + - -0.0067410865 + - -0.004614045 + - 0.049478266 + - 0.02788061 + - 0.01380941 + - -0.026440766 + - 0.005988441 + - 0.032200143 + - -0.008311825 + - 0.018194389 + - -0.03193835 + - -0.012827699 + - 0.005072177 + - -0.04319531 + - 0.033378195 + - -0.02146676 + - -0.021728551 + - -0.025917185 + - 0.0562848 + - 0.024608238 + - -0.012304119 + - 0.0061847833 + - 0.012238671 + - 0.0016852716 + - -0.0064138495 + - -0.04450426 + - 0.005857546 + - -0.01740902 + - -0.004450426 + - 0.013089488 + - -0.019503338 + - -0.014202095 + - -0.03769773 + - -0.02277571 + - 0.002127042 + - 0.021597655 + - -0.0045813206 + - 0.019503338 + - 0.007264666 + - -0.018979758 + - -0.0015625576 + - -0.022121236 + - -0.03691236 + - -0.015183807 + - -0.04110099 + - 0.030367615 + - -0.017670808 + - -0.042148154 + - -0.017670808 + - -0.025393607 + - 0.006381125 + - 0.011584197 + - 0.0020615943 + - 0.010667933 + - -0.02840419 + - -0.010929722 + - 0.01073338 + - -0.030891191 + - 0.028273294 + - -0.030105822 + - 0.0071664946 + - 0.005824822 + - -0.016492754 + - 0.026964346 + - -0.0093589835 + - 0.009162641 + - 0.030367615 + - 0.02251392 + - 0.005464861 + - -0.0057593747 + - 0.03167656 + - 0.016230965 + - -0.02146676 + - -0.0179326 + - -0.017801704 + - -0.006839257 + - -0.018194389 + - -0.0036159712 + - 0.026178977 + - -0.025655398 + - 0.05288153 + - -0.011518749 + - 0.02840419 + - 0.00818093 + - 0.0056612035 + - 0.0016525479 + - -0.00202069 + - 0.013613068 + - 0.013285831 + - -0.009097194 + - 0.00536669 + - 0.060473435 + - 0.00011811218 + - 0.012631357 + - -0.04398068 + - 0.030367615 + - -0.022644814 + - 0.038221303 + - -0.020288708 + - 0.0035668856 + - 0.020943182 + - -0.01380941 + - 0.025131818 + - -0.016689098 + - -0.011126065 + - -0.028665978 + - 0.009817116 + - -0.0013498535 + - 0.0062829545 + - 0.009489879 + - 0.047907528 + - 0.007002876 + - 0.0039268467 + - 0.013743963 + - -0.00870451 + - -0.014987464 + - -0.0048431107 + - 0.0017261762 + - 0.041886363 + - -0.005039453 + - 0.008311825 + - 0.0042868075 + - 0.017016336 + - 0.015249254 + - -0.027357029 + - -0.020157812 + - 0.021335866 + - 0.050525427 + - 0.04528963 + - 0.03246193 + - -0.012696804 + - 0.050263636 + - 0.013024041 + - -0.041886363 + - -0.0036650565 + - 0.0027651545 + - -0.06335312 + - 0.011387855 + - 0.04240994 + - 8.641108e-05 + - -0.015445596 + - -0.003403267 + - -0.01845618 + - -0.038221303 + - 0.046860367 + - -0.009489879 + - -0.018848864 + - -0.018587073 + - 0.0081154825 + - -0.0019552424 + - 0.0039268467 + - -0.027749715 + - 0.0053339666 + - -0.021335866 + - -0.0024379173 + - 0.0028306018 + - -0.00922809 + - 0.024739133 + - 0.0061847833 + - 0.018063493 + - 0.0027324306 + - -0.0029614966 + - -0.02251392 + - -0.028665978 + - -0.0063156784 + - 0.022644814 + - -0.016885439 + - -0.004254084 + - -0.039006677 + - -0.015707387 + - -0.024739133 + - 0.007820969 + - -0.024870029 + - 0.008769957 + - -0.010471591 + - 0.022906605 + - -0.008900852 + - 0.03429446 + - -0.02683345 + - 0.02251392 + - 0.0179326 + - -0.018063493 + - 0.009751669 + - -0.021859445 + - -0.02277571 + - 0.036650565 + - 0.003992294 + - 0.0033214577 + - 0.024084657 + - 0.019241547 + - 0.010602485 + - -0.030367615 + - 0.016754545 + - -0.04110099 + - 0.00922809 + - -0.006806534 + - 0.015380149 + - -0.030629404 + - 0.030105822 + - 0.013874858 + - -0.04110099 + - 0.03233104 + - 0.053405114 + - -0.0093589835 + - -0.040839203 + - -0.0108642755 + - 0.008508168 + - -0.021074077 + - 0.010667933 + - 0.009162641 + - 0.025131818 + - -0.006086612 + - 0.02892777 + - 0.008050036 + - 0.028273294 + - 0.026964346 + - 0.0026506213 + - 0.00071992184 + - 0.053405114 + - 0.037435934 + - 0.007984588 + - -0.028273294 + - -0.0014889294 + - 0.002012509 + - -0.00069537904 + - 0.032200143 + - 0.028273294 + - -0.007853693 + - -0.0089663 + - 0.013743963 + - 0.039268464 + - 0.030629404 + - -0.00922809 + - 0.005464861 + - -0.007984588 + - -0.016492754 + - 0.026571661 + - 0.021728551 + - -0.022906605 + - -0.005464861 + - 0.041362785 + - -0.004090465 + - 0.010013458 + - 0.012631357 + - -0.014463885 + - -0.0008385453 + - 0.008573615 + - 0.030105822 + - -0.026702557 + - -0.007493732 + - -0.017670808 + - 0.030891191 + - -0.05183437 + - -0.004450426 + - -0.019503338 + - 0.019110652 + - -0.020288708 + - 0.028665978 + - -0.008769957 + - 0.010471591 + - -0.016034622 + - 0.003403267 + - 0.031283878 + - 0.008573615 + - -0.012696804 + - -0.0179326 + - -0.023168394 + - -0.038483094 + - -0.029582245 + - -0.0084427195 + - 0.022644814 + - -0.00448315 + - -0.01636186 + - -0.040315624 + - 0.010013458 + - 0.016427306 + - 0.0020043277 + - 0.01714723 + - 0.020026917 + - 0.00062993163 + - -0.011126065 + - -0.0108642755 + - -0.028273294 + - -0.017801704 + - -0.019503338 + - 0.0043849787 + - -0.033116408 + - 0.017539915 + - -0.025000922 + - -0.018325282 + - -0.02277571 + - 0.011322407 + - -0.0027651545 + - -0.008769957 + - -0.015511043 + - 0.020419601 + - -0.001750719 + - 0.015707387 + - -0.02683345 + - 0.02945135 + - -0.008377273 + - 0.046860367 + - -0.036388777 + - -0.012631357 + - -0.030760298 + - 0.01616552 + id: 523d8b12-9073-49c2-9598-ee7ce2dd6a36 + meta: + api_version: + version: '2' + billed_units: + image_tokens: 0 + input_tokens: 4 + response_type: embeddings_by_type + texts: + - hello world + - another doc + status: + code: 200 + message: OK +- request: + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate, zstd + connection: + - keep-alive + content-length: + - '375' + content-type: + - application/json + host: + - api.cohere.com + method: POST + parsed_body: + embedding_types: + - float + images: + - data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAIAAAAlC+aJAAAAfElEQVR4nNXOQREAMAjAsK7+PTMRPLhGQd7QJnESJ3ESJ3ESJ3ESJ3ESJ3ESJ3ESJ3ESJ3ESJ3ESJ3ESJ3ESJ3ESJ3ESJ3ESJ3ESJ3ESJ3ESJ3ESJ3ESJ3ESJ3ESJ3ESJ3ESJ3ESJ3ESJ3ESJ3ESJ3ESJ3ESJ3ES53Vg6wNShQF/fRSLfgAAAABJRU5ErkJggg== + input_type: image + model: embed-v4.0 + output_dimension: 1536 + uri: https://api.cohere.com/v2/embed + response: + headers: + access-control-expose-headers: + - X-Debug-Trace-ID + alt-svc: + - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 + cache-control: + - no-cache, no-store, no-transform, must-revalidate, private, max-age=0 + content-length: + - '19487' + content-type: + - application/json + expires: + - Thu, 01 Jan 1970 00:00:00 GMT + pragma: + - no-cache + transfer-encoding: + - chunked + vary: + - Origin,Accept-Encoding + parsed_body: + embeddings: + float: + - - 0.010122348 + - 0.016491465 + - -0.020699631 + - -0.0036110622 + - -0.03298293 + - 0.009326207 + - -0.054592438 + - 0.023656722 + - -0.0072221244 + - -0.013363774 + - -0.0037247965 + - 0.07460966 + - -0.03184559 + - 0.021268303 + - 0.0035826287 + - 0.00870067 + - 0.02786489 + - 0.022291912 + - 0.0045493697 + - -0.01501292 + - 0.03912458 + - 0.04026192 + - -0.008586936 + - -0.020813366 + - -0.047540914 + - 0.015240389 + - 0.03002584 + - 0.01501292 + - 0.0069662225 + - -0.008473201 + - -0.026841281 + - -0.016832668 + - 0.002146734 + - 0.004464069 + - -0.029115966 + - 0.01876615 + - 0.0068240548 + - 0.0067103202 + - -0.0021183002 + - 0.00039096145 + - 0.02411166 + - 0.03161812 + - -0.0024310695 + - -0.037077364 + - 0.028547294 + - -0.017742543 + - 0.01501292 + - -0.029343436 + - -0.073244855 + - 0.01637773 + - 0.031390652 + - 0.00582888 + - -0.030935714 + - 0.0019903493 + - -0.03184559 + - 0.022405647 + - -0.010691019 + - -0.005118041 + - -0.026727548 + - 0.051407877 + - -0.028319826 + - -0.009781145 + - 0.07188004 + - 0.02251938 + - 0.006027915 + - -0.011316557 + - -0.0059141805 + - 0.013534375 + - 0.012965703 + - 0.0004336118 + - -0.025590206 + - -0.045493696 + - -0.0249078 + - 0.03912458 + - 0.035485085 + - -0.021382038 + - -0.0332104 + - -0.02786489 + - -0.034347743 + - -0.00082101906 + - -0.00870067 + - -0.0067671873 + - -0.006255383 + - -0.022405647 + - -0.028319826 + - 0.008586936 + - 0.022291912 + - -0.018311214 + - -0.019334821 + - 0.015126654 + - 0.008359467 + - -0.014273647 + - 0.068695486 + - -0.035485085 + - 0.008871271 + - -0.024566596 + - -0.002189384 + - 0.045948636 + - 0.0045493697 + - -0.006937789 + - -0.00070728484 + - -0.03298293 + - 0.0048905723 + - 0.00375323 + - -0.014899186 + - -0.00503274 + - -0.03957952 + - 0.020244695 + - 0.019676024 + - -0.0008601152 + - 0.0134206405 + - -0.02706875 + - 0.029115966 + - -0.087802835 + - -0.029343436 + - 0.001201318 + - 0.024452861 + - -0.011885229 + - -0.044583824 + - -0.0018908317 + - -0.033665337 + - -0.009041872 + - -0.014330515 + - -0.029343436 + - 0.004862139 + - -0.04526623 + - 0.032300524 + - -0.009212473 + - -0.03957952 + - 0.0053455094 + - -0.0036679294 + - 0.023429254 + - 0.025362736 + - 0.010691019 + - -0.018652415 + - 0.01501292 + - 0.007449593 + - 0.035257615 + - 0.01797001 + - -0.016946401 + - -0.0096674105 + - 0.059596743 + - 0.0008778862 + - 0.027523687 + - 0.028319826 + - -0.013932445 + - 0.019334821 + - -0.021836974 + - -0.004293468 + - -0.0249078 + - -0.0030566077 + - 0.0028291394 + - -0.022633115 + - -0.015922794 + - -0.008473201 + - 0.01637773 + - 0.005572978 + - 0.031163182 + - -0.015467857 + - 0.008871271 + - 0.053000156 + - 0.036849894 + - 0.0011657759 + - 0.07097017 + - 0.019448556 + - -0.0011160172 + - 0.040944327 + - -0.027523687 + - -0.033892803 + - 0.051407877 + - 0.02706875 + - 0.011487159 + - -0.022291912 + - -0.02251938 + - 0.02866103 + - -0.035485085 + - 0.011032222 + - -0.022064444 + - -0.055047374 + - 0.010520417 + - -0.024794064 + - 0.008416334 + - -0.009496809 + - -0.013875578 + - -0.030935714 + - 0.0541375 + - 0.026500078 + - 0.0063691176 + - 0.010008614 + - 0.029570904 + - -0.017173871 + - 0.010975354 + - -0.025703939 + - 0.011487159 + - 0.04208167 + - -0.028092358 + - -0.033665337 + - -0.025249003 + - -0.033665337 + - 0.028888498 + - -0.0021183002 + - -0.0026301043 + - -0.044128887 + - 0.009724278 + - 0.04230914 + - -0.0249078 + - -0.00790453 + - 0.0498156 + - -0.014899186 + - 0.03275546 + - -0.05709459 + - 0.008985005 + - -0.0007534894 + - -0.03912458 + - -0.014444249 + - -0.011202823 + - -0.033437867 + - 0.022064444 + - 0.03184559 + - 0.0007321642 + - 0.025703939 + - 0.04822332 + - -0.029798372 + - 0.03002584 + - -0.038214706 + - -0.062781304 + - 0.028319826 + - -0.016832668 + - 0.012738235 + - 0.011032222 + - 0.004520936 + - -0.0011373424 + - 0.005118041 + - -0.0332104 + - 0.02013096 + - -0.0016917968 + - 0.027751155 + - -0.00039273856 + - -0.04685851 + - -0.023770457 + - -0.018424947 + - 0.022291912 + - -0.053000156 + - -0.012795103 + - 0.030480778 + - -0.025021533 + - 0.008871271 + - -0.025703939 + - -0.051862814 + - 0.00092409074 + - 0.018652415 + - 0.031163182 + - 0.029798372 + - -0.04344648 + - -0.0068240548 + - -0.035485085 + - -0.0023173352 + - 0.04685851 + - 0.007449593 + - 0.008131999 + - 0.00989488 + - -0.027523687 + - -0.016832668 + - 0.017742543 + - -0.02331552 + - 0.0039238315 + - 0.035485085 + - -0.024794064 + - -0.0070799566 + - 0.0052602086 + - 0.0026727547 + - -0.0035115448 + - 0.020244695 + - 0.0077339285 + - -0.009212473 + - 0.018197479 + - 0.041399263 + - -0.025135268 + - 0.02706875 + - 0.0010022831 + - -0.029570904 + - 0.013761844 + - 0.009326207 + - 0.028888498 + - 0.014785452 + - 0.011714627 + - 0.0010875837 + - -0.009269341 + - 0.016491465 + - -0.033892803 + - 0.022291912 + - -0.029570904 + - -0.0029002232 + - -0.0042366004 + - 0.0004353889 + - -0.020927101 + - 0.0039806985 + - 0.013250039 + - -0.028547294 + - -0.002203601 + - 0.025135268 + - 0.041171797 + - 0.02411166 + - 0.0052886424 + - 0.0083026 + - 0.022291912 + - -0.011487159 + - 0.034120273 + - -0.042764075 + - -0.033665337 + - 0.029570904 + - 0.010520417 + - 0.012340166 + - -0.02411166 + - 0.014159913 + - 0.01603653 + - -0.053455096 + - 0.00750646 + - 0.0022889017 + - -0.039806984 + - 0.016263997 + - -0.005004307 + - -0.021040834 + - 0.008245733 + - 0.05254522 + - -0.014273647 + - 0.0046346704 + - 0.044356354 + - -0.025817674 + - -0.04048939 + - 0.011998963 + - -0.033437867 + - -0.0136481095 + - 0.048678257 + - -0.011316557 + - -0.015240389 + - -0.044811293 + - 0.0026016708 + - 0.04663104 + - -0.009951746 + - -0.0023173352 + - -0.0076770615 + - 0.0249078 + - -0.02866103 + - -0.0064544184 + - -0.010349816 + - -0.01797001 + - -0.008416334 + - 0.01876615 + - -0.004919006 + - 0.025362736 + - 0.003952265 + - -0.03184559 + - -0.021495773 + - -0.020585898 + - 0.013136305 + - 0.0166052 + - 0.020017227 + - -0.00247372 + - 0.015695326 + - 0.010236082 + - -0.025021533 + - 0.0021183002 + - 0.014444249 + - 0.012795103 + - -0.014444249 + - -0.05709459 + - 0.029570904 + - 0.008131999 + - -0.0027011882 + - -0.03730483 + - -0.0029002232 + - 0.00375323 + - 0.0006326467 + - 0.0249078 + - 0.020472163 + - -0.0022178178 + - -0.03730483 + - 0.018538682 + - 0.018879885 + - -0.0033409435 + - 0.010634151 + - -0.007563327 + - 0.03161812 + - -0.0011657759 + - 0.021950709 + - 0.015240389 + - -0.022291912 + - -0.043901417 + - 0.019448556 + - 0.0069662225 + - -0.01501292 + - 0.008871271 + - -0.006084782 + - -0.03207306 + - 0.067785606 + - -0.010634151 + - 0.00074638095 + - 0.044356354 + - -0.036167488 + - -0.0051464746 + - -0.024452861 + - 0.0076770615 + - -0.02251938 + - -0.016718933 + - -0.011885229 + - 0.008530068 + - -0.02411166 + - -0.034347743 + - 0.014444249 + - 0.01501292 + - -0.00582888 + - -0.045948636 + - -0.00022124864 + - -0.05550231 + - -0.006255383 + - -0.00375323 + - -0.011998963 + - 0.01740134 + - -0.042764075 + - -0.03275546 + - -0.051862814 + - 0.03730483 + - 0.015126654 + - 0.034120273 + - -0.0498156 + - 0.0016420381 + - -0.051407877 + - -7.419382e-05 + - 0.04208167 + - -0.032527994 + - -0.018538682 + - -0.00582888 + - -0.025021533 + - 0.0028860064 + - 0.021268303 + - -0.010918487 + - -0.011145956 + - -0.030253308 + - -0.018538682 + - -0.028092358 + - -0.014159913 + - -0.010236082 + - -0.0124539 + - -0.0028149225 + - 0.020699631 + - -0.0030139575 + - -0.012112697 + - 0.03480268 + - -0.03594002 + - -0.013875578 + - 0.048678257 + - 0.03912458 + - 0.01501292 + - -0.028547294 + - 0.0031561253 + - 0.0059994813 + - -0.0041797333 + - 0.026500078 + - -0.015695326 + - 0.03184559 + - 0.03730483 + - 0.008416334 + - 0.016718933 + - 0.011089088 + - -0.02251938 + - -0.0013079438 + - 0.0066250195 + - 0.030480778 + - -0.01797001 + - 0.042764075 + - -0.0016917968 + - -0.01205583 + - -0.02172324 + - -0.014159913 + - -0.03480268 + - -0.009155607 + - 0.014159913 + - -0.0072789914 + - 0.045493696 + - -0.007392726 + - 0.008643802 + - 0.03775977 + - 0.03298293 + - 0.019221088 + - -0.006681887 + - -0.0032129923 + - -0.053682562 + - -0.015240389 + - -0.012567634 + - -0.044128887 + - 0.015695326 + - -0.037077364 + - -0.0053170756 + - -0.009724278 + - -0.0011728844 + - -0.02786489 + - 0.0022889017 + - -0.048905723 + - -0.0031276916 + - -0.0117714945 + - -0.022860583 + - 0.054592438 + - -0.0050896076 + - 0.015922794 + - -0.024680331 + - 0.0018197478 + - -0.021382038 + - -0.02627261 + - -0.046403572 + - 0.0069662225 + - 0.04321901 + - 0.07961397 + - -0.026045142 + - -0.032300524 + - -0.027751155 + - 0.021382038 + - 0.029798372 + - 0.06005168 + - 0.015922794 + - 0.020017227 + - -0.020017227 + - 0.03002584 + - -0.02331552 + - 0.008643802 + - 0.004407202 + - -0.06414612 + - -0.01501292 + - 0.015354123 + - -0.004805272 + - 0.03275546 + - 0.0136481095 + - 0.016832668 + - 0.04208167 + - -0.03935205 + - 0.021382038 + - -0.03207306 + - 0.036394957 + - -0.032300524 + - -0.017742543 + - -0.015922794 + - -0.04048939 + - 0.0040944326 + - 0.011316557 + - 0.10600031 + - 0.0006824054 + - 0.012283298 + - 0.008871271 + - 0.012851969 + - 0.035030145 + - 0.0007996939 + - 0.031390652 + - 0.028547294 + - -0.002715405 + - 0.020813366 + - 0.01580906 + - -0.005004307 + - 0.0021751674 + - -0.00076770614 + - 0.1501292 + - -0.017173871 + - -0.026841281 + - -0.007961397 + - 0.009326207 + - -0.023201786 + - 0.013761844 + - -0.0058004465 + - -0.015354123 + - -0.0056582787 + - 0.0065681525 + - -0.00494744 + - -0.0052317753 + - 0.018993618 + - -0.03480268 + - 0.00989488 + - 0.011828361 + - -0.0059710476 + - -0.006681887 + - 0.0022889017 + - -0.013761844 + - -0.001094692 + - 0.0052602086 + - 0.007392726 + - -0.015467857 + - -0.0023315519 + - 0.0019619158 + - 0.020813366 + - -0.014046179 + - 0.030253308 + - 0.0052317753 + - -0.009326207 + - -0.009383075 + - 0.011998963 + - -0.016718933 + - -0.002843356 + - 0.08461828 + - -0.033665337 + - -0.027296219 + - 0.04663104 + - -0.01956229 + - -0.03184559 + - 0.015922794 + - -0.001421678 + - 0.0021040835 + - 0.0166052 + - -0.0059710476 + - -0.03480268 + - -0.06505599 + - 0.004265034 + - 0.04799585 + - -0.015126654 + - 0.0030850414 + - -0.002260468 + - 0.0009951746 + - 0.007563327 + - 0.0039238315 + - -0.06687573 + - 0.03207306 + - -0.011202823 + - -0.002530587 + - -0.03571255 + - -0.0053170756 + - -0.037077364 + - 0.029115966 + - 0.012283298 + - -0.017628808 + - 0.014444249 + - 0.0015638458 + - -0.015126654 + - 0.0069662225 + - -0.0041228663 + - 0.006141649 + - -0.011430291 + - 0.031390652 + - -0.03912458 + - -0.03184559 + - -0.008814404 + - 0.015695326 + - -0.032300524 + - 0.0031419084 + - 0.0030708245 + - 0.016832668 + - -0.0031987757 + - 0.02172324 + - 0.0076201945 + - -0.0024310695 + - 0.007335859 + - -0.0083026 + - 0.0016420381 + - 0.07097017 + - 0.031163182 + - -0.010747886 + - -0.011145956 + - 0.02706875 + - 0.0045778034 + - 0.008075131 + - 0.028319826 + - -0.002146734 + - -0.012510766 + - -0.0022746848 + - -0.004350335 + - 0.00034475693 + - -0.0023457687 + - -0.0026301043 + - 0.025021533 + - 0.05072547 + - 0.022064444 + - -0.005004307 + - -0.012510766 + - 0.01205583 + - -0.00247372 + - 0.024566596 + - 0.016832668 + - -0.00494744 + - -0.0332104 + - 0.01637773 + - -0.0005686712 + - -0.018197479 + - -0.008359467 + - -0.0002114746 + - -0.02627261 + - -0.00750646 + - -0.00035897372 + - 0.010804753 + - 0.0010591501 + - -0.01740134 + - 0.02331552 + - -0.017742543 + - -0.017742543 + - 0.021382038 + - 0.03002584 + - 0.0019476989 + - -0.056184717 + - -0.0036394957 + - -0.0031276916 + - -0.0012795102 + - -0.005516111 + - 0.032527994 + - 0.020813366 + - -0.036622427 + - -0.024794064 + - 0.012226431 + - -0.007961397 + - 0.01580906 + - 0.017742543 + - 0.06414612 + - 0.016150262 + - 0.019903492 + - 0.02331552 + - 0.0017913143 + - 4.6204535e-05 + - -0.01501292 + - -0.048450787 + - -0.0007534894 + - -0.008985005 + - -0.0011160172 + - 0.011998963 + - -0.011828361 + - 0.03002584 + - 0.036849894 + - 0.02388419 + - 0.03002584 + - -0.008871271 + - 0.0007854771 + - -0.012510766 + - 0.028547294 + - -0.0034120274 + - -0.0015069788 + - 0.041854203 + - -0.03275546 + - 0.02547647 + - 0.0134206405 + - -0.016832668 + - -0.027523687 + - 0.0024452861 + - 0.04958813 + - 0.0010022831 + - -0.02706875 + - -0.014159913 + - -0.001130234 + - -0.020017227 + - -0.062326364 + - 0.025021533 + - -0.03730483 + - 0.023201786 + - -0.009496809 + - -0.0013648109 + - -0.018538682 + - 0.03002584 + - 0.009610544 + - 0.008530068 + - -0.009496809 + - -0.0001474991 + - -0.0046631037 + - -0.011145956 + - 0.022633115 + - -0.014330515 + - 0.010747886 + - 0.004919006 + - -0.017515073 + - -0.019107353 + - -0.04026192 + - 0.010406683 + - 0.02627261 + - 0.025590206 + - 0.024225393 + - 0.012624501 + - 0.033665337 + - -0.00055445445 + - -0.019903492 + - -0.00053312926 + - -0.03935205 + - -0.033437867 + - -0.0042366004 + - -0.024225393 + - 0.056639653 + - -0.00790453 + - -0.068695486 + - 0.047085978 + - -0.035030145 + - 0.002786489 + - 0.0011871011 + - -0.0021183002 + - 0.046403572 + - 0.013932445 + - -0.012681368 + - 0.028319826 + - -0.0077907955 + - -0.017742543 + - -0.018083744 + - 0.026500078 + - 0.0019476989 + - 0.05550231 + - -0.020699631 + - 0.029115966 + - 0.008530068 + - -0.027751155 + - 0.061416492 + - 0.07188004 + - 0.012624501 + - 0.01086162 + - -0.0019761324 + - -0.05095294 + - 0.017628808 + - -0.03594002 + - -0.015354123 + - 0.027523687 + - -0.00060421316 + - 0.0021040835 + - -0.00027189593 + - 0.014785452 + - 0.01205583 + - 0.003696363 + - -0.02866103 + - 0.059141807 + - -0.046403572 + - 0.015581591 + - 0.005118041 + - -0.049133193 + - -0.0498156 + - 0.026045142 + - -0.012965703 + - -0.013136305 + - -0.008018265 + - 0.030480778 + - 0.03275546 + - -0.027296219 + - -0.0019476989 + - 0.005004307 + - -0.030935714 + - 0.035485085 + - 0.007847663 + - 0.03184559 + - 0.025021533 + - 0.00028078142 + - 0.08871271 + - -0.028319826 + - -0.017628808 + - 0.0060563483 + - -0.019676024 + - -0.017742543 + - -0.01125969 + - 0.0008601152 + - 0.011316557 + - 0.008018265 + - 0.016263997 + - -0.04048939 + - -0.04822332 + - -0.06414612 + - 0.019107353 + - 0.001037825 + - 0.018993618 + - -0.00015283038 + - 0.017515073 + - -0.013761844 + - -0.04071686 + - 0.007392726 + - 0.007449593 + - 0.0039806985 + - -0.050498005 + - -0.0069662225 + - -0.012851969 + - 0.03912458 + - 0.005061174 + - -0.013932445 + - -0.0016420381 + - -0.020017227 + - -2.132517e-05 + - -0.013136305 + - 0.00291444 + - -0.042536605 + - 0.0023315519 + - 0.018538682 + - -0.0036110622 + - -0.008985005 + - -0.002459503 + - -0.0029855238 + - 0.0032840762 + - -0.036622427 + - 0.0027438386 + - -0.02627261 + - -0.035030145 + - -0.032527994 + - 0.01580906 + - 0.020585898 + - 0.029570904 + - 0.028888498 + - 0.0016562549 + - -0.012965703 + - 0.0063691176 + - 0.0031987757 + - 0.009724278 + - -0.001876615 + - 0.01501292 + - 0.051407877 + - 0.059141807 + - 0.012169564 + - -0.013875578 + - 0.032300524 + - 0.00022302574 + - 0.009781145 + - 0.002772272 + - 0.021609506 + - 0.024452861 + - -0.0041513 + - -0.012965703 + - 0.026841281 + - 0.0009809579 + - 0.017856276 + - -0.0066250195 + - -0.02411166 + - -0.018083744 + - -0.00037852177 + - -0.029115966 + - -0.0029002232 + - -0.02706875 + - 0.005061174 + - -0.010349816 + - -0.028092358 + - 0.0026016708 + - -0.017856276 + - -0.014273647 + - -0.0077907955 + - -0.013534375 + - 0.02115457 + - 0.0010022831 + - 0.0061132153 + - 0.018993618 + - 0.038897112 + - 0.016832668 + - 0.037077364 + - 0.0064544184 + - 0.047540914 + - 0.040944327 + - 0.023201786 + - -0.05254522 + - -0.0076201945 + - -0.030253308 + - 0.013022571 + - -0.041399263 + - 0.0059426143 + - 0.023770457 + - 0.0029428736 + - -0.06596586 + - 0.016946401 + - 0.004208167 + - -0.007847663 + - 0.0124539 + - -0.04663104 + - 0.018424947 + - 0.006937789 + - 0.06551092 + - -0.033665337 + - 0.00790453 + - -0.04776838 + - 0.011600893 + - 0.053682562 + - -0.015240389 + - -0.00375323 + - -0.0375323 + - 0.00870067 + - 0.053000156 + - 0.013534375 + - 0.024452861 + - -0.00375323 + - 0.021495773 + - -0.022178177 + - 0.020699631 + - -0.014046179 + - 0.0059426143 + - 0.048450787 + - -0.024680331 + - 0.013875578 + - -0.0008778862 + - -0.0038953978 + - 0.018197479 + - -0.053455096 + - 0.0063975514 + - 0.00017060136 + - 0.0012084263 + - 0.007392726 + - -0.017628808 + - 0.024680331 + - 0.012112697 + - -0.03002584 + - -6.130987e-05 + - -0.005516111 + - -0.0005260209 + - -0.006084782 + - 0.029115966 + - -0.031163182 + - -0.0065112854 + - 0.0018623982 + - -0.053682562 + - 0.010691019 + - -0.012283298 + - 0.014330515 + - -0.029343436 + - -0.01006548 + - -0.02035843 + - 0.0039806985 + - 0.0059141805 + - 0.014444249 + - 0.00145722 + - 0.006937789 + - 0.004862139 + - -0.020244695 + - -0.009951746 + - -0.003099258 + - 0.0030850414 + - 0.015240389 + - -0.038214706 + - -0.012965703 + - -0.02251938 + - 0.0166052 + - 0.068695486 + - -0.0044356356 + - 0.0026585378 + - -0.022633115 + - 0.03207306 + - -0.0541375 + - 0.011714627 + - -0.011032222 + - -0.029570904 + - 0.04026192 + - 0.027296219 + - 0.01797001 + - 0.038669642 + - -0.047085978 + - 0.031163182 + - -0.013363774 + - 0.01956229 + - 0.012567634 + - -0.04663104 + - 0.0018623982 + - -0.023542989 + - 0.017287605 + - 0.02547647 + - 0.009439942 + - -0.053682562 + - -0.026500078 + - 0.033437867 + - -0.017628808 + - -0.03457521 + - -0.017742543 + - -0.005516111 + - 0.013932445 + - 0.0013363773 + - 0.036622427 + - 0.018538682 + - 0.009155607 + - 0.033665337 + - 0.023201786 + - 0.015922794 + - -0.001876615 + - -0.013534375 + - 0.021609506 + - -0.034347743 + - 0.009212473 + - 0.021382038 + - 0.011942095 + - 0.047313444 + - -0.053682562 + - 0.010634151 + - 0.01978976 + - -0.017628808 + - 0.0016207129 + - -0.0070230896 + - 0.06505599 + - 0.027296219 + - -0.004520936 + - 0.0059141805 + - 0.013250039 + - -0.07097017 + - 0.010008614 + - -0.0016207129 + - 0.00022924559 + - 0.006681887 + - -0.012397032 + - -0.048678257 + - -0.006027915 + - -0.0166052 + - -0.017515073 + - -0.017515073 + - 0.0054592434 + - -0.00750646 + - -0.011885229 + - -0.048905723 + - -0.011828361 + - 0.07051523 + - 0.0019476989 + - -0.036167488 + - 0.0059141805 + - 0.0020187828 + - -0.061871428 + - 0.0015069788 + - -0.008871271 + - 0.0016775801 + - 0.04071686 + - 0.02172324 + - 0.035030145 + - 0.0034120274 + - 0.0038385307 + - 0.02013096 + - -0.020699631 + - -0.0040091323 + - -0.00019103798 + - 0.014557983 + - 0.0029286568 + - 0.016150262 + - 0.00069662224 + - 0.011145956 + - 0.0052317753 + - -0.0077907955 + - -0.012851969 + - 0.03298293 + - 0.0067103202 + - 0.0063122506 + - 0.0059710476 + - 0.02706875 + - -0.007392726 + - -0.021268303 + - -0.00038563018 + - 0.0040375656 + - -0.01006548 + - -0.006937789 + - 0.00062198413 + - 0.0023742022 + - -0.009155607 + - 0.010236082 + - -0.032300524 + - 0.022974318 + - 0.0038385307 + - 0.010406683 + - 0.027751155 + - -0.014046179 + - -0.0010449333 + - -0.002772272 + - -0.01876615 + - -0.00023457687 + - 0.0068240548 + - -0.03480268 + - -0.030480778 + - 0.033665337 + - -0.01165776 + - 0.00622695 + - -0.08052384 + - -0.020699631 + - 0.022633115 + - -0.050498005 + - 0.0012226431 + - -0.0066250195 + - -0.002402636 + - 0.0059141805 + - -0.011430291 + - 0.0249078 + - 0.022405647 + - -0.018652415 + - -0.0011799928 + - 0.031163182 + - -0.008814404 + - 0.08188865 + - 0.02251938 + - 0.012510766 + - 0.01580906 + - -0.015467857 + - -0.013534375 + - 0.016832668 + - -0.015467857 + - -0.017742543 + - 0.00989488 + - -0.008416334 + - -0.025590206 + - 0.014899186 + - -0.032300524 + - -0.020244695 + - -0.0066250195 + - -0.009041872 + - 0.0056582787 + - 0.040944327 + - -0.005373943 + - -0.006255383 + - -0.022291912 + - 0.002146734 + - -0.047313444 + - 0.015467857 + - 0.0018055311 + - -0.04526623 + - 0.004862139 + - -0.021609506 + - 0.0039806985 + - 0.021950709 + - -0.025362736 + - -0.017856276 + - 0.022860583 + - 0.025362736 + - 0.042536605 + - -0.0015069788 + - -0.0026869716 + - 0.010292949 + - -0.008985005 + - -0.010520417 + - -0.006027915 + - 0.022291912 + - -0.02627261 + - 0.006255383 + - -0.028319826 + - 0.03002584 + - -0.022064444 + - 0.0046062367 + - 0.022064444 + - -0.009098739 + - -0.08552815 + - 0.04048939 + - -0.022291912 + - -0.035257615 + - -0.010406683 + - 0.0070799566 + - -0.019221088 + - 0.04048939 + - 0.010236082 + - 0.0059710476 + - 0.0008458984 + - 0.0040659993 + - -0.041171797 + - -0.067785606 + - 0.016491465 + - 0.02627261 + - 0.019676024 + - -0.04026192 + - 0.0095536765 + - 0.02627261 + - 0.03730483 + - 0.017856276 + - 0.05732206 + - -0.009269341 + - -0.035257615 + - 0.012681368 + - -0.007335859 + - 0.004293468 + - -0.0057720128 + - 0.0010520418 + - 0.02866103 + - 0.006027915 + - 0.00750646 + - 0.0010520418 + - -0.059141807 + - 0.013363774 + - 0.067785606 + - -0.03184559 + - 0.035485085 + - 0.022178177 + - -0.0024452861 + - -0.02115457 + - 0.020017227 + - -0.013136305 + - -0.017742543 + - 0.0005118041 + - 8.8410605e-05 + - -0.002715405 + - 0.013363774 + - -0.020472163 + - -0.0030708245 + - 0.0029002232 + - 0.024794064 + - -0.0076770615 + - -0.019903492 + - 0.01956229 + - -0.035485085 + - 0.029343436 + - -0.014330515 + - 0.010406683 + - 0.005118041 + - -0.024680331 + - -0.023997925 + - 0.026841281 + - 0.0006433093 + - 0.001037825 + - 0.0015922794 + - 0.0027296217 + - 0.0037247965 + - -0.005544544 + - -0.0008778862 + - -0.0009951746 + - -0.03161812 + - 0.0124539 + - 0.018993618 + - -0.0036394957 + - 0.022178177 + - 0.01501292 + - -0.0332104 + - -0.0065112854 + - -0.0064828517 + - -0.016946401 + - 0.0076770615 + - -0.020927101 + - 0.008757536 + - 0.016718933 + - 0.02547647 + - -0.009326207 + - 0.0067103202 + - 4.442744e-06 + - -0.014159913 + - 0.013022571 + - 0.012226431 + - -0.03775977 + - 0.0068240548 + - -0.008416334 + - -0.00750646 + - -0.021040834 + - -0.051862814 + - 0.0013150522 + - 0.026841281 + - -0.0009525243 + - -0.02627261 + - 0.0077907955 + - 0.008416334 + - -0.02331552 + - 0.019903492 + - -0.010292949 + - -0.025135268 + - 0.030935714 + - 0.00054379186 + - 0.03002584 + - -0.026500078 + - -0.009155607 + - -0.054592438 + - 0.009326207 + - 0.0134206405 + - 0.029115966 + - -0.0012510767 + - -0.015354123 + - 0.0015638458 + - -0.03912458 + - -0.007847663 + - 0.0077907955 + - 0.014557983 + - 0.026045142 + - 0.01637773 + - -0.0024310695 + - 0.02706875 + - 0.011885229 + - 0.005373943 + - 0.012226431 + - -0.0095536765 + - -0.00082101906 + - 0.014785452 + - 0.03207306 + - 0.017060136 + - -0.042991545 + - 0.011600893 + - 0.0249078 + - 0.023997925 + - 0.054592438 + - -0.035485085 + - 0.0061132153 + - 0.026727548 + - 0.016263997 + - -0.0025590204 + - 0.012681368 + - -0.0044925027 + - 0.016718933 + - -0.011316557 + - 0.022633115 + - 0.02627261 + - -0.012795103 + - -0.038442176 + - 0.040944327 + - 0.006880922 + - 0.018993618 + - -0.012397032 + - -0.02251938 + - 0.010122348 + - 0.010008614 + - 0.038214706 + - -0.002715405 + - 0.030708246 + - -0.038214706 + - -0.014046179 + - -0.010463551 + - -0.040944327 + - -0.00025590204 + - 0.014444249 + - -0.0046631037 + - 0.0029002232 + - -0.0034120274 + - -0.032300524 + - 0.038897112 + - -0.0022320345 + - -0.011998963 + - 0.038669642 + - -0.016263997 + - 0.01797001 + - -0.008928138 + - 0.017060136 + - 0.06005168 + - -0.035485085 + - -0.038442176 + - -0.034347743 + - -0.0063122506 + - -0.027523687 + - -0.0066250195 + - -0.053455096 + - 0.029798372 + - 0.0003767447 + - 0.028092358 + - -0.0017699891 + - 0.012510766 + - -0.016263997 + - 0.016491465 + - 0.023997925 + - -0.017856276 + - 0.028547294 + - -0.0015922794 + - -0.0007819229 + - 0.06460105 + - -0.038897112 + - 0.0117714945 + - 0.029343436 + - -0.013875578 + - 0.02172324 + - 0.009326207 + - 0.05572978 + - 0.009383075 + - 0.00123686 + - 0.034120273 + - -0.019221088 + - -0.006937789 + - -0.0014856536 + - -0.01086162 + - -0.028888498 + - 0.04503876 + - 0.013136305 + - -0.013136305 + - 0.0051464746 + - -0.012226431 + - -0.02866103 + - 0.011828361 + - 0.0048905723 + - 0.011714627 + - 0.018197479 + - -0.0068240548 + - -0.021382038 + - 0.006681887 + - 0.024452861 + - 0.009781145 + - -0.019448556 + - 0.028888498 + - 0.025590206 + - 0.06687573 + - 0.0072221244 + - 0.0026158877 + - -0.013022571 + - 0.03161812 + - 0.0014003529 + - 0.011145956 + - 0.01876615 + - -0.01205583 + - 0.026045142 + - 0.031163182 + - -0.0011728844 + - 0.026727548 + - -0.0060563483 + - -0.029115966 + - -0.002189384 + - 0.033665337 + - 0.004208167 + - 0.032300524 + - -0.038897112 + - -0.015467857 + - 0.04799585 + - 0.017628808 + - 0.0015567375 + - 0.005174908 + - -0.024225393 + - -0.019334821 + - -0.004293468 + - -0.042536605 + - -0.008416334 + - -0.016832668 + - -0.008131999 + - 0.0124539 + - 0.015240389 + - 0.01876615 + - -0.0072221244 + - -0.011600893 + - 0.004719971 + - 0.02172324 + - 0.017515073 + - -0.010406683 + - -0.012681368 + - 0.03775977 + - 0.032300524 + - -0.010691019 + - 0.009781145 + - -0.008871271 + - -0.01978976 + - -0.006170083 + - -0.011998963 + - 0.019676024 + - 0.023088051 + - 0.0053170756 + - -0.044356354 + - -0.03480268 + - -0.031163182 + - -0.012567634 + - -0.03730483 + - 0.006880922 + - 0.0019192654 + - -0.012908837 + - -0.052090283 + - 0.005686712 + - -0.0064828517 + - -0.0013221606 + - -0.012851969 + - -0.015922794 + - 0.008928138 + - -0.0023742022 + - -0.030935714 + - 0.0016278214 + - -0.0013434858 + - 0.027523687 + - 0.017287605 + - 0.0011515592 + - 0.0024879365 + - 0.032300524 + - 0.0022462513 + - 0.025249003 + - 0.03298293 + - -0.032527994 + - -0.022974318 + - 0.025931407 + - -0.08052384 + - 0.024566596 + - -0.047085978 + - -0.020244695 + id: 41cc694a-6ffc-491a-b4d1-696b110e1e16 + images: + - bit_depth: 32 + format: image/png + height: 56 + width: 56 + meta: + api_version: + version: '2' + billed_units: + image_tokens: 6 + input_tokens: 0 + response_type: embeddings_by_type + status: + code: 200 + message: OK +version: 1 diff --git a/tests/test_embedder.py b/tests/test_embedder.py index a4f82fc2..db8787ee 100644 --- a/tests/test_embedder.py +++ b/tests/test_embedder.py @@ -854,3 +854,135 @@ async def test_voyage_embed_text_and_image_end_to_end(): image_vec = await embedder.embed_image(Image.new("RGB", (64, 64), (255, 0, 0))) assert len(image_vec) == 1024 assert any(abs(x) > 1e-6 for x in image_vec), "image embedding is all zeros" + + +class _FakeCohereEmbeddings: + def __init__(self, float_): + self.float_ = float_ + + +class _FakeCohereResult: + def __init__(self, float_): + self.embeddings = _FakeCohereEmbeddings(float_) + + +def _fake_cohere_client(captured, float_): + class FakeAsyncClientV2: + def __init__(self, *args, **kwargs): + captured["init"] = kwargs + + async def embed(self, **kwargs): + captured.update(kwargs) + return _FakeCohereResult(float_) + + return FakeAsyncClientV2 + + +async def test_cohere_embed_documents_request_shape(monkeypatch): + from haiku.rag.embeddings.cohere import CohereMultimodalEmbedder + + captured: dict = {} + monkeypatch.setattr( + "cohere.AsyncClientV2", _fake_cohere_client(captured, [[0.1, 0.2], [0.3, 0.4]]) + ) + + embedder = CohereMultimodalEmbedder("embed-v4.0", vector_dim=2) + vecs = await embedder.embed_documents(["a cat", "a dog"]) + + assert vecs == [[0.1, 0.2], [0.3, 0.4]] + assert captured["model"] == "embed-v4.0" + assert captured["input_type"] == "search_document" + assert captured["texts"] == ["a cat", "a dog"] + assert captured["output_dimension"] == 2 + assert captured["embedding_types"] == ["float"] + + +async def test_cohere_embed_query_request_shape(monkeypatch): + from haiku.rag.embeddings.cohere import CohereMultimodalEmbedder + + captured: dict = {} + monkeypatch.setattr( + "cohere.AsyncClientV2", _fake_cohere_client(captured, [[0.5, 0.6]]) + ) + + embedder = CohereMultimodalEmbedder("embed-v4.0", vector_dim=2) + vec = await embedder.embed_query("find the cat") + + assert vec == [0.5, 0.6] + assert captured["model"] == "embed-v4.0" + assert captured["input_type"] == "search_query" + assert captured["texts"] == ["find the cat"] + + +async def test_cohere_embed_image_uses_image_input_type(monkeypatch): + from haiku.rag.embeddings.cohere import CohereMultimodalEmbedder + + captured: dict = {} + monkeypatch.setattr( + "cohere.AsyncClientV2", _fake_cohere_client(captured, [[0.7, 0.8]]) + ) + + embedder = CohereMultimodalEmbedder("embed-v4.0", vector_dim=2) + vec = await embedder.embed_image(b"\x89PNG\r\n\x1a\nfake") + + assert vec == [0.7, 0.8] + assert captured["model"] == "embed-v4.0" + assert captured["input_type"] == "image" + images = captured["images"] + assert len(images) == 1 + assert images[0].startswith("data:image/png;base64,") + + +async def test_cohere_embed_documents_empty_list_skips_request(monkeypatch): + from haiku.rag.embeddings.cohere import CohereMultimodalEmbedder + + captured: dict = {} + monkeypatch.setattr("cohere.AsyncClientV2", _fake_cohere_client(captured, [])) + + embedder = CohereMultimodalEmbedder("embed-v4.0", vector_dim=2) + assert await embedder.embed_documents([]) == [] + assert "texts" not in captured + + +async def test_cohere_get_embedder_routes_to_multimodal(monkeypatch): + monkeypatch.setattr("cohere.AsyncClientV2", _fake_cohere_client({}, [])) + from haiku.rag.embeddings.cohere import CohereMultimodalEmbedder + + config = AppConfig( + embeddings=EmbeddingsConfig( + model=EmbeddingModelConfig( + provider="cohere", + name="embed-v4.0", + vector_dim=1536, + multimodal=True, + ) + ) + ) + embedder = get_embedder(config) + assert isinstance(embedder, CohereMultimodalEmbedder) + assert embedder.supports_images is True + + +@pytest.mark.vcr() +async def test_cohere_embed_text_and_image_end_to_end(): + """End-to-end against the real Cohere ``embed`` API (``embed-v4.0``): text + and image inputs return embeddings of the configured dimension in a shared + vector space. To re-record, set ``CO_API_KEY`` and run with + ``--record-mode=rewrite``.""" + from PIL import Image + + from haiku.rag.embeddings.cohere import CohereMultimodalEmbedder + + embedder = CohereMultimodalEmbedder("embed-v4.0", vector_dim=1536) + + text_vec = await embedder.embed_query("a photo of a red square") + assert len(text_vec) == 1536 + assert any(abs(x) > 1e-6 for x in text_vec), "text embedding is all zeros" + + text_batch = await embedder.embed_documents(["hello world", "another doc"]) + assert len(text_batch) == 2 + assert all(len(v) == 1536 for v in text_batch) + + image_vec = await embedder.embed_image(Image.new("RGB", (64, 64), (255, 0, 0))) + assert len(image_vec) == 1536 + assert any(abs(x) > 1e-6 for x in image_vec), "image embedding is all zeros" From b098be790b7ac29f59b7606b683a650804f87c11 Mon Sep 17 00:00:00 2001 From: Yiorgis Gozadinos Date: Tue, 23 Jun 2026 15:12:28 +0300 Subject: [PATCH 4/4] Document multimodal embedder flag and Voyage/Cohere providers --- CHANGELOG.md | 2 +- README.md | 4 ++-- docs/configuration/processing.md | 4 +++- docs/configuration/providers.md | 37 +++++++++++++++++++++++++++----- docs/python.md | 2 +- 5 files changed, 39 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d8760c8..6d18f527 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ ### Changed -- `provider: vllm` is text-only unless `embeddings.model.multimodal: true` is set. Existing multimodal vLLM configs must add the flag. +- `provider: vllm` is text-only unless `embeddings.model.multimodal: true` is set. Existing multimodal vLLM configs must add the flag; `multimodal` is not part of the stored embedding identity, so changing it raises no drift error — re-ingest or `rebuild` to add or drop picture chunks. ## [0.60.0] - 2026-06-22 diff --git a/README.md b/README.md index f7d3aff3..5040cd2b 100644 --- a/README.md +++ b/README.md @@ -10,14 +10,14 @@ Agentic RAG built on [LanceDB](https://lancedb.com/), [Pydantic AI](https://ai.p ## Features - **Hybrid search** — Vector + full-text with Reciprocal Rank Fusion -- **Multimodal & cross-modal search** — Multimodal embedders (vLLM) put picture vectors in the same space as text; supports text-as-query → figure hits and image-as-query +- **Multimodal & cross-modal search** — Multimodal embedders (vLLM, VoyageAI, Cohere) put picture vectors in the same space as text; supports text-as-query → figure hits and image-as-query - **Question answering** — RAG skill with citations (page numbers, section headings) - **Vision QA** — Vision-capable models receive figure bytes alongside chunk text - **Reranking** — MxBAI, Cohere, Zero Entropy, or vLLM - **Analysis skill** — Complex analytical tasks via sandboxed Python code execution (aggregation, computation, multi-document analysis) - **Conversational RAG** — Chat TUI and web application for multi-turn conversations with session memory - **Document structure** — Stores full [DoclingDocument](https://docling-project.github.io/docling/concepts/docling_document/), enabling structure-aware context expansion -- **Multiple providers** — Embeddings: Ollama, OpenAI, VoyageAI, LM Studio, vLLM (multimodal). QA: any model supported by Pydantic AI +- **Multiple providers** — Embeddings: Ollama, OpenAI, VoyageAI, Cohere, LM Studio, vLLM (multimodal via `multimodal: true` on vLLM/VoyageAI/Cohere). QA: any model supported by Pydantic AI - **Local-first** — Embedded LanceDB, no servers required. Also supports S3, GCS, Azure, and LanceDB Cloud - **CLI & Python API** — Full functionality from command line or code - **MCP server** — Expose as tools for AI assistants (Claude Desktop, etc.) diff --git a/docs/configuration/processing.md b/docs/configuration/processing.md index f8ddf80e..1174caaa 100644 --- a/docs/configuration/processing.md +++ b/docs/configuration/processing.md @@ -283,9 +283,11 @@ Three independent settings drive ingest, retrieval, and QA: | Setting | Question it answers | Values | |---|---|---| | `processing.pictures` | Generate and/or describe pictures at ingest? | `none` / `description` / `image` (default) | -| `embeddings.model.provider` | Can the embedder index image content? | text-only (`ollama`, `openai`, `cohere`, `sentence-transformers`) vs `vllm` (multimodal) | +| `embeddings.model.multimodal` | Can the embedder index image content? | `false` (default, text-only) / `true` (supported on `vllm`, `voyageai`, `cohere`) | | `qa.model.vision` | Can the QA model interpret images? | `false` (default) / `true` | +The Embedder column below is driven by `embeddings.model.multimodal`, not the provider name — a vision-capable model under a text-only configuration still indexes no images, and an image-only document then produces zero chunks. See [Multimodal embedders](providers.md#multimodal-embedders). + **What gets stored** by `pictures` × embedder: | `pictures` | Embedder | Text chunks | Synthetic picture chunks | diff --git a/docs/configuration/providers.md b/docs/configuration/providers.md index 63aea039..e0a17b28 100644 --- a/docs/configuration/providers.md +++ b/docs/configuration/providers.md @@ -228,11 +228,15 @@ embeddings: base_url: http://localhost:1234/v1 ``` -**Note:** The `base_url` must include the `/v1` path for OpenAI-compatible endpoints. +**Note:** The `base_url` must include the `/v1` path for OpenAI-compatible endpoints. This path is text-only. For a vision-language model served by vLLM, use `provider: vllm` with `multimodal: true` (below), not `provider: openai`. -### vLLM (multimodal) +### Multimodal embedders -For cross-modal retrieval (text and pictures share a single vector space), use the dedicated `vllm` provider against a vLLM server hosting a multimodal embedding model: +For cross-modal retrieval (text and pictures share a single vector space), set `embeddings.model.multimodal: true`. Capability is decided by this flag, not the provider name: each provider passes images in its own wire format, so multimodal is supported only on `vllm`, `voyageai`, and `cohere`. Setting it on any other provider raises at startup. + +A model produces picture chunks at ingest only when its embedder is multimodal. Without the flag, an image-only document produces zero chunks and is not retrievable. Switching `multimodal` on or off does not change the stored embedding identity, so it raises no drift error; re-ingest or `rebuild` to add or drop picture chunks. + +**vLLM** — a vLLM server hosting a multimodal embedding model. Text inputs use the standard OpenAI `input` field; image inputs use vLLM's `messages`-with-`image_url` superset. Tested with `Qwen/Qwen3-VL-Embedding-8B` (4096-dim) and `jinaai/jina-embeddings-v4` (2048-dim). Run vLLM separately; haiku.rag adds no Python ML dependencies for this path. ```yaml embeddings: @@ -241,11 +245,34 @@ embeddings: name: Qwen/Qwen3-VL-Embedding-8B vector_dim: 4096 base_url: http://localhost:8000/v1 + multimodal: true ``` -Tested with `Qwen/Qwen3-VL-Embedding-8B` (4096-dim) and `jinaai/jina-embeddings-v4` (2048-dim). Run vLLM separately. haiku.rag adds no Python ML dependencies for this path. Text inputs use the standard OpenAI `input` field. Image inputs use vLLM's `messages`-with-`image_url` superset, transparently to the caller. +**VoyageAI** — `voyage-multimodal-3` (1024-dim) via the `voyageai` extra. Reads `VOYAGE_API_KEY` from the environment. -Picture chunks for retrieval are emitted at ingest under any embedder reporting `supports_images=True`. See [Picture Handling](processing.md#picture-handling). +```yaml +embeddings: + model: + provider: voyageai + name: voyage-multimodal-3 + vector_dim: 1024 + multimodal: true +``` + +**Cohere** — `embed-v4.0` (configurable `vector_dim`, e.g. 1536) via the `cohere` extra. Reads `CO_API_KEY` from the environment. + +```yaml +embeddings: + model: + provider: cohere + name: embed-v4.0 + vector_dim: 1536 + multimodal: true +``` + +A text-only model served by vLLM uses `provider: vllm` without the flag (or `provider: openai` with a `base_url`). + +Picture chunks for retrieval are emitted at ingest under any multimodal embedder. See [Picture Handling](processing.md#picture-handling). ## Question Answering Providers diff --git a/docs/python.md b/docs/python.md index cc028fb1..5d2d8dc9 100644 --- a/docs/python.md +++ b/docs/python.md @@ -260,7 +260,7 @@ results = await client.search( ### Image queries -`client.search()` accepts an image instead of a text query when the configured embedder is multimodal (e.g. `provider: vllm` against a vision-language embedding model). The image is embedded once and the chunks table is searched vector-only. Full-text search and reranking don't apply without a text query. +`client.search()` accepts an image instead of a text query when the configured embedder is multimodal (`embeddings.model.multimodal: true` on a vLLM, VoyageAI, or Cohere model). The image is embedded once and the chunks table is searched vector-only. Full-text search and reranking don't apply without a text query. ```python from PIL import Image