From 659ea11ac41a31afc3e8e0e5280fde5c4be4ad4f Mon Sep 17 00:00:00 2001 From: alexcastgonz <82875882+pcbeingused333@users.noreply.github.com> Date: Wed, 28 Oct 2026 12:16:28 -0400 Subject: [PATCH] fix(embeddings): default Cohere to embed-multilingual-v3.0, the v2.0 models are retired (#4698) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cohere retired `embed-english-v2.0`, `embed-english-light-v2.0` and `embed-multilingual-v2.0` on April 4, 2026 ([deprecations](https://docs.cohere.com/docs/deprecations), which lists `embed-english-v3.0`, `embed-multilingual-v3.0` and `embed-v4.0` as the embedding alternatives). `CohereEmbeddingFunction` still defaulted to `embed-multilingual-v2.0`, so every call without an explicit `name` fails. The default is now `embed-multilingual-v3.0`, the multilingual v3 model, and the retired models are removed from the docstring and the Cohere integration page (the page also listed `embed-english-v2.0` as the default, which did not match the code). The docs example, its generated snippet, the docs test and the slow Cohere test use the new name. This changes the default vector size: `ndims()` returns 1024 for `embed-multilingual-v3.0`, where the old default gave 768. Tables created from a schema that uses `cohere.ndims()` get 1024-dimension vectors from now on. A table that already holds 768-dimension vectors from the retired model needs a re-embed with a current model, since the old model can no longer be called. The `ndims()` entries for the v2 names are left as they are. Test: `test_cohere_default_model_is_not_a_retired_v2_model` in `python/python/tests/test_embeddings.py` checks the default name and that `ndims()` is 1024. The repository's pytest session could not be run for this change (its `conftest.py` needs a newer native module than the released wheel); the body of that test was run against the released `lancedb` 0.40.0 with this version of `cohere.py` in place, where it passes, and it returns `embed-multilingual-v2.0` / 768 without the change. ruff check and format are clean on the touched Python files. No Cohere request was made. This change was made with Claude Code. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Sonnet 5.5 Co-authored-by: Xuanwo --- docs/web-tests/py/test_integrations.py | 2 +- docs/web/embedding/index.mdx | 2 +- docs/web/integrations/embedding/cohere.mdx | 14 +++++++++----- docs/web/snippets/integrations.mdx | 2 +- python/python/lancedb/embeddings/cohere.py | 16 ++++++++++------ python/python/tests/test_embeddings.py | 10 ++++++++++ python/python/tests/test_embeddings_slow.py | 2 +- 7 files changed, 33 insertions(+), 15 deletions(-) diff --git a/docs/web-tests/py/test_integrations.py b/docs/web-tests/py/test_integrations.py index 577847504..84c4560ae 100644 --- a/docs/web-tests/py/test_integrations.py +++ b/docs/web-tests/py/test_integrations.py @@ -93,7 +93,7 @@ def test_embedding_cohere_usage() -> None: cohere = ( EmbeddingFunctionRegistry.get_instance() .get("cohere") - .create(name="embed-multilingual-v2.0") + .create(name="embed-multilingual-v3.0") ) class TextModel(LanceModel): diff --git a/docs/web/embedding/index.mdx b/docs/web/embedding/index.mdx index 4402feddf..4039ed840 100644 --- a/docs/web/embedding/index.mdx +++ b/docs/web/embedding/index.mdx @@ -181,7 +181,7 @@ LanceDB supports most popular embedding providers. | OpenAI | `openai` | `text-embedding-ada-002` | | Sentence Transformers | `sentence-transformers` | `all-MiniLM-L6-v2` | | Hugging Face | `huggingface` | `colbert-ir/colbertv2.0` | -| Cohere | `cohere` | `embed-english-v3.0` | +| Cohere | `cohere` | `embed-multilingual-v3.0` | | ... | ... | ... | ### Multimodal embedding {#multimodal-embedding} diff --git a/docs/web/integrations/embedding/cohere.mdx b/docs/web/integrations/embedding/cohere.mdx index b9a8e3378..3c56fec76 100644 --- a/docs/web/integrations/embedding/cohere.mdx +++ b/docs/web/integrations/embedding/cohere.mdx @@ -18,16 +18,20 @@ Supported models are: - embed-multilingual-v3.0 - embed-english-light-v3.0 - embed-multilingual-light-v3.0 -- embed-english-v2.0 -- embed-english-light-v2.0 -- embed-multilingual-v2.0 + +The v2.0 models (`embed-english-v2.0`, `embed-english-light-v2.0` and `embed-multilingual-v2.0`) were retired by Cohere on April 4, 2026. + +The previous default, `embed-multilingual-v2.0`, produced 768-dimensional vectors. +The new default, `embed-multilingual-v3.0`, produces 1024-dimensional vectors. +Existing tables containing vectors from a v2.0 model must be re-embedded with an +active model into a table whose vector column has the matching dimension. Supported parameters (to be passed in `create` method) are: | Parameter | Type | Default Value | Description | |---|---|--------|---------| -| `name` | `str` | `"embed-english-v2.0"` | The model ID of the cohere model to use. Supported base models for Text Embeddings: embed-english-v3.0, embed-multilingual-v3.0, embed-english-light-v3.0, embed-multilingual-light-v3.0, embed-english-v2.0, embed-english-light-v2.0, embed-multilingual-v2.0 | +| `name` | `str` | `"embed-multilingual-v3.0"` | The model ID of the cohere model to use. Supported base models for Text Embeddings: embed-english-v3.0, embed-multilingual-v3.0, embed-english-light-v3.0, embed-multilingual-light-v3.0 | | `source_input_type` | `str` | `"search_document"` | The type of input data to be used for the source column. | | `query_input_type` | `str` | `"search_query"` | The type of input data to be used for the query. | @@ -52,4 +56,4 @@ Usage Example: {PyEmbeddingCohereUsage} - \ No newline at end of file + diff --git a/docs/web/snippets/integrations.mdx b/docs/web/snippets/integrations.mdx index 67bb654cf..dca2d0c1f 100644 --- a/docs/web/snippets/integrations.mdx +++ b/docs/web/snippets/integrations.mdx @@ -2,7 +2,7 @@ export const PyEmbeddingAwsUsage = "import tempfile\nfrom pathlib import Path\n\nimport lancedb\nimport pandas as pd\nfrom lancedb.embeddings import get_registry\nfrom lancedb.pydantic import LanceModel, Vector\n\nmodel = get_registry().get(\"bedrock-text\").create()\n\nclass TextModel(LanceModel):\n text: str = model.SourceField()\n vector: Vector(model.ndims()) = model.VectorField()\n\ndf = pd.DataFrame({\"text\": [\"hello world\", \"goodbye world\"]})\ndb = lancedb.connect(str(Path(tempfile.mkdtemp()) / \"bedrock-demo\"))\ntbl = db.create_table(\"test\", schema=TextModel, mode=\"overwrite\")\n\ntbl.add(df)\nrs = tbl.search(\"hello\").limit(1).to_pandas()\nprint(rs.head())\n"; -export const PyEmbeddingCohereUsage = "import tempfile\nfrom pathlib import Path\n\nimport lancedb\nfrom lancedb.embeddings import EmbeddingFunctionRegistry\nfrom lancedb.pydantic import LanceModel, Vector\n\ncohere = (\n EmbeddingFunctionRegistry.get_instance()\n .get(\"cohere\")\n .create(name=\"embed-multilingual-v2.0\")\n)\n\nclass TextModel(LanceModel):\n text: str = cohere.SourceField()\n vector: Vector(cohere.ndims()) = cohere.VectorField()\n\ndata = [{\"text\": \"hello world\"}, {\"text\": \"goodbye world\"}]\n\ndb = lancedb.connect(str(Path(tempfile.mkdtemp()) / \"cohere-demo\"))\ntbl = db.create_table(\"test\", schema=TextModel, mode=\"overwrite\")\ntbl.add(data)\n"; +export const PyEmbeddingCohereUsage = "import tempfile\nfrom pathlib import Path\n\nimport lancedb\nfrom lancedb.embeddings import EmbeddingFunctionRegistry\nfrom lancedb.pydantic import LanceModel, Vector\n\ncohere = (\n EmbeddingFunctionRegistry.get_instance()\n .get(\"cohere\")\n .create(name=\"embed-multilingual-v3.0\")\n)\n\nclass TextModel(LanceModel):\n text: str = cohere.SourceField()\n vector: Vector(cohere.ndims()) = cohere.VectorField()\n\ndata = [{\"text\": \"hello world\"}, {\"text\": \"goodbye world\"}]\n\ndb = lancedb.connect(str(Path(tempfile.mkdtemp()) / \"cohere-demo\"))\ntbl = db.create_table(\"test\", schema=TextModel, mode=\"overwrite\")\ntbl.add(data)\n"; export const PyEmbeddingColpaliSetup = "import tempfile\nfrom pathlib import Path\n\nimport lancedb\nimport pandas as pd\nimport requests\nfrom lancedb.embeddings import get_registry\nfrom lancedb.pydantic import LanceModel, MultiVector\n\ndb = lancedb.connect(str(Path(tempfile.mkdtemp()) / \"colpali-demo\"))\nfunc = get_registry().get(\"colpali\").create()\n\nclass Images(LanceModel):\n label: str\n image_uri: str = func.SourceField()\n image_bytes: bytes = func.SourceField()\n vector: MultiVector(func.ndims()) = func.VectorField()\n vec_from_bytes: MultiVector(func.ndims()) = func.VectorField()\n\ntable = db.create_table(\"images\", schema=Images)\nlabels = [\"cat\", \"dog\", \"horse\"]\nuris = [\n \"http://farm1.staticflickr.com/53/167798175_7c7845bbbd_z.jpg\",\n \"http://farm9.staticflickr.com/8387/8602747737_2e5c2a45d4_z.jpg\",\n \"http://farm9.staticflickr.com/8216/8434969557_d37882c42d_z.jpg\",\n]\nimage_bytes = [requests.get(uri).content for uri in uris]\ntable.add(\n pd.DataFrame({\"label\": labels, \"image_uri\": uris, \"image_bytes\": image_bytes})\n)\n"; diff --git a/python/python/lancedb/embeddings/cohere.py b/python/python/lancedb/embeddings/cohere.py index 8fc460f9a..286f658ad 100644 --- a/python/python/lancedb/embeddings/cohere.py +++ b/python/python/lancedb/embeddings/cohere.py @@ -22,16 +22,20 @@ class CohereEmbeddingFunction(TextEmbeddingFunction): Parameters ---------- - name : str, default "embed-multilingual-v2.0" + name : str, default "embed-multilingual-v3.0" The name of the model to use. List of acceptable models: * embed-english-v3.0 * embed-multilingual-v3.0 * embed-english-light-v3.0 * embed-multilingual-light-v3.0 - * embed-english-v2.0 - * embed-english-light-v2.0 - * embed-multilingual-v2.0 + + The v2.0 models (embed-english-v2.0, embed-english-light-v2.0 and + embed-multilingual-v2.0) were retired by Cohere on April 4, 2026. + The previous default produced 768-dimensional vectors, while the new + default produces 1024-dimensional vectors. Existing tables containing + vectors from a v2.0 model must be re-embedded with an active model into + a table whose vector column has the matching dimension. source_input_type : str, default "search_document" The input type for the source column in the database @@ -65,7 +69,7 @@ class CohereEmbeddingFunction(TextEmbeddingFunction): cohere = EmbeddingFunctionRegistry .get_instance() .get("cohere") - .create(name="embed-multilingual-v2.0") + .create(name="embed-multilingual-v3.0") class TextModel(LanceModel): text: str = cohere.SourceField() @@ -81,7 +85,7 @@ class CohereEmbeddingFunction(TextEmbeddingFunction): """ - name: str = "embed-multilingual-v2.0" + name: str = "embed-multilingual-v3.0" source_input_type: str = "search_document" query_input_type: str = "search_query" client: ClassVar = None diff --git a/python/python/tests/test_embeddings.py b/python/python/tests/test_embeddings.py index 3c968a821..32503c04f 100644 --- a/python/python/tests/test_embeddings.py +++ b/python/python/tests/test_embeddings.py @@ -1115,3 +1115,13 @@ def test_jina_embeddings_use_their_own_api_key(monkeypatch): func_b.compute_source_embeddings(["hello"]) assert sent == ["Bearer key-a", "Bearer key-b"] + + +def test_cohere_default_model_is_not_a_retired_v2_model(): + # Cohere retired embed-english-v2.0, embed-english-light-v2.0 and + # embed-multilingual-v2.0 on April 4, 2026. + cohere = get_registry().get("cohere").create() + + assert cohere.name == "embed-multilingual-v3.0" + assert "v2.0" not in cohere.name + assert cohere.ndims() == 1024 diff --git a/python/python/tests/test_embeddings_slow.py b/python/python/tests/test_embeddings_slow.py index b584598c7..4de85070f 100644 --- a/python/python/tests/test_embeddings_slow.py +++ b/python/python/tests/test_embeddings_slow.py @@ -272,7 +272,7 @@ def test_cohere_embedding_function(): cohere = ( get_registry() .get("cohere") - .create(name="embed-multilingual-v2.0", max_retries=0) + .create(name="embed-multilingual-v3.0", max_retries=0) ) class TextModel(LanceModel):