diff --git a/_build_scripts/link-validator.js b/_build_scripts/link-validator.js
index 2b3c8715..eacdddac 100644
--- a/_build_scripts/link-validator.js
+++ b/_build_scripts/link-validator.js
@@ -45,6 +45,7 @@ const domainsToIgnore = [
'medium.com', // TODO[g-despot]: started throwing Forbidden 403 (incl. subdomains, e.g. *.medium.com)
'https://www.npmjs.com',
'https://openai.com',
+ 'https://platform.deepseek.com', // 403s automated requests (site loads fine in a browser)
'https://platform.openai.com',
'https://www.researchgate.net',
'https://simple/',
diff --git a/docs/weaviate/model-providers/_includes/integration_deepseek_rag.png b/docs/weaviate/model-providers/_includes/integration_deepseek_rag.png
new file mode 100644
index 00000000..81825f35
Binary files /dev/null and b/docs/weaviate/model-providers/_includes/integration_deepseek_rag.png differ
diff --git a/docs/weaviate/model-providers/_includes/integration_deepseek_rag_grouped.png b/docs/weaviate/model-providers/_includes/integration_deepseek_rag_grouped.png
new file mode 100644
index 00000000..7e79d2eb
Binary files /dev/null and b/docs/weaviate/model-providers/_includes/integration_deepseek_rag_grouped.png differ
diff --git a/docs/weaviate/model-providers/_includes/integration_deepseek_rag_single.png b/docs/weaviate/model-providers/_includes/integration_deepseek_rag_single.png
new file mode 100644
index 00000000..14d6acd8
Binary files /dev/null and b/docs/weaviate/model-providers/_includes/integration_deepseek_rag_single.png differ
diff --git a/docs/weaviate/model-providers/_includes/provider.connect.py b/docs/weaviate/model-providers/_includes/provider.connect.py
index 022ba957..1a656009 100644
--- a/docs/weaviate/model-providers/_includes/provider.connect.py
+++ b/docs/weaviate/model-providers/_includes/provider.connect.py
@@ -33,6 +33,10 @@
# Recommended: save sensitive data as environment variables
databricks_token = os.getenv("DATABRICKS_TOKEN")
# END DatabricksInstantiation
+# START DeepseekInstantiation
+# Recommended: save sensitive data as environment variables
+deepseek_key = os.getenv("DEEPSEEK_APIKEY")
+# END DeepseekInstantiation
# START DigitalOceanInstantiation
# Recommended: save sensitive data as environment variables
digitalocean_key = os.getenv("DIGITALOCEAN_APIKEY")
@@ -114,6 +118,10 @@
# START DatabricksInstantiation
"X-Databricks-Token": databricks_token,
# END DatabricksInstantiation
+# START DeepseekInstantiation
+ "X-Deepseek-Api-Key": deepseek_key,
+ # "X-Deepseek-Baseurl": "https://api.deepseek.com", # Optional; for providing a custom base URL
+# END DeepseekInstantiation
# START DigitalOceanInstantiation
"X-Digitalocean-Api-Key": digitalocean_key,
# END DigitalOceanInstantiation
diff --git a/docs/weaviate/model-providers/_includes/provider.generative.py b/docs/weaviate/model-providers/_includes/provider.generative.py
index f4f82051..6d413960 100644
--- a/docs/weaviate/model-providers/_includes/provider.generative.py
+++ b/docs/weaviate/model-providers/_includes/provider.generative.py
@@ -857,6 +857,107 @@ def import_data():
# clean up
client.collections.delete("DemoCollection")
+# ---------------------------------------------------------------------------
+# DeepSeek generative integration (generative-deepseek).
+#
+# `Configure.Generative.deepseek()` and `GenerativeConfig.deepseek()` are
+# merged upstream on the Python client's main branch (PR #2084, commit
+# afc0e0eb, 2026-06-28), and the calls below match those signatures exactly
+# (keyword-only: base_url, model, temperature, max_tokens, frequency_penalty,
+# presence_penalty, top_p, stop). They are not in a released client yet: the
+# newest tag is v4.22.0 (2026-06-18), which predates that commit, and this
+# repo pins weaviate-client==4.22.0 in pyproject.toml.
+#
+# So the blocks below stay DISPLAY-ONLY: they are rendered in the docs via
+# FilteredTextBlock (with `language="pyindent"`, which strips the 4-space guard
+# indent) and are intentionally kept out of the test runner's allowlist in
+# tests/test_python.py. The `if DEEPSEEK_CLIENT_AVAILABLE:` guard is a
+# belt-and-suspenders measure so that even if this file is ever executed
+# end-to-end, the `deepseek()` calls the pinned client lacks can never run.
+# TODO: once pyproject.toml pins a weaviate-client release that contains
+# afc0e0eb, set DEEPSEEK_CLIENT_AVAILABLE = True, unindent these blocks and
+# switch their FilteredTextBlock `language` from `pyindent` back to `py`, and
+# add this file to the allowlist in tests/test_python.py.
+# ---------------------------------------------------------------------------
+DEEPSEEK_CLIENT_AVAILABLE = False
+
+if DEEPSEEK_CLIENT_AVAILABLE:
+ # NOTE: there is deliberately no "basic" no-model block for DeepSeek. The
+ # module's built-in default model is the retired `deepseek-chat` alias, so
+ # `Configure.Generative.deepseek()` with no arguments is not a usable
+ # example. Every documented DeepSeek block sets `model` explicitly.
+
+ # START GenerativeDeepseekCustomModel
+ from weaviate.classes.config import Configure
+
+ client.collections.create(
+ "DemoCollection",
+ # highlight-start
+ generative_config=Configure.Generative.deepseek(
+ model="deepseek-v4-flash"
+ )
+ # highlight-end
+ # Additional parameters not shown
+ )
+ # END GenerativeDeepseekCustomModel
+
+ # clean up
+ client.collections.delete("DemoCollection")
+
+ # START FullGenerativeDeepseek
+ from weaviate.classes.config import Configure
+
+ client.collections.create(
+ "DemoCollection",
+ # highlight-start
+ generative_config=Configure.Generative.deepseek(
+ model="deepseek-v4-flash",
+ # # These parameters are optional
+ # temperature=0.7,
+ # max_tokens=500,
+ # frequency_penalty=0.0,
+ # presence_penalty=0.0,
+ # top_p=1.0,
+ # base_url="https://api.deepseek.com",
+ # stop=["\n\n"],
+ )
+ # highlight-end
+ )
+ # END FullGenerativeDeepseek
+
+ # clean up
+ client.collections.delete("DemoCollection")
+ import_data()
+
+ # START RuntimeModelSelectionDeepseek
+ from weaviate.classes.config import Configure
+ from weaviate.classes.generate import GenerativeConfig
+
+ collection = client.collections.use("DemoCollection")
+ response = collection.generate.near_text(
+ query="A holiday film",
+ limit=2,
+ grouped_task="Write a tweet promoting these two movies",
+ # highlight-start
+ generative_provider=GenerativeConfig.deepseek(
+ # # These parameters are optional
+ # model="deepseek-v4-flash",
+ # temperature=0.7,
+ # max_tokens=500,
+ # frequency_penalty=0.0,
+ # presence_penalty=0.0,
+ # top_p=1.0,
+ # base_url="https://api.deepseek.com",
+ # stop=["\n\n"],
+ ),
+ # Additional parameters not shown
+ # highlight-end
+ )
+ # END RuntimeModelSelectionDeepseek
+
+ # clean up
+ client.collections.delete("DemoCollection")
+
# START BasicGenerativeNVIDIA
from weaviate.classes.config import Configure
diff --git a/docs/weaviate/model-providers/deepseek/generative.md b/docs/weaviate/model-providers/deepseek/generative.md
new file mode 100644
index 00000000..ce9a90b0
--- /dev/null
+++ b/docs/weaviate/model-providers/deepseek/generative.md
@@ -0,0 +1,204 @@
+---
+title: Generative AI
+description: "Weaviate's integration with DeepSeek's API allows you to access their generative models' capabilities directly from Weaviate."
+sidebar_position: 50
+image: og/docs/model-provider-integrations.jpg
+# tags: ['model providers', 'deepseek', 'generative', 'rag']
+---
+
+# DeepSeek Generative AI with Weaviate
+
+import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock';
+import PyConnect from '!!raw-loader!../_includes/provider.connect.py';
+import PyCode from '!!raw-loader!../_includes/provider.generative.py';
+
+Weaviate's integration with DeepSeek's API allows you to access their generative models' capabilities directly from Weaviate.
+
+[Configure a Weaviate collection](#configure-collection) to use a generative AI model with DeepSeek. Weaviate will perform retrieval augmented generation (RAG) using the specified model and your DeepSeek API key.
+
+More specifically, Weaviate will perform a search, retrieve the most relevant objects, and then pass them to the DeepSeek generative model to generate outputs.
+
+
+
+:::info Code examples are Python-only for now
+Examples for the other client languages will follow.
+:::
+
+## Requirements
+
+### Weaviate configuration
+
+Your Weaviate instance must be configured with the DeepSeek generative AI integration (`generative-deepseek`) module.
+
+:::info Added in `v1.36.19`, `v1.37.10`, and `v1.38.2`
+The `generative-deepseek` module is available from `v1.36.19` on the `v1.36` line, `v1.37.10` on the `v1.37` line, and `v1.38.2` on the `v1.38` line. Earlier patch releases on these lines do not include it.
+:::
+
+
+ For Weaviate Cloud (WCD) users
+
+This integration is enabled by default on Weaviate Cloud (WCD) instances.
+
+
+
+
+ For self-hosted users
+
+- Check the [cluster metadata](/deploy/configuration/status.md#cluster-metadata) to verify if the module is enabled.
+- Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
+- To enable the module, include it in the `ENABLE_MODULES` environment variable available to Weaviate, e.g. `ENABLE_MODULES="generative-deepseek"` (add it to your existing comma-separated list if other modules are enabled).
+
+
+
+### API credentials
+
+You must provide a valid DeepSeek API key to Weaviate for this integration. Go to [DeepSeek](https://platform.deepseek.com/) to sign up and obtain an API key.
+
+Provide the API key to Weaviate using one of the following methods:
+
+- Set the `DEEPSEEK_APIKEY` environment variable that is available to Weaviate.
+- Provide the API key at runtime, as shown in the examples below.
+
+
+
+## Configure collection
+
+import MutableGenerativeConfig from '/_includes/mutable-generative-config.md';
+
+
+
+Always set `model` explicitly. The module's built-in default is a retired model alias, so a collection configured without a `model` points at a model that DeepSeek no longer serves. See [Available models](#available-models) for the current model names.
+
+[Configure a Weaviate index](../../manage-collections/generative-reranker-models.mdx#specify-a-generative-model-integration) as follows to use a DeepSeek generative model:
+
+
+
+### Select a model
+
+Specify any current DeepSeek model name. See [Available models](#available-models) for the current names, and [Generative parameters](#generative-parameters) for the other settings you can configure alongside it.
+
+You can also [override the model at query time](#select-a-model-at-runtime).
+
+### Generative parameters
+
+Configure the following generative parameters to customize the model behavior.
+
+
+
+Weaviate checks `maxTokens` against a built-in ceiling only for the retired `deepseek-chat` and `deepseek-reasoner` aliases. For any current model, a `maxTokens` above the model's limit is accepted when you create the collection and fails later, as an error from DeepSeek at query time.
+
+For further details on model parameters, see the [DeepSeek API documentation](https://api-docs.deepseek.com/).
+
+## Select a model at runtime
+
+Aside from setting the default model provider when creating the collection, you can also override it at query time.
+
+
+
+## Header parameters
+
+You can provide the API key as well as some optional parameters at runtime through additional headers in the request. The following headers are available:
+
+- `X-Deepseek-Api-Key`: The DeepSeek API key.
+- `X-Deepseek-Baseurl`: The base URL to use (e.g. a proxy) instead of the default DeepSeek URL.
+
+`X-Deepseek-Api-Key` takes precedence over the `DEEPSEEK_APIKEY` environment variable. The API key is never part of the collection configuration, so if neither the header nor the environment variable is set, the request fails with `api key: no api key found`.
+
+`X-Deepseek-Baseurl` takes precedence over a `baseURL` set at query time, which in turn takes precedence over the `baseURL` in the collection configuration. If none of them are set, Weaviate uses `https://api.deepseek.com`. Provide an API root rather than a full endpoint path, because Weaviate appends `/chat/completions` to it.
+
+Provide the headers as shown in the [API credentials examples](#api-credentials) above.
+
+## Retrieval augmented generation
+
+After configuring the generative AI integration, perform RAG operations, either with the [single prompt](#single-prompt) or [grouped task](#grouped-task) method.
+
+### Single prompt
+
+
+
+To generate text for each object in the search results, use the single prompt method.
+
+The example below generates outputs for each of the `n` search results, where `n` is specified by the `limit` parameter.
+
+When creating a single prompt query, use braces `{}` to interpolate the object properties you want Weaviate to pass on to the language model. For example, to pass on the object's `title` property, include `{title}` in the query.
+
+
+
+### Grouped task
+
+
+
+To generate one text for the entire set of search results, use the grouped task method.
+
+In other words, when you have `n` search results, the generative model generates one output for the entire group.
+
+
+
+## References
+
+### Available models
+
+Weaviate forwards the configured model name to DeepSeek as-is. There is no allowlist on the Weaviate side, so any current DeepSeek model name is accepted.
+
+The current model names are `deepseek-v4-flash` and `deepseek-v4-pro`. For the full list of models and pricing, see the [DeepSeek pricing page](https://api-docs.deepseek.com/quick_start/pricing) and the [DeepSeek API documentation](https://api-docs.deepseek.com/).
+
+:::caution The module default is a retired model
+The `deepseek-chat` and `deepseek-reasoner` aliases are retired and DeepSeek no longer serves them. They previously pointed at `deepseek-v4-flash` in its non-thinking and thinking modes respectively.
+
+The built-in default model of the `generative-deepseek` module is still `deepseek-chat`, so a collection created without a `model` points at a retired alias. Set `model` on every collection you create.
+:::
+
+### Reasoning models
+
+The `generative-deepseek` module returns only the model's message content. If you use a reasoning model, its separate reasoning (chain-of-thought) output is not surfaced through the integration.
+
+Reasoning models can take much longer to respond than non-reasoning models. Weaviate applies the [`MODULES_CLIENT_TIMEOUT`](/deploy/configuration/env-vars/index.md#MODULES_CLIENT_TIMEOUT) environment variable to the whole request, including reading the response, and it defaults to 50 seconds. If reasoning queries time out, raise this value on your Weaviate instance.
+
+## Further resources
+
+### Code examples
+
+Once the integration is 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](../../manage-collections/index.mdx) and [How-to: Manage objects](../../manage-objects/index.mdx) guides show how to perform data operations (i.e. create, read, update, delete collections and objects within them).
+- The [How-to: Query & Search](../../search/index.mdx) guides show how to perform search operations (i.e. vector, keyword, hybrid) as well as retrieval augmented generation.
+
+### References
+
+- [DeepSeek API documentation](https://api-docs.deepseek.com/)
+
+## Questions and feedback
+
+import DocsFeedback from '/_includes/docs-feedback.mdx';
+
+
diff --git a/docs/weaviate/model-providers/deepseek/index.md b/docs/weaviate/model-providers/deepseek/index.md
new file mode 100644
index 00000000..ae10085f
--- /dev/null
+++ b/docs/weaviate/model-providers/deepseek/index.md
@@ -0,0 +1,45 @@
+---
+title: DeepSeek + Weaviate
+description: "DeepSeek offers a range of models for natural language processing and generation. Weaviate seamlessly integrates with the DeepSeek API, allowing users to leverage DeepSeek's generative models directly from the Weaviate Database."
+sidebar_position: 10
+image: og/docs/model-provider-integrations.jpg
+# tags: ['model providers', 'deepseek']
+---
+
+
+
+DeepSeek offers a range of models for natural language processing and generation. Weaviate seamlessly integrates with the DeepSeek API, allowing users to leverage DeepSeek's generative models directly from the Weaviate Database.
+
+This integration empowers developers to build sophisticated AI-driven applications with ease.
+
+## Integrations with DeepSeek
+
+### Generative AI models for RAG
+
+
+
+DeepSeek's generative AI models can generate human-like text based on given prompts and contexts.
+
+[Weaviate's generative AI integration](./generative.md) enables users to perform retrieval augmented generation (RAG) directly from the Weaviate Database. This combines Weaviate's efficient storage and fast retrieval capabilities with DeepSeek's generative AI models to generate personalized and context-aware responses.
+
+[DeepSeek generative AI integration page](./generative.md)
+
+## Summary
+
+This integration enables developers to leverage DeepSeek's generative models directly within Weaviate.
+
+In turn, it simplifies the process of building AI-driven applications to speed up your development process, so that you can focus on creating innovative solutions.
+
+## Get started
+
+You must provide a valid DeepSeek API key to Weaviate for this integration. Go to [DeepSeek](https://platform.deepseek.com/) to sign up and obtain an API key.
+
+Then, go to the relevant integration page to learn how to configure Weaviate with the DeepSeek models and start using them in your applications.
+
+- [Generative AI](./generative.md)
+
+## Questions and feedback
+
+import DocsFeedback from '/_includes/docs-feedback.mdx';
+
+
diff --git a/docs/weaviate/model-providers/index.md b/docs/weaviate/model-providers/index.md
index d6c85263..f41e4360 100644
--- a/docs/weaviate/model-providers/index.md
+++ b/docs/weaviate/model-providers/index.md
@@ -24,6 +24,7 @@ This enables an enhanced developed experience, such as the ability to:
| [Cohere](./cohere/index.md) | [Text](./cohere/embeddings.md), [Multimodal](./cohere/embeddings-multimodal.md) | [Text](./cohere/generative.md) | [Reranker](./cohere/reranker.md) |
| [Contextual AI](./contextualai/index.md) | - | [Text](./contextualai/generative.md) | [Reranker](./contextualai/reranker.md) |
| [Databricks](./databricks/index.md) | [Text](./databricks/embeddings.md) | [Text](./databricks/generative.md) | - |
+| [DeepSeek](./deepseek/index.md) | - | [Text](./deepseek/generative.md) | - |
| [DigitalOcean](./digitalocean/index.md) | [Text](./digitalocean/embeddings.md) | - | - |
| [FriendliAI](./friendliai/index.md) | - | [Text](./friendliai/generative.md) | - |
| [Google](./google/index.md) | [Text](./google/embeddings.md), [Multimodal](./google/embeddings-multimodal.md) | [Text](./google/generative.md) | - |
diff --git a/sidebars.js b/sidebars.js
index 2e07fe83..b4414870 100644
--- a/sidebars.js
+++ b/sidebars.js
@@ -238,6 +238,16 @@ const sidebars = {
"weaviate/model-providers/databricks/generative",
],
},
+ {
+ type: "category",
+ label: "DeepSeek",
+ className: "sidebar-item",
+ link: {
+ type: "doc",
+ id: "weaviate/model-providers/deepseek/index",
+ },
+ items: ["weaviate/model-providers/deepseek/generative"],
+ },
{
type: "category",
label: "DigitalOcean",