:::callout{intent="info" title="Added in `v1.35.0`"}
:::

# Weaviate Embeddings - Multimodal Embeddings

Weaviate Cloud only

[Configure a Weaviate vector index](#configure-the-vectorizer) to use a Weaviate Embeddings model, and Weaviate will generate embeddings for various operations using the specified model and your Weaviate API key. This feature is called the _vectorizer_.

At [import time](#data-import), Weaviate generates image embeddings and saves them into the index. Then at search time, Weaviate converts text queries into embeddings.

:::callout{intent="tip" title="Primary use case: Image-based document retrieval"}
This integration is optimized for image-based document retrieval. Embed images of document pages with Weaviate Embeddings' multimodal model, then retrieve relevant pages with text queries.

**No OCR or preprocessing required**: This model embeds document images directly, eliminating the need for OCR pipelines, text extraction, or other preprocessing steps. Simply convert your documents (PDFs, slides, invoices) to images and embed them as-is.
:::

![Embedding integration illustration](/assets/docs/weaviate/model-providers/_includes/integration_wes_embedding.png)

## Requirements

To use Weaviate Embeddings, you need a Weaviate Cloud instance with a Weaviate client library that supports Weaviate Embeddings.

:::callout{intent="info" title="Cloud only"}
Weaviate Embeddings vectorizers are not available for self-hosted users.
:::

### API credentials

Your Weaviate Cloud credentials are automatically used to authorize your access to Weaviate Embeddings.

:::code-group{sync="languages"}
```python title="Python"
import weaviate
from weaviate.classes.init import Auth
import os

# Best practice: store your credentials in environment variables
weaviate_url = os.getenv("WEAVIATE_URL")
weaviate_key = os.getenv("WEAVIATE_API_KEY")

client = weaviate.connect_to_weaviate_cloud(
    cluster_url=weaviate_url,                     # Weaviate URL: "REST Endpoint" in Weaviate Cloud console
    auth_credentials=Auth.api_key(weaviate_key),  # Weaviate API key: "ADMIN" API key in Weaviate Cloud console
)

print(client.is_ready())  # Should print: `True`

# Work with Weaviate

client.close()
```

```typescript title="JavaScript/TypeScript"
import weaviate from 'weaviate-client'

// Best practice: store your credentials in environment variables
const weaviateUrl = process.env.WEAVIATE_URL as string;        // Weaviate URL: "REST Endpoint" in Weaviate Cloud console
const weaviateApiKey = process.env.WEAVIATE_API_KEY as string; // Weaviate API key: "ADMIN" API key in Weaviate Cloud console

const client = await weaviate.connectToWeaviateCloud(
  weaviateUrl,  
  {
    authCredentials: new weaviate.ApiKey(weaviateApiKey),  
  }
)

// Work with Weaviate

client.close()
```

```goraw title="Go"
```

```java title="Java" {5-10}
// Best practice: store your credentials in environment variables
String weaviateUrl = System.getenv("WEAVIATE_URL");
String weaviateApiKey = System.getenv("WEAVIATE_API_KEY");

WeaviateClient client = WeaviateClient.connectToWeaviateCloud(weaviateUrl, // Replace with your
    // Weaviate Cloud URL
    weaviateApiKey // Replace with your Weaviate Cloud key
);

System.out.println(client.isReady()); // Should print: `True`

client.close(); // Free up resources
```

```csharp title="C# (Beta)" {5-11}
// Best practice: store your credentials in environment variables
string weaviateUrl = Environment.GetEnvironmentVariable("WEAVIATE_URL");
string weaviateApiKey = Environment.GetEnvironmentVariable("WEAVIATE_API_KEY");

using var client = await Connect.Cloud(
    weaviateUrl, // Replace with your Weaviate Cloud URL
    weaviateApiKey // Replace with your Weaviate Cloud key
);

var meta = await client.GetMeta();
Console.WriteLine(meta.Version);
```
:::

## Configure the vectorizer

[Configure a Weaviate index](../how-to-manage-collections/vector-config.md#specify-a-vectorizer) as follows to use a Weaviate Embeddings multimodal model.

Configure one `BLOB` type property to hold the image data, and pass its name to the vectorizer configuration.

This model produces **multi-vector embeddings**, which represent each document with multiple vectors for fine-grained semantic matching. To manage memory usage effectively, we recommend enabling **MUVERA encoding** which compresses the multi-vectors into a single fixed-dimensional vector.

:::callout{intent="tip" title="Recommended: Enable MUVERA encoding"}
The ColModernVBERT model outputs multi-vector embeddings that can consume significant memory. MUVERA encoding compresses these into efficient single vectors while preserving retrieval quality. For more details on tuning MUVERA parameters, see [Multi-vector encodings](../how-to-configure-weaviate/compression-multi-vectors.md).
:::

:::code-group{sync="languages"}
```python title="Python" {5-20}
from weaviate.classes.config import Configure, Property, DataType

client.collections.create(
    "DemoCollection",
    properties=[
        Property(name="doc_page", data_type=DataType.BLOB),
    ],
    vector_config=[
        Configure.MultiVectors.multi2vec_weaviate(
            # name="document", # Optional: You can choose to name the vector
            image_field="doc_page",
            model="ModernVBERT/colmodernvbert",
            encoding=Configure.VectorIndex.MultiVector.Encoding.muvera(
                # Optional parameters for tuning MUVERA
                ksim=4,
                dprojections=16,
                repetitions=20,
            ),
        )
    ],
)
```

```typescript title="JavaScript/TypeScript" {3-21}
await client.collections.create({
  name: 'DemoCollection',
  properties: [
    {
      name: 'doc_page',
      dataType: weaviate.configure.dataType.BLOB,
    },
  ],
  vectorizers: [
    weaviate.configure.multiVectors.multi2VecWeaviate({
      // name: 'document', // Optional: You can choose to name the vector
      imageField: 'doc_page',
      model: 'ModernVBERT/colmodernvbert',
      encoding: weaviate.configure.vectorIndex.multiVector.encoding.muvera({
        // Optional parameters for tuning MUVERA
        ksim: 4,
        dprojections: 16,
        repetitions: 20,
      }),
    }),
  ],
});
```

```go title="Go"
// Coming soon
```

```java title="Java"
// Coming soon
```

```csharp title="C# (Beta)"
// Coming soon
```
:::

::::accordion{title="Basic configuration (without MUVERA)"}
If you prefer to store the raw multi-vector embeddings without MUVERA compression, use this configuration. Note that this will consume more memory.

:::code-group{sync="languages"}
```python title="Python" {5-14}
from weaviate.classes.config import Configure

client.collections.create(
    "DemoCollection",
    properties=[
        Property(name="doc_page", data_type=DataType.BLOB),  # Define an image property
        # Any other properties can be defined here
    ],
    vector_config=[
        Configure.MultiVectors.multi2vec_weaviate(
            name="document",
            image_field="doc_page"  # Must provide the image property name here
        )
    ],
    # Additional parameters not shown
)
```

```typescript title="JavaScript/TypeScript" {3-14}
await client.collections.create({
  name: 'DemoCollection',
  properties: [
    {
      name: 'doc_page',
      dataType: weaviate.configure.dataType.BLOB,
    },
  ],
  vectorizers: [
    weaviate.configure.multiVectors.multi2VecWeaviate({
      name: 'document',
      imageField: 'doc_page',
    }),
  ],
});
```

```go title="Go"
// Coming soon
```

```java title="Java"
// Coming soon
```

```csharp title="C# (Beta)"
// Coming soon
```
:::
::::

### Vectorizer parameters

The following parameters are available for the Weaviate Embeddings multimodal vectorizer:

- `base_url` (optional): The base URL for the Weaviate Embeddings service. (Not required in most cases.)
- `model` (optional): The name of the model to use for embedding generation. Currently only one model is available.

## Data import

After configuring the vectorizer, [import data](../how-to-manage-objects/import.md) into Weaviate. Weaviate generates embeddings for image objects using the specified model.

:::code-group{sync="languages"}
```python title="Python" {11-15}
collection = client.collections.use("DemoCollection")

with collection.batch.fixed_size(batch_size=200) as batch:
    for src_obj in source_objects:
        pages_b64 = url_to_base64(src_obj["page_img_path"])
        weaviate_obj = {
            "title": src_obj["title"],
            "doc_page": pages_b64  # Add the image in base64 encoding
        }

        # The model provider integration will automatically vectorize the object
        batch.add_object(
            properties=weaviate_obj,
            # vector=vector  # Optionally provide a pre-obtained vector
        )
```

```typescript title="JavaScript/TypeScript"
// Coming soon
```
:::

:::callout{intent="tip" title="Re-use existing vectors"}
If you already have a compatible model vector available, you can provide it directly to Weaviate. This can be useful if you have already generated embeddings using the same model and want to use them in Weaviate, such as when migrating data from another system.
:::

## Searches

Once the vectorizer is configured, Weaviate will perform vector and hybrid search operations using the specified model.

![Embedding integration at search illustration](/assets/docs/weaviate/model-providers/_includes/integration_wes_embedding_search.png)

### Vector (near text) search

When you perform a [vector search](../how-to-query-search/similarity.md#search-with-text), Weaviate converts the text query into an embedding using the specified model and returns the most similar objects from the database.

The query below returns the `n` most similar objects from the database, set by `limit`.

:::code-group{sync="languages"}
```python title="Python" {3-6}
collection = client.collections.use("DemoCollection")

response = collection.query.near_text(
    query="A holiday film",  # The model provider integration will automatically vectorize the query
    limit=2
)

for obj in response.objects:
    print(obj.properties["title"])
```

```typescript title="JavaScript/TypeScript"
const collectionName = 'DemoCollection'
const myCollection = client.collections.use(collectionName)
```

```goraw title="Go" {1-9}
nearTextResponse, err := client.GraphQL().Get().
  WithClassName("DemoCollection").
  WithFields(
    graphql.Field{Name: "title"},
  ).
  WithNearText(client.GraphQL().NearTextArgBuilder().
    WithConcepts([]string{"A holiday film"})).
  WithLimit(2).
  Do(ctx)

if err != nil {
  panic(err)
}
fmt.Printf("%v", nearTextResponse)
```

```java title="Java" {3-4}
CollectionHandle<Map<String, Object>> collection = client.collections.use("DemoCollection");

var response = collection.query.nearText("A holiday film", // The model provider integration will automatically vectorize the query
    q -> q.limit(2).returnMetadata(Metadata.DISTANCE));

for (var o : response.objects()) {
  System.out.println(o.properties().get("title"));
}
```

```csharp title="C# (Beta)" {3-7}
var collection = client.Collections.Use("DemoCollection");

var response = await collection.Query.NearText(
    "A holiday film", // The model provider integration will automatically vectorize the query
    limit: 2,
    returnMetadata: MetadataOptions.Distance
);

foreach (var o in response.Objects)
{
    Console.WriteLine(o.Properties["title"]);
}
```
:::

### Hybrid search

:::callout{intent="info" title="What is a hybrid search?"}
A hybrid search performs a vector search and a keyword (BM25) search, before [combining the results](../how-to-query-search/hybrid.md) to return the best matching objects from the database.
:::

When you perform a [hybrid search](../how-to-query-search/hybrid.md), Weaviate converts the text query into an embedding using the specified model and returns the best scoring objects from the database.

The query below returns the `n` best scoring objects from the database, set by `limit`.

:::code-group{sync="languages"}
```python title="Python" {3-6}
collection = client.collections.use("DemoCollection")

response = collection.query.hybrid(
    query="A holiday film",  # The model provider integration will automatically vectorize the query
    limit=2
)

for obj in response.objects:
    print(obj.properties["title"])
```

```typescript title="JavaScript/TypeScript"
const collectionName = 'DemoCollection'
const myCollection = client.collections.use(collectionName)
```

```goraw title="Go" {1-9}
hybridResponse, err := client.GraphQL().Get().
  WithClassName("DemoCollection").
  WithFields(
    graphql.Field{Name: "title"},
  ).
  WithHybrid(client.GraphQL().HybridArgumentBuilder().
    WithQuery("A holiday film")).
  WithLimit(2).
  Do(ctx)

if err != nil {
  panic(err)
}
fmt.Printf("%v", hybridResponse)
```

```java title="Java" {3-4}
CollectionHandle<Map<String, Object>> collection = client.collections.use("DemoCollection");

QueryResponse<Map<String, Object>> response = collection.query.hybrid("A holiday film", // The model provider integration will automatically vectorize the query
    q -> q.limit(2).returnMetadata(Metadata.DISTANCE));

for (var o : response.objects()) {
  System.out.println(o.properties().get("title"));
}
```

```csharp title="C# (Beta)" {3-7}
var collection = client.Collections.Use("DemoCollection");

var response = await collection.Query.Hybrid(
    "A holiday film", // The model provider integration will automatically vectorize the query
    limit: 2,
    returnMetadata: MetadataOptions.Distance
);

foreach (var o in response.Objects)
{
    Console.WriteLine(o.Properties["title"]);
}
```
:::

## Available models

### `ModernVBERT/colmodernvbert`

- A 250M parameter late-interaction vision-language encoder, fine-tuned for visual document retrieval tasks.
- Generates multi-vector embeddings (ColBERT-style late-interaction) from document images and text queries.
- Ideal for getting documents directly into Weaviate without heavy preprocessing - no OCR or text extraction required.
- State-of-the-art performance in its size class, matching models up to 10x larger.
- Query token limit: 8,192 tokens
- Read more at the [Hugging Face model card](https://huggingface.co/ModernVBERT/colmodernvbert)
- For integration details, see [Weaviate Embeddings: Multimodal](weaviate-embeddings-multimodal.md)

:::callout{intent="info" title="MUVERA encoding recommended"}
Enable [MUVERA encoding](../how-to-configure-weaviate/compression-multi-vectors.md) to reduce memory usage while preserving retrieval quality.
:::

## Further resources

### Code examples

Once the integrations are configured at the collection, the data management and search operations in Weaviate work identically to any other collection. See the following model-agnostic examples:

- The [How-to: Manage collections](../how-to-manage-collections/index.md) and [How-to: Manage objects](../how-to-manage-objects/index.md) guides show how to perform data operations (i.e. create, read, update, delete collections and objects within them).
- The [How-to: Query & Search](../how-to-query-search/index.md) guides show how to perform search operations (i.e. vector, keyword, hybrid) as well as retrieval augmented generation.

### Multi-vector embeddings

- [Multi-vector encodings (MUVERA)](../how-to-configure-weaviate/compression-multi-vectors.md): Learn how to configure MUVERA parameters to balance memory usage and retrieval accuracy.
- [Define multi-vector embeddings](../how-to-manage-collections/vector-config.md#define-multi-vector-embeddings-eg-colbert-colpali): Configure multi-vector embeddings in your collection.

### References

- Weaviate Embeddings [Documentation](../cloud-weaviate-embeddings/overview.md)
- Weaviate Embeddings [Models](../cloud-weaviate-embeddings/models.md)

### Pricing

Weaviate Embeddings models are charged based on token usage. For more pricing information, see the [Weaviate Cloud pricing page](https://weaviate.io/pricing).

## Questions and feedback

Have a question or feedback? Here's how to reach us.

::::card-grid
:::card{title="Community Forum" href="https://forum.weaviate.io/c/support" icon="messages-square"}
Ask questions and connect with other developers on our **Community forum**.
:::

:::card{title="Support" href="/guides/support-overview" icon="life-buoy"}
Weaviate Cloud user or customer? Find the right channel on the **Support page**.
:::
::::

## Related pages

- [Agents](./agents-index.md)
- [AI-assisted Weaviate code generation](./ai-assisted-vibe-coding-index.md)
- [APIs](./apis-index.md)
- [Authorization and authentication](./authorization-and-authentication-index.md)
- [Benchmarks](./benchmarks-index.md)
- [Best practices](./best-practices-index.md)
- [Client libraries](./clients-index.md)
- [Client Libraries / SDKs](./client-libraries-index.md)
- [Cloud](./cloud-index.md)
- [Cloud account management](./cloud-account-management-index.md)

# Agent Instructions

This portal answers questions programmatically. To receive a synthesized,
source-cited answer instead of crawling page by page, append the `?ask=`
query parameter to any page URL on this site:

    /guides/quickstart?ask=how+do+I+authenticate

Optional parameters:

- `&goal=<what-you-are-trying-to-do>` steers the answer toward your
  objective (e.g. `&goal=write+a+python+client`).
- `&version=<label>` scopes the answer to a mounted version when the
  portal publishes more than one.

The response is `text/markdown`: the answer followed by a `# Sources` list
of the portal pages it was grounded in. Status codes are the contract:

- `200` — the answer; `402` — the portal owner’s plan or answer credits are
  exhausted (surface this to your operator; do NOT retry); `429` — you are
  rate-limited; back off for the `Retry-After` seconds; `503` — the answer
  lane is temporarily unavailable; fall back to crawling the `.md` pages.

For the full corpus map read `llms.txt` at the site root; for the tool
surface (search + page fetch as MCP tools) see `/mcp`.
