From 7f9c0d0e5917d62d13b75d3c788fa47c110658a0 Mon Sep 17 00:00:00 2001 From: Connor Shorten Date: Tue, 26 May 2026 08:49:35 -0400 Subject: [PATCH 01/84] add docs for follow-up queries in Suggest Queries Mode --- docs/agents/_includes/query_agent.mts | 24 ++++++++++++++++++++++++ docs/agents/_includes/query_agent.py | 22 ++++++++++++++++++++++ docs/agents/query/usage.md | 25 +++++++++++++++++++++++++ 3 files changed, 71 insertions(+) diff --git a/docs/agents/_includes/query_agent.mts b/docs/agents/_includes/query_agent.mts index a671d6526..5e3924826 100644 --- a/docs/agents/_includes/query_agent.mts +++ b/docs/agents/_includes/query_agent.mts @@ -606,6 +606,30 @@ for (const suggestedQuery of suggestResponse.queries) { } // END SuggestQueries +// START SuggestQueriesWithConversation +// Build a conversation history +const suggestConversation: ChatMessage[] = [ + { + role: "user", + content: "What are some popular machine learning frameworks?", + }, + { + role: "assistant", + content: "Some popular ML frameworks include TensorFlow, PyTorch, and JAX.", + }, +]; + +// Suggest follow-up queries based on the conversation context +const suggestWithConvoResponse = await qa.suggestQueries({ + conversation: suggestConversation, + numQueries: 3, +}); + +for (const suggestedQuery of suggestWithConvoResponse.queries) { + console.log(suggestedQuery.query); +} +// END SuggestQueriesWithConversation + await client.close() } diff --git a/docs/agents/_includes/query_agent.py b/docs/agents/_includes/query_agent.py index d76ef6303..a55c2b770 100644 --- a/docs/agents/_includes/query_agent.py +++ b/docs/agents/_includes/query_agent.py @@ -689,3 +689,25 @@ async def run_streaming_query(): for suggested_query in response.queries: print(suggested_query.query) # END SuggestQueries + +# START SuggestQueriesWithConversation +from weaviate.agents.classes import ChatMessage + +# Build a conversation history +conversation = [ + ChatMessage(role="user", content="What are some popular machine learning frameworks?"), + ChatMessage( + role="assistant", + content="Some popular ML frameworks include TensorFlow, PyTorch, and JAX.", + ), +] + +# Suggest follow-up queries based on the conversation context +response = qa.suggest_queries( + conversation=conversation, + num_queries=3, +) + +for suggested_query in response.queries: + print(suggested_query.query) +# END SuggestQueriesWithConversation diff --git a/docs/agents/query/usage.md b/docs/agents/query/usage.md index 9d6bbe8e9..a84495014 100644 --- a/docs/agents/query/usage.md +++ b/docs/agents/query/usage.md @@ -499,6 +499,31 @@ You can optionally specify: +#### `Suggest Queries`: Follow-Up Queries + +You can pass a `conversation` to `Suggest Queries` to generate follow-up query suggestions based on the conversation history. This is useful for guiding users toward relevant next questions after an initial exchange. + +The `conversation` parameter accepts a list of `ChatMessage` objects, using the same format as [conversational queries](#conversational-queries). + + + + + + + + + + ## Stream responses The Query Agent can also stream responses, allowing you to receive the answer as it is being generated. From 5502eab28ae4111e71cb16e07a87783d502a13d6 Mon Sep 17 00:00:00 2001 From: dannyjameswilliams Date: Mon, 22 Jun 2026 15:57:20 +0100 Subject: [PATCH 02/84] docs: add new structured output section --- .../_includes/code/structured_outputs.mts | 108 +++++ .../_includes/code/structured_outputs.py | 102 ++++ docs/query-agent/guides/ask_mode.md | 21 +- docs/query-agent/reference/index.md | 2 +- .../reference/structured_outputs.md | 440 ++++++++++++++++++ sidebars.js | 5 + 6 files changed, 674 insertions(+), 4 deletions(-) create mode 100644 docs/query-agent/_includes/code/structured_outputs.mts create mode 100644 docs/query-agent/_includes/code/structured_outputs.py create mode 100644 docs/query-agent/reference/structured_outputs.md diff --git a/docs/query-agent/_includes/code/structured_outputs.mts b/docs/query-agent/_includes/code/structured_outputs.mts new file mode 100644 index 000000000..40e96982f --- /dev/null +++ b/docs/query-agent/_includes/code/structured_outputs.mts @@ -0,0 +1,108 @@ +import 'dotenv/config' +const { loadClientInternally } = await import('./util.mjs').catch(() => import('../docs/query-agent/_includes/code/util.mjs')); + +const client = await loadClientInternally(); + + +// START SOInstantiate +import { QueryAgent } from 'weaviate-agents'; + +const qa = new QueryAgent(client, { collections: ['FinancialContracts'] }); +// END SOInstantiate + + +// START SOBasicExampleBaseModel +import { z } from 'zod'; + +const ContractSummary = z.object({ + contract_id: z.string(), + contract_title: z.string(), + auto_renew: z.boolean(), + parties_involved: z.array(z.string()), + requires_action: z.boolean(), +}); + +const res = await qa.ask( + "Find the oldest contract and include if it automatically renews, who is involved, and if user action is needed", + { outputFormat: ContractSummary } +); + +console.log(res.finalAnswerParsed); +// END SOBasicExampleBaseModel + + +// START SOBasicDictExample +const res2 = await qa.ask( + "Find the oldest contract and include if it automatically renews, who is involved, and if user action is needed", + { + outputFormat: { + type: "object", + properties: { + contract_id: { title: "Contract Id", type: "string" }, + contract_title: { title: "Contract Title", type: "string" }, + auto_renew: { title: "Auto Renew", type: "boolean" }, + parties_involved: { items: { type: "string" }, title: "Parties Involved", type: "array" }, + requires_action: { title: "Requires Action", type: "boolean" }, + }, + required: ["contract_id", "contract_title", "auto_renew", "parties_involved", "requires_action"], + title: "ContractSummary", + additionalProperties: false, + }, + } +); + +console.log(res2.finalAnswerParsed); +// END SOBasicDictExample + + +// START SOReasoningExample +const FinalAnswer = z.object({ + reasoning: z.string(), + final_answer: z.string(), +}); + +const res3 = await qa.ask("What is the most recent contract about AI?", { outputFormat: FinalAnswer }); + +console.log(res3.finalAnswerParsed); +// END SOReasoningExample + + +// START SONestedExampleBaseModel +const ContractInfo = z.object({ + names_mentioned: z.array(z.string()).describe("All names within the contract text"), + contract_type: z.enum(["sales", "purchase", "other"]).describe("Determine the type of contract"), + summary: z.string().describe("Provide a brief summary of the contract."), + contract_uuid: z.uuid(), +}); + +const ContractInfoResponse = z.object({ + contract_infos: z.array(ContractInfo), + overall_summary: z.string(), +}); + +const res4 = await qa.ask("Find and return all contracts about AI in 2023", { outputFormat: ContractInfoResponse }); + +console.log(res4.finalAnswerParsed); +// END SONestedExampleBaseModel + + +// START SOCitationExample +const CitedText = z.object({ + sentence: z.string().describe("A single sentence from your answer, to be combined with other sentences"), + sources: z.array(z.uuid()).describe("The UUIDs of the sources that support the sentence"), +}); + +const CitedAnswer = z.object({ + reasoning: z.string(), + final_answer: z.array(CitedText).describe( + "A list of cited sentences, that will combine together in a paragraph to be a full answer" + ), +}); + +const res5 = await qa.ask("What is the most recent contract about AI?", { outputFormat: CitedAnswer }); + +console.log(res5.finalAnswerParsed); +// END SOCitationExample + + +await client.close(); diff --git a/docs/query-agent/_includes/code/structured_outputs.py b/docs/query-agent/_includes/code/structured_outputs.py new file mode 100644 index 000000000..80d7673f5 --- /dev/null +++ b/docs/query-agent/_includes/code/structured_outputs.py @@ -0,0 +1,102 @@ +import sys +sys.path.insert(0, "docs/query-agent/_includes/code") +from util import load_client_internally + +client = load_client_internally() + + +# START SOInstantiate +from weaviate.agents.query import QueryAgent + +qa = QueryAgent(client=client, collections=["FinancialContracts"]) +# END SOInstantiate + + +# START SOBasicExampleBaseModel +from pydantic import BaseModel + +class ContractSummary(BaseModel): + contract_id: str + contract_title: str + auto_renew: bool + parties_involved: list[str] + requires_action: bool + +res = qa.ask( + "Find the oldest contract and include if it automatically renews, who is involved, and if user action is needed", + output_format=ContractSummary, +) + +print(res.final_answer_parsed) +# END SOBasicExampleBaseModel + +# START SOBasicDictExample +res = qa.ask( + "Find the oldest contract and include if it automatically renews, who is involved, and if user action is needed", + output_format={ + 'properties': { + 'contract_id': {'title': 'Contract Id', 'type': 'string'}, + 'contract_title': {'title': 'Contract Title', 'type': 'string'}, + 'auto_renew': {'title': 'Auto Renew', 'type': 'boolean'}, + 'parties_involved': {'items': {'type': 'string'}, 'title': 'Parties Involved', 'type': 'array'}, + 'requires_action': {'title': 'Requires Action', 'type': 'boolean'} + }, + 'required': ['contract_id', 'contract_title', 'auto_renew', 'parties_involved', 'requires_action'], + 'title': 'ContractSummary', + 'type': 'object' + } +) + +print(res.final_answer_parsed) +# END SOBasicDictExample + +# START SOReasoningExample +from pydantic import BaseModel + +class FinalAnswer(BaseModel): + reasoning: str + final_answer: str + +res = qa.ask("What is the most recent contract about AI?", output_format=FinalAnswer) + +print(res.final_answer_parsed) +# END SOReasoningExample + +# START SONestedExampleBaseModel +from pydantic import BaseModel, Field +from uuid import UUID +from typing import Literal + +class ContractInfo(BaseModel): + names_mentioned: list[str] = Field(description="All names within the contract text") + contract_type: Literal["sales", "purchase", "other"] = Field(description="Determine the type of contract") + summary: str = Field(description="Provide a brief summary of the contract.") + contract_uuid: UUID + +class ContractInfoResponse(BaseModel): + contract_infos: list[ContractInfo] + overall_summary: str + +res = qa.ask("Find and return all contracts about AI in 2023", output_format=ContractInfoResponse) + +print(res.final_answer_parsed) +# END SONestedExampleBaseModel + +# START SOCitationExample +from pydantic import BaseModel +from uuid import UUID + +class CitedText(BaseModel): + sentence: str = Field(description="A single sentence from your answer, to be combined with other sentences") + sources: list[UUID] = Field(description="The UUIDs of the sources that support the sentence") + +class CitedAnswer(BaseModel): + reasoning: str + final_answer: list[CitedText] = Field( + description="A list of cited sentences, that will combine together in a paragraph to be a full answer" + ) + +res = qa.ask("What is the most recent contract about AI?", output_format=CitedAnswer) + +print(res.final_answer_parsed) +# END SOCitationExample \ No newline at end of file diff --git a/docs/query-agent/guides/ask_mode.md b/docs/query-agent/guides/ask_mode.md index 9913257af..b16f6795a 100644 --- a/docs/query-agent/guides/ask_mode.md +++ b/docs/query-agent/guides/ask_mode.md @@ -66,7 +66,8 @@ The `.ask()` method accepts several arguments: | --- | --- | --- | | `query` | `str \| list[ChatMessage]` | The user query you want the agent to answer. This can be a simple string (`"What is the highest-grossing product?"`) or a list of chat messages (for conversational context). [See the page on multi-turn conversations for more detail](../reference/multi_turn_conversations.md). | | `collections` | `list[str \| QueryAgentCollectionConfig] \| None` | The name(s) of the collections to search. You can pass one or many collection names as a list of strings (e.g., `["ECommerce", "BookSales"]`), or provide collection configuration objects for more control. If specified in the `ask` method, it will overwrite those defined in the instantiation of `QueryAgent`. [See the page on collection configuration for more detail](../reference/advanced_collections.md). | -| `result_evaluation` | `Literal["llm", "none"]` | Controls whether the agent will ask an LLM to "evaluate" (i.e., rewrite or rephrase) the result based on all retrieved context. Accepts either:
• `"none"` (default): faster and cheaper; where the final answer is the last LLM call and no further analysis is completed.
• `"llm"`: higher cost/latency - enables a final step where an LLM subsets the sources retrieved to only those used in the answer, as well as enabling the optional fields `is_partial_answer` and `missing_information`. See [the response class](#response) for more details. | +| `result_evaluation` | `Literal["llm", "none"]` | Controls whether the agent will ask an LLM to "evaluate" the result based on all retrieved context. Accepts either:
• `"none"` (default): faster and cheaper; where the final answer is the last LLM call and no further analysis is completed.
• `"llm"`: higher cost/latency - enables a final step where an LLM subsets the sources retrieved to only those used in the answer, as well as enabling the optional fields `is_partial_answer` and `missing_information`. See [the response class](#response) for more details. | +| `output_format` | `dict \| type[BaseModel] \| None` | Optional schema for structured output in the final response. Modifies the `final_answer` field of the [response class](#response). See [the page on structured output for more details](../reference/structured_outputs.md). | @@ -74,8 +75,8 @@ The `.ask()` method accepts several arguments: | --- | --- | --- | | `query` | `string \| ChatMessage[]` | The user query you want the agent to answer. This can be a simple string (`"What is the highest-grossing product?"`) or a list of chat messages (for conversational context). [See the page on multi-turn conversations for more detail](../reference/multi_turn_conversations.md). | | `collections` | `(string \| QueryAgentCollectionConfig)[]` | The name(s) of the collections to search. You can pass one or many collection names as a list of strings (e.g., `["ECommerce", "BookSales"]`), or provide collection configuration objects for more control. [See the page on collection configuration for more detail](../reference/advanced_collections.md). If specified in the `ask` method, it will overwrite those defined in the instantiation of `QueryAgent`. | -| `resultEvaluation` | `"llm" \| "none"` | Controls whether the agent will ask an LLM to "evaluate" (i.e., rewrite or rephrase) the result based on all retrieved context. Accepts either:
• `"none"`: faster and cheaper; default setting where the final answer is the last LLM call.
• `"llm"`: higher cost/latency - enables a final step where an LLM subsets the sources retrieved to only those used in the answer, as well as enabling the optional fields `is_partial_answer` and `missing_information`. See [the response class](#response) for more details. | - +| `resultEvaluation` | `"llm" \| "none"` | Controls whether the agent will ask an LLM to "evaluate" the result based on all retrieved context. Accepts either:
• `"none"`: faster and cheaper; default setting where the final answer is the last LLM call.
• `"llm"`: higher cost/latency - enables a final step where an LLM subsets the sources retrieved to only those used in the answer, as well as enabling the optional fields `is_partial_answer` and `missing_information`. See [the response class](#response) for more details. | +| `outputFormat` | `ZodType \| object` | Optional schema for structured output in the final response. Pass a [Zod](https://zod.dev/) schema (parsed and validated) or a raw [Draft 2020-12 JSON Schema](https://json-schema.org/draft/2020-12) object (parsed only). Modifies the `finalAnswer` field of the [response class](#response), exposing the typed result on `finalAnswerParsed`. See [the page on structured output for more details](../reference/structured_outputs.md). |
@@ -99,6 +100,13 @@ The `AskModeResponse` class has the following properties: | `final_answer` | `str` | A string comprising the LLM's final answer to the user query. | | `sources` | `list[Source] \| None` | A list of `Source` objects, which have an `object_id` property correlating to the UUID of the Weaviate object that was retrieved during the run. If `result_evaluation` is `"llm"`, these are subset to only those that are relevant to the `final_answer`. | +Additionally, there is another field if the `output_format` parameter on the call to ask mode (`qa.ask(..., output_format=...)`) was not `None`: +| Field | Type | Description | +| --- | --- | --- | +| `final_answer_parsed` | `` | The final response, conforming to the schema given in the `output_format`. | + +The type of `final_answer_parsed` is a `dict` if a dictionary was supplied to `output_format`, otherwise it will be the exact type of the `BaseModel` given. + [See the client documentation for more detail.](https://weaviate-python-client.readthedocs.io/en/latest/weaviate-agents-python-client/docs/weaviate_agents.classes.html#weaviate_agents.classes.AskModeResponse) @@ -115,6 +123,13 @@ The `AskModeResponse` class has the following properties: | `finalAnswer` | `string` | A string comprising the LLM's final answer to the user query. | | `sources` | `Source[]` | A list of `Source` objects, which have an `objectId` property correlating to the UUID of the Weaviate object that was retrieved during the run. If `resultEvaluation` is `"llm"`, these are subset to only those that are relevant to the `finalAnswer`. | +Additionally, there is another field if the `outputFormat` parameter on the call to ask mode (`qa.ask(..., { outputFormat: ... })`) was provided: +| Field | Type | Description | +| --- | --- | --- | +| `finalAnswerParsed` | `` | The final response, conforming to the schema given in `outputFormat`. | + +The type of `finalAnswerParsed` is `Record` if a raw JSON Schema object was supplied to `outputFormat`, otherwise it will be the inferred type of the Zod schema given (`z.infer`). + [See the client documentation for more detail.](https://weaviate.github.io/agents-typescript-client/types/AskModeResponse.html) diff --git a/docs/query-agent/reference/index.md b/docs/query-agent/reference/index.md index f121d088d..e05e24593 100644 --- a/docs/query-agent/reference/index.md +++ b/docs/query-agent/reference/index.md @@ -12,7 +12,7 @@ See the different configuration options for the Query Agent and how you can cust * **[Multi-turn Conversations](./multi_turn_conversations.md)**: Learn how to include multiple turns of conversations in a message history instead of a single user query. * **[Additional Filters](./additional_filters.md)**: Define persistent filters that get added to every search the Query Agent performs. * **[Collection Configuration](./advanced_collections.md)**: Setup your collections with more advanced configurations, such as named vectors, multi-tenancy and additional filters. - +* **[Structured Outputs](./structured_outputs.md)**: Configure the format of the ask mode response to conform to a schema. ## Questions and feedback diff --git a/docs/query-agent/reference/structured_outputs.md b/docs/query-agent/reference/structured_outputs.md new file mode 100644 index 000000000..9e0ec058a --- /dev/null +++ b/docs/query-agent/reference/structured_outputs.md @@ -0,0 +1,440 @@ +--- +title: Structured Outputs +description: "Conform the final response to a particular schema." +image: og/docs/query-agent.png +# tags: ['agents', 'query-agent', 'configuration'] +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import PyCode from '!!raw-loader!/docs/query-agent/_includes/code/structured_outputs.py'; +import TSCode from '!!raw-loader!/docs/query-agent/_includes/code/structured_outputs.mts'; + + +Structured outputs ensure that the model's final response will adhere to a given schema. This means you can easily access aspects of a response which is customised to your use-case. + +## Basic Usage + + + + In Python, you can either provide a Pydantic `BaseModel` or a raw dictionary conforming to the [Draft 2020-12 JSON Schema](https://json-schema.org/draft/2020-12) specification. + + In the below examples, we use structured outputs to generate a set of metadata associated with a single retrieved item. + + The structured output can be accessed by a new field, `final_answer_parsed`, which appears only when the `output_format` argument is not `None`. The raw string from the model can still be accessed at `final_answer`. + + ### Pydantic BaseModel + + +
+ Example output + ```python + ContractSummary( + contract_id='46', + contract_title='Employment Contract', + auto_renew=False, + parties_involved=['Weaviate', 'Mark Robson'], + requires_action=True + ) + ``` +
+ + + ### Dictionary + + +
+ Example output + ```python + { + 'contract_id': '46', + 'contract_title': 'Employment Contract', + 'auto_renew': False, + 'parties_involved': ['Weaviate', 'Mark Robson'], + 'requires_action': True + } + ``` +
+ +
+ + In JavaScript/TypeScript, you can either provide a [Zod](https://zod.dev/) schema or a raw object conforming to the [Draft 2020-12 JSON Schema](https://json-schema.org/draft/2020-12) specification. + + In the below examples, we use structured outputs to generate a set of metadata associated with a single retrieved item. + + The structured output can be accessed by a new field, `finalAnswerParsed`, which appears only when the `outputFormat` argument is not null. The raw string from the model can still be accessed at `finalAnswer`. + + ### Zod schema + +
+ Example output + ```typescript + { + contract_id: '46', + contract_title: 'Employment Contract', + auto_renew: false, + parties_involved: [ 'Weaviate', 'Mark Robson' ], + requires_action: true + } + ``` +
+ + ### Object + +
+ Example output + ```typescript + { + contract_id: '46.0', + contract_title: 'Employment Contract', + auto_renew: false, + parties_involved: [ 'Weaviate', 'Mark Robson' ], + requires_action: true + } + ``` +
+ +
+
+ +## Example: Reasoning + +As a basic example, consider adding an additional field `reasoning` to the response. Order is preserved in the specification, so if this is provided _before_ the answer field, the model will produce a reasoning string before writing its answer, which can provide explainability to a response. + + + + +
+ Example output + ```python + FinalAnswer( + reasoning='The most recent contract mentioning AI is the sales agreement dated 2024-03-15, but it does not mention AI in the text. The most recent contract that is actually about AI is the partnership agreement dated 2023-11-15 between Weaviate and FictionalSoft, which explicitly states it is for artificial intelligence research and development. No later AI-related contract is present in the provided data.', + final_answer='The most recent contract about AI is the partnership agreement dated 2023-11-15 between Weaviate and FictionalSoft. It is specifically for collaboration on artificial intelligence research and development. No more recent AI-related contract appears in the provided data.' + ) + ``` +
+
+ + +
+ Example output + ```typescript + { + reasoning: 'The most recent contract related to AI is the partnership agreement dated 2024-03-15 at 10:30 UTC. It specifically mentions collaboration on artificial intelligence research and development.', + final_answer: 'The most recent AI-related contract is a **Partnership Agreement** dated **2024-03-15 10:30 UTC** between **Weaviate** and **FictionalSoft**. It says the parties wish to establish a partnership to collaborate on **artificial intelligence research and development**. It has a **2-year term** and includes financial contributions of **$244.46 from Weaviate** and **$151.01 from FictionalSoft**, with profits split **50/50**.\n' + + '\n' + + 'If you want, I can also summarize the next most recent AI-related contract.' + } + ``` +
+
+
+ +## Example: Nested Schemas + +Nested schemas are supported, for example, you can define two schemas and have one reference the other, allowing more complex structured outputs to be crafted. + +In the below example, the final response will generate a list of information for each object that was retrieved, either extracted or generated from the content of the data, as well as providing an overall answer. + + + + +
+ Example output + ```python + ContractInfoResponse( + contract_infos=[ + ContractInfo( + names_mentioned=['Hans Zimmer', 'Weaviate', 'Mark Robson'], + contract_type='other', + summary='Loan agreement between Weaviate and Mark Robson for $342.00, dated 2023-03-15.', + contract_uuid=UUID('b2c4ffdc-411c-423a-9040-b7cbf5439bd0') + ), + ContractInfo( + names_mentioned=['John Smith', 'Weaviate'], + contract_type='other', + summary='Non-disclosure agreement between Weaviate and John Smith, dated 2022-03-15.', + contract_uuid=UUID('c126e3d3-db85-4a77-b49c-2a87fe48cd52') + ), + ContractInfo( + names_mentioned=['Johnathan Smith', 'Weaviate', 'John Smith'], + contract_type='other', + summary='Lease agreement for office space between Weaviate and John Smith, dated 2024-03-15.', + contract_uuid=UUID('6bbca4b9-fea1-4275-889a-1f5d4591ecbb') + ), + ContractInfo( + names_mentioned=['Arthur Penndragon', 'Weaviate', 'Mark Robson'], + contract_type='other', + summary='Loan agreement between Weaviate and Mark Robson for $620.41, dated 2023-03-15.', + contract_uuid=UUID('93213fd4-4c55-4a7c-a190-2e4c9d808566') + ), + ContractInfo( + names_mentioned=['Alice Johnson', 'Weaviate', 'Danny Williams'], + contract_type='other', + summary='Service agreement for digital marketing services between Weaviate and Danny Williams, dated + 2023-03-15, with total compensation of $961.89.', + contract_uuid=UUID('eed7d7f9-b06a-4d7b-b19a-f0f3782e49fd') + ), + ContractInfo( + names_mentioned=['Weaviate', 'John Smith'], + contract_type='other', + summary='Loan agreement between Weaviate and John Smith for $403.65, dated 2022-03-15.', + contract_uuid=UUID('5f75ec7e-ca7f-415c-9f5d-7d3a1518fad8') + ), + ContractInfo( + names_mentioned=['Hans Zimmer', 'Weaviate', 'Mark Robson'], + contract_type='sales', + summary='Sales agreement between Weaviate and Mark Robson for software licenses and support services, + dated 2023-04-24, with a total purchase price of $420.03.', + contract_uuid=UUID('174b1a9a-e9b2-4f48-960d-283a0fbbe3ab') + ), + ContractInfo( + names_mentioned=['John Williams', 'Weaviate', 'Mark Robson'], + contract_type='other', + summary='Service agreement between Weaviate and Mark Robson for consultation, software development, and + project management services, dated 2023-04-15, with total compensation of $744.35.', + contract_uuid=UUID('65848d82-e38e-4bed-b0bb-0c2830af8b27') + ), + ContractInfo( + names_mentioned=['John Williams', 'Weaviate'], + contract_type='other', + summary='Invoice from Weaviate to John Williams for data analysis, API integration, system maintenance, + technical support, and consultation services, dated 2023-10-15, totaling $873.17.', + contract_uuid=UUID('5b5544f9-7092-45d0-830d-dd211b0f3a70') + ), + ContractInfo( + names_mentioned=['Kaladin Stormblessed', 'Weaviate', 'John Smith'], + contract_type='other', + summary='Lease agreement between Weaviate and John Smith for office space, dated 2023-07-15.', + contract_uuid=UUID('f3f3730b-f3c4-4b2f-aa7a-1bc07b5814d8') + ), + ContractInfo( + names_mentioned=['Johnathan Smith', 'Weaviate', 'Mark Robson'], + contract_type='other', + summary='Non-disclosure agreement between Weaviate and Mark Robson, dated 2023-09-15.', + contract_uuid=UUID('3d4d802d-1820-4a5f-b8fe-6c5e189de1e6') + ), + ContractInfo( + names_mentioned=['John Williams', 'Weaviate', 'Danny Williams'], + contract_type='sales', + summary='Sales agreement between Weaviate and Danny Williams for products A, B, and C, dated + 2023-11-15, with a total purchase price of $270.68.', + contract_uuid=UUID('e645324e-14a4-4ca4-aeae-da146d55a3bb') + ), + ContractInfo( + names_mentioned=['John Williams', 'Weaviate', 'Mark Robson'], + contract_type='other', + summary='Invoice from Weaviate to Mark Robson dated 2023-04-15 for consultation, software development, + and project management services, totaling $744.35.', + contract_uuid=UUID('48a58d82-e38e-4bed-b0bb-0c2830af8b27') + ), + ContractInfo( + names_mentioned=['John Williams', 'Weaviate', 'John Smith'], + contract_type='other', + summary='Invoice from Weaviate to John Smith dated 2023-10-15 for consultation, development, and + additional charges, totaling $296.36.', + contract_uuid=UUID('03c0f5bb-f999-4b8b-86f3-271405de0037') + ), + ContractInfo( + names_mentioned=['Johnathan Smith', 'Weaviate', 'Danny Williams'], + contract_type='other', + summary='Service agreement between Weaviate and Danny Williams for software development, technical + support, and consultation services, dated 2023-03-15, with compensation of $273.86.', + contract_uuid=UUID('d68e20a9-4bd4-42d0-8986-d16425c3444a') + ) + ], + overall_summary='There are multiple 2023 contracts related to AI, including two partnership agreements about artificial intelligence research and development, plus other 2023 contracts mentioning AI-adjacent services. Some listed contracts are not directly about AI but were returned from the available matching set.' + ) + ``` +
+ A `Field` can be used to provide additional metadata, such as a `description`, or even constraints on numeric objects. A `Literal` can be used to constrain a field to produce only one of a few different objects. +
+ + + A `.describe()` call can be used to provide additional metadata, such as a description, or even constraints on numeric objects. A `z.enum()` can be used to constrain a field to produce only one of a few different objects. +
+ Example output + ```typescript + { + contract_infos: [ + { + names_mentioned: [Array], + contract_type: 'other', + summary: 'Partnership agreement to collaborate on artificial intelligence research and development, including shared contributions, responsibilities, and profit or revenue sharing. Date: 2023-03-15.', + contract_uuid: '583a63f9-f71b-4926-8075-2ade04a689c3' + }, + { + names_mentioned: [Array], + contract_type: 'other', + summary: 'Partnership agreement to collaborate on artificial intelligence projects and develop innovative AI solutions, with financial contributions, roles, and termination terms. Date: 2022-03-15.', + contract_uuid: '301d007b-53b4-4ce5-9913-a4b3f28fae2f' + }, + { + names_mentioned: [Array], + contract_type: 'other', + summary: 'Partnership agreement focused on artificial intelligence and machine learning collaboration, including resource contributions, revenue sharing, confidentiality, and termination terms. Date: 2023-03-15.', + contract_uuid: 'c2d4620b-db64-4b20-ac10-dd805d9b135d' + }, + { + names_mentioned: [Array], + contract_type: 'other', + summary: 'Partnership agreement to advance artificial intelligence technologies through combined resources and expertise, with defined contributions, responsibilities, and termination provisions. Date: 2023-03-15.', + contract_uuid: 'bbfd975d-85e8-47f1-acae-8d46ff028272' + }, + { + names_mentioned: [Array], + contract_type: 'other', + summary: 'Partnership agreement to collaborate on artificial intelligence projects, with project management, technical development, funding contributions, and termination terms. Date: 2023-03-15.', + contract_uuid: '6e2f283c-0e29-4daa-979f-800dffe476fb' + }, + { + names_mentioned: [Array], + contract_type: 'other', + summary: 'Service agreement for data analysis, cloud computing, software development, technical support, and consultation services. It includes compensation, confidentiality, and termination terms. Date: 2023-03-15 to 2023-09-15 depending on the agreement.', + contract_uuid: '8cab56ce-512e-47ef-9a38-5d5fa829444e' + }, + { + names_mentioned: [Array], + contract_type: 'other', + summary: 'Service agreement providing consulting on artificial intelligence and data management systems, including implementation, training, and technical support. Date: 2023-03-15.', + contract_uuid: '24541d4f-d84c-4cbe-b935-60cbc64c170e' + } + ], + overall_summary: 'The AI-related contracts available are partnership and service agreements from 2022–2023, with one purchase order and several invoices that mention AI or related services.' + } + ``` +
+
+
+ +## Example: Citations + +For a custom implementation of citing text (for example, if you want citations in-line), you could create a schema that iteratively builds a response from objects consisting of pairs of text and source IDs. + +:::note Supported Citations +The Query Agent natively supports subsetting and evaluating the quality of the response via the `result_evaluation` parameter in ask mode. [See here for more details](../guides/ask_mode.md#parameters) +::: + + + + +
+ Example output + ```python + CitedAnswer( + reasoning='The most recent contract mentioning AI is the partnership agreement dated 2024-03-15, which explicitly refers to AI-related work only in the contract text by implication? However, among the provided contracts, the latest one that clearly concerns AI is the partnership agreement from 2023-11-15, and another earlier partnership agreement from 2023-10-15 also mentions AI solutions. The 2024-03-15 sales agreement does not mention AI, so it is not relevant. The latest clearly AI-related contract in the data is the 2023-11-15 partnership agreement between Weaviate and FictionalSoft.', + final_answer=[ + CitedText( + sentence='The most recent contract about AI is the partnership agreement dated 2023-11-15 between Weaviate and FictionalSoft.', + sources=[UUID('4601c407-7905-4bd5-a1b9-4234bf18e9b6')] + ), + CitedText( + sentence='It says the parties will collaborate on projects including artificial intelligence research and development, with a three-year term and 50/50 profit sharing.', + sources=[UUID('4601c407-7905-4bd5-a1b9-4234bf18e9b6')] + ) + ] + ) + ``` +
+
+ + +
+ Example output + ```typescript + { + reasoning: 'The most recent contract that explicitly concerns AI is the partnership agreement dated 2023-11-15 between Weaviate and FictionalSoft, which states that the parties wish to collaborate on artificial intelligence research and development. Among the provided contracts, no later agreement mentions AI, and later-dated documents are sales or lease agreements without AI-related terms.', + final_answer: [ + { + sentence: 'The most recent AI-related contract is the partnership agreement dated November 15, 2023, between Weaviate and FictionalSoft, which is for collaboration on artificial intelligence research and development.', + sources: [Array] + }, + { + sentence: 'No later contract in the provided set mentions AI; the newer 2024 documents are a sales agreement and lease agreements that do not reference artificial intelligence.', + sources: [Array] + } + ] + } + ``` +
+
+
+ +## What is supported? + + +| Feature | Supported? | Notes | +|---------|:----------:|-------| +| Min / max number of items in an array | ✅ | | +| Min / max value of a number property | ✅ | E.g. constrain a value to be within a certain range. | +| String formats: `uuid`, `date-time`, `time`, `date`, `duration`, `email`, `hostname`, `ipv4`, `ipv6` | ✅ | Validated as a string with the given format. | +| Regular expression (pattern) on a string | ✅ | | +| Recursive schemas (a schema referencing itself) | ✅ | | +| Default values (e.g. `x: int = 1`) | ❌ | The field is always populated by the model, so the default is never used. Consider using nullable entries and transforming them afterwards. | +| Schemas with 5000+ properties | ❌ | | +| 1000 or more enum values across all properties | ❌ | | +| More than 10 levels of nesting in a single property | ❌ | | + + +## Streaming + +Structured outputs are supported with [streaming ask mode](../guides/ask_mode.md#streaming). + +When streaming, the structured output is delivered incrementally as raw string fragments through `StreamedTokens` instances. No special parsing is applied during the stream — each token is simply a piece of the final output. To use the result, accumulate the streamed tokens into a single string, then validate the completed string against your schema. You can also attempt partial validation as the string grows if you want to react to the output before the stream finishes. + +## Questions and feedback + +import DocsFeedback from '/\_includes/docs-feedback.mdx'; + + diff --git a/sidebars.js b/sidebars.js index b328f000a..2e07fe83b 100644 --- a/sidebars.js +++ b/sidebars.js @@ -1371,6 +1371,11 @@ const sidebars = { id: "query-agent/reference/advanced_collections", className: "sidebar-item", }, + { + type: "doc", + id: "query-agent/reference/structured_outputs", + className: "sidebar-item", + }, ], }, { From c51d7476292ac6968a12b6b1163fe2d6406e3b4e Mon Sep 17 00:00:00 2001 From: dannyjameswilliams Date: Wed, 24 Jun 2026 16:15:55 +0100 Subject: [PATCH 03/84] streaming correction, python/TS titles in basic usage --- docs/query-agent/reference/structured_outputs.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/query-agent/reference/structured_outputs.md b/docs/query-agent/reference/structured_outputs.md index 9e0ec058a..276ab249b 100644 --- a/docs/query-agent/reference/structured_outputs.md +++ b/docs/query-agent/reference/structured_outputs.md @@ -24,7 +24,7 @@ Structured outputs ensure that the model's final response will adhere to a given The structured output can be accessed by a new field, `final_answer_parsed`, which appears only when the `output_format` argument is not `None`. The raw string from the model can still be accessed at `final_answer`. - ### Pydantic BaseModel + **Pydantic BaseModel** - ### Dictionary + **Dictionary** - ### Object + **Object** Date: Sun, 19 Jul 2026 21:46:32 +0200 Subject: [PATCH 04/84] docs: correct deprecated ChunkSize and document backup chunking variables ChunkSize has had no effect since its removal in core, but the page documented it as a working option with a default, minimum and maximum. Mark it deprecated and point to BACKUP_CHUNK_TARGET_SIZE. Document BACKUP_MIN_CHUNK_SIZE, BACKUP_CHUNK_TARGET_SIZE and BACKUP_SPLIT_FILE_SIZE, which were undocumented, including how their values are raised against each other. Document the location parameter for text2vec-google. No version markers: these all landed across several stable lines, so no single version is correct for every supported release. --- docs/deploy/configuration/backups.md | 24 ++++++++++++++++++- .../model-providers/google/embeddings.md | 3 +++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/docs/deploy/configuration/backups.md b/docs/deploy/configuration/backups.md index de8ac6b11..5b9eddd9f 100644 --- a/docs/deploy/configuration/backups.md +++ b/docs/deploy/configuration/backups.md @@ -316,7 +316,7 @@ The `*` character matches any sequence of characters. For example, `Article*` ma | name | type | required | default | description | | ---- | ---- | ---- | ---- |---- | | `CPUPercentage` | number | no | `50%` | An optional integer to set the desired CPU core utilization ranging from 1%-80%. | -| `ChunkSize` | number | no | `128MB` | An optional integer represents the desired size for chunks. Weaviate will attempt to come close the specified size, with a minimum of 2MB, default of 128MB, and a maximum of 512MB.| +| `ChunkSize` | number | no | - | **Deprecated. This option has no effect.** Weaviate ignores any value sent here, so it neither sets nor caps the chunk size. Chunk sizing is now controlled by the [`BACKUP_CHUNK_TARGET_SIZE`](#how-it-works) environment variable, which replaced it. | | `CompressionLevel`| string | no | `DefaultCompression` | An optional [compression level](#compression-levels) to be used. | | `Path` | string | no | `""` | An optional string to manually set the backup location. If not provided, the backup will be stored in the default location. Introduced in Weaviate `v1.27.2`. | | `incremental_base_backup_id` | string | no | `None` | The ID of a previous backup to use as the base for an [incremental backup](#incremental-backups). Files unchanged since the base backup are stored as references rather than copied. Introduced in Weaviate `v1.37`. | @@ -468,6 +468,28 @@ This can result in dramatically smaller backups and much faster backup times. When creating a backup, Weaviate splits large files into individual chunks. During an incremental backup, Weaviate compares each file against the base backup. Files that haven't changed are stored as pointers to the base backup rather than being copied again. On restore, Weaviate automatically fetches the referenced files from the base backup. +Only files that are large enough to get a chunk of their own can be referenced individually. Smaller files are packed together into shared chunks, so a change to any one of them means the whole chunk is written again. Three environment variables control the packing: `BACKUP_MIN_CHUNK_SIZE` sets which files count as large, `BACKUP_CHUNK_TARGET_SIZE` sets how much data is packed into one shared chunk, and `BACKUP_SPLIT_FILE_SIZE` sets when a single very large file is spread across several chunks. + +Lowering `BACKUP_MIN_CHUNK_SIZE` allows more files to be referenced individually, at the cost of more chunks per backup. + +The following environment variables control chunking. All three accept a plain number of bytes or a number with a unit suffix (`B`, `KB`, `MB`, `GB`, `TB`, `KiB`, `MiB`, `GiB`, `TiB`), for example `4MiB`, and all three are applied at startup, so a restart is required to change them. + +| Environment variable | Required | Description | +| --- | --- | --- | +| `BACKUP_MIN_CHUNK_SIZE` | no | The minimum size a file must reach before it is stored in its own chunk and can be referenced individually by a later incremental backup. Defaults to `1MiB`. | +| `BACKUP_CHUNK_TARGET_SIZE` | no | The size Weaviate aims for when packing several small files into a single chunk. Defaults to `10MiB`. | +| `BACKUP_SPLIT_FILE_SIZE` | no | The size above which a single file is split across multiple chunks instead of being written to one. Defaults to `50GiB`. | + +:::note Minimum values are raised automatically + +These three settings are lower bounds, not exact values, and Weaviate raises them when a smaller value would have no useful effect: + +- The threshold for treating a file as large is the larger of `BACKUP_MIN_CHUNK_SIZE` and the size of the 100th largest file in the shard, so roughly the 100 largest files in a shard can get their own chunk, and lowering `BACKUP_MIN_CHUNK_SIZE` below that point has no further effect. +- `BACKUP_CHUNK_TARGET_SIZE` is raised to that threshold if you set it lower, since a chunk that packs small files must still be able to hold one large file. +- `BACKUP_SPLIT_FILE_SIZE` is likewise raised to that threshold if you set it lower; otherwise no file would ever be large enough to split. + +::: + #### Create a full (base) backup First, create a regular backup that will serve as the base: diff --git a/docs/weaviate/model-providers/google/embeddings.md b/docs/weaviate/model-providers/google/embeddings.md index 802b5d0d8..1b84e150a 100644 --- a/docs/weaviate/model-providers/google/embeddings.md +++ b/docs/weaviate/model-providers/google/embeddings.md @@ -234,9 +234,12 @@ The following examples show how to configure Google-specific options. **Vertex AI parameters:** - `projectId` (Required): Your Google Cloud project ID, e.g. `cloud-large-language-models` +- `location` (Optional): The Google Cloud region to send requests to, e.g. `europe-west1`. Defaults to `us-central1`. - `apiEndpoint` (Optional): Regional endpoint, e.g. `us-central1-aiplatform.googleapis.com` - `modelId` (Optional): e.g. `gemini-embedding-001`, `text-embedding-005` +Set `location` together with a matching `apiEndpoint` to keep data in a specific region. + Date: Wed, 22 Jul 2026 15:48:58 +0200 Subject: [PATCH 05/84] Document server-side batching ingest and refactor the batch import page - Add the one-shot SSB entry points to the batch import docs: data.ingest() (Python sync+async, TypeScript) and Batch.InsertMany (C#), alongside the streaming examples - Add an FAQ entry for the insert_many 'message larger than max' (RESOURCE_EXHAUSTED) failure with the verified client error and the ingest/SSB fix - State the GRPC_MAX_MESSAGE_SIZE default only in the env-vars table (row anchor added); other pages link to it; correct the stale 10MB value - Refactor manage-objects/import.mdx: remove the gRPC API and Python-specific sections, promote Error handling to its own section, rewrite Stream data from large files as tips, trim Asynchronous imports, and merge the four Specify sections under Customize imported objects with snippets moved to ingest/SSB (Go remains manual batching) - Rank SSB first on the Python client pages and best practices --- .../code/csharp/ManageObjectsImportTest.cs | 80 +++- _includes/code/howto/manage-data.import.py | 186 ++++++---- _includes/code/howto/manage-data.import.ts | 15 +- .../test/java/ManageObjectsImportTest.java | 97 +++-- docs/deploy/configuration/env-vars/index.md | 2 +- docs/weaviate/best-practices/index.md | 14 +- .../weaviate/client-libraries/python/async.md | 9 +- .../client-libraries/python/index.mdx | 14 + .../python/notes-best-practices.mdx | 2 + docs/weaviate/concepts/data-import.mdx | 2 +- docs/weaviate/manage-objects/import.mdx | 342 ++++-------------- docs/weaviate/more-resources/faq.md | 25 ++ 12 files changed, 386 insertions(+), 402 deletions(-) diff --git a/_includes/code/csharp/ManageObjectsImportTest.cs b/_includes/code/csharp/ManageObjectsImportTest.cs index c556d141e..822c8e5dd 100644 --- a/_includes/code/csharp/ManageObjectsImportTest.cs +++ b/_includes/code/csharp/ManageObjectsImportTest.cs @@ -10,6 +10,7 @@ using System.Threading.Tasks; using CsvHelper; using Weaviate.Client; +using Weaviate.Client.Batch; using Weaviate.Client.Models; using Xunit; @@ -146,8 +147,55 @@ await client.Collections.Create( var collection = client.Collections.Use("MyCollection"); - // Use `Batch.InsertMany` for server-side batching. The client sends - // data in batches at a rate controlled by the server. + // Use `Batch.StartBatch` for server-side batching. The client streams + // objects to the server, which paces the import based on its own load. + // highlight-start + await using var batch = await collection.Batch.StartBatch(); + + var handles = new List(); + foreach (var dataRow in dataRows) + { + handles.Add(await batch.Add(dataRow)); + } + + await batch.Close(); + // highlight-end + + var results = await Task.WhenAll(handles.Select(h => h.Result)); + var failedObjects = results.Where(r => !r.Success).ToList(); + if (failedObjects.Any()) + { + Console.WriteLine($"Number of failed imports: {failedObjects.Count}"); + } + // END ServerSideBatchImportExample + + var result = await collection.Aggregate.OverAll(totalCount: true); + Assert.Equal(5, result.TotalCount); + } + + [Fact] + public async Task TestServerSideIngest() + { + await BeforeEach(); + await client.Collections.Create( + new CollectionCreateParams + { + Name = "MyCollection", + VectorConfig = Configure.Vector("default", v => v.SelfProvided()), + } + ); + + // START ServerSideIngestExample + var dataRows = Enumerable + .Range(0, 5) + .Select(i => new { title = $"Object {i + 1}" }) + .ToList(); + + var collection = client.Collections.Use("MyCollection"); + + // `Batch.InsertMany` is the one-shot server-side ingest of an + // in-memory list. The client streams the list to the server + // using server-side batching under the hood. // highlight-start var response = await collection.Batch.InsertMany(dataRows); // highlight-end @@ -158,7 +206,7 @@ await client.Collections.Create( Console.WriteLine($"Number of failed imports: {failedObjects.Count}"); Console.WriteLine($"First failed object: {failedObjects.First().Error}"); } - // END ServerSideBatchImportExample + // END ServerSideIngestExample var result = await collection.Aggregate.OverAll(totalCount: true); Assert.Equal(5, result.TotalCount); @@ -194,8 +242,9 @@ await client.Collections.Create( var collection = client.Collections.Use("MyCollection"); + // `Batch.InsertMany` imports the list using server-side batching. // highlight-start - var response = await collection.Data.InsertMany(dataToInsert); + var response = await collection.Batch.InsertMany(dataToInsert); // highlight-end var failedObjects = response.Where(r => r.Error != null).ToList(); @@ -245,13 +294,17 @@ await client.Collections.Create( var collection = client.Collections.Use("MyCollection"); - var response = await collection.Data.InsertMany(dataToInsert); + // `Batch.InsertMany` imports the list using server-side batching. + // highlight-start + var response = await collection.Batch.InsertMany(dataToInsert); + // highlight-end // Handle errors - if (response.HasErrors) + var failedObjects = response.Where(r => r.Error != null).ToList(); + if (failedObjects.Any()) { - Console.WriteLine($"Number of failed imports: {response.Errors.Count()}"); - Console.WriteLine($"First failed object: {response.Errors.First().Message}"); + Console.WriteLine($"Number of failed imports: {failedObjects.Count}"); + Console.WriteLine($"First failed object: {failedObjects.First().Error}"); } // END BatchImportWithVectorExample @@ -342,16 +395,17 @@ await client.Collections.Create( var collection = client.Collections.Use("MyCollection"); - // Insert the data using InsertMany + // `Batch.InsertMany` imports the list using server-side batching. // highlight-start - var response = await collection.Data.InsertMany(dataToInsert); + var response = await collection.Batch.InsertMany(dataToInsert); // highlight-end // Handle errors - if (response.HasErrors) + var failedObjects = response.Where(r => r.Error != null).ToList(); + if (failedObjects.Any()) { - Console.WriteLine($"Number of failed imports: {response.Errors.Count()}"); - Console.WriteLine($"First failed object error: {response.Errors.First().Message}"); + Console.WriteLine($"Number of failed imports: {failedObjects.Count}"); + Console.WriteLine($"First failed object error: {failedObjects.First().Error}"); } // END BatchImportWithNamedVectors } diff --git a/_includes/code/howto/manage-data.import.py b/_includes/code/howto/manage-data.import.py index fa191b5b7..4a7bf34f0 100644 --- a/_includes/code/howto/manage-data.import.py +++ b/_includes/code/howto/manage-data.import.py @@ -157,38 +157,43 @@ # ===== Insert many with custom ID ===== # ======================================= +# Re-create the collection +client.collections.delete("MyCollection") +client.collections.create( + "MyCollection", + vector_config=Configure.Vectors.self_provided() +) + # START BatchImportWithIDExample # highlight-start from weaviate.util import generate_uuid5 # Generate a deterministic ID +from weaviate.classes.data import DataObject # highlight-end -# START BatchImportWithIDExample data_rows = [{"title": f"Object {i+1}"} for i in range(5)] collection = client.collections.use("MyCollection") # highlight-start -with collection.batch.fixed_size(batch_size=200) as batch: - for data_row in data_rows: - obj_uuid = generate_uuid5(data_row) - batch.add_object( - properties=data_row, - uuid=obj_uuid - ) +data_objects = [ + DataObject( + properties=data_row, + uuid=generate_uuid5(data_row) + ) + for data_row in data_rows +] + +result = collection.data.ingest(data_objects) # highlight-end - if batch.number_errors > 10: - print("Batch import stopped due to excessive errors.") - break -failed_objects = collection.batch.failed_objects -if failed_objects: - print(f"Number of failed imports: {len(failed_objects)}") - print(f"First failed object: {failed_objects[0]}") +if result.errors: + print(f"Number of failed imports: {len(result.errors)}") # END BatchImportWithIDExample -result = collection.aggregate.over_all(total_count=True) -assert result.total_count == 5 -resp_obj = collection.query.fetch_object_by_id(obj_uuid) +# Tests +agg_result = collection.aggregate.over_all(total_count=True) +assert agg_result.total_count == 5 +resp_obj = collection.query.fetch_object_by_id(generate_uuid5(data_rows[-1])) assert resp_obj != None # Clean up client.collections.delete(collection.name) @@ -197,32 +202,40 @@ # ===== Batch import with custom vector ===== # =========================================== +# Re-create the collection +client.collections.delete("MyCollection") +client.collections.create( + "MyCollection", + vector_config=Configure.Vectors.self_provided() +) + # START BatchImportWithVectorExample +from weaviate.classes.data import DataObject + data_rows = [{"title": f"Object {i+1}"} for i in range(5)] vectors = [[0.1] * 1536 for i in range(5)] collection = client.collections.use("MyCollection") # highlight-start -with collection.batch.fixed_size(batch_size=200) as batch: - for i, data_row in enumerate(data_rows): - batch.add_object( - properties=data_row, - vector=vectors[i] - ) +data_objects = [ + DataObject( + properties=data_row, + vector=vectors[i] + ) + for i, data_row in enumerate(data_rows) +] + +result = collection.data.ingest(data_objects) # highlight-end - if batch.number_errors > 10: - print("Batch import stopped due to excessive errors.") - break -failed_objects = collection.batch.failed_objects -if failed_objects: - print(f"Number of failed imports: {len(failed_objects)}") - print(f"First failed object: {failed_objects[0]}") +if result.errors: + print(f"Number of failed imports: {len(result.errors)}") # END BatchImportWithVectorExample -result = collection.aggregate.over_all(total_count=True) -assert result.total_count == 5 +# Tests +agg_result = collection.aggregate.over_all(total_count=True) +assert agg_result.total_count == 5 # Clean up client.collections.delete(collection.name) @@ -255,6 +268,8 @@ ) # START BatchImportWithNamedVectors +from weaviate.classes.data import DataObject + data_rows = [{ "title": f"Object {i+1}", "body": f"Body {i+1}" @@ -266,24 +281,22 @@ collection = client.collections.use("MyCollection") # highlight-start -with collection.batch.fixed_size(batch_size=200) as batch: - for i, data_row in enumerate(data_rows): - batch.add_object( - properties=data_row, - vector={ - "title": title_vectors[i], - "body": body_vectors[i], - } - ) +data_objects = [ + DataObject( + properties=data_row, + vector={ + "title": title_vectors[i], + "body": body_vectors[i], + } + ) + for i, data_row in enumerate(data_rows) +] + +result = collection.data.ingest(data_objects) # highlight-end - if batch.number_errors > 10: - print("Batch import stopped due to excessive errors.") - break -failed_objects = collection.batch.failed_objects -if failed_objects: - print(f"Number of failed imports: {len(failed_objects)}") - print(f"First failed object: {failed_objects[0]}") +if result.errors: + print(f"Number of failed imports: {len(result.errors)}") # END BatchImportWithNamedVectors response = collection.query.fetch_objects(include_vector=True) @@ -318,36 +331,37 @@ ] ) -from_uuid = authors.data.insert( - properties={"name": "Jane Austen"} -) - publications.data.insert( {"title": "Ye Olde Times"} ) target_uuid = publications.query.fetch_objects(limit=1).objects[0].uuid -# BatchImportWithRefExample +# START BatchImportWithRefExample +from weaviate.classes.data import DataObject + collection = client.collections.use("Author") -with collection.batch.fixed_size(batch_size=100) as batch: - batch.add_reference( - from_property="writesFor", - from_uuid=from_uuid, - to=target_uuid, - ) +# highlight-start +data_objects = [ + DataObject( + properties={"name": "Jane Austen"}, + references={"writesFor": target_uuid}, + ), +] + +result = collection.data.ingest(data_objects) +# highlight-end -failed_references = collection.batch.failed_references -if failed_references: - print(f"Number of failed imports: {len(failed_references)}") - print(f"First failed reference: {failed_references[0]}") +if result.errors: + print(f"Number of failed imports: {len(result.errors)}") # END BatchImportWithRefExample # Tests from weaviate.classes.query import QueryReference +new_uuid = result.uuids[0] response = collection.query.fetch_object_by_id( - from_uuid, + new_uuid, return_references=QueryReference(link_on="writesFor", return_properties=["title"]) ) @@ -602,4 +616,46 @@ def add_object(obj) -> None: client.collections.delete(collection.name) +# ================================================== +# ===== Server-side one-shot ingest ===== +# ================================================== + +# Re-create the collection +client.collections.delete("MyCollection") +client.collections.create( + "MyCollection", + vector_config=Configure.Vectors.self_provided() +) + +# START ServerSideIngestExample +data_rows = [ + {"title": f"Object {i+1}"} for i in range(5) +] + +collection = client.collections.use("MyCollection") + +# highlight-start +# `ingest` imports the whole list with server-side batching in a single call +result = collection.data.ingest(data_rows) +# highlight-end + +# The return object is the same as for `insert_many` +if result.errors: + print(f"Number of failed imports: {len(result.errors)}") + # `errors` is a dict keyed by the index of the failed object + for index, error in result.errors.items(): + print(f"Failed object at index {index}: {error.message}") +# END ServerSideIngestExample + +# Tests +assert len(result.errors) == 0 +assert len(result.uuids) == 5 + +agg_result = collection.aggregate.over_all(total_count=True) +assert agg_result.total_count == 5 + +# Clean up +client.collections.delete(collection.name) + + client.close() diff --git a/_includes/code/howto/manage-data.import.ts b/_includes/code/howto/manage-data.import.ts index d5b438d2d..a0fdc8788 100644 --- a/_includes/code/howto/manage-data.import.ts +++ b/_includes/code/howto/manage-data.import.ts @@ -111,7 +111,10 @@ let dataObjects = [ ] const myCollection = client.collections.use('MyCollection') -await myCollection.data.insertMany(dataObject) +// highlight-start +// `ingest` imports the list using server-side batching +await myCollection.data.ingest(dataObjects) +// highlight-end // END BatchImportWithIDExample // result = await client.graphql.aggregate().withClassName(className).withFields('meta { count }').do(); @@ -146,7 +149,10 @@ let dataObjects = [ // ... ] -await jeopardy.data.insertMany(dataObjects) +// highlight-start +// `ingest` imports the list using server-side batching +await myCollection.data.ingest(dataObjects) +// highlight-end // END BatchImportWithVectorExample // result = await client.graphql.aggregate().withClassName(className).withFields('meta { count }').do(); @@ -204,7 +210,10 @@ let dataObjects = [ // ... ] -await myCollection.data.insertMany(dataObjects) +// highlight-start +// `ingest` imports the list using server-side batching +await myCollection.data.ingest(dataObjects) +// highlight-end } // END BatchImportWithNamedVectors diff --git a/_includes/code/java-v6/src/test/java/ManageObjectsImportTest.java b/_includes/code/java-v6/src/test/java/ManageObjectsImportTest.java index 4e0c5140f..0211cb63a 100644 --- a/_includes/code/java-v6/src/test/java/ManageObjectsImportTest.java +++ b/_includes/code/java-v6/src/test/java/ManageObjectsImportTest.java @@ -7,7 +7,6 @@ import io.weaviate.client6.v1.api.collections.data.BatchReference; import io.weaviate.client6.v1.api.collections.Vectors; import io.weaviate.client6.v1.api.collections.WeaviateObject; -import io.weaviate.client6.v1.api.collections.data.InsertManyResponse; import io.weaviate.client6.v1.api.collections.query.QueryReference; import org.junit.jupiter.api.AfterAll; @@ -158,32 +157,35 @@ void testBatchImportWithID() throws IOException { col -> col.vectorConfig(VectorConfig.selfProvided())); // START BatchImportWithIDExample - List>> dataObjects = new ArrayList<>(); - for (int i = 0; i < 5; i++) { - Map dataRow = Map.of("title", "Object " + (i + 1)); - UUID objUuid = generateUuid5(dataRow.toString()); - - dataObjects.add(WeaviateObject.>of( - obj -> obj.properties(dataRow).uuid(objUuid.toString()))); - } - var collection = client.collections.use("MyCollection"); + // Add objects with custom IDs to a server-side batch import. // highlight-start - var response = collection.data.insertMany(dataObjects); + BatchContext> batch = collection.batch.start(); + try (batch) { + for (int i = 0; i < 5; i++) { + Map dataRow = Map.of("title", "Object " + (i + 1)); + UUID objUuid = generateUuid5(dataRow.toString()); + + batch.add(WeaviateObject.>of( + obj -> obj.properties(dataRow).uuid(objUuid.toString()))); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } // highlight-end - if (!response.errors().isEmpty()) { + if (batch.numberOfErrors() > 0) { System.err - .println("Number of failed imports: " + response.errors().size()); - System.err.println("First failed object: " + response.errors().get(0)); + .println("Number of failed imports: " + batch.numberOfErrors()); } // END BatchImportWithIDExample var result = collection.aggregate.overAll(agg -> agg.includeTotalCount(true)); assertThat(result.totalCount()).isEqualTo(5); - String lastUuid = dataObjects.get(4).uuid(); + String lastUuid = + generateUuid5(Map.of("title", "Object 5").toString()).toString(); assertThat(collection.data.exists(lastUuid)).isTrue(); client.collections.delete("MyCollection"); @@ -195,30 +197,29 @@ void testBatchImportWithVector() throws IOException { col -> col.vectorConfig(VectorConfig.selfProvided())); // START BatchImportWithVectorExample - List>> dataObjects = new ArrayList<>(); float[] vector = new float[10]; // Using a small vector for demonstration Arrays.fill(vector, 0.1f); - for (int i = 0; i < 5; i++) { - Map dataRow = Map.of("title", "Object " + (i + 1)); - UUID objUuid = generateUuid5(dataRow.toString()); - - dataObjects.add( - WeaviateObject.>of(obj -> obj.properties(dataRow) - .uuid(objUuid.toString()) - .vectors(Vectors.of(vector)))); - } - var collection = client.collections.use("MyCollection"); + // Add objects with custom vectors to a server-side batch import. // highlight-start - var response = collection.data.insertMany(dataObjects); + BatchContext> batch = collection.batch.start(); + try (batch) { + for (int i = 0; i < 5; i++) { + Map dataRow = Map.of("title", "Object " + (i + 1)); + + batch.add(WeaviateObject.>of( + obj -> obj.properties(dataRow).vectors(Vectors.of(vector)))); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } // highlight-end - if (!response.errors().isEmpty()) { + if (batch.numberOfErrors() > 0) { System.err - .println("Number of failed imports: " + response.errors().size()); - System.err.println("First failed object: " + response.errors().get(0)); + .println("Number of failed imports: " + batch.numberOfErrors()); } // END BatchImportWithVectorExample @@ -297,32 +298,26 @@ void testImportWithNamedVectors() throws IOException { CollectionHandle> collection = client.collections.use("MyCollection"); - List>> objectsToInsert = - new ArrayList<>(); - for (int i = 0; i < dataRows.size(); i++) { - int index = i; - objectsToInsert.add( - // highlight-start - // Use the Builder with the EXACT matching generic types - WeaviateObject - .>of(v -> v.properties(dataRows.get(index)) - .vectors(Vectors.of("title", titleVectors.get(index))) - .vectors(Vectors.of("body", bodyVectors.get(index))))); - // highlight-end - - } - - // Insert the data using insertMany with the List + // Add objects with named vectors to a server-side batch import. // highlight-start - InsertManyResponse response = collection.data.insertMany(objectsToInsert); + BatchContext> batch = collection.batch.start(); + try (batch) { + for (int i = 0; i < dataRows.size(); i++) { + int index = i; + batch.add(WeaviateObject + .>of(v -> v.properties(dataRows.get(index)) + .vectors(Vectors.of("title", titleVectors.get(index))) + .vectors(Vectors.of("body", bodyVectors.get(index))))); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } // highlight-end // Check for errors - if (!response.errors().isEmpty()) { + if (batch.numberOfErrors() > 0) { System.err.printf("Number of failed imports: %d\n", - response.errors().size()); - System.err.printf("First failed object error: %s\n", - response.errors().get(0)); + batch.numberOfErrors()); } // END BatchImportWithNamedVectors } diff --git a/docs/deploy/configuration/env-vars/index.md b/docs/deploy/configuration/env-vars/index.md index e5cca50b4..a0c6d1028 100644 --- a/docs/deploy/configuration/env-vars/index.md +++ b/docs/deploy/configuration/env-vars/index.md @@ -58,7 +58,7 @@ import APITable from '@site/src/components/APITable'; | `GO_PROFILING_DISABLE` | If `true`, disables Go profiling. Default: `false`. | `boolean` | `false` | | `GO_PROFILING_PORT` | Sets the port for the Go profiler. Default: `6060` | `integer` | `6060` | | `DEBUG_ENDPOINTS_ENABLED` | Gate for the debug HTTP listener (the profiling port set by `GO_PROFILING_PORT`, default `6060`), which serves Weaviate's **unauthenticated** internal debug and profiling endpoints — `/debug/config`, Go profiling (`/debug/pprof/*`, `/debug/fgprof`), and various maintenance and diagnostic routes. [Runtime-configurable](/deploy/configuration/env-vars/runtime-config.md) via the `debug_endpoints_enabled` override. Default: `false`. `GO_PROFILING_DISABLE` still controls whether the listener binds at all.
Added in `v1.37.9` | `boolean` | `true` | -| `GRPC_MAX_MESSAGE_SIZE` | Maximum gRPC message size in bytes. Default: 10MB | `string - number` | `2000000000` | +| `GRPC_MAX_MESSAGE_SIZE` | Maximum gRPC message size in bytes. Requests larger than this limit (e.g. a large `insert_many` call) are rejected. Default: `104858000` (approximately 100 MB) | `string - number` | `2000000000` | | `GRPC_PORT` | The port on which Weaviate's gRPC server listens for incoming requests. Default: `50051` | `string - number` | `50052` | | `HNSW_GEO_INDEX_EF` | Balance geo index search speed and recall. This value controls the search depth for geo-based queries. Default: `800`
Added in `v1.31.22` | `string - number` | `1000` | | `LAZY_LOAD_SHARD_COUNT_THRESHOLD` | Number of shards (tenants) in a collection before lazy shard loading activates. Set to `0` to force lazy loading for all collections. Default: `1000`. See [dynamic lazy shard loading](/weaviate/concepts/storage#dynamic-lazy-shard-loading).
Added in `v1.36.6` | `string - number` | `1000` | diff --git a/docs/weaviate/best-practices/index.md b/docs/weaviate/best-practices/index.md index 8403e0162..b218148ff 100644 --- a/docs/weaviate/best-practices/index.md +++ b/docs/weaviate/best-practices/index.md @@ -295,14 +295,24 @@ When importing any significant amount of data (i.e. more than 10 objects), use b for obj in objects: collection.data.insert(properties=obj) -# ✅ Do this -with collection.batch.fixed_size(batch_size=200) as batch: +# ✅ Do this: server-side batching (recommended) - the server +# tells the client how much data to send next +with collection.batch.stream() as batch: for obj in objects: batch.add_object(properties=obj) + +# ✅ Or, if your objects are already in an in-memory list, +# ingest the whole list with a single call +result = collection.data.ingest(objects) ``` +[Server-side batching](../concepts/data-import.mdx#server-side-batching) requires Weaviate `v1.36` or later and a client that supports it. If it is not available, use a client-side batching method such as `collection.batch.fixed_size(batch_size=200)` or `collection.batch.dynamic()` instead. + +Avoid passing large lists to `collection.data.insert_many()`. It sends all objects in a single request, which fails if the request exceeds the server's [`GRPC_MAX_MESSAGE_SIZE`](/deploy/configuration/env-vars/index.md#GRPC_MAX_MESSAGE_SIZE) limit. `collection.data.ingest()` is a drop-in replacement that does not have this limitation. + :::tip Further resources - [How-to: Batch import data](../manage-objects/import.mdx) +- [Concepts: Data import](../concepts/data-import.mdx) ::: ### Minimize costs by offloading inactive tenants diff --git a/docs/weaviate/client-libraries/python/async.md b/docs/weaviate/client-libraries/python/async.md index 2af0897e3..fdb65dc9b 100644 --- a/docs/weaviate/client-libraries/python/async.md +++ b/docs/weaviate/client-libraries/python/async.md @@ -130,7 +130,8 @@ Methods that involve sending requests to Weaviate will be async functions. For e - `async_client.connect()`: Connect to a Weaviate server - `async_client.collections.create()`: Create a new collection -- `.data.insert_many()`: Insert a list of objects into a collection +- `.data.insert_many()`: Insert a list of objects into a collection in a single request +- `.data.ingest()`: Insert a list of objects into a collection using [server-side batching](../../manage-objects/import.mdx#server-side-batching) ### Example sync methods @@ -193,7 +194,11 @@ Note the use of a context manager in the async function. The context manager is The async client supports server-side batching through the `stream()` method, which uses the same feedback-based flow as the synchronous client. For client-side batching methods (`dynamic`, `fixed_size`, `rate_limit`), use the synchronous client. -The async client also offers `insert` and `insert_many` methods for data insertion, which can be used in an async context. +The async client also offers `insert` and `insert_many` methods for data insertion, which can be used in an async context. The one-shot `data.ingest()` method is also available on the async client and is preferred over `insert_many` for large lists. + +:::caution `insert_many` and large lists +`insert_many` sends all objects in a **single request**. The server rejects requests larger than its [`GRPC_MAX_MESSAGE_SIZE`](/deploy/configuration/env-vars/index.md#GRPC_MAX_MESSAGE_SIZE) limit, so the whole call fails for large lists. Use `data.ingest()` instead: it is a drop-in replacement that splits the list into server-paced batches. +::: ### Application-level example diff --git a/docs/weaviate/client-libraries/python/index.mdx b/docs/weaviate/client-libraries/python/index.mdx index b4b4cb635..7a4b47a5c 100644 --- a/docs/weaviate/client-libraries/python/index.mdx +++ b/docs/weaviate/client-libraries/python/index.mdx @@ -116,6 +116,20 @@ For more code examples, check out the [How-to manuals & Guides](../../guides.mdx The Python client library provides a synchronous API by default through the `WeaviateClient` class, which is covered on this page. An asynchronous API is also available through the `WeaviateAsyncClient` class (from `weaviate-client` `v4.7.0` and up). See the [async client API page](./async.md) for further details. +## Batch imports + +The client provides several ways to [import data in bulk](../../manage-objects/import.mdx): + +- `collection.batch.stream()`: [Server-side batching](../../concepts/data-import.mdx#server-side-batching), the recommended starting point. The server tells the client how much data to send next, so you don't have to tune batch parameters yourself. +- `collection.data.ingest()`: A one-shot convenience for importing a list of objects that you already hold in memory. It uses server-side batching under the hood and returns the same return object as `insert_many`. +- `collection.batch.dynamic()`, `fixed_size()`, and `rate_limit()`: Client-side batching methods for when you want manual control over batch size and concurrency, or when server-side batching is not available. + +:::caution `insert_many` and large lists +`collection.data.insert_many()` sends all objects in a **single request**. The server rejects requests larger than its [`GRPC_MAX_MESSAGE_SIZE`](/deploy/configuration/env-vars/index.md#GRPC_MAX_MESSAGE_SIZE) limit, so the whole call fails for large lists. Use `collection.data.ingest()` instead: it is a drop-in replacement that splits the list into server-paced batches. +::: + +For guidance on choosing a batching method, see the [best practices page](./notes-best-practices.mdx#batch-imports). + ## Releases Go to the [GitHub releases page](https://github.com/weaviate/weaviate-python-client/releases) to see the history of the Python client library releases and change logs. diff --git a/docs/weaviate/client-libraries/python/notes-best-practices.mdx b/docs/weaviate/client-libraries/python/notes-best-practices.mdx index e2ec89f33..55d611e18 100644 --- a/docs/weaviate/client-libraries/python/notes-best-practices.mdx +++ b/docs/weaviate/client-libraries/python/notes-best-practices.mdx @@ -202,6 +202,8 @@ There are four methods to configure the batching behavior. They are `stream`, `d | `fixed_size` | The batch size and number of concurrent requests are fixed to sizes specified by the user. | When you want to specify fixed parameters. | | `rate_limit` | The number of objects sent to Weaviate is rate limited (specified as n_objects per minute). | When you want to avoid hitting third-party vectorization API rate limits. | +If your objects are already in an in-memory list, `collection.data.ingest(objs)` is a one-shot convenience that uses server-side batching under the hood (no batching context required). It accepts plain property dicts or `DataObject` instances and returns the same `BatchObjectReturn` object as `insert_many`, making it a drop-in replacement for `insert_many` for large lists. + #### Usage We recommend using a context manager as shown below. diff --git a/docs/weaviate/concepts/data-import.mdx b/docs/weaviate/concepts/data-import.mdx index 92713352f..b6858e502 100644 --- a/docs/weaviate/concepts/data-import.mdx +++ b/docs/weaviate/concepts/data-import.mdx @@ -50,7 +50,7 @@ This architecture centralizes the complex batching logic on the server, resultin - **Simplified client code**: No need to tweak the batch size and the number of concurrent requests manually. The server determines the optimal batch size based on its current workload. - **Improved stability**: The system automatically applies **backpressure**. If the server is busy, it will instruct the client to send less data, preventing overloads and request timeouts, which is especially useful during long-running vectorization tasks. -- **Enhanced resilience**: It's designed to handle cluster events like node scaling more gracefully, reducing the risk of interrupted batches. +- **Enhanced resilience**: It's designed to handle cluster events like node scaling more gracefully, reducing the risk of interrupted batches. Because the server paces the client, the import load tracks the actual server capacity, which behaves well on autoscaling clusters and under memory pressure. ::: diff --git a/docs/weaviate/manage-objects/import.mdx b/docs/weaviate/manage-objects/import.mdx index 0fd7b1823..992ac3cbf 100644 --- a/docs/weaviate/manage-objects/import.mdx +++ b/docs/weaviate/manage-objects/import.mdx @@ -9,9 +9,7 @@ import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; import PyCode from '!!raw-loader!/_includes/code/howto/manage-data.import.py'; -import PySuppCode from '!!raw-loader!/_includes/code/howto/sample-data.py'; import TSCode from '!!raw-loader!/_includes/code/howto/manage-data.import.ts'; -import TsSuppCode from '!!raw-loader!/_includes/code/howto/sample-data.ts'; import JavaV6Code from '!!raw-loader!/_includes/code/java-v6/src/test/java/ManageObjectsImportTest.java'; import CSharpCode from '!!raw-loader!/_includes/code/csharp/ManageObjectsImportTest.cs'; import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/manage-data.import_test.go'; @@ -25,9 +23,16 @@ import SsbStatus from '/_includes/feature-notes/ssb-status.mdx'; -With [server-side batch imports](../concepts/data-import.mdx#server-side-batching) (also called "automatic" batching), the client sends data in batch sizes determined by feedback from the server. This simplifies your code and helps the server manage its own load. The following example adds objects to a collection named `MyCollection`. +With [server-side batch imports](../concepts/data-import.mdx#server-side-batching) (also called "automatic" batching), the client sends data in batch sizes determined by feedback from the server. This simplifies your code and helps the server manage its own load. Server-side batching offers two entry points: -Server-side batching uses the [gRPC API](#use-the-grpc-api), which current client versions enable by default. +- **Stream from a data source** (recommended for large datasets): Open a batching context (`batch.stream()` in Python) and add objects one at a time as you read them, so the full dataset never has to fit in memory. +- **[Ingest an in-memory list](#ingest-an-in-memory-list)**: If your objects are already in a list, call `data.ingest()` to import the whole list in a single call. The client streams the list to the server using server-side batching under the hood. + +Server-side batching uses the [gRPC API](../api/index.mdx), which current client versions enable by default. If you use the Go client, configure its gRPC connection parameters as described on the [connection configuration page](../connections/connect-custom.mdx). + +The [async Python client](../client-libraries/python/async.md#bulk-data-insertion) also supports server-side batching through the `stream()` method and the one-shot `ingest()` method. + +The following example adds objects to a collection named `MyCollection`. @@ -69,20 +74,59 @@ The Go client does not support server-side batching; use [manual batching](#manu -## Manual batching +### Ingest an in-memory list -Use manual (client-side) batching when you want to control the batch size and concurrency yourself, or when using a client that does not yet support server-side batching (such as the Go client). The following example adds objects to the `MyCollection` collection. +In the Python and TypeScript clients, `ingest` is the safe replacement for passing a large list to `insert_many`. `insert_many` sends all objects in a single request, which fails if the request exceeds the server's [`GRPC_MAX_MESSAGE_SIZE`](/deploy/configuration/env-vars/index.md#GRPC_MAX_MESSAGE_SIZE) limit, while `ingest` splits the list into server-paced batches. -
- Additional information + + + +`ingest` accepts plain property dicts or `DataObject` instances (to set object IDs, vectors, or references) and returns the same return object as `insert_many`. -To create a bulk import job manually, follow these steps: + + + + +In TypeScript, `data.ingest()` is the server-side batching API, with no separate streaming context. It accepts any `Iterable`, so you can also pass a lazy source instead of a list. + + + + + +The Go client does not support server-side batching; use [manual batching](#manual-batching) instead. + + + + +The Java client does not provide a one-shot ingest method. Use the streaming context `collection.batch.start()` shown in the [server-side batching example](#server-side-batching) above. Note that `collection.data.insertMany(...)` sends all objects in a single request and does not use server-side batching. + + + + +In the C# client, `Batch.InsertMany` uses server-side batching under the hood. + + + + -1. Initialize a batch object. -1. Add items to the batch object. -1. Ensure that the last batch is sent (flushed). +## Manual batching -
+Use manual (client-side) batching when you want to control the batch size and concurrency yourself, or when using a client that does not yet support server-side batching (such as the Go client). The following example adds objects to the `MyCollection` collection. @@ -92,17 +136,6 @@ To create a bulk import job manually, follow these steps: endMarker="# END BasicBatchImportExample" language="py" /> - -### Error handling - - - -During a batch import, any failed objects or references will be stored and can be obtained through `batch.failed_objects` and `batch.failed_references`. -Additionally, a running count of failed objects and references is maintained and can be accessed through `batch.number_errors` within the context manager. -This counter can be used to stop the import process in order to investigate the failed objects or references. - -Find out more about error handling on the Python client [reference page](/weaviate/client-libraries/python). - -## Use the gRPC API +## Error handling -The [gRPC API](../api/index.mdx) is faster than the REST API. Use the gRPC API to improve import speeds. - - - - - - - -The Python client uses gRPC by default. - -
-The legacy Python client does not support gRPC. - -
- - -The TypeScript client v3 uses gRPC by default. - -
-The legacy TypeScript client does not support gRPC. - -
- - -The Java client v6 uses gRPC by default. - - - - -To use the gRPC API with the Go client, add the `GrpcConfig` field to your client connection code. Update `Secured` if you use an encrypted connection.

- -```go -cfg := weaviate.Config{ - Host: fmt.Sprintf("localhost:%v", "8080"), - Scheme: "http", - // highlight-start - GrpcConfig: &grpc.Config{ - Host: "localhost:50051", - Secured: false, - }, - // highlight-end -} + -client, err := weaviate.NewClient(cfg) -if err != nil { - require.Nil(t, err) - } -``` +Errors are reported the same way in server-side and manual batching. During a batch import, any failed objects or references are stored and can be inspected after the batching context closes. In the Python client: -
- +- Within the context manager, `batch.number_errors` holds a running count of failed objects and references. You can use this counter to stop the import process and investigate the failures. +- After the context closes, `collection.batch.failed_objects` and `collection.batch.failed_references` contain the failed items. +- The one-shot `data.ingest()` method returns the same result object as `insert_many`: its `errors` dict maps the original index of each failed object to its error. -The C# uses gRPC by default. - - - - -To use the gRPC API with the [Spark connector](https://github.com/weaviate/spark-connector), add the `grpc:host` field to your client connection code. Update `grpc:secured` if you use an encrypted connection.

+Find out more about error handling on the Python client [reference page](/weaviate/client-libraries/python). -```java - df.write - .format("io.weaviate.spark.Weaviate") - .option("scheme", "http") - .option("host", "localhost:8080") - // highlight-start - .option("grpc:host", "localhost:50051") - .option("grpc:secured", "false") - // highlight-start - .option("className", className) - .mode("append") - .save() -``` +## Customize imported objects -
-
+Batch-imported objects support the same parameters as individually created objects, such as custom IDs, vectors, and cross-references. These parameters work the same way in server-side and manual batching. -## Specify an ID value +### Specify an ID value Weaviate generates an UUID for each object. Object IDs must be unique. If you set object IDs, use one of these deterministic UUID methods to prevent duplicate IDs: @@ -266,7 +237,7 @@ Weaviate generates an UUID for each object. Object IDs must be unique. If you se
-## Specify a vector +### Specify a vector Use the `vector` property to specify a vector for each object. @@ -313,7 +284,7 @@ Use the `vector` property to specify a vector for each object. -## Specify named vectors +### Specify named vectors When you create an object, you can specify named vectors (if [configured in your collection](../manage-collections/vector-config.mdx#define-named-vectors)). @@ -352,7 +323,7 @@ When you create an object, you can specify named vectors (if [configured in your -## Import with references +### Import with references You can batch create links from an object to another other object through cross-references. @@ -360,7 +331,7 @@ You can batch create links from an object to another other object through cross- @@ -383,142 +354,15 @@ You can batch create links from an object to another other object through cross- -## Python-specific considerations - -The Python clients have built-in batching methods to help you optimize import speed. For details, see the client documentation: - - -- [Python client](../client-libraries/python/notes-best-practices.mdx) - -### Async Python client and batching - -The [async Python client](../client-libraries/python/async.md#bulk-data-insertion) supports server-side batching through the `stream()` method. For client-side batching, use the sync Python client. - ## Stream data from large files -If your dataset is large, consider streaming the import to avoid out-of-memory issues. +If your dataset does not fit in memory, do not load it all at once. Instead, read the source file lazily and add objects to the import as you go: -To try the example code, download the sample data and create the sample input files. +- With the server-side streaming context (`batch.stream()` in Python), add each object as you read it from the file. The client sends data at the pace the server requests, so memory usage stays flat. +- In TypeScript, `data.ingest()` accepts any `Iterable`, so you can pass a lazy source (such as a generator that reads the file record by record) instead of a fully loaded array. +- With manual batching, apply the same pattern: add objects to the batch as you read them. -
- Get the sample data - - - - - - - - - - - - - - - - -
- -
- Stream JSON files example code - - - - - - - - - - - - - - - - -
- -
- Stream CSV files example code - - - - - - - - - - - - - - - - -
+For JSON files, use a streaming parser that yields one object at a time (such as `ijson` in Python). For CSV files, read the file in chunks (such as `pandas` with the `chunksize` parameter) rather than loading it whole. ## Batch vectorization @@ -541,22 +385,6 @@ Note that each provider exposes different configuration options. language="py" /> - - - - - - ## Additional considerations @@ -565,22 +393,7 @@ Data imports can be resource intensive. Consider the following when you import l ### Asynchronous imports -:::caution Experimental -Available starting in `v1.22`. This is an experimental feature. Use with caution. -::: - -To maximize import speed, enable [asynchronous indexing](/weaviate/config-refs/indexing/vector-index.mdx#asynchronous-indexing). - -To enable asynchronous indexing, set the `ASYNC_INDEXING` environment variable to `true` in your Weaviate configuration file. - -```yaml -weaviate: - image: cr.weaviate.io/semitechnologies/weaviate:||site.weaviate_version|| - ... - environment: - ASYNC_INDEXING: 'true' - ... -``` +To maximize import speed, enable [asynchronous indexing](/weaviate/config-refs/indexing/vector-index.mdx#asynchronous-indexing) by setting the `ASYNC_INDEXING` environment variable to `true` in your Weaviate configuration. This decouples vector index construction from object creation, so imports are not slowed down by index building. ### Automatically add new tenants @@ -594,6 +407,7 @@ For details, see [auto-tenant](/weaviate/manage-collections/multi-tenancy#automa - [Connect to Weaviate](/weaviate/connections/index.mdx) - [How-to: Create objects](./create.mdx) +- [Python client: batch import notes and best practices](../client-libraries/python/notes-best-practices.mdx) - References: REST - /v1/batch diff --git a/docs/weaviate/more-resources/faq.md b/docs/weaviate/more-resources/faq.md index 01fd0cb98..032f58deb 100644 --- a/docs/weaviate/more-resources/faq.md +++ b/docs/weaviate/more-resources/faq.md @@ -541,6 +541,31 @@ client.collections.create( +#### Q: Why does `insert_many` fail with a "message larger than max" (`RESOURCE_EXHAUSTED`) error? + +
+ Answer + +`insert_many` (Python) and `insertMany` (TypeScript, Java) send all objects in a **single gRPC request**. Requests larger than the server's [`GRPC_MAX_MESSAGE_SIZE`](/deploy/configuration/env-vars/index.md#GRPC_MAX_MESSAGE_SIZE) limit are rejected with the gRPC status `RESOURCE_EXHAUSTED`, so a sufficiently large list fails as a whole with an error similar to: + +```text +WeaviateBatchError: Query call with protocol GRPC batch failed with message +CLIENT: Sent message larger than max (3002340 vs. 1000000). +``` + +The two numbers are the size of your request and the server's limit (the values shown here are from a test with a 1 MB limit). Recent Python clients read the server's limit at connect time and reject oversized requests before sending them. With older clients, the server-side variant `grpc: received message larger than max` may appear instead. + +For large lists, use [server-side batching](../manage-objects/import.mdx#server-side-batching) instead, which splits the data into server-paced batches: + +- **Python**: Use `collection.data.ingest(objects)`, a drop-in replacement for `insert_many` that returns the same return object. Alternatively, use the `collection.batch.stream()` context manager. +- **TypeScript**: `collection.data.ingest(objects)`. +- **Java** (`v6`): the `collection.batch.start()` streaming context. +- **C#**: `collection.Batch.InsertMany(items)` (already uses server-side batching). + +Alternatively, you can raise the `GRPC_MAX_MESSAGE_SIZE` [environment variable](/deploy/configuration/env-vars/index.md#GRPC_MAX_MESSAGE_SIZE) on the server, but batching is the recommended solution. + +
+ ## Miscellaneous #### Q: Can I request a feature in Weaviate? From a9253880460fca2bfb7273bea8ca56b8c085eafc Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Wed, 22 Jul 2026 17:39:25 +0200 Subject: [PATCH 06/84] Address review: differentiate TypeScript SSB examples, drop extras - TypeScript: the server-side batching example now streams from a sync generator passed to data.ingest(), and a separate ServerSideIngestExample shows the in-memory array flavor (both executed against a live 1.38.0 with persistence checks) - Remove the Batch imports section from the Python client page - Remove the redundant lowercase anchor from the GRPC_MAX_MESSAGE_SIZE row (links use the APITable-generated anchor) - Add the data import best practices blog post to Further resources --- _includes/code/howto/manage-data.import.ts | 56 +++++++++++++++++-- docs/deploy/configuration/env-vars/index.md | 2 +- .../client-libraries/python/index.mdx | 14 ----- docs/weaviate/manage-objects/import.mdx | 10 +++- 4 files changed, 59 insertions(+), 23 deletions(-) diff --git a/_includes/code/howto/manage-data.import.ts b/_includes/code/howto/manage-data.import.ts index a0fdc8788..04c56fc55 100644 --- a/_includes/code/howto/manage-data.import.ts +++ b/_includes/code/howto/manage-data.import.ts @@ -343,6 +343,53 @@ try { { // START ServerSideBatchImportExample +const myCollection = client.collections.use('MyCollection') + +// highlight-start +// `ingest` is the TypeScript server-side batching API. It accepts any +// Iterable, so passing a generator streams objects to the server +// without building the full list in memory. +function* generateData(): Generator<{ properties: { title: string } }> { + for (let i = 1; i <= 5; i++) { + yield { properties: { title: `Object ${i}` } } + } +} + +const result = await myCollection.data.ingest(generateData()) +// highlight-end + +console.log(result) +// END ServerSideBatchImportExample + +// Verify the import (not shown in the docs snippet): all 5 objects and +// their `title` property must have persisted. +const check = await myCollection.query.fetchObjects({ limit: 5 }) +if (check.objects.length !== 5) + throw new Error(`SSB import: expected 5 objects, got ${check.objects.length}`) +if (!check.objects.every((o) => typeof o.properties.title === 'string' && o.properties.title.length > 0)) + throw new Error('SSB import did not persist the title property') +} + +await client.collections.delete('MyCollection'); + +// ================================================== +// ===== Server-side one-shot ingest ===== +// ================================================== + +// Clean slate +try { + await client.collections.delete('MyCollection'); +} catch (e) { + // ignore error if class doesn't exist +} finally { + await client.collections.create({ + name: 'MyCollection', + vectorizers: weaviate.configure.vectors.selfProvided(), + }) +} + +{ +// START ServerSideIngestExample const dataObjects = [ { properties: { title: 'Object 1' } }, { properties: { title: 'Object 2' } }, @@ -354,21 +401,20 @@ const dataObjects = [ const myCollection = client.collections.use('MyCollection') // highlight-start -// Use `ingest` for server-side batching. The client sends data -// in batches at a rate controlled by the server. +// `ingest` imports the whole list with server-side batching in a single call const result = await myCollection.data.ingest(dataObjects) // highlight-end console.log(result) -// END ServerSideBatchImportExample +// END ServerSideIngestExample // Verify the import (not shown in the docs snippet): all 5 objects and // their `title` property must have persisted. const check = await myCollection.query.fetchObjects({ limit: 5 }) if (check.objects.length !== 5) - throw new Error(`SSB import: expected 5 objects, got ${check.objects.length}`) + throw new Error(`Ingest import: expected 5 objects, got ${check.objects.length}`) if (!check.objects.every((o) => typeof o.properties.title === 'string' && o.properties.title.length > 0)) - throw new Error('SSB import did not persist the title property') + throw new Error('Ingest import did not persist the title property') } await client.collections.delete('MyCollection'); diff --git a/docs/deploy/configuration/env-vars/index.md b/docs/deploy/configuration/env-vars/index.md index a0c6d1028..51defbdd0 100644 --- a/docs/deploy/configuration/env-vars/index.md +++ b/docs/deploy/configuration/env-vars/index.md @@ -58,7 +58,7 @@ import APITable from '@site/src/components/APITable'; | `GO_PROFILING_DISABLE` | If `true`, disables Go profiling. Default: `false`. | `boolean` | `false` | | `GO_PROFILING_PORT` | Sets the port for the Go profiler. Default: `6060` | `integer` | `6060` | | `DEBUG_ENDPOINTS_ENABLED` | Gate for the debug HTTP listener (the profiling port set by `GO_PROFILING_PORT`, default `6060`), which serves Weaviate's **unauthenticated** internal debug and profiling endpoints — `/debug/config`, Go profiling (`/debug/pprof/*`, `/debug/fgprof`), and various maintenance and diagnostic routes. [Runtime-configurable](/deploy/configuration/env-vars/runtime-config.md) via the `debug_endpoints_enabled` override. Default: `false`. `GO_PROFILING_DISABLE` still controls whether the listener binds at all.
Added in `v1.37.9` | `boolean` | `true` | -| `GRPC_MAX_MESSAGE_SIZE` | Maximum gRPC message size in bytes. Requests larger than this limit (e.g. a large `insert_many` call) are rejected. Default: `104858000` (approximately 100 MB) | `string - number` | `2000000000` | +| `GRPC_MAX_MESSAGE_SIZE` | Maximum gRPC message size in bytes. Requests larger than this limit (e.g. a large `insert_many` call) are rejected. Default: `104858000` (approximately 100 MB) | `string - number` | `2000000000` | | `GRPC_PORT` | The port on which Weaviate's gRPC server listens for incoming requests. Default: `50051` | `string - number` | `50052` | | `HNSW_GEO_INDEX_EF` | Balance geo index search speed and recall. This value controls the search depth for geo-based queries. Default: `800`
Added in `v1.31.22` | `string - number` | `1000` | | `LAZY_LOAD_SHARD_COUNT_THRESHOLD` | Number of shards (tenants) in a collection before lazy shard loading activates. Set to `0` to force lazy loading for all collections. Default: `1000`. See [dynamic lazy shard loading](/weaviate/concepts/storage#dynamic-lazy-shard-loading).
Added in `v1.36.6` | `string - number` | `1000` | diff --git a/docs/weaviate/client-libraries/python/index.mdx b/docs/weaviate/client-libraries/python/index.mdx index 7a4b47a5c..b4b4cb635 100644 --- a/docs/weaviate/client-libraries/python/index.mdx +++ b/docs/weaviate/client-libraries/python/index.mdx @@ -116,20 +116,6 @@ For more code examples, check out the [How-to manuals & Guides](../../guides.mdx The Python client library provides a synchronous API by default through the `WeaviateClient` class, which is covered on this page. An asynchronous API is also available through the `WeaviateAsyncClient` class (from `weaviate-client` `v4.7.0` and up). See the [async client API page](./async.md) for further details. -## Batch imports - -The client provides several ways to [import data in bulk](../../manage-objects/import.mdx): - -- `collection.batch.stream()`: [Server-side batching](../../concepts/data-import.mdx#server-side-batching), the recommended starting point. The server tells the client how much data to send next, so you don't have to tune batch parameters yourself. -- `collection.data.ingest()`: A one-shot convenience for importing a list of objects that you already hold in memory. It uses server-side batching under the hood and returns the same return object as `insert_many`. -- `collection.batch.dynamic()`, `fixed_size()`, and `rate_limit()`: Client-side batching methods for when you want manual control over batch size and concurrency, or when server-side batching is not available. - -:::caution `insert_many` and large lists -`collection.data.insert_many()` sends all objects in a **single request**. The server rejects requests larger than its [`GRPC_MAX_MESSAGE_SIZE`](/deploy/configuration/env-vars/index.md#GRPC_MAX_MESSAGE_SIZE) limit, so the whole call fails for large lists. Use `collection.data.ingest()` instead: it is a drop-in replacement that splits the list into server-paced batches. -::: - -For guidance on choosing a batching method, see the [best practices page](./notes-best-practices.mdx#batch-imports). - ## Releases Go to the [GitHub releases page](https://github.com/weaviate/weaviate-python-client/releases) to see the history of the Python client library releases and change logs. diff --git a/docs/weaviate/manage-objects/import.mdx b/docs/weaviate/manage-objects/import.mdx index 992ac3cbf..5b1beff62 100644 --- a/docs/weaviate/manage-objects/import.mdx +++ b/docs/weaviate/manage-objects/import.mdx @@ -44,6 +44,9 @@ The following example adds objects to a collection named `MyCollection`. /> + +In TypeScript, `data.ingest()` is the server-side batching API, with no separate streaming context. It accepts any `Iterable`, so passing a generator streams objects to the server without building the full list in memory. + -In TypeScript, `data.ingest()` is the server-side batching API, with no separate streaming context. It accepts any `Iterable`, so you can also pass a lazy source instead of a list. +When your objects are already in an array, pass the array directly to `data.ingest()` to import the whole list in a single call. @@ -408,6 +411,7 @@ For details, see [auto-tenant](/weaviate/manage-collections/multi-tenancy#automa - [Connect to Weaviate](/weaviate/connections/index.mdx) - [How-to: Create objects](./create.mdx) - [Python client: batch import notes and best practices](../client-libraries/python/notes-best-practices.mdx) +- [Blog: Data import best practices](https://weaviate.io/blog/data-import-best-practices) - References: REST - /v1/batch From 96e58dfa0fccd122a57d5484c1a3c6359fd612fb Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Wed, 22 Jul 2026 17:59:47 +0200 Subject: [PATCH 07/84] Scope language-specific prose to the language tabs The server-side batching, ingest, and error-handling sections mixed Python-specific method names into shared paragraphs. The shared prose is now language-neutral and each language tab carries its own wording, so a selected language reads as one coherent story. Error handling gains a per-language tab block; the Go tab stays generic because the Go example does not consume the batch response. --- docs/weaviate/manage-objects/import.mdx | 49 +++++++++++++++++++++---- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/docs/weaviate/manage-objects/import.mdx b/docs/weaviate/manage-objects/import.mdx index 5b1beff62..ab08e63cb 100644 --- a/docs/weaviate/manage-objects/import.mdx +++ b/docs/weaviate/manage-objects/import.mdx @@ -25,17 +25,18 @@ import SsbStatus from '/_includes/feature-notes/ssb-status.mdx'; With [server-side batch imports](../concepts/data-import.mdx#server-side-batching) (also called "automatic" batching), the client sends data in batch sizes determined by feedback from the server. This simplifies your code and helps the server manage its own load. Server-side batching offers two entry points: -- **Stream from a data source** (recommended for large datasets): Open a batching context (`batch.stream()` in Python) and add objects one at a time as you read them, so the full dataset never has to fit in memory. -- **[Ingest an in-memory list](#ingest-an-in-memory-list)**: If your objects are already in a list, call `data.ingest()` to import the whole list in a single call. The client streams the list to the server using server-side batching under the hood. +- **Stream from a data source** (recommended for large datasets): Add objects to the import one at a time as you read them from the source, so the full dataset never has to fit in memory. +- **[Ingest an in-memory list](#ingest-an-in-memory-list)**: Import a list of objects that you already hold in memory with a single call. Server-side batching uses the [gRPC API](../api/index.mdx), which current client versions enable by default. If you use the Go client, configure its gRPC connection parameters as described on the [connection configuration page](../connections/connect-custom.mdx). -The [async Python client](../client-libraries/python/async.md#bulk-data-insertion) also supports server-side batching through the `stream()` method and the one-shot `ingest()` method. - The following example adds objects to a collection named `MyCollection`. + +Open the `batch.stream()` context manager and add objects one at a time; the client sends them at the pace the server requests. The [async Python client](../client-libraries/python/async.md#bulk-data-insertion) also supports server-side batching through the `stream()` method and the one-shot `ingest()` method. + + +Open a streaming context with `collection.batch.start()` and add objects one at a time. The batch is flushed and closed automatically when the try-with-resources block exits. + + +Open a streaming batch with `collection.Batch.StartBatch()` and add objects one at a time with `Add`. Call `Close` to flush the batch. + -`ingest` accepts plain property dicts or `DataObject` instances (to set object IDs, vectors, or references) and returns the same return object as `insert_many`. +`data.ingest()` is the safe replacement for passing a large list to `insert_many`, which sends all objects in a single request. `ingest` accepts plain property dicts or `DataObject` instances (to set object IDs, vectors, or references) and returns the same return object as `insert_many`. -Errors are reported the same way in server-side and manual batching. During a batch import, any failed objects or references are stored and can be inspected after the batching context closes. In the Python client: +Batch imports report failures per object: a problem with one object does not abort the rest of the import. Errors are reported the same way in server-side and manual batching. Inspect the failed items during and after the import to catch data issues early. -- Within the context manager, `batch.number_errors` holds a running count of failed objects and references. You can use this counter to stop the import process and investigate the failures. + + + +- Within a batching context manager, `batch.number_errors` holds a running count of failed objects and references. You can use this counter to stop the import process and investigate the failures. - After the context closes, `collection.batch.failed_objects` and `collection.batch.failed_references` contain the failed items. - The one-shot `data.ingest()` method returns the same result object as `insert_many`: its `errors` dict maps the original index of each failed object to its error. Find out more about error handling on the Python client [reference page](/weaviate/client-libraries/python). + + + +`data.ingest()` returns a result object. Inspect its `errors` field for the objects that failed to import. + + + + +Inspect the per-object errors on the result returned by the batcher. + + + + +Within a `batch.start()` streaming context, `batch.numberOfErrors()` reports the number of objects that could not be imported. The response returned by `insertMany` exposes the failed objects through its `errors()` method. + + + + +The response returned by `Batch.InsertMany` is a collection of per-object entries. Filter for entries where `Error` is not null to find the failed objects. With `Batch.StartBatch()`, each `Add` returns a handle whose result reports whether the object succeeded. + + + + ## Customize imported objects Batch-imported objects support the same parameters as individually created objects, such as custom IDs, vectors, and cross-references. These parameters work the same way in server-side and manual batching. From 2ce190ff4e14f383ee4f3f92fea7c29fa0124138 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Thu, 23 Jul 2026 08:18:50 +0200 Subject: [PATCH 08/84] Move the Go gRPC connection note into the manual batching Go tab --- docs/weaviate/manage-objects/import.mdx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/weaviate/manage-objects/import.mdx b/docs/weaviate/manage-objects/import.mdx index ab08e63cb..f993f1712 100644 --- a/docs/weaviate/manage-objects/import.mdx +++ b/docs/weaviate/manage-objects/import.mdx @@ -28,7 +28,7 @@ With [server-side batch imports](../concepts/data-import.mdx#server-side-batchin - **Stream from a data source** (recommended for large datasets): Add objects to the import one at a time as you read them from the source, so the full dataset never has to fit in memory. - **[Ingest an in-memory list](#ingest-an-in-memory-list)**: Import a list of objects that you already hold in memory with a single call. -Server-side batching uses the [gRPC API](../api/index.mdx), which current client versions enable by default. If you use the Go client, configure its gRPC connection parameters as described on the [connection configuration page](../connections/connect-custom.mdx). +Server-side batching uses the [gRPC API](../api/index.mdx), which current client versions enable by default. The following example adds objects to a collection named `MyCollection`. @@ -156,6 +156,9 @@ Use manual (client-side) batching when you want to control the batch size and co /> + +Configure the Go client's gRPC connection parameters as described on the [connection configuration](../connections/connect-custom.mdx) page. + Date: Thu, 23 Jul 2026 15:51:44 +0200 Subject: [PATCH 09/84] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- docs/weaviate/manage-objects/import.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/weaviate/manage-objects/import.mdx b/docs/weaviate/manage-objects/import.mdx index f993f1712..b2642662b 100644 --- a/docs/weaviate/manage-objects/import.mdx +++ b/docs/weaviate/manage-objects/import.mdx @@ -364,7 +364,7 @@ When you create an object, you can specify named vectors (if [configured in your ### Import with references -You can batch create links from an object to another other object through cross-references. +You can batch create links from an object to another object through cross-references. From a2dc1d8d29f0ad86cf25e17aebc3f0e15bcef39d Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Mon, 27 Jul 2026 11:23:50 +0200 Subject: [PATCH 10/84] docs: fix structured outputs review findings Follow-up to #457, addressing review findings. Correctness: - structured_outputs.py: the citations snippet used Field() but only imported BaseModel, so the block raised NameError when copied. - Register structured_outputs.py/.mts in tests/test_agents.py; they were the only query-agent snippet files not covered by CI. - Bump weaviate-agents to >=1.7.0 (Python) and ^1.6.0 (TS); output_format and outputFormat do not exist in the pinned 1.6.0/1.5.0. Add zod as an explicit dependency - it was only resolving via hoisting of a transitive copy, though weaviate-agents declares it as a peer dep. Snippets: - Block-scope each TS example so they can all use `res`; the rendered docs were publishing res2/res3/res4/res5. - Use console.dir(..., { depth: null }) for the nested and citation examples, which console.log was abbreviating to `[Array]` - exactly the nested values those examples exist to show. - Move the zod import into the shared instantiation block, and call populateWeaviate/populate_weaviate as the other snippet files do. Docs: - Regenerate every example output from a single real run of each file. The previous outputs named "FictionalSoft", a party that appears in 0 of the 300 objects in the query-agent-financial-contracts dataset (the counterparty is OpenAI), so they were not reproducible. - Note that outputs are non-deterministic and will vary between runs. - State the minimum client versions and the Zod 4 requirement. - Correct the string-format row: formats constrain the shape the model generates but are not validated afterwards. A hostname-formatted field returned a 3606-character value, 14x the RFC 1123 limit. - Name ParsedAskModeResponse as the returned class in ask_mode.md. - Note that additionalProperties is optional, and why only the TS example carries it. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01CxMtvQPuFNT2ERqHx7C49z --- .../_includes/code/structured_outputs.mts | 34 ++- .../_includes/code/structured_outputs.py | 11 +- docs/query-agent/guides/ask_mode.md | 22 +- docs/query-agent/reference/index.md | 2 +- .../reference/structured_outputs.md | 263 ++++++++---------- package.json | 5 +- pyproject.toml | 2 +- tests/test_agents.py | 2 + uv.lock | 8 +- yarn.lock | 13 +- 10 files changed, 185 insertions(+), 177 deletions(-) diff --git a/docs/query-agent/_includes/code/structured_outputs.mts b/docs/query-agent/_includes/code/structured_outputs.mts index 40e96982f..a81f2852c 100644 --- a/docs/query-agent/_includes/code/structured_outputs.mts +++ b/docs/query-agent/_includes/code/structured_outputs.mts @@ -1,19 +1,20 @@ import 'dotenv/config' -const { loadClientInternally } = await import('./util.mjs').catch(() => import('../docs/query-agent/_includes/code/util.mjs')); +const { loadClientInternally, populateWeaviate } = await import('./util.mjs').catch(() => import('../docs/query-agent/_includes/code/util.mjs')); const client = await loadClientInternally(); +await populateWeaviate(client, false); // START SOInstantiate import { QueryAgent } from 'weaviate-agents'; +import { z } from 'zod'; const qa = new QueryAgent(client, { collections: ['FinancialContracts'] }); // END SOInstantiate +{ // START SOBasicExampleBaseModel -import { z } from 'zod'; - const ContractSummary = z.object({ contract_id: z.string(), contract_title: z.string(), @@ -29,10 +30,12 @@ const res = await qa.ask( console.log(res.finalAnswerParsed); // END SOBasicExampleBaseModel +} +{ // START SOBasicDictExample -const res2 = await qa.ask( +const res = await qa.ask( "Find the oldest contract and include if it automatically renews, who is involved, and if user action is needed", { outputFormat: { @@ -51,22 +54,26 @@ const res2 = await qa.ask( } ); -console.log(res2.finalAnswerParsed); +console.log(res.finalAnswerParsed); // END SOBasicDictExample +} +{ // START SOReasoningExample const FinalAnswer = z.object({ reasoning: z.string(), final_answer: z.string(), }); -const res3 = await qa.ask("What is the most recent contract about AI?", { outputFormat: FinalAnswer }); +const res = await qa.ask("What is the most recent contract about AI?", { outputFormat: FinalAnswer }); -console.log(res3.finalAnswerParsed); +console.log(res.finalAnswerParsed); // END SOReasoningExample +} +{ // START SONestedExampleBaseModel const ContractInfo = z.object({ names_mentioned: z.array(z.string()).describe("All names within the contract text"), @@ -80,12 +87,16 @@ const ContractInfoResponse = z.object({ overall_summary: z.string(), }); -const res4 = await qa.ask("Find and return all contracts about AI in 2023", { outputFormat: ContractInfoResponse }); +const res = await qa.ask("Find and return all contracts about AI in 2023", { outputFormat: ContractInfoResponse }); -console.log(res4.finalAnswerParsed); +// `console.dir` with `depth: null` prints nested values in full; +// `console.log` would abbreviate them to `[Array]`. +console.dir(res.finalAnswerParsed, { depth: null }); // END SONestedExampleBaseModel +} +{ // START SOCitationExample const CitedText = z.object({ sentence: z.string().describe("A single sentence from your answer, to be combined with other sentences"), @@ -99,10 +110,11 @@ const CitedAnswer = z.object({ ), }); -const res5 = await qa.ask("What is the most recent contract about AI?", { outputFormat: CitedAnswer }); +const res = await qa.ask("What is the most recent contract about AI?", { outputFormat: CitedAnswer }); -console.log(res5.finalAnswerParsed); +console.dir(res.finalAnswerParsed, { depth: null }); // END SOCitationExample +} await client.close(); diff --git a/docs/query-agent/_includes/code/structured_outputs.py b/docs/query-agent/_includes/code/structured_outputs.py index 80d7673f5..2288f99ff 100644 --- a/docs/query-agent/_includes/code/structured_outputs.py +++ b/docs/query-agent/_includes/code/structured_outputs.py @@ -1,8 +1,9 @@ import sys sys.path.insert(0, "docs/query-agent/_includes/code") -from util import load_client_internally +from util import load_client_internally, populate_weaviate client = load_client_internally() +populate_weaviate(client, False) # START SOInstantiate @@ -32,7 +33,7 @@ class ContractSummary(BaseModel): # START SOBasicDictExample res = qa.ask( - "Find the oldest contract and include if it automatically renews, who is involved, and if user action is needed", + "Find the oldest contract and include if it automatically renews, who is involved, and if user action is needed", output_format={ 'properties': { 'contract_id': {'title': 'Contract Id', 'type': 'string'}, @@ -83,7 +84,7 @@ class ContractInfoResponse(BaseModel): # END SONestedExampleBaseModel # START SOCitationExample -from pydantic import BaseModel +from pydantic import BaseModel, Field from uuid import UUID class CitedText(BaseModel): @@ -99,4 +100,6 @@ class CitedAnswer(BaseModel): res = qa.ask("What is the most recent contract about AI?", output_format=CitedAnswer) print(res.final_answer_parsed) -# END SOCitationExample \ No newline at end of file +# END SOCitationExample + +client.close() diff --git a/docs/query-agent/guides/ask_mode.md b/docs/query-agent/guides/ask_mode.md index b16f6795a..72ffabffa 100644 --- a/docs/query-agent/guides/ask_mode.md +++ b/docs/query-agent/guides/ask_mode.md @@ -67,7 +67,7 @@ The `.ask()` method accepts several arguments: | `query` | `str \| list[ChatMessage]` | The user query you want the agent to answer. This can be a simple string (`"What is the highest-grossing product?"`) or a list of chat messages (for conversational context). [See the page on multi-turn conversations for more detail](../reference/multi_turn_conversations.md). | | `collections` | `list[str \| QueryAgentCollectionConfig] \| None` | The name(s) of the collections to search. You can pass one or many collection names as a list of strings (e.g., `["ECommerce", "BookSales"]`), or provide collection configuration objects for more control. If specified in the `ask` method, it will overwrite those defined in the instantiation of `QueryAgent`. [See the page on collection configuration for more detail](../reference/advanced_collections.md). | | `result_evaluation` | `Literal["llm", "none"]` | Controls whether the agent will ask an LLM to "evaluate" the result based on all retrieved context. Accepts either:
• `"none"` (default): faster and cheaper; where the final answer is the last LLM call and no further analysis is completed.
• `"llm"`: higher cost/latency - enables a final step where an LLM subsets the sources retrieved to only those used in the answer, as well as enabling the optional fields `is_partial_answer` and `missing_information`. See [the response class](#response) for more details. | -| `output_format` | `dict \| type[BaseModel] \| None` | Optional schema for structured output in the final response. Modifies the `final_answer` field of the [response class](#response). See [the page on structured output for more details](../reference/structured_outputs.md). | +| `output_format` | `dict \| type[BaseModel] \| None` | Optional schema for structured output in the final response. When set, `.ask()` returns a `ParsedAskModeResponse` instead of an `AskModeResponse`: the parsed result is added on a new `final_answer_parsed` field, and `final_answer` still holds the raw model output. See [the response class](#response) and [the page on structured outputs for more details](../reference/structured_outputs.md). |
@@ -76,7 +76,7 @@ The `.ask()` method accepts several arguments: | `query` | `string \| ChatMessage[]` | The user query you want the agent to answer. This can be a simple string (`"What is the highest-grossing product?"`) or a list of chat messages (for conversational context). [See the page on multi-turn conversations for more detail](../reference/multi_turn_conversations.md). | | `collections` | `(string \| QueryAgentCollectionConfig)[]` | The name(s) of the collections to search. You can pass one or many collection names as a list of strings (e.g., `["ECommerce", "BookSales"]`), or provide collection configuration objects for more control. [See the page on collection configuration for more detail](../reference/advanced_collections.md). If specified in the `ask` method, it will overwrite those defined in the instantiation of `QueryAgent`. | | `resultEvaluation` | `"llm" \| "none"` | Controls whether the agent will ask an LLM to "evaluate" the result based on all retrieved context. Accepts either:
• `"none"`: faster and cheaper; default setting where the final answer is the last LLM call.
• `"llm"`: higher cost/latency - enables a final step where an LLM subsets the sources retrieved to only those used in the answer, as well as enabling the optional fields `is_partial_answer` and `missing_information`. See [the response class](#response) for more details. | -| `outputFormat` | `ZodType \| object` | Optional schema for structured output in the final response. Pass a [Zod](https://zod.dev/) schema (parsed and validated) or a raw [Draft 2020-12 JSON Schema](https://json-schema.org/draft/2020-12) object (parsed only). Modifies the `finalAnswer` field of the [response class](#response), exposing the typed result on `finalAnswerParsed`. See [the page on structured output for more details](../reference/structured_outputs.md). | +| `outputFormat` | `ZodType \| object` | Optional schema for structured output in the final response. Pass a [Zod](https://zod.dev/) schema (parsed and validated) or a raw [Draft 2020-12 JSON Schema](https://json-schema.org/draft/2020-12) object (parsed only). When set, `.ask()` returns a `ParsedAskModeResponse` instead of an `AskModeResponse`: the typed result is added on a new `finalAnswerParsed` field, and `finalAnswer` still holds the raw model output. See [the response class](#response) and [the page on structured outputs for more details](../reference/structured_outputs.md). |
@@ -100,14 +100,15 @@ The `AskModeResponse` class has the following properties: | `final_answer` | `str` | A string comprising the LLM's final answer to the user query. | | `sources` | `list[Source] \| None` | A list of `Source` objects, which have an `object_id` property correlating to the UUID of the Weaviate object that was retrieved during the run. If `result_evaluation` is `"llm"`, these are subset to only those that are relevant to the `final_answer`. | -Additionally, there is another field if the `output_format` parameter on the call to ask mode (`qa.ask(..., output_format=...)`) was not `None`: +[See the client documentation for more detail.](https://weaviate-python-client.readthedocs.io/en/latest/weaviate-agents-python-client/docs/weaviate_agents.classes.html#weaviate_agents.classes.AskModeResponse) + +If you provide the `output_format` parameter (`qa.ask(..., output_format=...)`), Ask Mode returns a `ParsedAskModeResponse` instead. This is a subclass of `AskModeResponse`, so it keeps every field above — including `final_answer`, which still holds the raw string from the model — and adds one more: + | Field | Type | Description | | --- | --- | --- | -| `final_answer_parsed` | `` | The final response, conforming to the schema given in the `output_format`. | +| `final_answer_parsed` | `` | The final response, parsed into the schema given in `output_format`. | The type of `final_answer_parsed` is a `dict` if a dictionary was supplied to `output_format`, otherwise it will be the exact type of the `BaseModel` given. - -[See the client documentation for more detail.](https://weaviate-python-client.readthedocs.io/en/latest/weaviate-agents-python-client/docs/weaviate_agents.classes.html#weaviate_agents.classes.AskModeResponse)
@@ -123,14 +124,17 @@ The type of `final_answer_parsed` is a `dict` if a dictionary was supplied to `o | `finalAnswer` | `string` | A string comprising the LLM's final answer to the user query. | | `sources` | `Source[]` | A list of `Source` objects, which have an `objectId` property correlating to the UUID of the Weaviate object that was retrieved during the run. If `resultEvaluation` is `"llm"`, these are subset to only those that are relevant to the `finalAnswer`. | -Additionally, there is another field if the `outputFormat` parameter on the call to ask mode (`qa.ask(..., { outputFormat: ... })`) was provided: +[See the client documentation for more detail.](https://weaviate.github.io/agents-typescript-client/types/AskModeResponse.html) + +If you provide the `outputFormat` parameter (`qa.ask(..., { outputFormat: ... })`), Ask Mode returns a `ParsedAskModeResponse` instead. This is an `AskModeResponse` extended with one more field, so it keeps every field above — including `finalAnswer`, which still holds the raw string from the model: + | Field | Type | Description | | --- | --- | --- | -| `finalAnswerParsed` | `` | The final response, conforming to the schema given in `outputFormat`. | +| `finalAnswerParsed` | `` | The final response, parsed into the schema given in `outputFormat`. | The type of `finalAnswerParsed` is `Record` if a raw JSON Schema object was supplied to `outputFormat`, otherwise it will be the inferred type of the Zod schema given (`z.infer`). -[See the client documentation for more detail.](https://weaviate.github.io/agents-typescript-client/types/AskModeResponse.html) +[See the client documentation for more detail.](https://weaviate.github.io/agents-typescript-client/types/ParsedAskModeResponse.html)
diff --git a/docs/query-agent/reference/index.md b/docs/query-agent/reference/index.md index e05e24593..0bbff9b29 100644 --- a/docs/query-agent/reference/index.md +++ b/docs/query-agent/reference/index.md @@ -12,7 +12,7 @@ See the different configuration options for the Query Agent and how you can cust * **[Multi-turn Conversations](./multi_turn_conversations.md)**: Learn how to include multiple turns of conversations in a message history instead of a single user query. * **[Additional Filters](./additional_filters.md)**: Define persistent filters that get added to every search the Query Agent performs. * **[Collection Configuration](./advanced_collections.md)**: Setup your collections with more advanced configurations, such as named vectors, multi-tenancy and additional filters. -* **[Structured Outputs](./structured_outputs.md)**: Configure the format of the ask mode response to conform to a schema. +* **[Structured Outputs](./structured_outputs.md)**: Configure the format of the Ask Mode response to conform to a schema. ## Questions and feedback diff --git a/docs/query-agent/reference/structured_outputs.md b/docs/query-agent/reference/structured_outputs.md index 276ab249b..fccaa2942 100644 --- a/docs/query-agent/reference/structured_outputs.md +++ b/docs/query-agent/reference/structured_outputs.md @@ -1,5 +1,5 @@ --- -title: Structured Outputs +title: Structured outputs description: "Conform the final response to a particular schema." image: og/docs/query-agent.png # tags: ['agents', 'query-agent', 'configuration'] @@ -12,17 +12,46 @@ import PyCode from '!!raw-loader!/docs/query-agent/_includes/code/structured_out import TSCode from '!!raw-loader!/docs/query-agent/_includes/code/structured_outputs.mts'; -Structured outputs ensure that the model's final response will adhere to a given schema. This means you can easily access aspects of a response which is customised to your use-case. +Structured outputs ensure that the Query Agent's final response adheres to a schema that you provide. Instead of parsing a free-text answer, you get back an object whose fields are customized to your use case. -## Basic Usage +Structured outputs are supported in **[Ask Mode](../guides/ask_mode.md) only.** + +:::info Client versions +Structured outputs require `weaviate-agents` **1.7.0 or later** in Python, and **1.6.0 or later** in JavaScript/TypeScript. The JavaScript/TypeScript examples that use a Zod schema also require **Zod 4 or later**. [See the installation page](../installation.md). +::: + +The example outputs on this page are illustrative. The Query Agent is non-deterministic, so the wording, the level of detail, and the specific records it selects will vary between runs, even for an identical query and schema. The *shape* of the response is what the schema guarantees. + +## Basic usage + +Set the schema per request, with the `output_format` argument of `.ask()` (`outputFormat` in JavaScript/TypeScript). The examples on this page use a Query Agent instantiated over a `FinancialContracts` collection ([see the class instantiation page for more detail](./instantiation.md)): - In Python, you can either provide a Pydantic `BaseModel` or a raw dictionary conforming to the [Draft 2020-12 JSON Schema](https://json-schema.org/draft/2020-12) specification. + + + + + + + +The examples below use structured outputs to generate a set of metadata associated with a single retrieved item. - In the below examples, we use structured outputs to generate a set of metadata associated with a single retrieved item. + + + In Python, you can either provide a Pydantic `BaseModel` or a raw dictionary conforming to the [Draft 2020-12 JSON Schema](https://json-schema.org/draft/2020-12) specification. - The structured output can be accessed by a new field, `final_answer_parsed`, which appears only when the `output_format` argument is not `None`. The raw string from the model can still be accessed at `final_answer`. + The structured output is available on a new field, `final_answer_parsed`, which appears when you provide `output_format`. The raw string from the model can still be accessed at `final_answer`. **Pydantic BaseModel** Example output ```python ContractSummary( - contract_id='46', + contract_id='46.0', contract_title='Employment Contract', auto_renew=False, - parties_involved=['Weaviate', 'Mark Robson'], + parties_involved=['Weaviate (Employer)', 'Mark Robson (Employee)', 'Hans Zimmer (Chief Executive Officer/signatory)'], requires_action=True ) ``` @@ -58,10 +87,10 @@ Structured outputs ensure that the model's final response will adhere to a given Example output ```python { - 'contract_id': '46', + 'contract_id': '46.0', 'contract_title': 'Employment Contract', 'auto_renew': False, - 'parties_involved': ['Weaviate', 'Mark Robson'], + 'parties_involved': ['Weaviate (Employer)', 'Mark Robson (Employee)', 'Hans Zimmer, Chief Executive Officer'], 'requires_action': True } ``` @@ -71,9 +100,7 @@ Structured outputs ensure that the model's final response will adhere to a given In JavaScript/TypeScript, you can either provide a [Zod](https://zod.dev/) schema or a raw object conforming to the [Draft 2020-12 JSON Schema](https://json-schema.org/draft/2020-12) specification. - In the below examples, we use structured outputs to generate a set of metadata associated with a single retrieved item. - - The structured output can be accessed by a new field, `finalAnswerParsed`, which appears only when the `outputFormat` argument is not null. The raw string from the model can still be accessed at `finalAnswer`. + The structured output is available on a new field, `finalAnswerParsed`, which appears when you provide `outputFormat`. The raw string from the model can still be accessed at `finalAnswer`. **Zod schema** Example output ```typescript { - contract_id: '46', + contract_id: '46.0', contract_title: 'Employment Contract', auto_renew: false, - parties_involved: [ 'Weaviate', 'Mark Robson' ], + parties_involved: [ 'Weaviate (Employer)', 'Mark Robson (Employee)' ], requires_action: true } ``` @@ -106,15 +133,21 @@ Structured outputs ensure that the model's final response will adhere to a given Example output ```typescript { - contract_id: '46.0', + contract_id: '46', contract_title: 'Employment Contract', auto_renew: false, - parties_involved: [ 'Weaviate', 'Mark Robson' ], + parties_involved: [ + 'Weaviate (Employer)', + 'Mark Robson (Employee)', + 'Hans Zimmer (Chief Executive Officer and signatory)' + ], requires_action: true } ``` + The `additionalProperties: false` entry above is what Zod's own JSON Schema conversion emits, so the two examples describe the same schema. It is optional — the Query Agent accepts a schema with or without it. + @@ -134,8 +167,8 @@ As a basic example, consider adding an additional field `reasoning` to the respo Example output ```python FinalAnswer( - reasoning='The most recent contract mentioning AI is the sales agreement dated 2024-03-15, but it does not mention AI in the text. The most recent contract that is actually about AI is the partnership agreement dated 2023-11-15 between Weaviate and FictionalSoft, which explicitly states it is for artificial intelligence research and development. No later AI-related contract is present in the provided data.', - final_answer='The most recent contract about AI is the partnership agreement dated 2023-11-15 between Weaviate and FictionalSoft. It is specifically for collaboration on artificial intelligence research and development. No more recent AI-related contract appears in the provided data.' + reasoning='Among the provided contracts, the latest one explicitly concerning AI is dated November 15, 2023. It is a partnership agreement between Weaviate and OpenAI for collaboration on artificial intelligence research and development. The March 15, 2024 contracts are sales and lease agreements and do not concern AI.', + final_answer='The most recent AI-related contract is a **Partnership Agreement dated November 15, 2023**, between **Weaviate and OpenAI**. It establishes a three-year partnership to collaborate on **artificial intelligence research and development**. Weaviate is responsible for marketing and promotion, while OpenAI provides technical expertise and development support; profits are to be split equally.\n\n- **Contract type:** Partnership agreement\n- **Date:** November 15, 2023\n- **Author/signatory:** Johnathan Smith, CEO of Weaviate\n- **Document ID:** 60' ) ``` @@ -151,17 +184,15 @@ As a basic example, consider adding an additional field `reasoning` to the respo Example output ```typescript { - reasoning: 'The most recent contract related to AI is the partnership agreement dated 2024-03-15 at 10:30 UTC. It specifically mentions collaboration on artificial intelligence research and development.', - final_answer: 'The most recent AI-related contract is a **Partnership Agreement** dated **2024-03-15 10:30 UTC** between **Weaviate** and **FictionalSoft**. It says the parties wish to establish a partnership to collaborate on **artificial intelligence research and development**. It has a **2-year term** and includes financial contributions of **$244.46 from Weaviate** and **$151.01 from FictionalSoft**, with profits split **50/50**.\n' + - '\n' + - 'If you want, I can also summarize the next most recent AI-related contract.' + reasoning: 'The latest dated contract explicitly concerning AI is dated May 15, 2023. Later contracts in the provided data are dated November 15, 2023 and March 15, 2024, but do not concern AI. There are multiple duplicate records for the May 15 contract; the matching record identifies doc_id 56.0 and author Alice Johnson.', + final_answer: 'The most recent AI-related contract is a **Partnership Agreement** dated **May 15, 2023**.\n\n- **Author:** Alice Johnson\n- **Doc ID:** 56.0\n- **Summary:** Weaviate and OpenAI agree to collaborate on developing AI-driven solutions to improve data management and retrieval. Weaviate contributes $391.74, OpenAI contributes $302.40, profits are split 60/40, and the agreement lasts three years.\n\nNo later contract in the provided records explicitly concerns AI.' } ```
-## Example: Nested Schemas +## Example: Nested schemas Nested schemas are supported, for example, you can define two schemas and have one reference the other, allowing more complex structured outputs to be crafted. @@ -175,115 +206,71 @@ In the below example, the final response will generate a list of information for endMarker="# END SONestedExampleBaseModel" language="py" /> + A `Field` can be used to provide additional metadata, such as a `description`, or even constraints on numeric objects. A `Literal` can be used to constrain a field to produce only one of a few different objects.
Example output ```python ContractInfoResponse( contract_infos=[ ContractInfo( - names_mentioned=['Hans Zimmer', 'Weaviate', 'Mark Robson'], + names_mentioned=['Weaviate', 'OpenAI', 'Mark Robson', 'Kaladin Stormblessed'], contract_type='other', - summary='Loan agreement between Weaviate and Mark Robson for $342.00, dated 2023-03-15.', - contract_uuid=UUID('b2c4ffdc-411c-423a-9040-b7cbf5439bd0') + summary='Partnership Agreement dated March 15, 2023, establishing collaboration between Weaviate and OpenAI on artificial intelligence research and development. Weaviate contributes technology resources valued at $112.85 and staff time valued at $550.09; OpenAI contributes research expertise and project-management support valued at $98.14. Net profits are split 60% to Weaviate and 40% to OpenAI.', + contract_uuid=UUID('8ec8f74a-2d38-4aca-80ca-e66f12ae0cb6') ), ContractInfo( - names_mentioned=['John Smith', 'Weaviate'], + names_mentioned=['Weaviate', 'OpenAI', 'Alice Johnson', 'Mark Robson'], contract_type='other', - summary='Non-disclosure agreement between Weaviate and John Smith, dated 2022-03-15.', - contract_uuid=UUID('c126e3d3-db85-4a77-b49c-2a87fe48cd52') + summary='Partnership Agreement dated March 15, 2023, for collaboration on artificial intelligence projects. Weaviate contributes $210.97 toward initial project costs, while OpenAI contributes $194.05 toward research and development. OpenAI is responsible for technical development and AI research expertise.', + contract_uuid=UUID('056b6b5c-d6d3-4235-9003-4822dbbef9ef') ), ContractInfo( - names_mentioned=['Johnathan Smith', 'Weaviate', 'John Smith'], + names_mentioned=['Weaviate', 'OpenAI', 'Arthur Penndragon', 'Mark Robson', 'Danny Williams'], contract_type='other', - summary='Lease agreement for office space between Weaviate and John Smith, dated 2024-03-15.', - contract_uuid=UUID('6bbca4b9-fea1-4275-889a-1f5d4591ecbb') + summary='Partnership Agreement dated March 15, 2023, for artificial intelligence research and development, with shared resources and expertise. Weaviate contributes technology resources and staff time; OpenAI contributes research expertise and project-management support. Profits are divided 60% to Weaviate and 40% to OpenAI.', + contract_uuid=UUID('c50c3b9b-339a-4830-b2f7-4b0b9b84bc56') ), ContractInfo( - names_mentioned=['Arthur Penndragon', 'Weaviate', 'Mark Robson'], + names_mentioned=['Weaviate', 'OpenAI', 'Edward Elric', 'Mark Robson'], contract_type='other', - summary='Loan agreement between Weaviate and Mark Robson for $620.41, dated 2023-03-15.', - contract_uuid=UUID('93213fd4-4c55-4a7c-a190-2e4c9d808566') + summary='Partnership Agreement dated March 15, 2023, to develop advanced data-processing technologies. Weaviate provides technological support and resources valued at $416.56; OpenAI contributes AI and machine-learning expertise valued at $567.91. Revenue is split 60% to Weaviate and 40% to OpenAI.', + contract_uuid=UUID('3cec1521-3d26-46b3-b63f-1af2ddaa3db4') ), ContractInfo( - names_mentioned=['Alice Johnson', 'Weaviate', 'Danny Williams'], + names_mentioned=['Weaviate', 'OpenAI'], contract_type='other', - summary='Service agreement for digital marketing services between Weaviate and Danny Williams, dated - 2023-03-15, with total compensation of $961.89.', - contract_uuid=UUID('eed7d7f9-b06a-4d7b-b19a-f0f3782e49fd') + summary='Partnership Agreement dated March 15, 2023, focused on collaborative projects in AI technology development. Weaviate contributes $234.12 toward project funding, and OpenAI contributes $173.25 for marketing and promotion. Weaviate handles technical development, while OpenAI conducts research and data analysis.', + contract_uuid=UUID('3d2afbc4-24c1-4f64-b676-193e4dccb451') ), ContractInfo( - names_mentioned=['Weaviate', 'John Smith'], + names_mentioned=['Weaviate', 'OpenAI', 'Johnathan Smith', 'Mark Robson'], contract_type='other', - summary='Loan agreement between Weaviate and John Smith for $403.65, dated 2022-03-15.', - contract_uuid=UUID('5f75ec7e-ca7f-415c-9f5d-7d3a1518fad8') - ), - ContractInfo( - names_mentioned=['Hans Zimmer', 'Weaviate', 'Mark Robson'], - contract_type='sales', - summary='Sales agreement between Weaviate and Mark Robson for software licenses and support services, - dated 2023-04-24, with a total purchase price of $420.03.', - contract_uuid=UUID('174b1a9a-e9b2-4f48-960d-283a0fbbe3ab') + summary='Partnership Agreement dated March 15, 2023, to advance artificial intelligence technologies and develop innovative AI solutions. Weaviate contributes $177.98 and OpenAI contributes $67.09; each party is responsible for roles specified in an attached exhibit.', + contract_uuid=UUID('8ac31eff-9936-4a1b-a5a4-8e148a4596bf') ), ContractInfo( - names_mentioned=['John Williams', 'Weaviate', 'Mark Robson'], + names_mentioned=['Weaviate', 'OpenAI', 'Alice Johnson', 'Mark Robson'], contract_type='other', - summary='Service agreement between Weaviate and Mark Robson for consultation, software development, and - project management services, dated 2023-04-15, with total compensation of $744.35.', - contract_uuid=UUID('65848d82-e38e-4bed-b0bb-0c2830af8b27') + summary='Partnership Agreement dated October 15, 2023, for development of innovative AI solutions. Weaviate contributes $726.88 and project resources, while OpenAI contributes $251.09 and technical expertise. Profits are shared 60% to Weaviate and 40% to OpenAI.', + contract_uuid=UUID('aa3c40bc-8bea-42d3-9692-75a417a99a0d') ), ContractInfo( - names_mentioned=['John Williams', 'Weaviate'], + names_mentioned=['Weaviate', 'OpenAI', 'Johnathan Smith', 'Mark Robson'], contract_type='other', - summary='Invoice from Weaviate to John Williams for data analysis, API integration, system maintenance, - technical support, and consultation services, dated 2023-10-15, totaling $873.17.', - contract_uuid=UUID('5b5544f9-7092-45d0-830d-dd211b0f3a70') + summary='Partnership Agreement dated November 15, 2023, covering projects including artificial intelligence research and development. Weaviate contributes $244.46 and handles marketing; OpenAI contributes $151.01 and provides technical expertise. Profits are shared equally.', + contract_uuid=UUID('1e85f2b6-f2f7-4e52-86ba-c4f508f6c06d') ), ContractInfo( - names_mentioned=['Kaladin Stormblessed', 'Weaviate', 'John Smith'], + names_mentioned=['Weaviate', 'OpenAI', 'Alice Johnson', 'Danny Williams'], contract_type='other', - summary='Lease agreement between Weaviate and John Smith for office space, dated 2023-07-15.', - contract_uuid=UUID('f3f3730b-f3c4-4b2f-aa7a-1bc07b5814d8') - ), - ContractInfo( - names_mentioned=['Johnathan Smith', 'Weaviate', 'Mark Robson'], - contract_type='other', - summary='Non-disclosure agreement between Weaviate and Mark Robson, dated 2023-09-15.', - contract_uuid=UUID('3d4d802d-1820-4a5f-b8fe-6c5e189de1e6') - ), - ContractInfo( - names_mentioned=['John Williams', 'Weaviate', 'Danny Williams'], - contract_type='sales', - summary='Sales agreement between Weaviate and Danny Williams for products A, B, and C, dated - 2023-11-15, with a total purchase price of $270.68.', - contract_uuid=UUID('e645324e-14a4-4ca4-aeae-da146d55a3bb') - ), - ContractInfo( - names_mentioned=['John Williams', 'Weaviate', 'Mark Robson'], - contract_type='other', - summary='Invoice from Weaviate to Mark Robson dated 2023-04-15 for consultation, software development, - and project management services, totaling $744.35.', - contract_uuid=UUID('48a58d82-e38e-4bed-b0bb-0c2830af8b27') - ), - ContractInfo( - names_mentioned=['John Williams', 'Weaviate', 'John Smith'], - contract_type='other', - summary='Invoice from Weaviate to John Smith dated 2023-10-15 for consultation, development, and - additional charges, totaling $296.36.', - contract_uuid=UUID('03c0f5bb-f999-4b8b-86f3-271405de0037') - ), - ContractInfo( - names_mentioned=['Johnathan Smith', 'Weaviate', 'Danny Williams'], - contract_type='other', - summary='Service agreement between Weaviate and Danny Williams for software development, technical - support, and consultation services, dated 2023-03-15, with compensation of $273.86.', - contract_uuid=UUID('d68e20a9-4bd4-42d0-8986-d16425c3444a') + summary='Service Agreement dated March 15, 2023, for AI development and consulting services. The total fee is $249.44, payable in two installments of $124.72.', + contract_uuid=UUID('1363c2ae-83e6-4049-8f95-cd6c873a997e') ) ], - overall_summary='There are multiple 2023 contracts related to AI, including two partnership agreements about artificial intelligence research and development, plus other 2023 contracts mentioning AI-adjacent services. Some listed contracts are not directly about AI but were returned from the available matching set.' + overall_summary='Nine distinct contracts concerning AI, artificial intelligence research and development, AI technology development, AI solutions, or AI development and consulting were identified in 2023. Several duplicate records in the provided data were consolidated by document identity.' ) ```
- A `Field` can be used to provide additional metadata, such as a `description`, or even constraints on numeric objects. A `Literal` can be used to constrain a field to produce only one of a few different objects. @@ -353,7 +334,7 @@ In the below example, the final response will generate a list of information for For a custom implementation of citing text (for example, if you want citations in-line), you could create a schema that iteratively builds a response from objects consisting of pairs of text and source IDs. :::note Supported Citations -The Query Agent natively supports subsetting and evaluating the quality of the response via the `result_evaluation` parameter in ask mode. [See here for more details](../guides/ask_mode.md#parameters) +The Query Agent natively supports subsetting and evaluating the quality of the response via the `result_evaluation` parameter in Ask Mode. [See the Ask Mode parameters for more details](../guides/ask_mode.md#parameters). ::: @@ -368,15 +349,15 @@ The Query Agent natively supports subsetting and evaluating the quality of the r Example output ```python CitedAnswer( - reasoning='The most recent contract mentioning AI is the partnership agreement dated 2024-03-15, which explicitly refers to AI-related work only in the contract text by implication? However, among the provided contracts, the latest one that clearly concerns AI is the partnership agreement from 2023-11-15, and another earlier partnership agreement from 2023-10-15 also mentions AI solutions. The 2024-03-15 sales agreement does not mention AI, so it is not relevant. The latest clearly AI-related contract in the data is the 2023-11-15 partnership agreement between Weaviate and FictionalSoft.', + reasoning='The latest dated contract in the provided records that explicitly concerns AI is the partnership agreement dated November 15, 2023 (doc_id 60.0), which covers collaboration on AI research and development. The March 15, 2024 contract is a sales agreement for unspecified products and does not mention AI.', final_answer=[ CitedText( - sentence='The most recent contract about AI is the partnership agreement dated 2023-11-15 between Weaviate and FictionalSoft.', - sources=[UUID('4601c407-7905-4bd5-a1b9-4234bf18e9b6')] + sentence='The most recent contract explicitly about AI is a Partnership Agreement dated November 15, 2023, between Weaviate and OpenAI (doc_id 60.0), authored by Johnathan Smith.', + sources=[UUID('a06ab40a-bcc3-4fc2-bb8a-b2b2598f706c')] ), CitedText( - sentence='It says the parties will collaborate on projects including artificial intelligence research and development, with a three-year term and 50/50 profit sharing.', - sources=[UUID('4601c407-7905-4bd5-a1b9-4234bf18e9b6')] + sentence='It establishes a three-year collaboration on projects including artificial-intelligence research and development, with Weaviate contributing $244.46, OpenAI contributing $151.01, shared marketing and technical responsibilities, and profits split equally.', + sources=[UUID('a06ab40a-bcc3-4fc2-bb8a-b2b2598f706c')] ) ] ) @@ -394,15 +375,15 @@ The Query Agent natively supports subsetting and evaluating the quality of the r Example output ```typescript { - reasoning: 'The most recent contract that explicitly concerns AI is the partnership agreement dated 2023-11-15 between Weaviate and FictionalSoft, which states that the parties wish to collaborate on artificial intelligence research and development. Among the provided contracts, no later agreement mentions AI, and later-dated documents are sales or lease agreements without AI-related terms.', + reasoning: 'The latest dated contract in the provided records that explicitly concerns AI is dated May 15, 2023. It is a partnership agreement for developing AI-driven solutions; the later March 15, 2024 contracts do not mention AI.', final_answer: [ { - sentence: 'The most recent AI-related contract is the partnership agreement dated November 15, 2023, between Weaviate and FictionalSoft, which is for collaboration on artificial intelligence research and development.', - sources: [Array] + sentence: 'The most recent AI-related contract is a Partnership Agreement dated May 15, 2023, authored by Alice Johnson, with document ID 56.0.', + sources: [ 'e32c13b7-b552-45f6-b58b-3f0c325715ab' ] }, { - sentence: 'No later contract in the provided set mentions AI; the newer 2024 documents are a sales agreement and lease agreements that do not reference artificial intelligence.', - sources: [Array] + sentence: 'It establishes a partnership between Weaviate and OpenAI to develop AI-driven solutions for improving data management and retrieval, with Weaviate contributing $391.74, OpenAI contributing $302.40, and profits split 60% to Weaviate and 40% to OpenAI over a three-year term.', + sources: [ 'e32c13b7-b552-45f6-b58b-3f0c325715ab' ] } ] } @@ -418,22 +399,22 @@ The Query Agent natively supports subsetting and evaluating the quality of the r |---------|:----------:|-------| | Min / max number of items in an array | ✅ | | | Min / max value of a number property | ✅ | E.g. constrain a value to be within a certain range. | -| String formats: `uuid`, `date-time`, `time`, `date`, `duration`, `email`, `hostname`, `ipv4`, `ipv6` | ✅ | Validated as a string with the given format. | +| String formats: `uuid`, `date-time`, `time`, `date`, `duration`, `email`, `hostname`, `ipv4`, `ipv6` | ✅ | Constrains the model to generate a string in the shape of the given format. The value is not validated against the full specification for that format after generation, so ask for a field the retrieved data can actually populate. | | Regular expression (pattern) on a string | ✅ | | | Recursive schemas (a schema referencing itself) | ✅ | | -| Default values (e.g. `x: int = 1`) | ❌ | The field is always populated by the model, so the default is never used. Consider using nullable entries and transforming them afterwards. | -| Schemas with 5000+ properties | ❌ | | -| 1000 or more enum values across all properties | ❌ | | -| More than 10 levels of nesting in a single property | ❌ | | +| Default values (e.g. `x: int = 1`) | ❌ | The schema is accepted, but the field is always populated by the model, so the default is never used. Consider using nullable entries and transforming them afterwards. | +| Schemas with 5000+ properties | ❌ | Rejected with a `SCHEMA_VALIDATION_ERROR` before the agent runs. | +| 1000 or more enum values across all properties | ❌ | Rejected with a `SCHEMA_VALIDATION_ERROR` before the agent runs. | +| More than 10 levels of nesting in a single property | ❌ | Rejected with a `SCHEMA_VALIDATION_ERROR` before the agent runs. The error names the offending field path and its depth. | ## Streaming -Structured outputs are supported with [streaming ask mode](../guides/ask_mode.md#streaming). +Structured outputs are supported with [streaming in Ask Mode](../guides/ask_mode.md#streaming). -When streaming, the structured output is delivered incrementally as raw string fragments through `StreamedTokens` instances. No special parsing is applied during the stream — each token is simply a piece of the final output. To use the partial result, accumulate the streamed tokens into a single string, then partially validate the string against your schema. +When streaming, the structured output is delivered incrementally as raw string fragments through `StreamedTokens` instances. No special parsing is applied during the stream — each token is a fragment of the final output. To use the partial result, accumulate the streamed tokens into a single string, then partially validate the string against your schema. -To use the final result after completion, you do not need to use the streamed tokens. Simply access the `final_answer_parsed` attribute (`finalAnswerParsed` in TypeScript) of the [`AskModeResponse` final state output](../guides/ask_mode.md#responses). +To use the final result after completion, you do not need to use the streamed tokens. Read the `final_answer_parsed` attribute (`finalAnswerParsed` in TypeScript) of the [final state output](../guides/ask_mode.md#responses). ## Questions and feedback diff --git a/package.json b/package.json index fae12bedf..0c238474f 100644 --- a/package.json +++ b/package.json @@ -42,9 +42,10 @@ "stream-chain": "^2.2.5", "stream-json": "^1.7.5", "uuid": "^13.0.0", - "weaviate-agents": "^1.5.0", + "weaviate-agents": "^1.6.0", "weaviate-client": "^3.12.1", - "weaviate-ts-embedded": "^1.1.0" + "weaviate-ts-embedded": "^1.1.0", + "zod": "^4.0.0" }, "devDependencies": { "@docusaurus/module-type-aliases": "^3.8.1", diff --git a/pyproject.toml b/pyproject.toml index 132c210cc..b1a9cce69 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ dependencies = [ "python-dotenv>=1.1.1", "requests>=2.32.3", "tqdm>=4.67.1", - "weaviate-agents>=1.6.0", + "weaviate-agents>=1.7.0", "weaviate-client==4.22.0", "weaviate-demo-datasets>=0.8.1", "weaviate-engram>=0.3.0", diff --git a/tests/test_agents.py b/tests/test_agents.py index 13fe86825..667635820 100644 --- a/tests/test_agents.py +++ b/tests/test_agents.py @@ -18,6 +18,7 @@ "./docs/query-agent/_includes/code/query_agent.py", "./docs/query-agent/_includes/code/quickstart.py", "./docs/query-agent/_includes/code/search_mode.py", + "./docs/query-agent/_includes/code/structured_outputs.py", "./docs/query-agent/_includes/code/suggest_queries.py", "./docs/query-agent/_includes/code/system_prompt.py", # Recipe walkthroughs (Weaviate Cloud + Weaviate Embeddings only) @@ -61,6 +62,7 @@ def test_recipes_requiring_openai_pyv4(script_loc): "./docs/query-agent/_includes/code/query_agent.mts", "./docs/query-agent/_includes/code/quickstart.mts", "./docs/query-agent/_includes/code/search_mode.mts", + "./docs/query-agent/_includes/code/structured_outputs.mts", "./docs/query-agent/_includes/code/suggest_queries.mts", "./docs/query-agent/_includes/code/system_prompt.mts", ], diff --git a/uv.lock b/uv.lock index 1bf725bd5..1db99e98a 100644 --- a/uv.lock +++ b/uv.lock @@ -1718,16 +1718,16 @@ wheels = [ [[package]] name = "weaviate-agents" -version = "1.6.0" +version = "1.7.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx-sse" }, { name = "rich" }, { name = "weaviate-client" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6e/a5/bd394d83a86153bcb54c297052558b312a247368c04ed08149850f0dcf71/weaviate_agents-1.6.0.tar.gz", hash = "sha256:a30c9c5120df3bc55ba1fa2384a4ebf5a3654d427a758294d9fa712cb5791576", size = 107790, upload-time = "2026-06-16T19:38:56.386Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b8/99/750d7d2e33f610bad0d4b1d77e2a7f0c73dbab5459876fa51c7a4a440a3a/weaviate_agents-1.7.0.tar.gz", hash = "sha256:f033085cbde7123424f5579dfab553df5e0128d395dfea3b58c5aea6602340cb", size = 111884, upload-time = "2026-07-27T08:31:58.622Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/96/69/9c5876da7925332d63151bcc61990e272cb8140a6dc7c6e887c905a3aede/weaviate_agents-1.6.0-py3-none-any.whl", hash = "sha256:e68723e3c14bf9639feadf307a55b7af4ddf2010e4d382e87b70766aeec8dae4", size = 50262, upload-time = "2026-06-16T19:38:55.445Z" }, + { url = "https://files.pythonhosted.org/packages/5e/d3/30952e1a4ca1556beb73e756d1f514c0bd62db53c21bdc65cdd6c5c6b78e/weaviate_agents-1.7.0-py3-none-any.whl", hash = "sha256:052e37ad9114424149b29deb8ba96159fce69f54e45874a4d6e42b1831643931", size = 54505, upload-time = "2026-07-27T08:31:57.755Z" }, ] [[package]] @@ -1795,7 +1795,7 @@ requires-dist = [ { name = "python-dotenv", specifier = ">=1.1.1" }, { name = "requests", specifier = ">=2.32.3" }, { name = "tqdm", specifier = ">=4.67.1" }, - { name = "weaviate-agents", specifier = ">=1.6.0" }, + { name = "weaviate-agents", specifier = ">=1.7.0" }, { name = "weaviate-client", specifier = "==4.22.0" }, { name = "weaviate-demo-datasets", specifier = ">=0.8.1" }, { name = "weaviate-engram", specifier = ">=0.3.0" }, diff --git a/yarn.lock b/yarn.lock index 3d8e031b2..750e8bf42 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15483,10 +15483,10 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -weaviate-agents@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/weaviate-agents/-/weaviate-agents-1.5.0.tgz#a842c85bccfbdba172f8e3b00e61b8ff9953bfd7" - integrity sha512-0In5bvKaI8kaef8hX+NXp/VwJmkBYIsWz0zEH8Jw+ZEF/kORDzH3FNMcID29+TuoCrGQTRz/kbAx1LI68a+JRQ== +weaviate-agents@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/weaviate-agents/-/weaviate-agents-1.6.0.tgz#29139b1afa51c65b64b20b6c8ad180f6c46f7915" + integrity sha512-rOFYiZz9c+RdFj/G28xWp+6jx5I2Nl88dMB14QwZWPNBbieRTFzo8S+DeZbh/7zsXa9/oRjRiTMkxMb/VoNyVA== weaviate-client@^3.12.1: version "3.13.0" @@ -15959,6 +15959,11 @@ zod@^3.23.8: resolved "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz" integrity sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A== +zod@^4.0.0: + version "4.4.3" + resolved "https://registry.yarnpkg.com/zod/-/zod-4.4.3.tgz#b680f172885d18bbebf21a834ea25e55a1bbf356" + integrity sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ== + zod@^4.1.8, zod@^4.3.5: version "4.3.6" resolved "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz" From 3ac2570aecbc93b4c8b5bd79a1105426e753aaf3 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Mon, 27 Jul 2026 11:30:38 +0200 Subject: [PATCH 11/84] docs: drop explanatory comment from console.dir examples Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01CxMtvQPuFNT2ERqHx7C49z --- docs/query-agent/_includes/code/structured_outputs.mts | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/query-agent/_includes/code/structured_outputs.mts b/docs/query-agent/_includes/code/structured_outputs.mts index a81f2852c..d3537e6cb 100644 --- a/docs/query-agent/_includes/code/structured_outputs.mts +++ b/docs/query-agent/_includes/code/structured_outputs.mts @@ -89,8 +89,6 @@ const ContractInfoResponse = z.object({ const res = await qa.ask("Find and return all contracts about AI in 2023", { outputFormat: ContractInfoResponse }); -// `console.dir` with `depth: null` prints nested values in full; -// `console.log` would abbreviate them to `[Array]`. console.dir(res.finalAnswerParsed, { depth: null }); // END SONestedExampleBaseModel } From a185616edd96de1762df856124e7c787042c4c46 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Mon, 27 Jul 2026 12:01:18 +0200 Subject: [PATCH 12/84] docs: tighten prose in structured outputs pages Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01CxMtvQPuFNT2ERqHx7C49z --- docs/query-agent/guides/ask_mode.md | 4 ++-- docs/query-agent/reference/structured_outputs.md | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/query-agent/guides/ask_mode.md b/docs/query-agent/guides/ask_mode.md index 72ffabffa..85cfee2d3 100644 --- a/docs/query-agent/guides/ask_mode.md +++ b/docs/query-agent/guides/ask_mode.md @@ -102,7 +102,7 @@ The `AskModeResponse` class has the following properties: [See the client documentation for more detail.](https://weaviate-python-client.readthedocs.io/en/latest/weaviate-agents-python-client/docs/weaviate_agents.classes.html#weaviate_agents.classes.AskModeResponse) -If you provide the `output_format` parameter (`qa.ask(..., output_format=...)`), Ask Mode returns a `ParsedAskModeResponse` instead. This is a subclass of `AskModeResponse`, so it keeps every field above — including `final_answer`, which still holds the raw string from the model — and adds one more: +If you provide the `output_format` parameter (`qa.ask(..., output_format=...)`), Ask Mode returns a `ParsedAskModeResponse` instead. It is a subclass of `AskModeResponse`, so it keeps every field above and adds one more. `final_answer` still holds the raw string from the model. | Field | Type | Description | | --- | --- | --- | @@ -126,7 +126,7 @@ The type of `final_answer_parsed` is a `dict` if a dictionary was supplied to `o [See the client documentation for more detail.](https://weaviate.github.io/agents-typescript-client/types/AskModeResponse.html) -If you provide the `outputFormat` parameter (`qa.ask(..., { outputFormat: ... })`), Ask Mode returns a `ParsedAskModeResponse` instead. This is an `AskModeResponse` extended with one more field, so it keeps every field above — including `finalAnswer`, which still holds the raw string from the model: +If you provide the `outputFormat` parameter (`qa.ask(..., { outputFormat: ... })`), Ask Mode returns a `ParsedAskModeResponse` instead. It is an `AskModeResponse` with one more field, so it keeps every field above. `finalAnswer` still holds the raw string from the model. | Field | Type | Description | | --- | --- | --- | diff --git a/docs/query-agent/reference/structured_outputs.md b/docs/query-agent/reference/structured_outputs.md index fccaa2942..38120a78a 100644 --- a/docs/query-agent/reference/structured_outputs.md +++ b/docs/query-agent/reference/structured_outputs.md @@ -20,7 +20,7 @@ Structured outputs are supported in **[Ask Mode](../guides/ask_mode.md) only.** Structured outputs require `weaviate-agents` **1.7.0 or later** in Python, and **1.6.0 or later** in JavaScript/TypeScript. The JavaScript/TypeScript examples that use a Zod schema also require **Zod 4 or later**. [See the installation page](../installation.md). ::: -The example outputs on this page are illustrative. The Query Agent is non-deterministic, so the wording, the level of detail, and the specific records it selects will vary between runs, even for an identical query and schema. The *shape* of the response is what the schema guarantees. +The example outputs on this page will not match yours exactly. The Query Agent is non-deterministic, so the wording and the records it picks vary between runs. Your schema controls the shape of the response, not the content. ## Basic usage @@ -146,7 +146,7 @@ The examples below use structured outputs to generate a set of metadata associat ``` - The `additionalProperties: false` entry above is what Zod's own JSON Schema conversion emits, so the two examples describe the same schema. It is optional — the Query Agent accepts a schema with or without it. + Zod adds `additionalProperties: false` when it converts a schema to JSON Schema, so both examples above describe the same thing. The field is optional. The Query Agent accepts a schema with or without it. @@ -399,7 +399,7 @@ The Query Agent natively supports subsetting and evaluating the quality of the r |---------|:----------:|-------| | Min / max number of items in an array | ✅ | | | Min / max value of a number property | ✅ | E.g. constrain a value to be within a certain range. | -| String formats: `uuid`, `date-time`, `time`, `date`, `duration`, `email`, `hostname`, `ipv4`, `ipv6` | ✅ | Constrains the model to generate a string in the shape of the given format. The value is not validated against the full specification for that format after generation, so ask for a field the retrieved data can actually populate. | +| String formats: `uuid`, `date-time`, `time`, `date`, `duration`, `email`, `hostname`, `ipv4`, `ipv6` | ✅ | Guides the model to produce a string in that format. The result is not checked afterwards, so a field your data cannot fill may still come back invalid. | | Regular expression (pattern) on a string | ✅ | | | Recursive schemas (a schema referencing itself) | ✅ | | | Default values (e.g. `x: int = 1`) | ❌ | The schema is accepted, but the field is always populated by the model, so the default is never used. Consider using nullable entries and transforming them afterwards. | From 1a60493b79bfacc1c912611e69cb207d79405fbe Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Mon, 27 Jul 2026 12:09:04 +0200 Subject: [PATCH 13/84] docs: restore verbatim run output in two structured outputs examples The TS nested example had been trimmed from 8 entries to 6 with a reworded overall_summary, and the Python citations reasoning had its clauses reordered. Both now match the captured run output exactly. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01CxMtvQPuFNT2ERqHx7C49z --- docs/query-agent/reference/structured_outputs.md | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/docs/query-agent/reference/structured_outputs.md b/docs/query-agent/reference/structured_outputs.md index 38120a78a..a849cdaa0 100644 --- a/docs/query-agent/reference/structured_outputs.md +++ b/docs/query-agent/reference/structured_outputs.md @@ -303,6 +303,12 @@ In the below example, the final response will generate a list of information for summary: 'Service agreement dated March 15, 2023, for consulting on artificial intelligence and data management systems, including implementation, training, and technical support. The total fee is $428.14, with a two-year term ending March 15, 2025.', contract_uuid: 'dbc30467-5f6a-4630-b7ea-7a17ade8b70a' }, + { + names_mentioned: [ 'Weaviate', 'Danny Williams', 'Kaladin Stormblessed' ], + contract_type: 'other', + summary: 'Duplicate record of the service agreement for artificial intelligence and data management systems consulting, implementation, training, and technical support. Total fee: $428.14; term ends March 15, 2025.', + contract_uuid: '010aeced-3328-415c-b93d-c19dc4baeefa' + }, { names_mentioned: [ 'Weaviate', 'OpenAI', 'Edward Elric', 'Mark Robson' ], contract_type: 'other', @@ -315,6 +321,12 @@ In the below example, the final response will generate a list of information for summary: 'Partnership agreement dated March 15, 2023, to collaborate on advancements in artificial intelligence technologies and develop innovative AI solutions. Weaviate contributes $177.98 and OpenAI contributes $67.09.', contract_uuid: '8ac31eff-9936-4a1b-a5a4-8e148a4596bf' }, + { + names_mentioned: [ 'Weaviate', 'OpenAI', 'Johnathan Smith', 'Mark Robson' ], + contract_type: 'other', + summary: 'Duplicate record of the partnership agreement to collaborate on artificial intelligence technologies and develop AI solutions. Weaviate contributes $177.98 and OpenAI contributes $67.09.', + contract_uuid: '6fcb6899-6344-41e0-8963-10b49bd17625' + }, { names_mentioned: [ 'Weaviate', 'OpenAI', 'Alice Johnson', 'Mark Robson' ], contract_type: 'other', @@ -322,7 +334,7 @@ In the below example, the final response will generate a list of information for contract_uuid: 'e32c13b7-b552-45f6-b58b-3f0c325715ab' } ], - overall_summary: 'Several 2023 contracts concern AI or artificial-intelligence-related services and projects, comprising partnership agreements and AI-related service agreements. Duplicate records were consolidated by document identity.' + overall_summary: 'Eight unique 2023 contracts concern AI or artificial intelligence-related services and projects. Several duplicate records were omitted from the main list. The matching documents include five partnership agreements and three AI-related service-agreement records; no invoice was explicitly identified as AI-related based on its text.' } ``` @@ -349,7 +361,7 @@ The Query Agent natively supports subsetting and evaluating the quality of the r Example output ```python CitedAnswer( - reasoning='The latest dated contract in the provided records that explicitly concerns AI is the partnership agreement dated November 15, 2023 (doc_id 60.0), which covers collaboration on AI research and development. The March 15, 2024 contract is a sales agreement for unspecified products and does not mention AI.', + reasoning='The latest dated contract in the provided records that explicitly concerns AI is dated March 15, 2024, but it is a sales agreement for unspecified products and does not mention AI. The latest contract that explicitly concerns artificial intelligence is the partnership agreement dated November 15, 2023 (doc_id 60.0), which covers collaboration on AI research and development.', final_answer=[ CitedText( sentence='The most recent contract explicitly about AI is a Partnership Agreement dated November 15, 2023, between Weaviate and OpenAI (doc_id 60.0), authored by Johnathan Smith.', From f5f48eedfec2b0ce7cd5d57a0e5d88772c45af59 Mon Sep 17 00:00:00 2001 From: Connor Shorten Date: Tue, 28 Jul 2026 09:39:05 -0400 Subject: [PATCH 14/84] first look --- .../_includes/code/search_mode.mts | 11 ++++++++ .../query-agent/_includes/code/search_mode.py | 11 ++++++++ docs/query-agent/guides/search_mode.md | 27 +++++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/docs/query-agent/_includes/code/search_mode.mts b/docs/query-agent/_includes/code/search_mode.mts index fc9f355b8..af2bbefbe 100644 --- a/docs/query-agent/_includes/code/search_mode.mts +++ b/docs/query-agent/_includes/code/search_mode.mts @@ -102,4 +102,15 @@ for (const obj of filteringResponse.searchResults.objects) { } // END FilteringExample +// START EffortExample +const effortResponse = await qa.search("What are Setwise Rerankers?", { + limit: 10, + effort: "high", +}); + +for (const obj of effortResponse.searchResults.objects) { + console.log(obj.properties); +} +// END EffortExample + await client.close(); diff --git a/docs/query-agent/_includes/code/search_mode.py b/docs/query-agent/_includes/code/search_mode.py index d1bab68d4..c85766615 100644 --- a/docs/query-agent/_includes/code/search_mode.py +++ b/docs/query-agent/_includes/code/search_mode.py @@ -107,6 +107,17 @@ print(f"Product: {obj.properties['name']} - ${obj.properties['price']}") # END FilteringExample +# START EffortExample +search_response = qa.search( + "What are Setwise Rerankers?", + limit=10, + effort="high", +) + +for obj in search_response.search_results.objects: + print(obj.properties) +# END EffortExample + # --- Async code examples in string as top-level await doesn't work, full code will be executed in # asyncio.run below diff --git a/docs/query-agent/guides/search_mode.md b/docs/query-agent/guides/search_mode.md index ff4d6a24c..6329919c1 100644 --- a/docs/query-agent/guides/search_mode.md +++ b/docs/query-agent/guides/search_mode.md @@ -69,6 +69,7 @@ The `.search()` method accepts several arguments: | `limit` | `int` | The maximum number of results returned in this page of results. Defaults to `20`. Use [`.next()`](#pagination) to fetch additional pages. | | `filtering` | `Literal["recall", "precision"]` | Either `"recall"` or `"precision"` to control filter generation. `"recall"` favors more results across filter interpretations; `"precision"` favors strict intent match. See [Customized filtering](#customized-filtering) below. | | `diversity_weight` | `float \| None` | A value between `0.0` and `1.0` that biases the result ranking towards diversity using Maximal Marginal Relevance (MMR). See [Diversity ranking](#diversity-ranking) below. | +| `effort` | `Literal["low", "medium", "high"] \| None` | The amount of effort the agent puts into the search. Higher effort may improve result quality at the expense of increased latency and cost. See [Search effort](#search-effort) below. | @@ -79,6 +80,7 @@ The `.search()` method accepts several arguments: | `limit` | `number` | The maximum number of results returned in this page of results. Defaults to `20`. Use [`.next()`](#pagination) to fetch additional pages. | | `filtering` | `"recall" \| "precision"` | Either `"recall"` or `"precision"` to control filter generation. `"recall"` favors more results across filter interpretations; `"precision"` favors strict intent match. See [Customized filtering](#customized-filtering) below. | | `diversityWeight` | `number` | A value between `0.0` and `1.0` that biases the result ranking towards diversity using Maximal Marginal Relevance (MMR). See [Diversity ranking](#diversity-ranking) below. | +| `effort` | `"low" \| "medium" \| "high"` | The amount of effort the agent puts into the search. Higher effort may improve result quality at the expense of increased latency and cost. See [Search effort](#search-effort) below. | @@ -138,6 +140,31 @@ To use diversity ranking with target vectors, set the single target vector you w +### Search effort + +The optional `effort` parameter controls the amount of effort the agent puts into the search. It accepts one of `"low"`, `"medium"`, or `"high"` — higher effort may improve result quality at the expense of increased latency and cost. When omitted, the search behaves as if the parameter did not exist. + +The effort value is fixed for the lifetime of a search: paginating with [`.next()`](#pagination) reuses the same effort value on every page, just as the underlying searches are reused to keep the result set consistent. + + + + + + + + + + ## Response The Search Mode response has the following properties: From 3962160c12310450f9b66b637412bb0a85cb00e0 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Wed, 29 Jul 2026 13:21:12 +0200 Subject: [PATCH 15/84] docs: add a Python generator example for server-side ingest The batch import page taught the iterable/generator form of the one-shot ingest call to TypeScript readers only, even though the Python client accepts any iterable too. Add the Python counterpart so both clients document the same capability. * New CI-executed snippet reads a JSONL file line by line and yields property dicts straight into the ingest call, so the file never has to fit in memory. Blank lines are skipped explicitly instead of relying on a null check that raises on them. * The snippet sits in the server-side batching tab, next to the streaming context, and links to the in-memory list section for the eager form. * "Stream data from large files" now names Python alongside TypeScript for the lazy-iterable option. Verified against Weaviate 1.38.0 with the CI-pinned client: 5 uuids returned, empty errors dict, all 5 titles persisted. --- _includes/code/howto/manage-data.import.py | 54 ++++++++++++++++++++++ docs/weaviate/manage-objects/import.mdx | 11 ++++- 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/_includes/code/howto/manage-data.import.py b/_includes/code/howto/manage-data.import.py index 4a7bf34f0..dfe5eda76 100644 --- a/_includes/code/howto/manage-data.import.py +++ b/_includes/code/howto/manage-data.import.py @@ -616,6 +616,60 @@ def add_object(obj) -> None: client.collections.delete(collection.name) +# ================================================== +# ===== Server-side ingest from a generator ===== +# ================================================== + +# Re-create the collection +client.collections.delete("MyCollection") +client.collections.create( + "MyCollection", + vector_config=Configure.Vectors.self_provided() +) + +# Create the source file used by the example below +with open("my-data.jsonl", "w") as f: + for i in range(5): + f.write(json.dumps({"title": f"Object {i+1}"}) + "\n") + f.write("\n") # A blank line, to show that the generator skips it + +# START ServerSideIngestGeneratorExample +import json + +# Each line of the source file holds one JSON object +def read_objects(path): + with open(path) as f: + for line in f: + line = line.strip() + if not line: # Skip blank lines + continue + record = json.loads(line) + yield {"title": record["title"]} + +collection = client.collections.use("MyCollection") + +# highlight-start +# `ingest` accepts any iterable, so the generator supplies objects one at a +# time and the file is never loaded into memory in full +result = collection.data.ingest(read_objects("my-data.jsonl")) +# highlight-end + +if result.errors: + print(f"Number of failed imports: {len(result.errors)}") +# END ServerSideIngestGeneratorExample + +# Tests +assert len(result.errors) == 0 +assert len(result.uuids) == 5 + +agg_result = collection.aggregate.over_all(total_count=True) +assert agg_result.total_count == 5 + +# Clean up +client.collections.delete(collection.name) +os.remove("my-data.jsonl") + + # ================================================== # ===== Server-side one-shot ingest ===== # ================================================== diff --git a/docs/weaviate/manage-objects/import.mdx b/docs/weaviate/manage-objects/import.mdx index b2642662b..a053abbb7 100644 --- a/docs/weaviate/manage-objects/import.mdx +++ b/docs/weaviate/manage-objects/import.mdx @@ -43,6 +43,15 @@ Open the `batch.stream()` context manager and add objects one at a time; the cli endMarker="# END ServerSideBatchImportExample" language="py" /> + +You can also stream from a data source with the one-shot import method. It accepts any iterable, so you can hand it a generator that reads a source file record by record. Objects go to the server as the generator produces them, so the source never has to fit in memory. To import objects that you already hold in a list, see [Ingest an in-memory list](#ingest-an-in-memory-list). + + @@ -398,7 +407,7 @@ You can batch create links from an object to another object through cross-refere If your dataset does not fit in memory, do not load it all at once. Instead, read the source file lazily and add objects to the import as you go: - With the server-side streaming context (`batch.stream()` in Python), add each object as you read it from the file. The client sends data at the pace the server requests, so memory usage stays flat. -- In TypeScript, `data.ingest()` accepts any `Iterable`, so you can pass a lazy source (such as a generator that reads the file record by record) instead of a fully loaded array. +- In Python and TypeScript, the [one-shot import method](#server-side-batching) accepts any iterable, so you can pass a lazy source, such as a generator that reads the file record by record, instead of a fully loaded list. - With manual batching, apply the same pattern: add objects to the batch as you read them. For JSON files, use a streaming parser that yields one object at a time (such as `ijson` in Python). For CSV files, read the file in chunks (such as `pandas` with the `chunksize` parameter) rather than loading it whole. From eea559ad3ba4d8a6fdba42d4328a406913d9a18b Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Wed, 29 Jul 2026 13:24:08 +0200 Subject: [PATCH 16/84] docs: correct the ingest paragraph on the Python best practices page The page's only mention of the one-shot ingest call opened with "If your objects are already in an in-memory list", which is wrong by omission: the parameter is an iterable, so a generator works just as well. The page had no mention of generators anywhere. Rewrite that paragraph to cover both the eager and the lazy case, add a short generator snippet, and link to the batch import page for the version that reads a file line by line. Ingest is deliberately not added to the batch sizing table: it is a second entry point to server-side batching, not a fifth sizing mode. Snippet verified against Weaviate 1.38.0 with the CI-pinned client: 2 uuids returned, empty errors dict, both titles persisted. --- _includes/code/client-libraries/python_v4.py | 27 +++++++++++++++++++ .../python/notes-best-practices.mdx | 11 +++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/_includes/code/client-libraries/python_v4.py b/_includes/code/client-libraries/python_v4.py index 083c9d388..994931eb7 100644 --- a/_includes/code/client-libraries/python_v4.py +++ b/_includes/code/client-libraries/python_v4.py @@ -360,6 +360,33 @@ # END BatchRateLimit +# START BatchIngestGenerator +import weaviate + +client = weaviate.connect_to_local() + +# A generator produces objects one at a time instead of building a list +def article_titles(): + for title in ["Multitenancy", "Database schema"]: + yield {"title": title} + +try: + articles = client.collections.use("WikiArticle") + # `ingest` accepts any iterable, so nothing is held in memory in full + result = articles.data.ingest(article_titles()) + + if result.errors: + print(f"Number of failed imports: {len(result.errors)}") + +finally: + client.close() +# END BatchIngestGenerator + +# Tests +assert len(result.errors) == 0 +assert len(result.uuids) == 2 + + import weaviate client = weaviate.connect_to_local() diff --git a/docs/weaviate/client-libraries/python/notes-best-practices.mdx b/docs/weaviate/client-libraries/python/notes-best-practices.mdx index 55d611e18..8a85488c1 100644 --- a/docs/weaviate/client-libraries/python/notes-best-practices.mdx +++ b/docs/weaviate/client-libraries/python/notes-best-practices.mdx @@ -202,7 +202,16 @@ There are four methods to configure the batching behavior. They are `stream`, `d | `fixed_size` | The batch size and number of concurrent requests are fixed to sizes specified by the user. | When you want to specify fixed parameters. | | `rate_limit` | The number of objects sent to Weaviate is rate limited (specified as n_objects per minute). | When you want to avoid hitting third-party vectorization API rate limits. | -If your objects are already in an in-memory list, `collection.data.ingest(objs)` is a one-shot convenience that uses server-side batching under the hood (no batching context required). It accepts plain property dicts or `DataObject` instances and returns the same `BatchObjectReturn` object as `insert_many`, making it a drop-in replacement for `insert_many` for large lists. +`collection.data.ingest(objs)` is a one-shot convenience that uses server-side batching under the hood (no batching context required). It takes any iterable of plain property dicts or `DataObject` instances, and returns the same `BatchObjectReturn` object as `insert_many`. Pass a list of objects that you already hold in memory, which makes it a drop-in replacement for `insert_many` for large lists. Pass a generator, or any other lazy iterable, to import from a source that does not fit in memory: objects are sent to the server as the generator produces them. + + + +For a generator that reads a source file line by line, see [batch import](../../manage-objects/import.mdx#server-side-batching). #### Usage From 307abb00cc1ba6cc95de0b9dfd4d6d2d0eb11ffb Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Wed, 29 Jul 2026 13:46:13 +0200 Subject: [PATCH 17/84] docs(quickstart): use the shorter ingest form for the import step Move every quickstart import step that has a one-shot server-side batching equivalent to `data.ingest`, in Python and TypeScript. Python: replaces `batch.fixed_size(...)` context managers with a single `data.ingest(...)` call. Where vectors are supplied, objects are wrapped in `DataObject` so the vector rides along. TypeScript: replaces `data.insertMany(...)` with `data.ingest(...)`. The TS client requires the `{ properties: ... }` object shape, so plain property lists are mapped before the call. Error handling: `data.ingest` has no context manager, so the old `batch.failed_objects` / `batch.number_errors` guidance no longer applies. The snippets now use the returned batch result. Python checks both `has_errors` and `errors` because `has_errors` is not currently set on the ingest path; TypeScript sets it correctly, so it checks `hasErrors`. Go, Java and C# keep their current correct form: Go has no server-side batching at all, and the Java and C# quickstarts already use the client-side convenience method. Per-language asymmetry is acceptable, an invented API is not. The self-hosted quickstart gains a minimum server version note. Server-side batching needs Weaviate 1.36 or later, and `data.ingest` has no client-side version guard, so an older instance would fail with an opaque transport error. Snippets executed against Weaviate 1.38.0 with the CI-pinned clients. --- _includes/code/llms-txt/python/quickstart.py | 4 +-- .../code/llms-txt/typescript/quickstart.ts | 2 +- .../python/local.quickstart.import_objects.py | 35 +++++++++---------- .../code/python/quickstart.import_objects.py | 35 +++++++++---------- .../quickstart.short.create_collection.py | 4 +-- ....short.import_vectors.create_collection.py | 8 +++-- ...uickstart.short.local.create_collection.py | 4 +-- ....local.import_vectors.create_collection.py | 8 +++-- .../local.quickstart.import_objects.mdx | 2 +- .../quickstart/quickstart.import_objects.mdx | 2 +- .../local.quickstart.import_objects.ts | 20 +++++++---- .../typescript/quickstart.import_objects.ts | 20 +++++++---- .../quickstart.short.create_collection.ts | 4 ++- ....short.import_vectors.create_collection.ts | 2 +- ...uickstart.short.local.create_collection.ts | 4 ++- ....local.import_vectors.create_collection.ts | 2 +- docs/weaviate/quickstart/local.md | 4 +++ 17 files changed, 90 insertions(+), 70 deletions(-) diff --git a/_includes/code/llms-txt/python/quickstart.py b/_includes/code/llms-txt/python/quickstart.py index 30ad432ff..7f46cb2c1 100644 --- a/_includes/code/llms-txt/python/quickstart.py +++ b/_includes/code/llms-txt/python/quickstart.py @@ -46,9 +46,7 @@ movies = client.collections.use("Movie__QuickstartPy") # Import objects - with movies.batch.fixed_size(batch_size=200) as batch: - for obj in data_objects: - batch.add_object(properties=obj) + movies.data.ingest(data_objects) print(f"Imported & vectorized {len(data_objects)} objects into the Movie collection") diff --git a/_includes/code/llms-txt/typescript/quickstart.ts b/_includes/code/llms-txt/typescript/quickstart.ts index a83e17a1e..3270ee824 100644 --- a/_includes/code/llms-txt/typescript/quickstart.ts +++ b/_includes/code/llms-txt/typescript/quickstart.ts @@ -36,7 +36,7 @@ if (!(await client.collections.exists('Movie__QuickstartTs'))) { const movies = client.collections.use('Movie__QuickstartTs'); // Import objects -await movies.data.insertMany(dataObjects); +await movies.data.ingest(dataObjects.map((properties) => ({ properties }))); console.log(`Imported & vectorized ${dataObjects.length} objects into the Movie collection`); diff --git a/_includes/code/python/local.quickstart.import_objects.py b/_includes/code/python/local.quickstart.import_objects.py index 9f9c3d7b4..d215211cf 100644 --- a/_includes/code/python/local.quickstart.import_objects.py +++ b/_includes/code/python/local.quickstart.import_objects.py @@ -9,27 +9,26 @@ ) data = json.loads(resp.text) -# highlight-start questions = client.collections.use("Question") -with questions.batch.fixed_size(batch_size=200) as batch: - for d in data: - batch.add_object( - { - "answer": d["Answer"], - "question": d["Question"], - "category": d["Category"], - } - ) - # highlight-end - if batch.number_errors > 10: - print("Batch import stopped due to excessive errors.") - break +# highlight-start +result = questions.data.ingest( + [ + { + "answer": d["Answer"], + "question": d["Question"], + "category": d["Category"], + } + for d in data + ] +) +# highlight-end -failed_objects = questions.batch.failed_objects -if failed_objects: - print(f"Number of failed imports: {len(failed_objects)}") - print(f"First failed object: {failed_objects[0]}") +if result.has_errors or result.errors: + print(f"Number of failed imports: {len(result.errors)}") + # `errors` is keyed by the position of the object in the input + for index, error in result.errors.items(): + print(f"Failed object at index {index}: {error.message}") client.close() # Free up resources # END Import diff --git a/_includes/code/python/quickstart.import_objects.py b/_includes/code/python/quickstart.import_objects.py index fa89fdf71..f72be5856 100644 --- a/_includes/code/python/quickstart.import_objects.py +++ b/_includes/code/python/quickstart.import_objects.py @@ -17,27 +17,26 @@ ) data = json.loads(resp.text) -# highlight-start questions = client.collections.use("Question") -with questions.batch.fixed_size(batch_size=200) as batch: - for d in data: - batch.add_object( - { - "answer": d["Answer"], - "question": d["Question"], - "category": d["Category"], - } - ) - # highlight-end - if batch.number_errors > 10: - print("Batch import stopped due to excessive errors.") - break +# highlight-start +result = questions.data.ingest( + [ + { + "answer": d["Answer"], + "question": d["Question"], + "category": d["Category"], + } + for d in data + ] +) +# highlight-end -failed_objects = questions.batch.failed_objects -if failed_objects: - print(f"Number of failed imports: {len(failed_objects)}") - print(f"First failed object: {failed_objects[0]}") +if result.has_errors or result.errors: + print(f"Number of failed imports: {len(result.errors)}") + # `errors` is keyed by the position of the object in the input + for index, error in result.errors.items(): + print(f"Failed object at index {index}: {error.message}") client.close() # Free up resources # END Import diff --git a/_includes/code/python/quickstart.short.create_collection.py b/_includes/code/python/quickstart.short.create_collection.py index a4685294d..62becb3a9 100644 --- a/_includes/code/python/quickstart.short.create_collection.py +++ b/_includes/code/python/quickstart.short.create_collection.py @@ -42,9 +42,7 @@ # START CreateCollection movies = client.collections.use("Movie") - with movies.batch.fixed_size(batch_size=200) as batch: - for obj in data_objects: - batch.add_object(properties=obj) + movies.data.ingest(data_objects) print(f"Imported & vectorized {len(movies)} objects into the Movie collection") # END CreateCollection diff --git a/_includes/code/python/quickstart.short.import_vectors.create_collection.py b/_includes/code/python/quickstart.short.import_vectors.create_collection.py index 2211e39ae..76a15f1b8 100644 --- a/_includes/code/python/quickstart.short.import_vectors.create_collection.py +++ b/_includes/code/python/quickstart.short.import_vectors.create_collection.py @@ -1,6 +1,7 @@ # START CreateCollection import weaviate from weaviate.classes.config import Configure +from weaviate.classes.data import DataObject import os # Best practice: store your credentials in environment variables @@ -46,9 +47,10 @@ # Insert the objects with vectors movies = client.collections.get("Movie") - with movies.batch.fixed_size(batch_size=200) as batch: - for obj in data_objects: - batch.add_object(properties=obj["properties"], vector=obj["vector"]) + movies.data.ingest( + DataObject(properties=obj["properties"], vector=obj["vector"]) + for obj in data_objects + ) print( f"Imported {len(data_objects)} objects with vectors into the Movie collection" diff --git a/_includes/code/python/quickstart.short.local.create_collection.py b/_includes/code/python/quickstart.short.local.create_collection.py index 5d8cdfc56..ff8ce55a0 100644 --- a/_includes/code/python/quickstart.short.local.create_collection.py +++ b/_includes/code/python/quickstart.short.local.create_collection.py @@ -36,9 +36,7 @@ # START CreateCollection movies = client.collections.use("Movie") - with movies.batch.fixed_size(batch_size=200) as batch: - for obj in data_objects: - batch.add_object(properties=obj) + movies.data.ingest(data_objects) print(f"Imported & vectorized {len(movies)} objects into the Movie collection") # END CreateCollection diff --git a/_includes/code/python/quickstart.short.local.import_vectors.create_collection.py b/_includes/code/python/quickstart.short.local.import_vectors.create_collection.py index 208b7a31c..f5a874884 100644 --- a/_includes/code/python/quickstart.short.local.import_vectors.create_collection.py +++ b/_includes/code/python/quickstart.short.local.import_vectors.create_collection.py @@ -1,6 +1,7 @@ # START CreateCollection import weaviate from weaviate.classes.config import Configure +from weaviate.classes.data import DataObject # Step 1.1: Connect to your local Weaviate instance with weaviate.connect_to_local() as client: @@ -38,9 +39,10 @@ # Insert the objects with vectors movies = client.collections.get("Movie") - with movies.batch.fixed_size(batch_size=200) as batch: - for obj in data_objects: - batch.add_object(properties=obj["properties"], vector=obj["vector"]) + movies.data.ingest( + DataObject(properties=obj["properties"], vector=obj["vector"]) + for obj in data_objects + ) print( f"Imported {len(data_objects)} objects with vectors into the Movie collection" diff --git a/_includes/code/quickstart/local.quickstart.import_objects.mdx b/_includes/code/quickstart/local.quickstart.import_objects.mdx index 705df5b35..52d0bf92c 100644 --- a/_includes/code/quickstart/local.quickstart.import_objects.mdx +++ b/_includes/code/quickstart/local.quickstart.import_objects.mdx @@ -19,7 +19,7 @@ import CSharpCode from "!!raw-loader!/_includes/code/csharp/QuickstartLocalTest. title="quickstart_import.py" /> -During a batch import, any failed objects can be obtained through `batch.failed_objects`. Additionally, a running count of failed objects is maintained and can be accessed through `batch.number_errors` within the context manager. This counter can be used to stop the import process in order to investigate the failed objects or references. Find out more about error handling on the Python client [reference page](/weaviate/client-libraries/python/notes-best-practices#error-handling). +The import returns a result object that reports whether anything failed, along with an entry for each failed object keyed by its position in the input. Check it after every import so that problems such as malformed data or a misconfigured model provider do not go unnoticed. Find out more about error handling on the Python client [reference page](/weaviate/client-libraries/python/notes-best-practices#error-handling). diff --git a/_includes/code/quickstart/quickstart.import_objects.mdx b/_includes/code/quickstart/quickstart.import_objects.mdx index 35ef8a581..93c94c8e7 100644 --- a/_includes/code/quickstart/quickstart.import_objects.mdx +++ b/_includes/code/quickstart/quickstart.import_objects.mdx @@ -20,7 +20,7 @@ import CSharpCode from "!!raw-loader!/_includes/code/csharp/QuickstartTest.cs"; /> -During a batch import, any failed objects can be obtained through `batch.failed_objects`. Additionally, a running count of failed objects is maintained and can be accessed through `batch.number_errors` within the context manager. This counter can be used to stop the import process in order to investigate the failed objects or references. Find out more about error handling on the Python client [reference page](/weaviate/client-libraries/python/notes-best-practices#error-handling). +The import returns a result object that reports whether anything failed, along with an entry for each failed object keyed by its position in the input. Check it after every import so that problems such as malformed data or a misconfigured model provider do not go unnoticed. Find out more about error handling on the Python client [reference page](/weaviate/client-libraries/python/notes-best-practices#error-handling). diff --git a/_includes/code/typescript/local.quickstart.import_objects.ts b/_includes/code/typescript/local.quickstart.import_objects.ts index ffe894279..736b017ee 100644 --- a/_includes/code/typescript/local.quickstart.import_objects.ts +++ b/_includes/code/typescript/local.quickstart.import_objects.ts @@ -11,18 +11,26 @@ async function getJsonData() { return file.json(); } -// highlight-start -// Note: The TS client does not have a `batch` method yet -// We use `insertMany` instead, which sends all of the data in one request async function importQuestions() { const questions = client.collections.use('Question'); const data = await getJsonData(); - const result = await questions.data.insertMany(data); - console.log('Insertion response: ', result); + + // highlight-start + const result = await questions.data.ingest( + data.map((properties) => ({ properties })) + ); + // highlight-end + + if (result.hasErrors) { + console.log(`Number of failed imports: ${Object.keys(result.errors).length}`); + // `errors` is keyed by the position of the object in the input + for (const [index, error] of Object.entries(result.errors)) { + console.log(`Failed object at index ${index}: ${error.message}`); + } + } } await importQuestions(); -// highlight-end client.close(); // Close the client connection // END Import diff --git a/_includes/code/typescript/quickstart.import_objects.ts b/_includes/code/typescript/quickstart.import_objects.ts index b04257fd7..47635eca9 100644 --- a/_includes/code/typescript/quickstart.import_objects.ts +++ b/_includes/code/typescript/quickstart.import_objects.ts @@ -20,18 +20,26 @@ async function getJsonData() { return file.json(); } -// highlight-start -// Note: The TS client does not have a `batch` method yet -// We use `insertMany` instead, which sends all of the data in one request async function importQuestions() { const questions = client.collections.use('Question'); const data = await getJsonData(); - const result = await questions.data.insertMany(data); - console.log('Insertion response: ', result); + + // highlight-start + const result = await questions.data.ingest( + data.map((properties) => ({ properties })) + ); + // highlight-end + + if (result.hasErrors) { + console.log(`Number of failed imports: ${Object.keys(result.errors).length}`); + // `errors` is keyed by the position of the object in the input + for (const [index, error] of Object.entries(result.errors)) { + console.log(`Failed object at index ${index}: ${error.message}`); + } + } } await importQuestions(); -// highlight-end client.close(); // Close the client connection // END Import diff --git a/_includes/code/typescript/quickstart.short.create_collection.ts b/_includes/code/typescript/quickstart.short.create_collection.ts index 3c7e5fb88..167ff7734 100644 --- a/_includes/code/typescript/quickstart.short.create_collection.ts +++ b/_includes/code/typescript/quickstart.short.create_collection.ts @@ -41,7 +41,9 @@ const dataObjects = [ // START CreateCollection const movieCollection = client.collections.get('Movie'); -const response = await movieCollection.data.insertMany(dataObjects); +await movieCollection.data.ingest( + dataObjects.map((properties) => ({ properties })) +); console.log(`Imported & vectorized ${dataObjects.length} objects into the Movie collection`); diff --git a/_includes/code/typescript/quickstart.short.import_vectors.create_collection.ts b/_includes/code/typescript/quickstart.short.import_vectors.create_collection.ts index a8f0cced0..82e4a8aae 100644 --- a/_includes/code/typescript/quickstart.short.import_vectors.create_collection.ts +++ b/_includes/code/typescript/quickstart.short.import_vectors.create_collection.ts @@ -51,7 +51,7 @@ const dataObjects = [ // START CreateCollection // Insert the objects with vectors const movieCollection = client.collections.get('Movie'); -const response = await movieCollection.data.insertMany(dataObjects); +await movieCollection.data.ingest(dataObjects); console.log(`Imported ${dataObjects.length} objects with vectors into the Movie collection`); diff --git a/_includes/code/typescript/quickstart.short.local.create_collection.ts b/_includes/code/typescript/quickstart.short.local.create_collection.ts index dabb209d9..239cae8fa 100644 --- a/_includes/code/typescript/quickstart.short.local.create_collection.ts +++ b/_includes/code/typescript/quickstart.short.local.create_collection.ts @@ -35,7 +35,9 @@ const dataObjects = [ // START CreateCollection const movieCollection = client.collections.get('Movie'); -const response = await movieCollection.data.insertMany(dataObjects); +await movieCollection.data.ingest( + dataObjects.map((properties) => ({ properties })) +); console.log(`Imported & vectorized ${dataObjects.length} objects into the Movie collection`); diff --git a/_includes/code/typescript/quickstart.short.local.import_vectors.create_collection.ts b/_includes/code/typescript/quickstart.short.local.import_vectors.create_collection.ts index 871ffe26c..6c667bcba 100644 --- a/_includes/code/typescript/quickstart.short.local.import_vectors.create_collection.ts +++ b/_includes/code/typescript/quickstart.short.local.import_vectors.create_collection.ts @@ -36,7 +36,7 @@ const dataObjects = [ // Insert the objects with vectors const movieCollection = client.collections.get('Movie'); -const response = await movieCollection.data.insertMany(dataObjects); +await movieCollection.data.ingest(dataObjects); console.log(`Imported ${dataObjects.length} objects with vectors into the Movie collection`); diff --git a/docs/weaviate/quickstart/local.md b/docs/weaviate/quickstart/local.md index ea5cd21e1..546e65442 100644 --- a/docs/weaviate/quickstart/local.md +++ b/docs/weaviate/quickstart/local.md @@ -126,6 +126,10 @@ import CodeClientInstall from "/_includes/code/quickstart/clients.install.new.md ## Step 1: Create a collection & import data {#create-a-collection} +:::info Minimum Weaviate version +The Python and JavaScript/TypeScript examples below import data with [server-side batching](../manage-objects/import.mdx#server-side-batching), which requires Weaviate `v1.36` or later. The Docker Compose file above runs a current release, so this is only a concern if you point the examples at an older instance. +::: + There are two paths you can choose from when importing data: From c77b5e77225d50a6c433ab080830a4874da77c20 Mon Sep 17 00:00:00 2001 From: g-despot Date: Wed, 29 Jul 2026 14:05:07 +0200 Subject: [PATCH 18/84] docs: apply editor review to the Python ingest generator docs - import.mdx: name `data.ingest()` inside the Python tab, and drop the Python-only method name from the shared "Stream data from large files" prose, linking to the server-side batching section instead. - notes-best-practices.mdx: promote the one-shot ingest material out of "Batch sizing" into its own "One-shot ingest" section, so it no longer splits "#### Usage" from the batching-method table it refers to. - notes-best-practices.mdx: document the `BatchObjectReturn` that `data.ingest()` returns under "Error handling", which previously covered only the batching-context API. - Snippet cleanups: use `collections.use()`, and trim two code comments that overclaimed or duplicated the surrounding prose. --- _includes/code/client-libraries/python_v4.py | 2 +- _includes/code/howto/manage-data.import.py | 5 ++-- .../python/notes-best-practices.mdx | 26 +++++++++++-------- docs/weaviate/manage-objects/import.mdx | 4 +-- 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/_includes/code/client-libraries/python_v4.py b/_includes/code/client-libraries/python_v4.py index 994931eb7..b647c8aca 100644 --- a/_includes/code/client-libraries/python_v4.py +++ b/_includes/code/client-libraries/python_v4.py @@ -372,7 +372,7 @@ def article_titles(): try: articles = client.collections.use("WikiArticle") - # `ingest` accepts any iterable, so nothing is held in memory in full + # `ingest` accepts any iterable, including a generator result = articles.data.ingest(article_titles()) if result.errors: diff --git a/_includes/code/howto/manage-data.import.py b/_includes/code/howto/manage-data.import.py index dfe5eda76..ff0646011 100644 --- a/_includes/code/howto/manage-data.import.py +++ b/_includes/code/howto/manage-data.import.py @@ -588,7 +588,7 @@ def add_object(obj) -> None: {"title": f"Object {i+1}"} for i in range(5) ] -collection = client.collections.get("MyCollection") +collection = client.collections.use("MyCollection") # highlight-start # Use `stream` for server-side batching. The client will send data @@ -649,8 +649,7 @@ def read_objects(path): collection = client.collections.use("MyCollection") # highlight-start -# `ingest` accepts any iterable, so the generator supplies objects one at a -# time and the file is never loaded into memory in full +# `ingest` pulls objects from the generator as it goes result = collection.data.ingest(read_objects("my-data.jsonl")) # highlight-end diff --git a/docs/weaviate/client-libraries/python/notes-best-practices.mdx b/docs/weaviate/client-libraries/python/notes-best-practices.mdx index 8a85488c1..f3215cb43 100644 --- a/docs/weaviate/client-libraries/python/notes-best-practices.mdx +++ b/docs/weaviate/client-libraries/python/notes-best-practices.mdx @@ -202,17 +202,6 @@ There are four methods to configure the batching behavior. They are `stream`, `d | `fixed_size` | The batch size and number of concurrent requests are fixed to sizes specified by the user. | When you want to specify fixed parameters. | | `rate_limit` | The number of objects sent to Weaviate is rate limited (specified as n_objects per minute). | When you want to avoid hitting third-party vectorization API rate limits. | -`collection.data.ingest(objs)` is a one-shot convenience that uses server-side batching under the hood (no batching context required). It takes any iterable of plain property dicts or `DataObject` instances, and returns the same `BatchObjectReturn` object as `insert_many`. Pass a list of objects that you already hold in memory, which makes it a drop-in replacement for `insert_many` for large lists. Pass a generator, or any other lazy iterable, to import from a source that does not fit in memory: objects are sent to the server as the generator produces them. - - - -For a generator that reads a source file line by line, see [batch import](../../manage-objects/import.mdx#server-side-batching). - #### Usage We recommend using a context manager as shown below. @@ -256,6 +245,19 @@ These methods return a new context manager for each batch. Attributes that are r If the background thread that is responsible for sending the batches raises an exception during batch processing, the error is raised to the main thread. +### One-shot ingest + +`collection.data.ingest(objs)` is a one-shot convenience that uses server-side batching under the hood (no batching context required). It accepts any iterable of plain property dicts or `DataObject` instances, and returns the same `BatchObjectReturn` object as `insert_many`. Pass a list of objects that you already hold in memory to use `ingest` as a drop-in replacement for `insert_many` on large lists. Pass a generator, or any other lazy iterable, to import from a source that does not fit in memory: the client sends each object to the server as the generator produces it. + + + +For a generator that reads a source file line by line, see [Batch import](../../manage-objects/import.mdx#server-side-batching). + ### Error handling During a batch import, any failed objects or references will be stored for retrieval. Additionally, a running count of failed objects and references is maintained. @@ -273,6 +275,8 @@ Note that these lists are reset when a batching process is initialized. So make language="py" /> +`collection.data.ingest()` does not use a batching context, so it reports failures through its return value instead. The `BatchObjectReturn` object that it returns exposes `result.has_errors` as a summary flag, and `result.errors` as a dictionary keyed by the position of each failed object in the input. Check `result.errors` directly, because it holds an entry for every failed object. The [one-shot ingest](#one-shot-ingest) example above shows this pattern. + ### Batch vectorization import BatchVectorizationOverview from "/_includes/code/client-libraries/batch-import.mdx"; diff --git a/docs/weaviate/manage-objects/import.mdx b/docs/weaviate/manage-objects/import.mdx index a053abbb7..b3656d0a8 100644 --- a/docs/weaviate/manage-objects/import.mdx +++ b/docs/weaviate/manage-objects/import.mdx @@ -44,7 +44,7 @@ Open the `batch.stream()` context manager and add objects one at a time; the cli language="py" /> -You can also stream from a data source with the one-shot import method. It accepts any iterable, so you can hand it a generator that reads a source file record by record. Objects go to the server as the generator produces them, so the source never has to fit in memory. To import objects that you already hold in a list, see [Ingest an in-memory list](#ingest-an-in-memory-list). +You can also stream from a data source with `data.ingest()`. It accepts any iterable, so you can pass a generator that reads a source file record by record. Objects go to the server as the generator produces them, so the source never has to fit in memory. To import objects that you already hold in a list, see [Ingest an in-memory list](#ingest-an-in-memory-list). Date: Wed, 29 Jul 2026 14:11:53 +0200 Subject: [PATCH 19/84] docs(quickstart): apply editor review to the ingest migration - Import includes: name the API again in the Python tab, and give the TypeScript tab the error-handling prose it was missing. The shared "check the result" sentence now sits above the tabs, so it also covers the Go, Java and C# tabs. - Quickstart snippets: explain why the Python examples check `errors` directly, and label the TypeScript ingest call, matching the how-to. - cloud/quickstart.mdx, tutorials/quick-tour-of-weaviate.mdx: the batch tip claimed batching sends everything in a single request, which is no longer what the code beneath it does. Rewritten language-agnostically, and the doubled parenthesis and number disagreement are fixed. - quickstart/local.md: move the version caveat below the examples, switch it to the house `:::note Requirement: ...` pattern, and lead with the reassurance rather than the caveat. --- _includes/code/python/local.quickstart.import_objects.py | 1 + _includes/code/python/quickstart.import_objects.py | 1 + .../code/quickstart/local.quickstart.import_objects.mdx | 6 +++++- _includes/code/quickstart/quickstart.import_objects.mdx | 6 +++++- .../code/typescript/local.quickstart.import_objects.ts | 1 + _includes/code/typescript/quickstart.import_objects.ts | 1 + docs/cloud/quickstart.mdx | 4 ++-- docs/weaviate/quickstart/local.md | 8 ++++---- docs/weaviate/tutorials/quick-tour-of-weaviate.mdx | 4 ++-- 9 files changed, 22 insertions(+), 10 deletions(-) diff --git a/_includes/code/python/local.quickstart.import_objects.py b/_includes/code/python/local.quickstart.import_objects.py index d215211cf..29e543ddd 100644 --- a/_includes/code/python/local.quickstart.import_objects.py +++ b/_includes/code/python/local.quickstart.import_objects.py @@ -24,6 +24,7 @@ ) # highlight-end +# Also check `errors` directly; it is populated for every failed object if result.has_errors or result.errors: print(f"Number of failed imports: {len(result.errors)}") # `errors` is keyed by the position of the object in the input diff --git a/_includes/code/python/quickstart.import_objects.py b/_includes/code/python/quickstart.import_objects.py index f72be5856..a73ba124d 100644 --- a/_includes/code/python/quickstart.import_objects.py +++ b/_includes/code/python/quickstart.import_objects.py @@ -32,6 +32,7 @@ ) # highlight-end +# Also check `errors` directly; it is populated for every failed object if result.has_errors or result.errors: print(f"Number of failed imports: {len(result.errors)}") # `errors` is keyed by the position of the object in the input diff --git a/_includes/code/quickstart/local.quickstart.import_objects.mdx b/_includes/code/quickstart/local.quickstart.import_objects.mdx index 52d0bf92c..ab4b5c60c 100644 --- a/_includes/code/quickstart/local.quickstart.import_objects.mdx +++ b/_includes/code/quickstart/local.quickstart.import_objects.mdx @@ -8,6 +8,8 @@ import JavaV6Code from "!!raw-loader!/_includes/code/java-v6/src/test/java/Quick import CSharpCode from "!!raw-loader!/_includes/code/csharp/QuickstartLocalTest.cs"; +Every import returns a result that reports which objects failed, if any. Check it in your own code to catch problems such as malformed data or a misconfigured model provider. + @@ -19,7 +21,7 @@ import CSharpCode from "!!raw-loader!/_includes/code/csharp/QuickstartLocalTest. title="quickstart_import.py" /> -The import returns a result object that reports whether anything failed, along with an entry for each failed object keyed by its position in the input. Check it after every import so that problems such as malformed data or a misconfigured model provider do not go unnoticed. Find out more about error handling on the Python client [reference page](/weaviate/client-libraries/python/notes-best-practices#error-handling). +`data.ingest()` returns a `BatchObjectReturn`. Read `result.has_errors` for a quick check, and `result.errors` for one entry per failed object, keyed by its position in the input. For more, see [error handling in the Python client reference](/weaviate/client-libraries/python/notes-best-practices#error-handling). @@ -33,6 +35,8 @@ The import returns a result object that reports whether anything failed, along w title="quickstart_import.ts" /> +`data.ingest()` returns a result object. Read `result.hasErrors` for a quick check, and `result.errors` for one entry per failed object, keyed by its position in the input. + diff --git a/_includes/code/quickstart/quickstart.import_objects.mdx b/_includes/code/quickstart/quickstart.import_objects.mdx index 93c94c8e7..9104791f2 100644 --- a/_includes/code/quickstart/quickstart.import_objects.mdx +++ b/_includes/code/quickstart/quickstart.import_objects.mdx @@ -8,6 +8,8 @@ import JavaV6Code from "!!raw-loader!/_includes/code/java-v6/src/test/java/Quick import CSharpCode from "!!raw-loader!/_includes/code/csharp/QuickstartTest.cs"; +Every import returns a result that reports which objects failed, if any. Check it in your own code to catch problems such as malformed data or a misconfigured model provider. + @@ -20,7 +22,7 @@ import CSharpCode from "!!raw-loader!/_includes/code/csharp/QuickstartTest.cs"; /> -The import returns a result object that reports whether anything failed, along with an entry for each failed object keyed by its position in the input. Check it after every import so that problems such as malformed data or a misconfigured model provider do not go unnoticed. Find out more about error handling on the Python client [reference page](/weaviate/client-libraries/python/notes-best-practices#error-handling). +`data.ingest()` returns a `BatchObjectReturn`. Read `result.has_errors` for a quick check, and `result.errors` for one entry per failed object, keyed by its position in the input. For more, see [error handling in the Python client reference](/weaviate/client-libraries/python/notes-best-practices#error-handling). @@ -34,6 +36,8 @@ The import returns a result object that reports whether anything failed, along w title="quickstart_import.ts" /> +`data.ingest()` returns a result object. Read `result.hasErrors` for a quick check, and `result.errors` for one entry per failed object, keyed by its position in the input. + diff --git a/_includes/code/typescript/local.quickstart.import_objects.ts b/_includes/code/typescript/local.quickstart.import_objects.ts index 736b017ee..dfa4a0861 100644 --- a/_includes/code/typescript/local.quickstart.import_objects.ts +++ b/_includes/code/typescript/local.quickstart.import_objects.ts @@ -16,6 +16,7 @@ async function importQuestions() { const data = await getJsonData(); // highlight-start + // `ingest` imports the list using server-side batching const result = await questions.data.ingest( data.map((properties) => ({ properties })) ); diff --git a/_includes/code/typescript/quickstart.import_objects.ts b/_includes/code/typescript/quickstart.import_objects.ts index 47635eca9..43aebb365 100644 --- a/_includes/code/typescript/quickstart.import_objects.ts +++ b/_includes/code/typescript/quickstart.import_objects.ts @@ -25,6 +25,7 @@ async function importQuestions() { const data = await getJsonData(); // highlight-start + // `ingest` imports the list using server-side batching const result = await questions.data.ingest( data.map((properties) => ({ properties })) ); diff --git a/docs/cloud/quickstart.mdx b/docs/cloud/quickstart.mdx index 7039863d7..fd581c138 100644 --- a/docs/cloud/quickstart.mdx +++ b/docs/cloud/quickstart.mdx @@ -221,11 +221,11 @@ We can now add data to our collection. The following example: - Loads objects, and -- Adds objects to the target collection (`Question`) using a batch process. +- Adds objects to the target collection (`Question`) with a batch import. :::tip Batch imports -([Batch imports](/weaviate/manage-objects/import.mdx)) are the most efficient way to add large amounts of data, as it sends multiple objects in a single request. See the [How-to: Batch import](/weaviate/manage-objects/import.mdx) guide for more information. +Batch imports are the most efficient way to add large amounts of data, because they send objects in groups instead of one request per object. See the [How-to: Batch import](/weaviate/manage-objects/import.mdx) guide for the available methods, including [server-side batching](/weaviate/manage-objects/import.mdx#server-side-batching), where the server tells the client how much data to send next. ::: diff --git a/docs/weaviate/quickstart/local.md b/docs/weaviate/quickstart/local.md index 546e65442..b2059d52b 100644 --- a/docs/weaviate/quickstart/local.md +++ b/docs/weaviate/quickstart/local.md @@ -126,10 +126,6 @@ import CodeClientInstall from "/_includes/code/quickstart/clients.install.new.md ## Step 1: Create a collection & import data {#create-a-collection} -:::info Minimum Weaviate version -The Python and JavaScript/TypeScript examples below import data with [server-side batching](../manage-objects/import.mdx#server-side-batching), which requires Weaviate `v1.36` or later. The Docker Compose file above runs a current release, so this is only a concern if you point the examples at an older instance. -::: - There are two paths you can choose from when importing data: @@ -156,6 +152,10 @@ import CreateCollectionCustomVectors from "/_includes/code/quickstart/quickstart +:::note Requirement: Weaviate v1.36 or later +The `docker-compose.yml` file on this page runs a current Weaviate release, so the examples in this step work as written. The Python and JavaScript/TypeScript examples [import a list of objects in a single call](../manage-objects/import.mdx#ingest-an-in-memory-list), which relies on [server-side batching](../manage-objects/import.mdx#server-side-batching) and needs Weaviate `v1.36` or later. Check the version first if you point the examples at an existing instance. +::: + ## Step 2: Semantic (vector) search {#semantic-search} diff --git a/docs/weaviate/tutorials/quick-tour-of-weaviate.mdx b/docs/weaviate/tutorials/quick-tour-of-weaviate.mdx index 776f338cf..b55c4188f 100644 --- a/docs/weaviate/tutorials/quick-tour-of-weaviate.mdx +++ b/docs/weaviate/tutorials/quick-tour-of-weaviate.mdx @@ -212,11 +212,11 @@ We can now add data to our collection. The following example: - Loads objects, and -- Adds objects to the target collection (`Question`) using a batch process. +- Adds objects to the target collection (`Question`) with a batch import. :::tip Batch imports -([Batch imports](../manage-objects/import.mdx)) are the most efficient way to add large amounts of data, as it sends multiple objects in a single request. See the [How-to: Batch import](../manage-objects/import.mdx) guide for more information. +Batch imports are the most efficient way to add large amounts of data, because they send objects in groups instead of one request per object. See the [How-to: Batch import](../manage-objects/import.mdx) guide for the available methods, including [server-side batching](../manage-objects/import.mdx#server-side-batching), where the server tells the client how much data to send next. ::: From 69f685a8d63ecf6f8ea4eac2382c8af5ba44f98f Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Wed, 29 Jul 2026 15:28:49 +0200 Subject: [PATCH 20/84] docs(quickstart): check result.errors in the Python import step Gate the Python import examples on result.errors alone. The has_errors flag is not set on the ingest path, so the Python tab prose now names result.errors as the check to read. The TypeScript tab keeps hasErrors, which does fire on that client. Also drop the version-floor note from the local quickstart. --- _includes/code/python/local.quickstart.import_objects.py | 4 ++-- _includes/code/python/quickstart.import_objects.py | 4 ++-- _includes/code/quickstart/local.quickstart.import_objects.mdx | 2 +- _includes/code/quickstart/quickstart.import_objects.mdx | 2 +- docs/weaviate/quickstart/local.md | 4 ---- 5 files changed, 6 insertions(+), 10 deletions(-) diff --git a/_includes/code/python/local.quickstart.import_objects.py b/_includes/code/python/local.quickstart.import_objects.py index 29e543ddd..2ed338e86 100644 --- a/_includes/code/python/local.quickstart.import_objects.py +++ b/_includes/code/python/local.quickstart.import_objects.py @@ -24,8 +24,8 @@ ) # highlight-end -# Also check `errors` directly; it is populated for every failed object -if result.has_errors or result.errors: +# `errors` is the reliable failure check for `ingest` +if result.errors: print(f"Number of failed imports: {len(result.errors)}") # `errors` is keyed by the position of the object in the input for index, error in result.errors.items(): diff --git a/_includes/code/python/quickstart.import_objects.py b/_includes/code/python/quickstart.import_objects.py index a73ba124d..19055127e 100644 --- a/_includes/code/python/quickstart.import_objects.py +++ b/_includes/code/python/quickstart.import_objects.py @@ -32,8 +32,8 @@ ) # highlight-end -# Also check `errors` directly; it is populated for every failed object -if result.has_errors or result.errors: +# `errors` is the reliable failure check for `ingest` +if result.errors: print(f"Number of failed imports: {len(result.errors)}") # `errors` is keyed by the position of the object in the input for index, error in result.errors.items(): diff --git a/_includes/code/quickstart/local.quickstart.import_objects.mdx b/_includes/code/quickstart/local.quickstart.import_objects.mdx index ab4b5c60c..04601ef67 100644 --- a/_includes/code/quickstart/local.quickstart.import_objects.mdx +++ b/_includes/code/quickstart/local.quickstart.import_objects.mdx @@ -21,7 +21,7 @@ Every import returns a result that reports which objects failed, if any. Check i title="quickstart_import.py" /> -`data.ingest()` returns a `BatchObjectReturn`. Read `result.has_errors` for a quick check, and `result.errors` for one entry per failed object, keyed by its position in the input. For more, see [error handling in the Python client reference](/weaviate/client-libraries/python/notes-best-practices#error-handling). +`data.ingest()` returns a `BatchObjectReturn`. Read `result.errors` to check for failures. It holds one entry per failed object, keyed by its position in the input. For more, see [error handling in the Python client reference](/weaviate/client-libraries/python/notes-best-practices#error-handling). diff --git a/_includes/code/quickstart/quickstart.import_objects.mdx b/_includes/code/quickstart/quickstart.import_objects.mdx index 9104791f2..3b7b8dfc1 100644 --- a/_includes/code/quickstart/quickstart.import_objects.mdx +++ b/_includes/code/quickstart/quickstart.import_objects.mdx @@ -22,7 +22,7 @@ Every import returns a result that reports which objects failed, if any. Check i /> -`data.ingest()` returns a `BatchObjectReturn`. Read `result.has_errors` for a quick check, and `result.errors` for one entry per failed object, keyed by its position in the input. For more, see [error handling in the Python client reference](/weaviate/client-libraries/python/notes-best-practices#error-handling). +`data.ingest()` returns a `BatchObjectReturn`. Read `result.errors` to check for failures. It holds one entry per failed object, keyed by its position in the input. For more, see [error handling in the Python client reference](/weaviate/client-libraries/python/notes-best-practices#error-handling). diff --git a/docs/weaviate/quickstart/local.md b/docs/weaviate/quickstart/local.md index b2059d52b..ea5cd21e1 100644 --- a/docs/weaviate/quickstart/local.md +++ b/docs/weaviate/quickstart/local.md @@ -152,10 +152,6 @@ import CreateCollectionCustomVectors from "/_includes/code/quickstart/quickstart -:::note Requirement: Weaviate v1.36 or later -The `docker-compose.yml` file on this page runs a current Weaviate release, so the examples in this step work as written. The Python and JavaScript/TypeScript examples [import a list of objects in a single call](../manage-objects/import.mdx#ingest-an-in-memory-list), which relies on [server-side batching](../manage-objects/import.mdx#server-side-batching) and needs Weaviate `v1.36` or later. Check the version first if you point the examples at an existing instance. -::: - ## Step 2: Semantic (vector) search {#semantic-search} From 7fd44376a56870bdbc05c47d811e012a2ea09169 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Wed, 29 Jul 2026 22:42:10 +0200 Subject: [PATCH 21/84] docs: fix critical findings from the docs deep review Fixes the 10 critical findings from a read-only audit of docs.weaviate.io (/weaviate, /deploy, /cloud), plus five High-tier findings in the same files and one stale include that contradicted a section fixed here. Every claim was checked against Weaviate core or the official client source. Wrong information a reader would act on: - Both quickstarts told the reader to sign up for Cohere while every client snippet required an OpenAI key. Prose and the curl tabs now say OpenAI, matching the CI-executed snippets; Java and C# collection config switched to OpenAI to match. - google/generative marked gemini-2.5-flash as the default, but omitting the model makes the server fall back to a legacy PaLM model that the same page lists as deprecated. Marker removed, with a caution to set the model. - google/embeddings: the Gemini example failed server-side validation. Python passed a keyword the client rejects, Go named the wrong module, and the AI Studio examples omitted the Gemini endpoint, so collection creation failed with "projectId cannot be empty". - anthropic/generative had a default and model list frozen at July 2024. Default corrected; the hand-maintained list replaced with a link to the provider's model-names page, since the module has no allowlist. - search/similarity MMR examples used a parameter and factory that had both been renamed, so the snippets raised on use. All five call sites and the surrounding prose corrected. - OPERATIONAL_MODE documented values the parser does not accept, and an unrecognized value silently falls back to full read-write. Values corrected and the silent fallback documented. - The cluster-consensus troubleshooting answer was a verbatim copy of the unrelated async-replication answer. Rewritten around cluster membership and Raft. Corrected the case of ASYNC_REPLICATION_DISABLED. Snippets that could not run as printed: - typescript/notes-best-practices had pasted GitHub review UI text inside a JS block, making it a SyntaxError on copy-paste, plus invalid generic syntax. - read-all-objects used Go markers that appear twice in the source, so the snippet component spliced two regions together and leaked raw import lines into non-compiling Go. Unique markers added. Two further Go tabs referenced markers that do not exist and rendered as empty code boxes; those tabs are removed rather than left blank. - Removed a preview bullet claiming Python client support was unreleased. It has shipped, and that include renders into the MMR section corrected here. Enables tests/test_python.py::test_search_mmr. It was skipped on the stale grounds that MMR support was not in a released client; support has shipped, and the snippet runs green against a live instance using self-provided vectors, so it needs no provider credentials. The test now covers the corrected MMR examples in CI. --- _includes/code/csharp/QuickstartTest.cs | 2 +- .../docs/manage-data.read-all-objects_test.go | 2 ++ .../docs/model-providers/2-usage-text/main.go | 7 ++++--- _includes/code/howto/search.similarity.mmr.py | 10 +++++----- .../java-v6/src/test/java/QuickstartTest.java | 2 +- .../quickstart.create_collection.mdx | 2 +- .../code/quickstart/quickstart.query.rag.mdx | 4 ++-- _includes/feature-notes/v137-preview.mdx | 1 - docs/cloud/quickstart.mdx | 6 +++--- docs/deploy/configuration/env-vars/index.md | 2 +- docs/deploy/faqs/troubleshooting.md | 16 ++++++++++++--- .../typescript/notes-best-practices.mdx | 4 ++-- .../manage-objects/read-all-objects.mdx | 20 ++----------------- .../_includes/provider.generative.py | 6 +++--- .../_includes/provider.generative.ts | 8 ++++---- .../_includes/provider.vectorizer.py | 2 +- .../_includes/provider.vectorizer.ts | 2 +- .../model-providers/anthropic/generative.md | 7 +------ .../model-providers/google/embeddings.md | 2 +- .../model-providers/google/generative.md | 8 ++++++-- docs/weaviate/search/similarity.md | 4 ++-- .../tutorials/quick-tour-of-weaviate.mdx | 8 ++++---- tests/test_python.py | 4 ---- 23 files changed, 60 insertions(+), 69 deletions(-) diff --git a/_includes/code/csharp/QuickstartTest.cs b/_includes/code/csharp/QuickstartTest.cs index 894f41c68..45a21ffad 100644 --- a/_includes/code/csharp/QuickstartTest.cs +++ b/_includes/code/csharp/QuickstartTest.cs @@ -63,7 +63,7 @@ public static async Task FullQuickstartWorkflowTest() Property.Text("category"), ], VectorConfig = Configure.Vector("default", v => v.Text2VecWeaviate()), // Configure the Weaviate Embeddings integration - GenerativeConfig = Configure.Generative.Cohere(), // Configure the Cohere generative AI integration + GenerativeConfig = Configure.Generative.OpenAI(), // Configure the OpenAI generative AI integration } ); // highlight-end diff --git a/_includes/code/howto/go/docs/manage-data.read-all-objects_test.go b/_includes/code/howto/go/docs/manage-data.read-all-objects_test.go index f571d4edb..37b12e7cd 100644 --- a/_includes/code/howto/go/docs/manage-data.read-all-objects_test.go +++ b/_includes/code/howto/go/docs/manage-data.read-all-objects_test.go @@ -22,6 +22,7 @@ func Test_ManageDataReadAllObjects(t *testing.T) { t.Run("Read all objects", func(t *testing.T) { // CursorExample // Retrieve data + // START ReadAllProps sourceClient, err := weaviate.NewClient(weaviate.Config{ Scheme: "https", Host: "WEAVIATE_INSTANCE_URL", // Replace WEAVIATE_INSTANCE_URL with your instance URL @@ -59,6 +60,7 @@ func Test_ManageDataReadAllObjects(t *testing.T) { } return get.Do(context.Background()) } + // END ReadAllProps // Use this function to retrieve data // START FetchClassDefinition diff --git a/_includes/code/howto/go/docs/model-providers/2-usage-text/main.go b/_includes/code/howto/go/docs/model-providers/2-usage-text/main.go index f7a44f959..274ce4095 100644 --- a/_includes/code/howto/go/docs/model-providers/2-usage-text/main.go +++ b/_includes/code/howto/go/docs/model-providers/2-usage-text/main.go @@ -321,8 +321,9 @@ func main() { "title_vector": { Vectorizer: map[string]interface{}{ "text2vec-google": map[string]interface{}{ - "properties": []string{"title"}, - "model_id": "gemini-embedding-001", // (Optional) To manually set the model ID + "properties": []string{"title"}, + "apiEndpoint": "generativelanguage.googleapis.com", + "model_id": "gemini-embedding-001", // (Optional) To manually set the model ID }, }, }, @@ -353,7 +354,7 @@ func main() { VectorConfig: map[string]models.VectorConfig{ "title_vector": { Vectorizer: map[string]interface{}{ - "text2vec-aws": map[string]interface{}{ + "text2vec-google": map[string]interface{}{ "properties": []string{"title"}, "project_id": "", // Required for Vertex AU "model_id": "textembedding-gecko@latest", // (Optional) To manually set the model ID diff --git a/_includes/code/howto/search.similarity.mmr.py b/_includes/code/howto/search.similarity.mmr.py index b860bc6ca..30811ab89 100644 --- a/_includes/code/howto/search.similarity.mmr.py +++ b/_includes/code/howto/search.similarity.mmr.py @@ -37,7 +37,7 @@ response = collection.query.near_vector( near_vector=base_vec, limit=20, - selection=Diversity.MMR( + diversity_selection=Diversity.mmr( limit=5, balance=0.5, ), @@ -75,7 +75,7 @@ response = collection.query.near_vector( near_vector=query_vector, limit=20, - selection=Diversity.MMR( + diversity_selection=Diversity.mmr( limit=5, balance=0.5, ), @@ -98,21 +98,21 @@ response_diverse = collection.query.near_vector( near_vector=base_vec, limit=20, - selection=Diversity.MMR(limit=5, balance=0.0), + diversity_selection=Diversity.mmr(limit=5, balance=0.0), ) # Balanced — equal weight on relevance and diversity response_balanced = collection.query.near_vector( near_vector=base_vec, limit=20, - selection=Diversity.MMR(limit=5, balance=0.5), + diversity_selection=Diversity.mmr(limit=5, balance=0.5), ) # Pure relevance — equivalent to standard vector search response_relevant = collection.query.near_vector( near_vector=base_vec, limit=20, - selection=Diversity.MMR(limit=5, balance=1.0), + diversity_selection=Diversity.mmr(limit=5, balance=1.0), ) # END MMRBalanceExamples diff --git a/_includes/code/java-v6/src/test/java/QuickstartTest.java b/_includes/code/java-v6/src/test/java/QuickstartTest.java index 3de3fa0b5..66bcb43bc 100644 --- a/_includes/code/java-v6/src/test/java/QuickstartTest.java +++ b/_includes/code/java-v6/src/test/java/QuickstartTest.java @@ -59,7 +59,7 @@ void testCreateCollection() throws Exception { collectionName, col -> col .vectorConfig(VectorConfig.text2vecWeaviate()) // Configure the Weaviate Embeddings integration - .generativeModule(Generative.cohere()) // Configure the Cohere generative AI integration + .generativeModule(Generative.openai()) // Configure the OpenAI generative AI integration ); CollectionHandle> questions = client.collections.use(collectionName); // highlight-end diff --git a/_includes/code/quickstart/quickstart.create_collection.mdx b/_includes/code/quickstart/quickstart.create_collection.mdx index 35925009c..1832d0339 100644 --- a/_includes/code/quickstart/quickstart.create_collection.mdx +++ b/_includes/code/quickstart/quickstart.create_collection.mdx @@ -88,7 +88,7 @@ curl -X POST \ "vectorizer": "text2vec-weaviate", "moduleConfig": { "text2vec-weaviate": {}, - "generative-cohere": {} + "generative-openai": {} } }' \ "$WEAVIATE_URL/v1/schema" diff --git a/_includes/code/quickstart/quickstart.query.rag.mdx b/_includes/code/quickstart/quickstart.query.rag.mdx index 63cf292cd..7f9b711b7 100644 --- a/_includes/code/quickstart/quickstart.query.rag.mdx +++ b/_includes/code/quickstart/quickstart.query.rag.mdx @@ -59,7 +59,7 @@ import JavaV6Code from "!!raw-loader!/_includes/code/java-v6/src/test/java/Quick # Best practice: store your credentials in environment variables # export WEAVIATE_URL="YOUR_INSTANCE_URL" # Your Weaviate instance URL # export WEAVIATE_API_KEY="YOUR_API_KEY" # Your Weaviate instance API key -# export COHERE_API_KEY="YOUR_API_KEY" # Your Cohere API key +# export OPENAI_API_KEY="YOUR_API_KEY" # Your OpenAI API key echo '{ "query": "{ @@ -92,7 +92,7 @@ echo '{ -X POST \ -H 'Content-Type: application/json' \ -H "Authorization: Bearer $WEAVIATE_API_KEY" \ - -H "X-Cohere-Api-Key: $COHERE_API_KEY" \ + -H "X-OpenAI-Api-Key: $OPENAI_API_KEY" \ -d @- \ $WEAVIATE_URL/v1/graphql ``` diff --git a/_includes/feature-notes/v137-preview.mdx b/_includes/feature-notes/v137-preview.mdx index 88182bb3f..156891a60 100644 --- a/_includes/feature-notes/v137-preview.mdx +++ b/_includes/feature-notes/v137-preview.mdx @@ -2,7 +2,6 @@ This is a preview feature. The API may change in future releases. -- **Python client**: Support is not yet in a released `weaviate-client`. Coming in the next release (tracked in [PR #1997](https://github.com/weaviate/weaviate-python-client/pull/1997)). - **Multi-node clusters**: MMR reranking may produce suboptimal results for collections whose shards are distributed across multiple nodes, since each shard returns its own candidate set before the coordinator reranks them. We are actively working on improving this. ::: diff --git a/docs/cloud/quickstart.mdx b/docs/cloud/quickstart.mdx index 7039863d7..bb652e9b8 100644 --- a/docs/cloud/quickstart.mdx +++ b/docs/cloud/quickstart.mdx @@ -74,7 +74,7 @@ Notes: ## Requirements - A [Weaviate Cloud account](./platform/create-account.mdx). -- In order to perform Retrieval Augmented Generation (RAG) in the last step, you will need a [Cohere](https://dashboard.cohere.com/) account. You can use a free Cohere trial API key. If you have another preferred [model provider](/weaviate/model-providers), you can use that instead of Cohere. +- In order to perform Retrieval Augmented Generation (RAG) in the last step, you will need an [OpenAI](https://platform.openai.com/) account and an OpenAI API key. If you have another preferred [model provider](/weaviate/model-providers), you can use that instead of OpenAI.
@@ -386,9 +386,9 @@ import QueryRAG from "/_includes/code/quickstart/quickstart.query.rag.mdx"; -:::info Cohere API key in the header +:::info OpenAI API key in the header -Note that this code includes an additional header for the Cohere API key. Weaviate uses this key to access the Cohere generative AI model and perform retrieval augmented generation (RAG). +Note that this code includes an additional header for the OpenAI API key. Weaviate uses this key to access the OpenAI generative AI model and perform retrieval augmented generation (RAG). ::: diff --git a/docs/deploy/configuration/env-vars/index.md b/docs/deploy/configuration/env-vars/index.md index 51defbdd0..65c811c77 100644 --- a/docs/deploy/configuration/env-vars/index.md +++ b/docs/deploy/configuration/env-vars/index.md @@ -80,7 +80,7 @@ import APITable from '@site/src/components/APITable'; | `OBJECTS_TTL_DELETE_SCHEDULE` | Schedule for deleting expired objects. Accepts standard 5-field cron format, 6-field (with seconds), 7-field (with seconds and year), descriptors (`@yearly`, `@monthly`, `@weekly`, `@daily`, `@hourly`), or hash expressions. Default: `""` (disabled)
Added in `v1.36` | `string - cron format` | `0 */6 * * *` (every 6 hours) | | `OBJECTS_TTL_PAUSE_DURATION` | How long to pause the TTL deletion process between batches. Longer pauses reduce resource pressure but slow down cleanup. If `0` there is no pause. Can be modified at runtime. Default: `1m`
Added in `v1.36` | `string - duration` | `20s`, `2m` | | `OBJECTS_TTL_PAUSE_EVERY_NO_BATCHES` | Number of batch deletions to process before pausing. With the default batch size of 10,000, a pause occurs every 100,000 deleted objects. If `0` there is no pause. Can be modified at runtime. Default: `10`
Added in `v1.36` | `string - number` | `3` | -| `OPERATIONAL_MODE` | Sets the [mode of operation](../status.md#operational-modes) for the instance. Options: `READ_WRITE` (default), `READ_ONLY`, `WRITE_ONLY`, `SCALE_OUT`. Limits available operations based on the mode selected. | `string` | `READ_WRITE` | +| `OPERATIONAL_MODE` | Sets the [mode of operation](../status.md#operational-modes) for the instance, limiting the available operations based on the mode selected. Options: `ReadWrite` (default), `ReadOnly`, `WriteOnly`, `ScaleOut`. These values are case-sensitive and matched exactly. An unrecognized value (such as `READ_ONLY`) silently falls back to the default `ReadWrite`, without a warning or an error, so a node you intended to restrict stays fully writable. | `string` | `ReadWrite` | | `ORIGIN` | Set the http(s) origin for Weaviate | `string - HTTP origin` | `https://my-weaviate-deployment.com` | | `PERSISTENCE_DATA_PATH` | Path to the Weaviate data store.
[Note about file systems and performance](/weaviate/concepts/resources.md#file-system). | `string - file path` | `/var/lib/weaviate`
Defaults to `./data`| | `PERSISTENCE_HNSW_DISABLE_SNAPSHOTS` | If set, [HNSW snapshotting](/weaviate/concepts/storage.md#persistence-and-crash-recovery) will be disabled. Default: `false` (enabled) as of `v1.36`; `true` (disabled) in `v1.31`–`v1.35`
Added in `v1.31` | `boolean` | `false` | diff --git a/docs/deploy/faqs/troubleshooting.md b/docs/deploy/faqs/troubleshooting.md index a5c013f29..8d0c50014 100644 --- a/docs/deploy/faqs/troubleshooting.md +++ b/docs/deploy/faqs/troubleshooting.md @@ -39,7 +39,7 @@ To confirm and identify the issue, you'll want to first run the same query multi #### Resolving the issue -Check your settings to check if you have asynchronous replication enabled. If `async_replication_disabled` is set to "true" then you'll need to set that variable to "false." Once it is enabled, the logs will show messages that indicate successful peers checks and synchronization for the nodes. +Check your settings to check if you have asynchronous replication enabled. If `ASYNC_REPLICATION_DISABLED` is set to "true" then you'll need to set that variable to "false." Once it is enabled, the logs will show messages that indicate successful peers checks and synchronization for the nodes. @@ -51,11 +51,21 @@ Check your settings to check if you have asynchronous replication enabled. If `a #### Identifying the issue -To confirm and identify the issue, you'll want to first run the same query multiple times to confirm that the results are inconsistent. If the inconsistent results are persisting, then you probably have asynchronous replication disabled for your deployment. +Start with the logs of a node that is failing to join. A membership problem reads differently from a data problem: you'll see repeated attempts to contact the founding member, gossip timeouts, or Raft messages about an election that never settles on a leader. A node in this state can still pass its own health checks, so if the live endpoint answers while the node stays outside the cluster, the process is healthy and the problem is membership. + +To confirm it, query the `/v1/cluster/statistics` endpoint. If it reports fewer nodes than you expect, or the top-level `synchronized` field is `false`, then your cluster has not reached consensus. #### Resolving the issue -Check your settings to check if you have asynchronous replication enabled. If `async_replication_disabled` is set to "true" then you'll need to set that variable to "false." Once it is enabled, the logs will show messages that indicate successful peers checks and synchronization for the nodes. Additionally, test the live and ready REST endpoints. and check the network configuration of the nodes. +Work outward from each node's own identity to the network between the nodes. + +- Point every joining node at the founding member with [`CLUSTER_JOIN`](/deploy/configuration/env-vars/index.md#CLUSTER_JOIN). The value is the service name and gossip port of that founding member, such as `weaviate-node-1:7100`, and every joining node must name the same one. +- Set [`CLUSTER_HOSTNAME`](/deploy/configuration/env-vars/index.md#CLUSTER_HOSTNAME) explicitly on every node. If you leave the hostname to the operating system and it changes across a restart, the node rejoins under a new name while the cluster is still holding a place for the old one. If the hostname cannot be resolved through DNS, set [`CLUSTER_ADVERTISE_ADDR`](/deploy/configuration/env-vars/index.md#CLUSTER_ADVERTISE_ADDR) to advertise the node's address directly. +- Give each node a [`CLUSTER_GOSSIP_BIND_PORT`](/deploy/configuration/env-vars/index.md#CLUSTER_GOSSIP_BIND_PORT), used to exchange network state information, and a [`CLUSTER_DATA_BIND_PORT`](/deploy/configuration/env-vars/index.md#CLUSTER_DATA_BIND_PORT), used to exchange data. By convention the data port is one higher than the gossip port. Then confirm that every node can actually reach every other node on both of those ports. A firewall rule, an unpublished container port, or a network policy that only exposes the HTTP port will let a node start up perfectly well and still leave it unable to find anyone. +- For consensus specifically, check the Raft settings. [`RAFT_JOIN`](/deploy/configuration/env-vars/index.md#RAFT_JOIN) names the voter nodes, and [`RAFT_BOOTSTRAP_EXPECT`](/deploy/configuration/env-vars/index.md#RAFT_BOOTSTRAP_EXPECT) sets how many voters the cluster waits for at bootstrap. If you set `RAFT_JOIN`, you must adjust `RAFT_BOOTSTRAP_EXPECT` by hand to match the number of voters you listed. When the two disagree, the cluster waits for a member that will never arrive. + +Once the nodes are talking, check `/v1/cluster/statistics` again. Every node should appear in the response, and `synchronized` should be `true`. + ### You've downgraded and now your clusters won't reach the `Ready` state. diff --git a/docs/weaviate/client-libraries/typescript/notes-best-practices.mdx b/docs/weaviate/client-libraries/typescript/notes-best-practices.mdx index 44ec04a23..e42d56cff 100644 --- a/docs/weaviate/client-libraries/typescript/notes-best-practices.mdx +++ b/docs/weaviate/client-libraries/typescript/notes-best-practices.mdx @@ -124,7 +124,7 @@ You can set `skipInitChecks` to `true` to skip these checks. ```js import weaviate from 'weaviate-client'; -Add commentMore actions + const client = await weaviate.connectToLocal({ skipInitChecks: true, }) @@ -147,7 +147,7 @@ type Article = { wordcount: number, }; -const collection = client.collections.get < Article > "Article"; +const collection = client.collections.get
("Article"); await collection.data.insert({ // compiler error since 'body' field is missing in '.insert' title: "TS is awesome!", diff --git a/docs/weaviate/manage-objects/read-all-objects.mdx b/docs/weaviate/manage-objects/read-all-objects.mdx index 87b0f61ff..198d812a5 100644 --- a/docs/weaviate/manage-objects/read-all-objects.mdx +++ b/docs/weaviate/manage-objects/read-all-objects.mdx @@ -47,8 +47,8 @@ The following code iterates through all objects, providing the properties and id @@ -95,14 +95,6 @@ Read through all data including the vectors. (Also applicable where [named vecto language="ts" /> - - - - - - diff --git a/docs/weaviate/model-providers/google/generative.md b/docs/weaviate/model-providers/google/generative.md index 426e568ec..a63783d05 100644 --- a/docs/weaviate/model-providers/google/generative.md +++ b/docs/weaviate/model-providers/google/generative.md @@ -320,15 +320,19 @@ You can also supply images as a part of the input when performing retrieval augm ### Available models +:::caution Always set the model explicitly +If no model is specified, the server falls back to a legacy PaLM model that Google has deprecated. Set the model explicitly when you configure a collection or when you run a query. +::: + Vertex AI: - `gemini-2.5-pro` -- `gemini-2.5-flash` (default) +- `gemini-2.5-flash` - `gemini-2.0-flash` - `gemini-1.5-pro` - `gemini-1.5-flash` Gemini API: -- `gemini-2.5-flash` (default) +- `gemini-2.5-flash` - `gemini-2.5-pro` - `gemini-2.0-flash` - `gemini-1.5-pro` diff --git a/docs/weaviate/search/similarity.md b/docs/weaviate/search/similarity.md index 5a4c2fe95..7a4b90472 100644 --- a/docs/weaviate/search/similarity.md +++ b/docs/weaviate/search/similarity.md @@ -675,7 +675,7 @@ import V137Preview from '/\_includes/feature-notes/v137-preview.mdx'; Standard vector search returns the closest matches to the query, which often means a cluster of near-duplicate results. **Maximum Marginal Relevance (MMR)** reranks results to balance relevance with diversity — each selected result must add something new to the result set. -Add the `selection` parameter to any vector search query: +Add the `diversity_selection` parameter to any vector search query: @@ -377,9 +377,9 @@ import QueryRAG from "/_includes/code/quickstart/quickstart.query.rag.mdx"; -:::info Cohere API key in the header +:::info OpenAI API key in the header -Note that this code includes an additional header for the Cohere API key. Weaviate uses this key to access the Cohere generative AI model and perform retrieval augmented generation (RAG). +Note that this code includes an additional header for the OpenAI API key. Weaviate uses this key to access the OpenAI generative AI model and perform retrieval augmented generation (RAG). ::: diff --git a/tests/test_python.py b/tests/test_python.py index 478f15171..af815e9d0 100644 --- a/tests/test_python.py +++ b/tests/test_python.py @@ -261,10 +261,6 @@ def test_search(empty_weaviates, script_loc): @pytest.mark.pyv4 -@pytest.mark.skip( - reason="Diversity/MMR not yet in a released weaviate-client; unskip once " - "https://github.com/weaviate/weaviate-python-client/pull/1997 ships" -) @pytest.mark.parametrize( "script_loc", [ From e4431ca2ef5e252655177d0761f8c138ebfa9954 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Thu, 30 Jul 2026 08:51:04 +0200 Subject: [PATCH 22/84] docs(quickstart): use server-side batching in the Java and C# import steps Java and C# were the last quickstart tabs still using client-side batching while the docs recommend server-side batching as the default. Java: `collection.data.insertMany(...)` becomes `collection.batch.start()`, which returns a `BatchContext`. The context is closed with try-with-resources so `close()` flushes the remaining objects and waits for the results, and `batch.numberOfErrors()` is read after the block, once the tally is complete. C#: `collection.Data.InsertMany(...)` becomes `collection.Batch.InsertMany(...)`. Both return a `BatchInsertResponse`, so the error handling keeps its shape and gains a per-entry loop. The `HasErrors` check moves inside the `END Import` marker so the docs tab renders it, matching the Java tab. Go keeps client-side batching because the Go client has no server-side batching API. The README examples are left alone. The shared line above the tabs now says a result reports whether any objects failed rather than which ones, because the Java tally is a count. The Java and C# tabs each gain a sentence naming their own result type. --- _includes/code/csharp/QuickstartLocalTest.cs | 12 ++++++--- _includes/code/csharp/QuickstartTest.cs | 12 ++++++--- .../csharp/quickstart/QuickstartCreate.cs | 4 +-- .../quickstart/QuickstartCreateVectors.cs | 4 +-- .../quickstart/QuickstartLocalCreate.cs | 4 +-- .../QuickstartLocalCreateVectors.cs | 4 +-- .../src/test/java/QuickstartLocalTest.java | 20 +++++++++------ .../java-v6/src/test/java/QuickstartTest.java | 20 +++++++++------ .../java/quickstart/QuickstartCreate.java | 25 ++++++++++++------- .../quickstart/QuickstartCreateVectors.java | 23 ++++++++++++----- .../quickstart/QuickstartLocalCreate.java | 25 ++++++++++++------- .../QuickstartLocalCreateVectors.java | 22 +++++++++++----- .../local.quickstart.import_objects.mdx | 8 +++++- .../quickstart/quickstart.import_objects.mdx | 8 +++++- 14 files changed, 129 insertions(+), 62 deletions(-) diff --git a/_includes/code/csharp/QuickstartLocalTest.cs b/_includes/code/csharp/QuickstartLocalTest.cs index d6fc27dfc..fac3c4ad7 100644 --- a/_includes/code/csharp/QuickstartLocalTest.cs +++ b/_includes/code/csharp/QuickstartLocalTest.cs @@ -87,21 +87,25 @@ public async Task FullQuickstartWorkflowTest() ); } - // Call InsertMany with the list of objects converted to an array - var insertResponse = await questions.Data.InsertMany(questionsToInsert.ToArray()); + // `Batch.InsertMany` imports the list using server-side batching + var insertResponse = await questions.Batch.InsertMany(questionsToInsert); // highlight-end - // END Import // Check for errors if (insertResponse.HasErrors) { Console.WriteLine($"Number of failed imports: {insertResponse.Errors.Count()}"); - Console.WriteLine($"First failed object error: {insertResponse.Errors.First()}"); + // `Objects` holds one entry per object, in the order they were sent + foreach (var entry in insertResponse.Objects.Where(o => o.Error is not null)) + { + Console.WriteLine($"Failed object at index {entry.Index}: {entry.Error.Message}"); + } } else { Console.WriteLine($"Successfully inserted {insertResponse.Objects.Count()} objects."); } + // END Import // START NearText // highlight-start diff --git a/_includes/code/csharp/QuickstartTest.cs b/_includes/code/csharp/QuickstartTest.cs index 894f41c68..b46a2075e 100644 --- a/_includes/code/csharp/QuickstartTest.cs +++ b/_includes/code/csharp/QuickstartTest.cs @@ -95,21 +95,25 @@ public static async Task FullQuickstartWorkflowTest() ); } - // Call InsertMany with the list of objects converted to an array - var insertResponse = await questions.Data.InsertMany(questionsToInsert.ToArray()); + // `Batch.InsertMany` imports the list using server-side batching + var insertResponse = await questions.Batch.InsertMany(questionsToInsert); // highlight-end - // END Import // Check for errors if (insertResponse.HasErrors) { Console.WriteLine($"Number of failed imports: {insertResponse.Errors.Count()}"); - Console.WriteLine($"First failed object error: {insertResponse.Errors.First()}"); + // `Objects` holds one entry per object, in the order they were sent + foreach (var entry in insertResponse.Objects.Where(o => o.Error is not null)) + { + Console.WriteLine($"Failed object at index {entry.Index}: {entry.Error.Message}"); + } } else { Console.WriteLine($"Successfully inserted {insertResponse.Objects.Count()} objects."); } + // END Import // START NearText // highlight-start diff --git a/_includes/code/csharp/quickstart/QuickstartCreate.cs b/_includes/code/csharp/quickstart/QuickstartCreate.cs index e1a4f4c6f..256d8ff87 100644 --- a/_includes/code/csharp/quickstart/QuickstartCreate.cs +++ b/_includes/code/csharp/quickstart/QuickstartCreate.cs @@ -65,8 +65,8 @@ public static async Task Run() }, }; - // Insert objects using InsertMany - var insertResponse = await movies.Data.InsertMany(dataObjects.ToArray()); + // Insert the objects using server-side batching + var insertResponse = await movies.Batch.InsertMany(dataObjects); if (insertResponse.HasErrors) { diff --git a/_includes/code/csharp/quickstart/QuickstartCreateVectors.cs b/_includes/code/csharp/quickstart/QuickstartCreateVectors.cs index 9ebb7f3d1..330ccd720 100644 --- a/_includes/code/csharp/quickstart/QuickstartCreateVectors.cs +++ b/_includes/code/csharp/quickstart/QuickstartCreateVectors.cs @@ -92,8 +92,8 @@ public static async Task Run() ), }; - // Insert the objects with vectors - var insertResponse = await movies.Data.InsertMany(dataToInsert); + // Insert the objects with vectors using server-side batching + var insertResponse = await movies.Batch.InsertMany(dataToInsert); if (insertResponse.HasErrors) { diff --git a/_includes/code/csharp/quickstart/QuickstartLocalCreate.cs b/_includes/code/csharp/quickstart/QuickstartLocalCreate.cs index 6d00abfb2..cf0f4e75c 100644 --- a/_includes/code/csharp/quickstart/QuickstartLocalCreate.cs +++ b/_includes/code/csharp/quickstart/QuickstartLocalCreate.cs @@ -70,8 +70,8 @@ public static async Task Run() }, }; - // Insert objects using InsertMany - var insertResponse = await movies.Data.InsertMany(dataObjects.ToArray()); + // Insert the objects using server-side batching + var insertResponse = await movies.Batch.InsertMany(dataObjects); if (insertResponse.HasErrors) { diff --git a/_includes/code/csharp/quickstart/QuickstartLocalCreateVectors.cs b/_includes/code/csharp/quickstart/QuickstartLocalCreateVectors.cs index 1e08c3d1b..93cbf8b53 100644 --- a/_includes/code/csharp/quickstart/QuickstartLocalCreateVectors.cs +++ b/_includes/code/csharp/quickstart/QuickstartLocalCreateVectors.cs @@ -76,8 +76,8 @@ public static async Task Run() ), }; - // Insert the objects with vectors - var insertResponse = await movies.Data.InsertMany(dataToInsert); + // Insert the objects with vectors using server-side batching + var insertResponse = await movies.Batch.InsertMany(dataToInsert); if (insertResponse.HasErrors) { Console.WriteLine($"Errors during import: {insertResponse.Errors}"); diff --git a/_includes/code/java-v6/src/test/java/QuickstartLocalTest.java b/_includes/code/java-v6/src/test/java/QuickstartLocalTest.java index c067883b9..0a80c19ca 100644 --- a/_includes/code/java-v6/src/test/java/QuickstartLocalTest.java +++ b/_includes/code/java-v6/src/test/java/QuickstartLocalTest.java @@ -3,7 +3,8 @@ import io.weaviate.client6.v1.api.collections.Generative; import io.weaviate.client6.v1.api.collections.Property; import io.weaviate.client6.v1.api.collections.VectorConfig; -import io.weaviate.client6.v1.api.collections.data.InsertManyResponse; +import io.weaviate.client6.v1.api.collections.WeaviateObject; +import io.weaviate.client6.v1.api.collections.batch.BatchContext; import org.json.JSONArray; import org.json.JSONObject; @@ -94,16 +95,21 @@ void testImportDataWorkflow() throws Exception { questionsToInsert.add(properties); }); - // Call insertMany with the list of objects - InsertManyResponse insertResponse = questions.data.insertMany(questionsToInsert.toArray(new Map[0])); + // `batch.start()` opens a server-side batch + BatchContext> batch = questions.batch.start(); + // Closing the batch sends the remaining objects and waits for the results + try (batch) { + for (Map properties : questionsToInsert) { + batch.add(WeaviateObject.>of(o -> o.properties(properties))); + } + } // highlight-end // Check for errors - if (!insertResponse.errors().isEmpty()) { - System.err.printf("Number of failed imports: %d\n", insertResponse.errors().size()); - System.err.printf("First failed object error: %s\n", insertResponse.errors().get(0)); + if (batch.numberOfErrors() > 0) { + System.err.printf("Number of failed imports: %d\n", batch.numberOfErrors()); } else { - System.out.printf("Successfully inserted %d objects.\n", insertResponse.uuids().size()); + System.out.printf("Successfully inserted %d objects.\n", questionsToInsert.size()); } // END Import // client.collections.delete(collectionName); diff --git a/_includes/code/java-v6/src/test/java/QuickstartTest.java b/_includes/code/java-v6/src/test/java/QuickstartTest.java index 3de3fa0b5..2de260ead 100644 --- a/_includes/code/java-v6/src/test/java/QuickstartTest.java +++ b/_includes/code/java-v6/src/test/java/QuickstartTest.java @@ -3,7 +3,8 @@ import io.weaviate.client6.v1.api.collections.Generative; import io.weaviate.client6.v1.api.collections.Property; import io.weaviate.client6.v1.api.collections.VectorConfig; -import io.weaviate.client6.v1.api.collections.data.InsertManyResponse; +import io.weaviate.client6.v1.api.collections.WeaviateObject; +import io.weaviate.client6.v1.api.collections.batch.BatchContext; import org.json.JSONArray; import org.json.JSONObject; @@ -115,16 +116,21 @@ void testImportDataWorkflow() throws Exception { questionsToInsert.add(properties); }); - // Call insertMany with the list of objects - InsertManyResponse insertResponse = questions.data.insertMany(questionsToInsert.toArray(new Map[0])); + // `batch.start()` opens a server-side batch + BatchContext> batch = questions.batch.start(); + // Closing the batch sends the remaining objects and waits for the results + try (batch) { + for (Map properties : questionsToInsert) { + batch.add(WeaviateObject.>of(o -> o.properties(properties))); + } + } // highlight-end // Check for errors - if (!insertResponse.errors().isEmpty()) { - System.err.printf("Number of failed imports: %d\n", insertResponse.errors().size()); - System.err.printf("First failed object error: %s\n", insertResponse.errors().get(0)); + if (batch.numberOfErrors() > 0) { + System.err.printf("Number of failed imports: %d\n", batch.numberOfErrors()); } else { - System.out.printf("Successfully inserted %d objects.\n", insertResponse.uuids().size()); + System.out.printf("Successfully inserted %d objects.\n", questionsToInsert.size()); } // END Import // client.collections.delete(collectionName); diff --git a/_includes/code/java-v6/src/test/java/quickstart/QuickstartCreate.java b/_includes/code/java-v6/src/test/java/quickstart/QuickstartCreate.java index 745c1049f..d451389b1 100644 --- a/_includes/code/java-v6/src/test/java/quickstart/QuickstartCreate.java +++ b/_includes/code/java-v6/src/test/java/quickstart/QuickstartCreate.java @@ -5,7 +5,8 @@ import io.weaviate.client6.v1.api.collections.CollectionHandle; import io.weaviate.client6.v1.api.collections.Property; import io.weaviate.client6.v1.api.collections.VectorConfig; -import io.weaviate.client6.v1.api.collections.data.InsertManyResponse; +import io.weaviate.client6.v1.api.collections.WeaviateObject; +import io.weaviate.client6.v1.api.collections.batch.BatchContext; import java.util.List; import java.util.Map; @@ -54,18 +55,24 @@ public static void main(String[] args) throws Exception { "A meek Hobbit and his companions set out on a perilous journey to destroy a powerful ring and save Middle-earth.", "genre", "Fantasy")); - // Insert objects using insertMany + // Insert the objects using server-side batching CollectionHandle> movies = client.collections.use(collectionName); - InsertManyResponse insertResponse = - movies.data.insertMany(dataObjects.toArray(new Map[0])); + BatchContext> batch = movies.batch.start(); + // Closing the batch sends the remaining objects and waits for the results + try (batch) { + for (Map properties : dataObjects) { + batch.add( + WeaviateObject.>of(o -> o.properties(properties))); + } + } - if (!insertResponse.errors().isEmpty()) { - System.err.println("Errors during import: " + insertResponse.errors()); + if (batch.numberOfErrors() > 0) { + System.err + .println("Number of failed imports: " + batch.numberOfErrors()); } else { - System.out - .println("Imported & vectorized " + insertResponse.uuids().size() - + " objects into the Movie collection"); + System.out.println("Imported & vectorized " + dataObjects.size() + + " objects into the Movie collection"); } } finally { if (client != null) { diff --git a/_includes/code/java-v6/src/test/java/quickstart/QuickstartCreateVectors.java b/_includes/code/java-v6/src/test/java/quickstart/QuickstartCreateVectors.java index 6a6d930d8..e1f208d41 100644 --- a/_includes/code/java-v6/src/test/java/quickstart/QuickstartCreateVectors.java +++ b/_includes/code/java-v6/src/test/java/quickstart/QuickstartCreateVectors.java @@ -7,7 +7,8 @@ import io.weaviate.client6.v1.api.collections.VectorConfig; import io.weaviate.client6.v1.api.collections.Vectors; import io.weaviate.client6.v1.api.collections.WeaviateObject; -import io.weaviate.client6.v1.api.collections.data.InsertManyResponse; +import io.weaviate.client6.v1.api.collections.batch.BatchContext; +import java.util.List; import java.util.Map; public class QuickstartCreateVectors { @@ -63,20 +64,30 @@ public static void main(String[] args) throws Exception { float[] vector3 = new float[] {0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f}; - // Insert the objects with vectors + // Insert the objects with vectors using server-side batching CollectionHandle> movies = client.collections.use(collectionName); - InsertManyResponse insertResponse = movies.data.insertMany( + List>> objectsToInsert = List.of( WeaviateObject.of(v -> v.properties(props1) .vectors(Vectors.of(vector1))), WeaviateObject.of(v -> v.properties(props2) .vectors(Vectors.of(vector2))), WeaviateObject.of(v -> v.properties(props3) .vectors(Vectors.of(vector3)))); - if (!insertResponse.errors().isEmpty()) { - System.err.println("Errors during import: " + insertResponse.errors()); + + BatchContext> batch = movies.batch.start(); + // Closing the batch sends the remaining objects and waits for the results + try (batch) { + for (WeaviateObject> object : objectsToInsert) { + batch.add(object); + } + } + + if (batch.numberOfErrors() > 0) { + System.err + .println("Number of failed imports: " + batch.numberOfErrors()); } else { - System.out.println("Imported " + insertResponse.uuids().size() + System.out.println("Imported " + objectsToInsert.size() + " objects with vectors into the Movie collection"); } } finally { diff --git a/_includes/code/java-v6/src/test/java/quickstart/QuickstartLocalCreate.java b/_includes/code/java-v6/src/test/java/quickstart/QuickstartLocalCreate.java index 16e7149be..6b6b45477 100644 --- a/_includes/code/java-v6/src/test/java/quickstart/QuickstartLocalCreate.java +++ b/_includes/code/java-v6/src/test/java/quickstart/QuickstartLocalCreate.java @@ -5,7 +5,8 @@ import io.weaviate.client6.v1.api.collections.CollectionHandle; import io.weaviate.client6.v1.api.collections.Property; import io.weaviate.client6.v1.api.collections.VectorConfig; -import io.weaviate.client6.v1.api.collections.data.InsertManyResponse; +import io.weaviate.client6.v1.api.collections.WeaviateObject; +import io.weaviate.client6.v1.api.collections.batch.BatchContext; import java.util.List; import java.util.Map; @@ -53,18 +54,24 @@ public static void main(String[] args) throws Exception { "A meek Hobbit and his companions set out on a perilous journey to destroy a powerful ring and save Middle-earth.", "genre", "Fantasy")); - // Insert objects using insertMany + // Insert the objects using server-side batching CollectionHandle> movies = client.collections.use(collectionName); - InsertManyResponse insertResponse = - movies.data.insertMany(dataObjects.toArray(new Map[0])); + BatchContext> batch = movies.batch.start(); + // Closing the batch sends the remaining objects and waits for the results + try (batch) { + for (Map properties : dataObjects) { + batch.add( + WeaviateObject.>of(o -> o.properties(properties))); + } + } - if (!insertResponse.errors().isEmpty()) { - System.err.println("Errors during import: " + insertResponse.errors()); + if (batch.numberOfErrors() > 0) { + System.err + .println("Number of failed imports: " + batch.numberOfErrors()); } else { - System.out - .println("Imported & vectorized " + insertResponse.uuids().size() - + " objects into the Movie collection"); + System.out.println("Imported & vectorized " + dataObjects.size() + + " objects into the Movie collection"); } } finally { if (client != null) { diff --git a/_includes/code/java-v6/src/test/java/quickstart/QuickstartLocalCreateVectors.java b/_includes/code/java-v6/src/test/java/quickstart/QuickstartLocalCreateVectors.java index f31eaad3d..66c88691d 100644 --- a/_includes/code/java-v6/src/test/java/quickstart/QuickstartLocalCreateVectors.java +++ b/_includes/code/java-v6/src/test/java/quickstart/QuickstartLocalCreateVectors.java @@ -7,7 +7,8 @@ import io.weaviate.client6.v1.api.collections.VectorConfig; import io.weaviate.client6.v1.api.collections.Vectors; import io.weaviate.client6.v1.api.collections.WeaviateObject; -import io.weaviate.client6.v1.api.collections.data.InsertManyResponse; +import io.weaviate.client6.v1.api.collections.batch.BatchContext; +import java.util.List; import java.util.Map; public class QuickstartLocalCreateVectors { @@ -59,10 +60,10 @@ public static void main(String[] args) throws Exception { float[] vector3 = new float[] {0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f}; - // Insert the objects with vectors + // Insert the objects with vectors using server-side batching CollectionHandle> movies = client.collections.use(collectionName); - InsertManyResponse insertResponse = movies.data.insertMany( + List>> objectsToInsert = List.of( WeaviateObject.of(v -> v.properties(props1) .vectors(Vectors.of(vector1))), WeaviateObject.of(v -> v.properties(props2) @@ -70,10 +71,19 @@ public static void main(String[] args) throws Exception { WeaviateObject.of(v -> v.properties(props3) .vectors(Vectors.of(vector3)))); - if (!insertResponse.errors().isEmpty()) { - System.err.println("Errors during import: " + insertResponse.errors()); + BatchContext> batch = movies.batch.start(); + // Closing the batch sends the remaining objects and waits for the results + try (batch) { + for (WeaviateObject> object : objectsToInsert) { + batch.add(object); + } + } + + if (batch.numberOfErrors() > 0) { + System.err + .println("Number of failed imports: " + batch.numberOfErrors()); } else { - System.out.println("Imported " + insertResponse.uuids().size() + System.out.println("Imported " + objectsToInsert.size() + " objects with vectors into the Movie collection"); } } finally { diff --git a/_includes/code/quickstart/local.quickstart.import_objects.mdx b/_includes/code/quickstart/local.quickstart.import_objects.mdx index 04601ef67..d4550c2de 100644 --- a/_includes/code/quickstart/local.quickstart.import_objects.mdx +++ b/_includes/code/quickstart/local.quickstart.import_objects.mdx @@ -8,7 +8,7 @@ import JavaV6Code from "!!raw-loader!/_includes/code/java-v6/src/test/java/Quick import CSharpCode from "!!raw-loader!/_includes/code/csharp/QuickstartLocalTest.cs"; -Every import returns a result that reports which objects failed, if any. Check it in your own code to catch problems such as malformed data or a misconfigured model provider. +Every import returns a result that reports whether any objects failed. Check it in your own code to catch problems such as malformed data or a misconfigured model provider. @@ -56,6 +56,9 @@ Every import returns a result that reports which objects failed, if any. Check i endMarker="// END Import" language="java" /> + +`batch.start()` opens a server-side batch. Closing the batch sends any remaining objects and waits for the server to report the results, so read `batch.numberOfErrors()` afterwards for the number of objects that failed. + @@ -65,6 +68,9 @@ Every import returns a result that reports which objects failed, if any. Check i endMarker="// END Import" language="csharp" /> + +`Batch.InsertMany()` returns a `BatchInsertResponse`. Read `HasErrors` for a quick check, and `Objects` for one entry per object, each carrying the `Error` that failed it. + diff --git a/_includes/code/quickstart/quickstart.import_objects.mdx b/_includes/code/quickstart/quickstart.import_objects.mdx index 3b7b8dfc1..4aee756d0 100644 --- a/_includes/code/quickstart/quickstart.import_objects.mdx +++ b/_includes/code/quickstart/quickstart.import_objects.mdx @@ -8,7 +8,7 @@ import JavaV6Code from "!!raw-loader!/_includes/code/java-v6/src/test/java/Quick import CSharpCode from "!!raw-loader!/_includes/code/csharp/QuickstartTest.cs"; -Every import returns a result that reports which objects failed, if any. Check it in your own code to catch problems such as malformed data or a misconfigured model provider. +Every import returns a result that reports whether any objects failed. Check it in your own code to catch problems such as malformed data or a misconfigured model provider. @@ -57,6 +57,9 @@ Every import returns a result that reports which objects failed, if any. Check i endMarker="// END Import" language="java" /> + +`batch.start()` opens a server-side batch. Closing the batch sends any remaining objects and waits for the server to report the results, so read `batch.numberOfErrors()` afterwards for the number of objects that failed. + @@ -66,6 +69,9 @@ Every import returns a result that reports which objects failed, if any. Check i endMarker="// END Import" language="csharp" /> + +`Batch.InsertMany()` returns a `BatchInsertResponse`. Read `HasErrors` for a quick check, and `Objects` for one entry per object, each carrying the `Error` that failed it. + From c7b789958daae1e70cc002413fca161647a1d1fe Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Thu, 30 Jul 2026 09:57:23 +0200 Subject: [PATCH 23/84] docs: use camelCase config keys in the Go Google vectorizer examples Addresses review feedback on this pull request. Weaviate matches module config keys by exact string, a plain map lookup with no case normalization and a silent fallback to the default on a miss. The snake_case keys these examples used were therefore ignored by the server: two of the three blocks failed collection creation with "projectId cannot be empty", and the model each example set was never applied. The accepted keys are apiEndpoint, projectId and modelId, which is also what this page's own parameter reference documents, so the snippets contradicted the prose beside them. Also corrects a "Vertex AU" typo, and rewrites a troubleshooting sentence that read "Check your settings to check ..." and referred to "peers checks". --- .../go/docs/model-providers/2-usage-text/main.go | 14 +++++++------- docs/deploy/faqs/troubleshooting.md | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/_includes/code/howto/go/docs/model-providers/2-usage-text/main.go b/_includes/code/howto/go/docs/model-providers/2-usage-text/main.go index 274ce4095..e25ed6a6e 100644 --- a/_includes/code/howto/go/docs/model-providers/2-usage-text/main.go +++ b/_includes/code/howto/go/docs/model-providers/2-usage-text/main.go @@ -288,8 +288,8 @@ func main() { "title_vector": { Vectorizer: map[string]interface{}{ "text2vec-google": map[string]interface{}{ - "project_id": "", - "model_id": "gemini-embedding-001", // (Optional) To manually set the model ID + "projectId": "", + "modelId": "gemini-embedding-001", // (Optional) To manually set the model ID }, }, }, @@ -323,7 +323,7 @@ func main() { "text2vec-google": map[string]interface{}{ "properties": []string{"title"}, "apiEndpoint": "generativelanguage.googleapis.com", - "model_id": "gemini-embedding-001", // (Optional) To manually set the model ID + "modelId": "gemini-embedding-001", // (Optional) To manually set the model ID }, }, }, @@ -355,10 +355,10 @@ func main() { "title_vector": { Vectorizer: map[string]interface{}{ "text2vec-google": map[string]interface{}{ - "properties": []string{"title"}, - "project_id": "", // Required for Vertex AU - "model_id": "textembedding-gecko@latest", // (Optional) To manually set the model ID - "api_endpoint": "", // (Optional) To manually set the API endpoint + "properties": []string{"title"}, + "projectId": "", // Required for Vertex AI + "modelId": "textembedding-gecko@latest", // (Optional) To manually set the model ID + "apiEndpoint": "", // (Optional) To manually set the API endpoint }, }, }, diff --git a/docs/deploy/faqs/troubleshooting.md b/docs/deploy/faqs/troubleshooting.md index 8d0c50014..c877c2d7e 100644 --- a/docs/deploy/faqs/troubleshooting.md +++ b/docs/deploy/faqs/troubleshooting.md @@ -39,7 +39,7 @@ To confirm and identify the issue, you'll want to first run the same query multi #### Resolving the issue -Check your settings to check if you have asynchronous replication enabled. If `ASYNC_REPLICATION_DISABLED` is set to "true" then you'll need to set that variable to "false." Once it is enabled, the logs will show messages that indicate successful peers checks and synchronization for the nodes. +Check whether asynchronous replication is enabled. If `ASYNC_REPLICATION_DISABLED` is set to `true`, set it to `false`. Once async replication is enabled, the logs will show successful peer checks and node synchronization. From ffd62a366253006ca96e200a5c06f593e3991f47 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Thu, 30 Jul 2026 09:59:53 +0200 Subject: [PATCH 24/84] docs(quickstart): correct the import prose for Java and C# The shared line above the tabs claimed every import "returns a result". That is false for Java: `batch.start()` hands back the `BatchContext` before any object is added, the try-with-resources block returns nothing, and the tally is read off a handle the reader already holds. It also primes the mental model that causes the premature read, because the only candidate for "the result the import gave me" is the object returned before the import ran. The line now says imports report whether any objects failed, without claiming a return value. The C# sentence said each entry carries "the `Error` that failed it", but `Error` is nullable and null on success, as the sample two lines below already shows with `.Where(o => o.Error is not null)`. It also left `Index` unnamed while the code prints it and the Python and TS tabs explain positional keying. The sentence now names `HasErrors`, `Errors`, `Objects`, `Index`, and `Error`, and says only failed entries carry an `Error`. The Java timing moves out of a trailing adverb into its own sentence, since reading `numberOfErrors()` before the batch closes is the one thing a reader can silently get wrong. In the C# samples, the comment above the failure loop now names `Index` and matches the Python and TS phrasing instead of saying "in the order they were sent", and the success count uses `insertResponse.Count` like the four sibling quickstart files rather than `Objects.Count()`. --- _includes/code/csharp/QuickstartLocalTest.cs | 4 ++-- _includes/code/csharp/QuickstartTest.cs | 4 ++-- .../code/quickstart/local.quickstart.import_objects.mdx | 6 +++--- _includes/code/quickstart/quickstart.import_objects.mdx | 7 +++---- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/_includes/code/csharp/QuickstartLocalTest.cs b/_includes/code/csharp/QuickstartLocalTest.cs index fac3c4ad7..6f9e71eb5 100644 --- a/_includes/code/csharp/QuickstartLocalTest.cs +++ b/_includes/code/csharp/QuickstartLocalTest.cs @@ -95,7 +95,7 @@ public async Task FullQuickstartWorkflowTest() if (insertResponse.HasErrors) { Console.WriteLine($"Number of failed imports: {insertResponse.Errors.Count()}"); - // `Objects` holds one entry per object, in the order they were sent + // `Objects` holds one entry per object; `Index` is the position of the object in the input foreach (var entry in insertResponse.Objects.Where(o => o.Error is not null)) { Console.WriteLine($"Failed object at index {entry.Index}: {entry.Error.Message}"); @@ -103,7 +103,7 @@ public async Task FullQuickstartWorkflowTest() } else { - Console.WriteLine($"Successfully inserted {insertResponse.Objects.Count()} objects."); + Console.WriteLine($"Successfully inserted {insertResponse.Count} objects."); } // END Import diff --git a/_includes/code/csharp/QuickstartTest.cs b/_includes/code/csharp/QuickstartTest.cs index b46a2075e..07a144781 100644 --- a/_includes/code/csharp/QuickstartTest.cs +++ b/_includes/code/csharp/QuickstartTest.cs @@ -103,7 +103,7 @@ public static async Task FullQuickstartWorkflowTest() if (insertResponse.HasErrors) { Console.WriteLine($"Number of failed imports: {insertResponse.Errors.Count()}"); - // `Objects` holds one entry per object, in the order they were sent + // `Objects` holds one entry per object; `Index` is the position of the object in the input foreach (var entry in insertResponse.Objects.Where(o => o.Error is not null)) { Console.WriteLine($"Failed object at index {entry.Index}: {entry.Error.Message}"); @@ -111,7 +111,7 @@ public static async Task FullQuickstartWorkflowTest() } else { - Console.WriteLine($"Successfully inserted {insertResponse.Objects.Count()} objects."); + Console.WriteLine($"Successfully inserted {insertResponse.Count} objects."); } // END Import diff --git a/_includes/code/quickstart/local.quickstart.import_objects.mdx b/_includes/code/quickstart/local.quickstart.import_objects.mdx index d4550c2de..ad0c6222f 100644 --- a/_includes/code/quickstart/local.quickstart.import_objects.mdx +++ b/_includes/code/quickstart/local.quickstart.import_objects.mdx @@ -8,7 +8,7 @@ import JavaV6Code from "!!raw-loader!/_includes/code/java-v6/src/test/java/Quick import CSharpCode from "!!raw-loader!/_includes/code/csharp/QuickstartLocalTest.cs"; -Every import returns a result that reports whether any objects failed. Check it in your own code to catch problems such as malformed data or a misconfigured model provider. +Every import reports whether any objects failed. Check for failures in your own code to catch problems such as malformed data or a misconfigured model provider. @@ -57,7 +57,7 @@ Every import returns a result that reports whether any objects failed. Check it language="java" /> -`batch.start()` opens a server-side batch. Closing the batch sends any remaining objects and waits for the server to report the results, so read `batch.numberOfErrors()` afterwards for the number of objects that failed. +`batch.start()` opens a server-side batch. Closing the batch sends any remaining objects and waits for the server to report the results. Read `batch.numberOfErrors()` after the batch closes; before then, the tally is incomplete. @@ -69,7 +69,7 @@ Every import returns a result that reports whether any objects failed. Check it language="csharp" /> -`Batch.InsertMany()` returns a `BatchInsertResponse`. Read `HasErrors` for a quick check, and `Objects` for one entry per object, each carrying the `Error` that failed it. +`Batch.InsertMany()` returns a `BatchInsertResponse`. Read `HasErrors` for a quick check, `Errors` for the failures alone, and `Objects` for one entry per object. Each entry's `Index` is its position in the input, and failed entries carry an `Error`. diff --git a/_includes/code/quickstart/quickstart.import_objects.mdx b/_includes/code/quickstart/quickstart.import_objects.mdx index 4aee756d0..5ca38bfca 100644 --- a/_includes/code/quickstart/quickstart.import_objects.mdx +++ b/_includes/code/quickstart/quickstart.import_objects.mdx @@ -8,7 +8,7 @@ import JavaV6Code from "!!raw-loader!/_includes/code/java-v6/src/test/java/Quick import CSharpCode from "!!raw-loader!/_includes/code/csharp/QuickstartTest.cs"; -Every import returns a result that reports whether any objects failed. Check it in your own code to catch problems such as malformed data or a misconfigured model provider. +Every import reports whether any objects failed. Check for failures in your own code to catch problems such as malformed data or a misconfigured model provider. @@ -21,7 +21,6 @@ Every import returns a result that reports whether any objects failed. Check it title="quickstart_import.py" /> - `data.ingest()` returns a `BatchObjectReturn`. Read `result.errors` to check for failures. It holds one entry per failed object, keyed by its position in the input. For more, see [error handling in the Python client reference](/weaviate/client-libraries/python/notes-best-practices#error-handling). @@ -58,7 +57,7 @@ Every import returns a result that reports whether any objects failed. Check it language="java" /> -`batch.start()` opens a server-side batch. Closing the batch sends any remaining objects and waits for the server to report the results, so read `batch.numberOfErrors()` afterwards for the number of objects that failed. +`batch.start()` opens a server-side batch. Closing the batch sends any remaining objects and waits for the server to report the results. Read `batch.numberOfErrors()` after the batch closes; before then, the tally is incomplete. @@ -70,7 +69,7 @@ Every import returns a result that reports whether any objects failed. Check it language="csharp" /> -`Batch.InsertMany()` returns a `BatchInsertResponse`. Read `HasErrors` for a quick check, and `Objects` for one entry per object, each carrying the `Error` that failed it. +`Batch.InsertMany()` returns a `BatchInsertResponse`. Read `HasErrors` for a quick check, `Errors` for the failures alone, and `Objects` for one entry per object. Each entry's `Index` is its position in the input, and failed entries carry an `Error`. From 9436d6b84d09de595ecf7440db1f90ffa1a4c4fd Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Thu, 30 Jul 2026 11:05:37 +0200 Subject: [PATCH 25/84] docs(quickstart): merge the two `errors` comments in the Python import Both comments described the same dictionary. Replace them with a single line above the check that says what `errors` holds and how it is keyed, matching the prose under the snippet. --- _includes/code/python/local.quickstart.import_objects.py | 3 +-- _includes/code/python/quickstart.import_objects.py | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/_includes/code/python/local.quickstart.import_objects.py b/_includes/code/python/local.quickstart.import_objects.py index 2ed338e86..d46b4dd1c 100644 --- a/_includes/code/python/local.quickstart.import_objects.py +++ b/_includes/code/python/local.quickstart.import_objects.py @@ -24,10 +24,9 @@ ) # highlight-end -# `errors` is the reliable failure check for `ingest` +# `errors` holds one entry per failed object, keyed by its position in the input if result.errors: print(f"Number of failed imports: {len(result.errors)}") - # `errors` is keyed by the position of the object in the input for index, error in result.errors.items(): print(f"Failed object at index {index}: {error.message}") diff --git a/_includes/code/python/quickstart.import_objects.py b/_includes/code/python/quickstart.import_objects.py index 19055127e..0f4041af9 100644 --- a/_includes/code/python/quickstart.import_objects.py +++ b/_includes/code/python/quickstart.import_objects.py @@ -32,10 +32,9 @@ ) # highlight-end -# `errors` is the reliable failure check for `ingest` +# `errors` holds one entry per failed object, keyed by its position in the input if result.errors: print(f"Number of failed imports: {len(result.errors)}") - # `errors` is keyed by the position of the object in the input for index, error in result.errors.items(): print(f"Failed object at index {index}: {error.message}") From 1f923c03879f3f9da59c61569275e74607781b14 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Thu, 30 Jul 2026 11:06:58 +0200 Subject: [PATCH 26/84] docs: point to result.errors as the ingest failure check The ingest() path reports failures through its return value rather than a batching context, so name result.errors as the check to use. --- docs/weaviate/client-libraries/python/notes-best-practices.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/weaviate/client-libraries/python/notes-best-practices.mdx b/docs/weaviate/client-libraries/python/notes-best-practices.mdx index f3215cb43..e70a2a025 100644 --- a/docs/weaviate/client-libraries/python/notes-best-practices.mdx +++ b/docs/weaviate/client-libraries/python/notes-best-practices.mdx @@ -275,7 +275,7 @@ Note that these lists are reset when a batching process is initialized. So make language="py" /> -`collection.data.ingest()` does not use a batching context, so it reports failures through its return value instead. The `BatchObjectReturn` object that it returns exposes `result.has_errors` as a summary flag, and `result.errors` as a dictionary keyed by the position of each failed object in the input. Check `result.errors` directly, because it holds an entry for every failed object. The [one-shot ingest](#one-shot-ingest) example above shows this pattern. +`collection.data.ingest()` does not use a batching context, so it reports failures through its return value instead. Check `result.errors`, a dictionary that holds one entry per failed object, keyed by the position of the object in the input. The [one-shot ingest](#one-shot-ingest) example above shows this pattern. ### Batch vectorization From 5d96a1d97ada93e371c7e17bdd7d3a628470b0a0 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Thu, 30 Jul 2026 14:11:47 +0200 Subject: [PATCH 27/84] Remove default region --- docs/weaviate/model-providers/google/embeddings.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/weaviate/model-providers/google/embeddings.md b/docs/weaviate/model-providers/google/embeddings.md index 1b84e150a..be5cb647e 100644 --- a/docs/weaviate/model-providers/google/embeddings.md +++ b/docs/weaviate/model-providers/google/embeddings.md @@ -234,7 +234,7 @@ The following examples show how to configure Google-specific options. **Vertex AI parameters:** - `projectId` (Required): Your Google Cloud project ID, e.g. `cloud-large-language-models` -- `location` (Optional): The Google Cloud region to send requests to, e.g. `europe-west1`. Defaults to `us-central1`. +- `location` (Optional): The Google Cloud region to send requests to, e.g. `europe-west1`. - `apiEndpoint` (Optional): Regional endpoint, e.g. `us-central1-aiplatform.googleapis.com` - `modelId` (Optional): e.g. `gemini-embedding-001`, `text-embedding-005` From 557dfb27280479d80c44ea31499facb4092036a4 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Thu, 30 Jul 2026 14:49:34 +0200 Subject: [PATCH 28/84] docs(backups): move chunking into Technical Considerations, add BACKUP_MAX_INDIVIDUAL_FILES Chunking runs on every backup, not only incremental ones, so the block no longer belongs under Incremental Backups > How it works. Move it to a new Technical Considerations > Chunking and file splitting section, modelled on Skip the storage access check. - Document BACKUP_MAX_INDIVIDUAL_FILES (default 100, added in v1.37.14 and v1.38.7, absent from 1.36) and note it is runtime-configurable via the backup_max_individual_files override key, unlike the three size variables which are startup-only. - Reframe BACKUP_MIN_CHUNK_SIZE as a floor: lowering it has no effect once at least BACKUP_MAX_INDIVIDUAL_FILES files already exceed it. - Record that chunks carrying a split-file part are not topped up, so large-file backups produce chunks smaller than BACKUP_CHUNK_TARGET_SIZE. - Note that unlimited/nolimit are accepted, which is how splitting is disabled. - Note that an incremental backup shrinks the individual-file budget by the number of files reused from the base, so it spans a backup chain. - Repoint the deprecated ChunkSize row at the new section anchor. - Add backup_max_individual_files to the runtime overrides table. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01VLMB1FhdGFGcdg63uVHxNY --- docs/deploy/configuration/backups.md | 55 +++++++++++-------- .../configuration/env-vars/runtime-config.md | 1 + 2 files changed, 34 insertions(+), 22 deletions(-) diff --git a/docs/deploy/configuration/backups.md b/docs/deploy/configuration/backups.md index 5b9eddd9f..18161a1df 100644 --- a/docs/deploy/configuration/backups.md +++ b/docs/deploy/configuration/backups.md @@ -316,7 +316,7 @@ The `*` character matches any sequence of characters. For example, `Article*` ma | name | type | required | default | description | | ---- | ---- | ---- | ---- |---- | | `CPUPercentage` | number | no | `50%` | An optional integer to set the desired CPU core utilization ranging from 1%-80%. | -| `ChunkSize` | number | no | - | **Deprecated. This option has no effect.** Weaviate ignores any value sent here, so it neither sets nor caps the chunk size. Chunk sizing is now controlled by the [`BACKUP_CHUNK_TARGET_SIZE`](#how-it-works) environment variable, which replaced it. | +| `ChunkSize` | number | no | - | **Deprecated. This option has no effect.** Weaviate ignores any value sent here, so it neither sets nor caps the chunk size. Chunk sizing is now controlled by the [`BACKUP_CHUNK_TARGET_SIZE`](#chunking-and-file-splitting) environment variable, which replaced it. | | `CompressionLevel`| string | no | `DefaultCompression` | An optional [compression level](#compression-levels) to be used. | | `Path` | string | no | `""` | An optional string to manually set the backup location. If not provided, the backup will be stored in the default location. Introduced in Weaviate `v1.27.2`. | | `incremental_base_backup_id` | string | no | `None` | The ID of a previous backup to use as the base for an [incremental backup](#incremental-backups). Files unchanged since the base backup are stored as references rather than copied. Introduced in Weaviate `v1.37`. | @@ -468,27 +468,7 @@ This can result in dramatically smaller backups and much faster backup times. When creating a backup, Weaviate splits large files into individual chunks. During an incremental backup, Weaviate compares each file against the base backup. Files that haven't changed are stored as pointers to the base backup rather than being copied again. On restore, Weaviate automatically fetches the referenced files from the base backup. -Only files that are large enough to get a chunk of their own can be referenced individually. Smaller files are packed together into shared chunks, so a change to any one of them means the whole chunk is written again. Three environment variables control the packing: `BACKUP_MIN_CHUNK_SIZE` sets which files count as large, `BACKUP_CHUNK_TARGET_SIZE` sets how much data is packed into one shared chunk, and `BACKUP_SPLIT_FILE_SIZE` sets when a single very large file is spread across several chunks. - -Lowering `BACKUP_MIN_CHUNK_SIZE` allows more files to be referenced individually, at the cost of more chunks per backup. - -The following environment variables control chunking. All three accept a plain number of bytes or a number with a unit suffix (`B`, `KB`, `MB`, `GB`, `TB`, `KiB`, `MiB`, `GiB`, `TiB`), for example `4MiB`, and all three are applied at startup, so a restart is required to change them. - -| Environment variable | Required | Description | -| --- | --- | --- | -| `BACKUP_MIN_CHUNK_SIZE` | no | The minimum size a file must reach before it is stored in its own chunk and can be referenced individually by a later incremental backup. Defaults to `1MiB`. | -| `BACKUP_CHUNK_TARGET_SIZE` | no | The size Weaviate aims for when packing several small files into a single chunk. Defaults to `10MiB`. | -| `BACKUP_SPLIT_FILE_SIZE` | no | The size above which a single file is split across multiple chunks instead of being written to one. Defaults to `50GiB`. | - -:::note Minimum values are raised automatically - -These three settings are lower bounds, not exact values, and Weaviate raises them when a smaller value would have no useful effect: - -- The threshold for treating a file as large is the larger of `BACKUP_MIN_CHUNK_SIZE` and the size of the 100th largest file in the shard, so roughly the 100 largest files in a shard can get their own chunk, and lowering `BACKUP_MIN_CHUNK_SIZE` below that point has no further effect. -- `BACKUP_CHUNK_TARGET_SIZE` is raised to that threshold if you set it lower, since a chunk that packs small files must still be able to hold one large file. -- `BACKUP_SPLIT_FILE_SIZE` is likewise raised to that threshold if you set it lower; otherwise no file would ever be large enough to split. - -::: +Only files that are large enough to get a chunk of their own can be referenced individually. Smaller files are packed together into shared chunks, so a change to any one of them means the whole chunk is written again. How Weaviate decides which files get their own chunk, and the environment variables that control it, are described in [Chunking and file splitting](#chunking-and-file-splitting). #### Create a full (base) backup @@ -800,6 +780,37 @@ The backup API is built in a way that no long-running network requests are requi If you would like your application to wait for the background backup process to complete, you can use the "wait for completion" feature that is present in all language clients. The clients will poll the status endpoint in the background and block until the status is either `SUCCESS` or `FAILED`. This makes it easy to write simple synchronous backup scripts, even with the async nature of the API. +### Chunking and file splitting + +Weaviate does not upload a shard's files one by one. It packs them into chunks, and the way files are grouped into chunks determines how much of a backup a later [incremental backup](#incremental-backups) can reuse. Chunking runs on every backup, not only on incremental ones. + +Weaviate gives each of a shard's biggest files a chunk of its own, and only a file that gets its own chunk can be referenced individually by a later incremental backup. All remaining files are packed together into shared chunks, so changing any one of them means the whole chunk is written again. A file above the split threshold is spread across several chunks instead of being written into one. + +The size a file must reach to get its own chunk is the larger of `BACKUP_MIN_CHUNK_SIZE` and the size of the Nth largest file in the shard, where N is `BACKUP_MAX_INDIVIDUAL_FILES`. `BACKUP_MIN_CHUNK_SIZE` is therefore a floor on that size rather than a dial. Lowering it never reduces how many files get their own chunk, but it only increases that number while the shard holds fewer than `BACKUP_MAX_INDIVIDUAL_FILES` files above its current value. At the defaults, a shard with 100 or more files of at least `1MiB` is unaffected by a lower `BACKUP_MIN_CHUNK_SIZE`, because the size of the 100th largest file wins the comparison. To have more files referenced individually in that case, raise `BACKUP_MAX_INDIVIDUAL_FILES` instead, at the cost of more chunks per backup. + +A chunk that carries part of a split file holds nothing else, because Weaviate deliberately leaves the rest of that chunk empty rather than mixing split parts with regular files. Backups dominated by very large files therefore produce chunks noticeably smaller than `BACKUP_CHUNK_TARGET_SIZE`. + +The three size variables below accept a plain number of bytes or a number with a unit suffix (`B`, `KB`, `MB`, `GB`, `TB`, `KiB`, `MiB`, `GiB`, `TiB`), for example `4MiB`. The decimal and binary suffixes are distinct: `MB` is 1,000,000 bytes while `MiB` is 1,048,576 bytes. They also accept `unlimited` or `nolimit`, which is how you disable file splitting through `BACKUP_SPLIT_FILE_SIZE`. All three are read at startup, so a restart is required to change them. `BACKUP_MAX_INDIVIDUAL_FILES` is a plain count instead of a size, and it is read for each backup, so it can also be changed without a restart. + +| Environment variable | Required | Description | +| --- | --- | --- | +| `BACKUP_MIN_CHUNK_SIZE` | no | The floor on the size a file must reach before it is stored in its own chunk and can be referenced individually by a later incremental backup. Defaults to `1MiB`. | +| `BACKUP_CHUNK_TARGET_SIZE` | no | The size Weaviate aims for when packing several smaller files into a single chunk. Defaults to `10MiB`. | +| `BACKUP_SPLIT_FILE_SIZE` | no | The size above which a single file is split across multiple chunks instead of being written to one. Set it to `unlimited` to disable splitting. Defaults to `50GiB`. | +| `BACKUP_MAX_INDIVIDUAL_FILES` | no | How many of a shard's biggest files are targeted to get their own chunk, and can therefore be referenced individually by a later incremental backup. A count rather than a size, and it must be greater than `0`. Defaults to `100`. Also settable without a restart through the `backup_max_individual_files` [runtime configuration](./env-vars/runtime-config.md) key.

Added in `v1.37.14` and `v1.38.7`. Not available in `v1.36`. | + +:::note Values are raised automatically + +These settings are lower bounds, not exact values, and Weaviate raises them when a smaller value would have no useful effect: + +- `BACKUP_CHUNK_TARGET_SIZE` is raised to the size that qualifies a file for its own chunk if you set it lower, since a chunk that packs smaller files must still be able to hold one big file. +- `BACKUP_SPLIT_FILE_SIZE` is likewise raised to that size if you set it lower; otherwise no file would ever be big enough to split. +- If a shard holds fewer files than `BACKUP_MAX_INDIVIDUAL_FILES`, the qualifying size falls back to the size of the shard's smallest file, still raised to `BACKUP_MIN_CHUNK_SIZE` if that is larger. + +::: + +On an incremental backup, the `BACKUP_MAX_INDIVIDUAL_FILES` budget is reduced by the number of files that are reused from the base backup, so it is shared across a whole backup chain rather than being renewed for each backup in it. + ### Skip the storage access check When a cloud backup backend (`backup-s3`, `backup-gcs`, or `backup-azure`) initializes, Weaviate verifies that the configured credentials can write to and delete from the target bucket. It does this by writing a temporary `access-check` object and then removing it. This probe fails on immutable (write-once / WORM) buckets, or with least-privilege credentials that are not permitted to delete objects. diff --git a/docs/deploy/configuration/env-vars/runtime-config.md b/docs/deploy/configuration/env-vars/runtime-config.md index 137ead48b..a44ea2c8b 100644 --- a/docs/deploy/configuration/env-vars/runtime-config.md +++ b/docs/deploy/configuration/env-vars/runtime-config.md @@ -61,6 +61,7 @@ The following overrides are currently supported: | `async_replication_hashtree_init_concurrency` | `ASYNC_REPLICATION_HASHTREE_INIT_CONCURRENCY`| | `async_replication_cluster_max_workers` _(removed in `v1.38`)_ | `ASYNC_REPLICATION_CLUSTER_MAX_WORKERS` _(removed in `v1.38`)_ | | `autoschema_enabled` | `AUTOSCHEMA_ENABLED` | +| `backup_max_individual_files` | `BACKUP_MAX_INDIVIDUAL_FILES` | | `debug_endpoints_enabled` | `DEBUG_ENDPOINTS_ENABLED` | | `default_quantization` | `DEFAULT_QUANTIZATION` | | `default_sharding_count` | `DEFAULT_SHARDING_COUNT` | From 04b56ae5b429ba4ff8d5d911216888bc90778cc7 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Thu, 30 Jul 2026 15:54:21 +0200 Subject: [PATCH 29/84] docs(backups): fix split-chunk size claim, apply editor and verifier feedback Correct one factual error and apply the review gates' required changes to the Chunking and file splitting section. - Split-file chunks: their size derives from BACKUP_SPLIT_FILE_SIZE, not from BACKUP_CHUNK_TARGET_SIZE. Each part is larger than half the split size and no larger than it, so at the defaults these chunks are far larger than the target, not smaller as previously stated. - Shared chunks are re-uploaded on every incremental backup regardless of whether their contents changed, because only single big-file chunks can be skipped. - Note that getting an own chunk is necessary but not sufficient for reuse: Weaviate only reuses files it treats as immutable. - Standardize on "qualifying size" for the size threshold, name BACKUP_SPLIT_FILE_SIZE where the split threshold is described, and split the floor-vs-dial paragraph so the definition stands on its own. - State that BACKUP_MAX_INDIVIDUAL_FILES is changed without a restart through the backup_max_individual_files runtime configuration key. - Move the backup-chain budget paragraph above the admonition so the section ends on it, and note that the shard-file-count fallback compares against the reduced budget on an incremental backup. - Link shard on first mention, retitle the admonition to cover the fallback bullet, drop the negative version marker, and rewrite the How it works remnant so it no longer conflicts with or duplicates the new section. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01VLMB1FhdGFGcdg63uVHxNY --- docs/deploy/configuration/backups.md | 30 +++++++++++++++------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/docs/deploy/configuration/backups.md b/docs/deploy/configuration/backups.md index 18161a1df..c85ec2b5f 100644 --- a/docs/deploy/configuration/backups.md +++ b/docs/deploy/configuration/backups.md @@ -466,9 +466,9 @@ This can result in dramatically smaller backups and much faster backup times. #### How it works -When creating a backup, Weaviate splits large files into individual chunks. During an incremental backup, Weaviate compares each file against the base backup. Files that haven't changed are stored as pointers to the base backup rather than being copied again. On restore, Weaviate automatically fetches the referenced files from the base backup. +When creating a backup, Weaviate packs a shard's files into chunks. During an incremental backup, Weaviate compares each file against the base backup. Files that haven't changed are stored as pointers to the base backup rather than being copied again. On restore, Weaviate automatically fetches the referenced files from the base backup. -Only files that are large enough to get a chunk of their own can be referenced individually. Smaller files are packed together into shared chunks, so a change to any one of them means the whole chunk is written again. How Weaviate decides which files get their own chunk, and the environment variables that control it, are described in [Chunking and file splitting](#chunking-and-file-splitting). +Only a file large enough to get a chunk of its own can be referenced individually, so the way Weaviate groups files into chunks determines how much an incremental backup can reuse. For how Weaviate decides which files get their own chunk, and the environment variables that control chunking, see [Chunking and file splitting](#chunking-and-file-splitting). #### Create a full (base) backup @@ -782,35 +782,37 @@ If you would like your application to wait for the background backup process to ### Chunking and file splitting -Weaviate does not upload a shard's files one by one. It packs them into chunks, and the way files are grouped into chunks determines how much of a backup a later [incremental backup](#incremental-backups) can reuse. Chunking runs on every backup, not only on incremental ones. +Weaviate does not upload a [shard's](/weaviate/concepts/storage.md#logical-storage-units-indexes-shards-stores) files one by one. It packs them into chunks, and the way files are grouped into chunks determines how much of that backup a later [incremental backup](#incremental-backups) can reuse. Chunking runs on every backup, not only on incremental ones. -Weaviate gives each of a shard's biggest files a chunk of its own, and only a file that gets its own chunk can be referenced individually by a later incremental backup. All remaining files are packed together into shared chunks, so changing any one of them means the whole chunk is written again. A file above the split threshold is spread across several chunks instead of being written into one. +Weaviate gives each of a shard's biggest files a chunk of its own, and only a file that gets its own chunk can be referenced individually by a later incremental backup. A chunk of its own is a requirement rather than a guarantee, because Weaviate only reuses files that it treats as immutable, so a large file that it keeps rewriting is uploaded again with every backup. All remaining files are packed together into shared chunks, and a shared chunk is uploaded again on every incremental backup whether or not anything in it changed, because only a chunk that holds a single big file can be skipped. A file larger than `BACKUP_SPLIT_FILE_SIZE` is spread across several chunks instead of being written into one. -The size a file must reach to get its own chunk is the larger of `BACKUP_MIN_CHUNK_SIZE` and the size of the Nth largest file in the shard, where N is `BACKUP_MAX_INDIVIDUAL_FILES`. `BACKUP_MIN_CHUNK_SIZE` is therefore a floor on that size rather than a dial. Lowering it never reduces how many files get their own chunk, but it only increases that number while the shard holds fewer than `BACKUP_MAX_INDIVIDUAL_FILES` files above its current value. At the defaults, a shard with 100 or more files of at least `1MiB` is unaffected by a lower `BACKUP_MIN_CHUNK_SIZE`, because the size of the 100th largest file wins the comparison. To have more files referenced individually in that case, raise `BACKUP_MAX_INDIVIDUAL_FILES` instead, at the cost of more chunks per backup. +A file gets its own chunk once it reaches the qualifying size: the larger of `BACKUP_MIN_CHUNK_SIZE` and the size of the Nth largest file in the shard, where N is `BACKUP_MAX_INDIVIDUAL_FILES`. -A chunk that carries part of a split file holds nothing else, because Weaviate deliberately leaves the rest of that chunk empty rather than mixing split parts with regular files. Backups dominated by very large files therefore produce chunks noticeably smaller than `BACKUP_CHUNK_TARGET_SIZE`. +Because the larger of the two wins, `BACKUP_MIN_CHUNK_SIZE` is a floor on the qualifying size rather than a dial for it. Lowering it never reduces how many files get their own chunk, and it only increases that number while the shard holds fewer than `BACKUP_MAX_INDIVIDUAL_FILES` files above its current value. At the defaults, a shard with 100 or more files of at least `1MiB` is unaffected by a lower `BACKUP_MIN_CHUNK_SIZE`, because the size of the 100th largest file wins the comparison. To have more files referenced individually in that case, raise `BACKUP_MAX_INDIVIDUAL_FILES` instead, at the cost of more chunks per backup. -The three size variables below accept a plain number of bytes or a number with a unit suffix (`B`, `KB`, `MB`, `GB`, `TB`, `KiB`, `MiB`, `GiB`, `TiB`), for example `4MiB`. The decimal and binary suffixes are distinct: `MB` is 1,000,000 bytes while `MiB` is 1,048,576 bytes. They also accept `unlimited` or `nolimit`, which is how you disable file splitting through `BACKUP_SPLIT_FILE_SIZE`. All three are read at startup, so a restart is required to change them. `BACKUP_MAX_INDIVIDUAL_FILES` is a plain count instead of a size, and it is read for each backup, so it can also be changed without a restart. +On an incremental backup, the `BACKUP_MAX_INDIVIDUAL_FILES` budget is reduced by the number of files that are reused from the base backup, so it is shared across a whole backup chain rather than being renewed for each backup in it. + +A chunk that carries part of a split file holds nothing else, because Weaviate deliberately leaves the rest of that chunk empty rather than mixing split parts with regular files. The size of such a chunk is governed by `BACKUP_SPLIT_FILE_SIZE` rather than by `BACKUP_CHUNK_TARGET_SIZE`: Weaviate divides the file into equal parts that are each larger than half of the split size and no larger than the split size, so at the defaults these chunks are far larger than the target, not smaller. + +The three size variables below accept a plain number of bytes or a number with a unit suffix (`B`, `KB`, `MB`, `GB`, `TB`, `KiB`, `MiB`, `GiB`, `TiB`), for example `4MiB`. The decimal and binary suffixes are distinct: `MB` is 1,000,000 bytes while `MiB` is 1,048,576 bytes. They also accept `unlimited` or `nolimit`, which is how you disable file splitting through `BACKUP_SPLIT_FILE_SIZE`. All three are read at startup, so a restart is required to change them. `BACKUP_MAX_INDIVIDUAL_FILES` is a plain count instead of a size, and Weaviate reads it for each backup, so you can change it without a restart through the `backup_max_individual_files` [runtime configuration](./env-vars/runtime-config.md) key. | Environment variable | Required | Description | | --- | --- | --- | -| `BACKUP_MIN_CHUNK_SIZE` | no | The floor on the size a file must reach before it is stored in its own chunk and can be referenced individually by a later incremental backup. Defaults to `1MiB`. | +| `BACKUP_MIN_CHUNK_SIZE` | no | The floor on the qualifying size a file must reach before it is stored in its own chunk and becomes eligible to be referenced individually by a later incremental backup. Defaults to `1MiB`. | | `BACKUP_CHUNK_TARGET_SIZE` | no | The size Weaviate aims for when packing several smaller files into a single chunk. Defaults to `10MiB`. | | `BACKUP_SPLIT_FILE_SIZE` | no | The size above which a single file is split across multiple chunks instead of being written to one. Set it to `unlimited` to disable splitting. Defaults to `50GiB`. | -| `BACKUP_MAX_INDIVIDUAL_FILES` | no | How many of a shard's biggest files are targeted to get their own chunk, and can therefore be referenced individually by a later incremental backup. A count rather than a size, and it must be greater than `0`. Defaults to `100`. Also settable without a restart through the `backup_max_individual_files` [runtime configuration](./env-vars/runtime-config.md) key.

Added in `v1.37.14` and `v1.38.7`. Not available in `v1.36`. | +| `BACKUP_MAX_INDIVIDUAL_FILES` | no | How many of a shard's biggest files Weaviate aims to give a chunk of their own, and therefore how many become eligible to be referenced individually by a later incremental backup. This is a count rather than a size, and it must be greater than `0`. Defaults to `100`. Also settable without a restart through the `backup_max_individual_files` [runtime configuration](./env-vars/runtime-config.md) key.

Added in `v1.37.14` and `v1.38.7`. | -:::note Values are raised automatically +:::note How Weaviate adjusts these values These settings are lower bounds, not exact values, and Weaviate raises them when a smaller value would have no useful effect: -- `BACKUP_CHUNK_TARGET_SIZE` is raised to the size that qualifies a file for its own chunk if you set it lower, since a chunk that packs smaller files must still be able to hold one big file. +- `BACKUP_CHUNK_TARGET_SIZE` is raised to the qualifying size if you set it lower, since a chunk that packs smaller files must still be able to hold one big file. - `BACKUP_SPLIT_FILE_SIZE` is likewise raised to that size if you set it lower; otherwise no file would ever be big enough to split. -- If a shard holds fewer files than `BACKUP_MAX_INDIVIDUAL_FILES`, the qualifying size falls back to the size of the shard's smallest file, still raised to `BACKUP_MIN_CHUNK_SIZE` if that is larger. +- If a shard holds fewer files than `BACKUP_MAX_INDIVIDUAL_FILES`, or than the reduced budget on an incremental backup, the qualifying size falls back to the size of the shard's smallest file, still raised to `BACKUP_MIN_CHUNK_SIZE` if that is larger. ::: -On an incremental backup, the `BACKUP_MAX_INDIVIDUAL_FILES` budget is reduced by the number of files that are reused from the base backup, so it is shared across a whole backup chain rather than being renewed for each backup in it. - ### Skip the storage access check When a cloud backup backend (`backup-s3`, `backup-gcs`, or `backup-azure`) initializes, Weaviate verifies that the configured credentials can write to and delete from the target bucket. It does this by writing a temporary `access-check` object and then removing it. This probe fails on immutable (write-once / WORM) buckets, or with least-privilege credentials that are not permitted to delete objects. From dc0e3204df4965373ff0e31da663adc07246771d Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Thu, 30 Jul 2026 16:08:19 +0200 Subject: [PATCH 30/84] docs(backups): tighten the split-part size bounds The lower bound on a split part was stated with a strict inequality. Because the part count is a ceiling division and the final part carries only the remainder, the last part can land on exactly half of the split size: a file of split size plus one byte splits into two parts of 26843545601 and 26843545600 bytes, the second being exactly 25GiB at the default 50GiB split. Say "at least half of the split size" instead of "larger than half", and soften "equal parts" to "roughly equal", since parts can differ by up to one byte per part. The upper bound and the paragraph's conclusion are unchanged. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01VLMB1FhdGFGcdg63uVHxNY --- docs/deploy/configuration/backups.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/deploy/configuration/backups.md b/docs/deploy/configuration/backups.md index c85ec2b5f..bbb001fca 100644 --- a/docs/deploy/configuration/backups.md +++ b/docs/deploy/configuration/backups.md @@ -792,7 +792,7 @@ Because the larger of the two wins, `BACKUP_MIN_CHUNK_SIZE` is a floor on the qu On an incremental backup, the `BACKUP_MAX_INDIVIDUAL_FILES` budget is reduced by the number of files that are reused from the base backup, so it is shared across a whole backup chain rather than being renewed for each backup in it. -A chunk that carries part of a split file holds nothing else, because Weaviate deliberately leaves the rest of that chunk empty rather than mixing split parts with regular files. The size of such a chunk is governed by `BACKUP_SPLIT_FILE_SIZE` rather than by `BACKUP_CHUNK_TARGET_SIZE`: Weaviate divides the file into equal parts that are each larger than half of the split size and no larger than the split size, so at the defaults these chunks are far larger than the target, not smaller. +A chunk that carries part of a split file holds nothing else, because Weaviate deliberately leaves the rest of that chunk empty rather than mixing split parts with regular files. The size of such a chunk is governed by `BACKUP_SPLIT_FILE_SIZE` rather than by `BACKUP_CHUNK_TARGET_SIZE`: Weaviate divides the file into roughly equal parts that are each at least half of the split size and no larger than the split size, so at the defaults these chunks are far larger than the target, not smaller. The three size variables below accept a plain number of bytes or a number with a unit suffix (`B`, `KB`, `MB`, `GB`, `TB`, `KiB`, `MiB`, `GiB`, `TiB`), for example `4MiB`. The decimal and binary suffixes are distinct: `MB` is 1,000,000 bytes while `MiB` is 1,048,576 bytes. They also accept `unlimited` or `nolimit`, which is how you disable file splitting through `BACKUP_SPLIT_FILE_SIZE`. All three are read at startup, so a restart is required to change them. `BACKUP_MAX_INDIVIDUAL_FILES` is a plain count instead of a size, and Weaviate reads it for each backup, so you can change it without a restart through the `backup_max_individual_files` [runtime configuration](./env-vars/runtime-config.md) key. From 25d4edeadc76352b62811f799a498d36d8334b7f Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Thu, 30 Jul 2026 17:40:25 +0200 Subject: [PATCH 31/84] Exempt hidden analytics beacons from the alt-text check The indexability suite already exempted the analytics beacon by hostname ("static.scarf.sh"). That predicate went stale when the pixel moved to our own CNAME (pixel.weaviate.cloud), so test_images_have_alt_text started failing on /weaviate/concepts/data-import, /cloud/quickstart and /cloud/manage-clusters/create. Repair the exemption structurally instead of by hostname: skip images hidden from both rendering and the accessibility tree (inline display:none or visibility:hidden, aria-hidden="true") and 1x1 tracking pixels. Alt text is meaningless on an image no reader, screen reader or crawler can reach, and the rule survives the next domain move. The scarf.sh case is kept. Content images missing alt text are still caught. Also mark the beacon itself as decorative in scarf.js with alt="" and aria-hidden="true", which is the correct markup for a hidden pixel. --- src/scripts/scarf.js | 5 +++++ tests/test_docs_indexability.py | 35 ++++++++++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/scripts/scarf.js b/src/scripts/scarf.js index 6e0d0384a..af63b2938 100644 --- a/src/scripts/scarf.js +++ b/src/scripts/scarf.js @@ -5,6 +5,11 @@ const scarfScript = { src: "https://pixel.weaviate.cloud/a.png?x-pxid=a41b0758-a3a9-4874-a880-8b5d5a363d40", referrerPolicy: "no-referrer-when-downgrade", style: "display: none;", + // Decorative, hidden analytics beacon: empty alt plus aria-hidden keeps it + // out of the accessibility tree instead of leaving assistive technology to + // announce an image with no alt attribute. + alt: "", + "aria-hidden": "true", }, }; diff --git a/tests/test_docs_indexability.py b/tests/test_docs_indexability.py index 56b3af6cd..63afde1b7 100644 --- a/tests/test_docs_indexability.py +++ b/tests/test_docs_indexability.py @@ -251,7 +251,17 @@ def _is_decorative_image(img) -> bool: # Skip language/site logo SVGs (e.g., /img/site/logo-py.svg) if src.endswith(".svg") and "/img/site/" in src: return True - # Skip analytics tracking pixels (e.g., Scarf) + # Skip images that carry no content by construction: analytics beacons, + # spacers, and anything hidden from both rendering and the accessibility + # tree. Such an image conveys nothing to a reader, a screen reader, or a + # crawler, so requiring alt text on it is meaningless. This is matched + # structurally rather than by hostname on purpose: the previous + # "static.scarf.sh" check went stale the moment the beacon moved to our own + # CNAME, and any hostname list will go stale again on the next move. + if _is_hidden_non_content(img): + return True + # Retained for the Scarf-hosted pixel, in case it is ever embedded without + # the hidden styling that the structural check above relies on. if "static.scarf.sh" in src: return True # Skip very small images (likely icons) @@ -262,6 +272,29 @@ def _is_decorative_image(img) -> bool: return False +def _is_hidden_non_content(img) -> bool: + """Check if an image is hidden from users and from the accessibility tree. + + Covers the ways a non-content image announces itself: + - inline `display: none` / `visibility: hidden` (removed from the render + tree, and therefore from the accessibility tree) + - `aria-hidden="true"` (explicitly withheld from assistive technology) + - 1x1 dimensions (a tracking pixel or a spacer) + """ + style = (img.get("style") or "").lower().replace(" ", "") + if "display:none" in style or "visibility:hidden" in style: + return True + + if str(img.get("aria-hidden", "")).lower() == "true": + return True + + dims = (img.get("width"), img.get("height")) + if all(d is not None and str(d).strip().isdigit() and int(d) <= 1 for d in dims): + return True + + return False + + @pytest.mark.indexability @pytest.mark.parametrize("path", ALL_PATHS) def test_llm_notice_present(path): From c1d1e0f30b31c5e116512822b0b1f7b922d9ca03 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Fri, 31 Jul 2026 12:56:34 +0200 Subject: [PATCH 32/84] Wait for the geo write to land before the filter example queries The FilterByGeolocation block deletes a collection, recreates it, inserts one object and immediately queries it with a geo filter. That was safe while the block ran against a local instance, but it now runs against the shared remote cluster, where the object is not always visible the moment insert returns. The query then matched nothing and `assert len(response.objects) == 1` failed. The expected count of 1 is correct: the object sits 403 m from the query centre and the radius is 1000 m. Verified against a local instance (match cut-off falls between 400 m and 405 m) and against the CI run of 2026-07-18, which passed and printed exactly that one object. Add a bounded readiness wait to the test scaffolding, above the START marker so the rendered example is unchanged, and keep the assertion exact. --- _includes/code/howto/search.filters.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/_includes/code/howto/search.filters.py b/_includes/code/howto/search.filters.py index 10e924e2c..f18a6581b 100644 --- a/_includes/code/howto/search.filters.py +++ b/_includes/code/howto/search.filters.py @@ -573,6 +573,24 @@ }, ) +# Test scaffolding below; not rendered in the docs. +# This block used to run against a local instance, where a write is queryable +# the moment `insert` returns. It now runs against a remote cluster, where it is +# not, so the example could query the collection before the object was visible +# and get back nothing. Wait (bounded) for the write to land, so the assertion +# tests the geo filter and not write visibility. The assertion stays exact. +import time +from weaviate.classes.query import Filter, GeoCoordinate + +readiness_filter = Filter.by_property("headquartersGeoLocation").within_geo_range( + coordinate=GeoCoordinate(latitude=52.39, longitude=4.84), + distance=1000 +) +for _ in range(30): + if len(publications.query.fetch_objects(filters=readiness_filter).objects) >= 1: + break + time.sleep(1) + # START FilterbyGeolocation from weaviate.classes.query import Filter from weaviate.classes.query import GeoCoordinate From 0392d4d8c684f9a3ebd9c8214c95e5884e5caa5f Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Fri, 31 Jul 2026 13:02:08 +0200 Subject: [PATCH 33/84] Scope the alt-text check to page content, not navbar chrome test_images_have_alt_text collected every img in the document, so on pages with no content images the only survivor was the Ask AI button logo in the navbar. The check passed on three pages by asserting on site furniture that is identical everywhere, and `len(content_images) > 0` held at exactly 1, so any navbar change would have flipped it red for no reason connected to those pages. Collect images from the main content region instead. That drops the navbar and footer without calling the Ask AI logo decorative, and it leaves the existing decorative filter untouched. Two of the labelled pages then have no content image at all and the third has only language-tab icons, so the check now skips them by name with a reason and records them in PAGES_MISSING_CONTENT_IMAGES. The label stays on the pages. Any other page labelled `images` without one fails, so a stale label cannot pass quietly. Add two pages that do carry screenshots, so the check enforces alt text on real images: 3 on the query tool page and 4 on tenant states. Verified that stripping their alt text fails the check, and that stripping alt from the Ask AI logo does not. --- tests/test_docs_indexability.py | 64 +++++++++++++++++++++++++++------ 1 file changed, 54 insertions(+), 10 deletions(-) diff --git a/tests/test_docs_indexability.py b/tests/test_docs_indexability.py index 63afde1b7..0721a74ba 100644 --- a/tests/test_docs_indexability.py +++ b/tests/test_docs_indexability.py @@ -34,12 +34,31 @@ ("/weaviate/concepts/data-import", {"images"}), ("/cloud/quickstart", {"code", "images"}), ("/cloud/manage-clusters/create", {"images"}), + ("/cloud/tools/query-tool", {"images"}), + ("/weaviate/manage-collections/tenant-states", {"images"}), ("/query-agent/recipes/query-agent-ecommerce-assistant", {"code"}), ("/weaviate/search", set()), # landing page ] ALL_PATHS = [path for path, _ in TEST_PAGES] +# Pages labelled "images" that carry no content images of their own today. +# +# The label is kept on purpose: these pages walk a reader through a UI, so they +# are the pages that most want screenshots, and the label records that intent. +# Until the screenshots exist there is nothing on the page for the alt-text +# check to assert, so it skips them by name and says so, rather than passing on +# the strength of the navbar chrome that used to leak into the check. +# +# Drop a page from this set the moment it gains a real content image; the +# alt-text check then enforces alt text on it. Any *other* page labelled +# "images" with no content images fails, so the label cannot go stale silently. +PAGES_MISSING_CONTENT_IMAGES = { + "/weaviate/concepts/data-import", + "/cloud/quickstart", + "/cloud/manage-clusters/create", +} + # --------------------------------------------------------------------------- # Fixtures # --------------------------------------------------------------------------- @@ -214,17 +233,22 @@ def test_details_content_present(path): ids=[p for p, f in TEST_PAGES if "images" in f], ) def test_images_have_alt_text(path): - """Content images have alt text (excludes SVG icons and badges).""" + """The page's own images have alt text (excludes SVG icons and badges).""" soup = _get_soup(path) - - # Find content images, excluding decorative ones - images = soup.find_all("img") - content_images = [ - img for img in images - if not _is_decorative_image(img) - ] - - assert len(content_images) > 0, f"{path}: no content images found" + content_images = _content_images(soup) + + if not content_images: + if path in PAGES_MISSING_CONTENT_IMAGES: + pytest.skip( + f"{path}: labelled 'images' but has no content image in the main " + "content region, so there is nothing here to assert on. This is a " + "content gap, tracked in PAGES_MISSING_CONTENT_IMAGES." + ) + pytest.fail( + f"{path}: labelled 'images' but has no content image in the main " + "content region. Either the page lost its images, or the 'images' " + "label in TEST_PAGES is wrong." + ) missing_alt = [ img.get("src", "unknown") @@ -236,6 +260,26 @@ def test_images_have_alt_text(path): ) +def _main_content(soup): + """The page's main content region. + + Global navbar and footer chrome lives outside it. Scoping to this region + keeps site furniture (the site logo, the Ask AI button logo) from standing + in for the page's own images: that chrome is identical on every page, so + counting it made the alt-text check assert on the layout instead of the + page, and a single navbar change could flip it. + """ + return soup.find("main") or soup.find("article") or soup + + +def _content_images(soup): + """Images that carry the page's own content.""" + return [ + img for img in _main_content(soup).find_all("img") + if not _is_decorative_image(img) + ] + + def _is_decorative_image(img) -> bool: """Check if an image is decorative (SVG icon, badge, etc.).""" src = img.get("src", "") From fe40180bb9ccce8d4ca857372ca1872afec3cc04 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Fri, 31 Jul 2026 13:02:47 +0200 Subject: [PATCH 34/84] Remove stray debug prints from the null-state filter example The Python example for filtering on a null property carried two debug prints: `print("despot. othing")` and `print("despot"+o.properties)`. Both sit inside the START/END markers, so both are published on the filters page today. The second one is not just noise, it cannot run: concatenating a str and a dict raises TypeError. It only stays quiet in CI because the query returns no objects on the test cluster, so the loop body never executes. Restore the line to the plain property print used by every sibling example. --- _includes/code/howto/search.filters.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/_includes/code/howto/search.filters.py b/_includes/code/howto/search.filters.py index f18a6581b..ec249425a 100644 --- a/_includes/code/howto/search.filters.py +++ b/_includes/code/howto/search.filters.py @@ -538,9 +538,8 @@ filters=Filter.by_property("country").is_none(True) # Find objects where the `country` property is null # highlight-end ) -print("despot. othing") for o in response.objects: - print("despot"+o.properties) # Inspect returned objects + print(o.properties) # Inspect returned objects # END FilterByPropertyNullState From c70718880ef746164e30f1bc3bea5fbc29019e70 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Sat, 1 Aug 2026 08:32:16 +0200 Subject: [PATCH 35/84] Warn at PR time when a snippet change strands an llms.txt block llms.txt is hand-maintained in weaviate-io, but its code blocks must match the START/END regions of the snippets in this repo. The only enforcement was the weekly test_llms_txt_snippets_are_covered job, which fetches the live file. So PR #485/#487 moved the quickstart snippets to `data.ingest`, nothing here told the author that weaviate-io/static/llms.txt had to move too, and the break surfaced days later in a scheduled run. It is still red: 2 of 51 blocks. Add tests/check_llms_txt_drift.py, run by llms_txt_snippet_sync.yml on any PR touching a file that matches SNIPPET_GLOBS. It answers one question: once this PR merges, which llms.txt blocks would the weekly coverage test no longer find? It reuses that test's globs, regexes, _normalize and _load_llms_txt, so the two cannot disagree about what "matches" means. The check is advisory and always exits 0. When a snippet PR is opened, weaviate-io has not merged or deployed yet, so the live llms.txt legitimately cannot match; a blocking check would fail every honest PR and would be routinely overridden, which teaches people to ignore it. Findings are GitHub warning annotations on the changed marker lines plus a job summary carrying the exact block to paste into llms.txt. It stays quiet when there is nothing to do: weaviate-io shipped first and llms.txt already carries the new block, only scaffolding outside the markers changed, or a region moved or was renamed with its code intact. It degrades to a generic reminder, never a failure, if the base ref or llms.txt cannot be read. The path filter also covers the Java and C# snippets, which live with their language suites rather than under _includes/code/llms-txt/. llms_txt_tests.yml is untouched; the scheduled job behaves exactly as before. --- .github/workflows/llms_txt_snippet_sync.yml | 57 ++++ tests/README-LLMS-TXT.md | 37 ++- tests/check_llms_txt_drift.py | 307 ++++++++++++++++++++ 3 files changed, 400 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/llms_txt_snippet_sync.yml create mode 100644 tests/check_llms_txt_drift.py diff --git a/.github/workflows/llms_txt_snippet_sync.yml b/.github/workflows/llms_txt_snippet_sync.yml new file mode 100644 index 000000000..d64b54b6d --- /dev/null +++ b/.github/workflows/llms_txt_snippet_sync.yml @@ -0,0 +1,57 @@ +name: llms.txt Snippet Sync + +# llms.txt is hand-maintained in the weaviate-io repo, so a snippet change here can +# strand a block in the published file. Only the weekly llms_txt_tests.yml job notices, +# which means the break surfaces days later. This gives the author the signal at PR time. +# +# It is advisory by design and never fails: when a snippet PR is opened, weaviate-io has +# not merged or deployed yet, so the live llms.txt legitimately cannot match. A blocking +# check would fire on every honest PR and would just be overridden. + +permissions: + contents: read + +on: + pull_request: + paths: + # Kept in step with SNIPPET_GLOBS in tests/test_llms_txt_code.py. Java and C# + # snippets live with their language suites, not under _includes/code/llms-txt/. + - "_includes/code/llms-txt/**" + - "_includes/code/java-v6/src/test/java/LlmsTxtTest.java" + - "_includes/code/csharp/LlmsTxtTest.cs" + - "tests/test_llms_txt_code.py" + - "tests/check_llms_txt_drift.py" + +env: + PYTHON_VERSION: "3.11" + +jobs: + check-snippet-sync: + name: Check llms.txt snippet sync + runs-on: ubuntu-latest + timeout-minutes: 5 + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Fetch the PR base commit + # Shallow single-commit fetch: the check only needs the base tree to read the + # pre-change snippet files. If it fails the check reports a degraded warning + # rather than blocking. + continue-on-error: true + run: git fetch --no-tags --depth=1 origin ${{ github.event.pull_request.base.sha }} + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: ${{ env.PYTHON_VERSION }} + + - name: Install pytest + # The check imports tests/test_llms_txt_code.py to reuse its matching logic, and + # that module imports pytest. Nothing else from the test suite is needed, so this + # stays far cheaper than the full setup-test-env composite. + run: python -m pip install --quiet "pytest>=8.3.5" + + - name: Check llms.txt snippet sync + run: python tests/check_llms_txt_drift.py --base "${{ github.event.pull_request.base.sha }}" diff --git a/tests/README-LLMS-TXT.md b/tests/README-LLMS-TXT.md index b465a0c43..7074057b4 100644 --- a/tests/README-LLMS-TXT.md +++ b/tests/README-LLMS-TXT.md @@ -116,6 +116,8 @@ no Weaviate cluster. 2. Run that language's `test_llms_txt` and confirm it passes — **never** hand-write a snippet without running it. 3. Copy the verified marked region **verbatim** into `weaviate-io/static/llms.txt`. + The PR-time sync warning (see *CI* below) flags this for you and prints the exact + block to paste. 4. New file? Add its path to the `test_llms_txt` parametrize list in the matching `tests/test_*.py`. @@ -182,12 +184,13 @@ after the matching `weaviate-io` change is live; otherwise mark with ## CI -Two separate workflows cover this directory: +Three separate workflows cover this directory: | Workflow | What it runs | |---|---| | `.github/workflows/docs_tests.yml` | Per-language **execution** tests — `test_llms_txt*` in `test_python.py`, `test_typescript.py`, `test_java.py`, `test_csharp.py`. Rides the existing `pyv4` / `ts` / `java` / `csharp` / `agents` markers, so no separate job for these. | | `.github/workflows/llms_txt_tests.yml` | The three **guard tests** in `test_llms_txt_code.py` — snippet coverage, version freshness, link validity. Single job `test-llms-txt`, runs `uv run pytest tests/test_llms_txt_code.py -m "llms_txt"`. | +| `.github/workflows/llms_txt_snippet_sync.yml` | The **PR-time warning** (`check_llms_txt_drift.py`). Advisory only, see below. | The guard workflow triggers on: @@ -204,6 +207,38 @@ Results post to Slack via the shared `./.github/actions/handle-test-results` composite under `test-type: 'llms.txt'`, with `continue-on-error: true` on the pytest step so the notification still fires when a guard fails. +### PR-time snippet sync warning + +The guard workflow runs weekly, so a snippet change here can break the published +`llms.txt` days before anyone notices. `tests/check_llms_txt_drift.py` closes that +gap on the docs side. `.github/workflows/llms_txt_snippet_sync.yml` runs it on every +PR touching a file that matches `SNIPPET_GLOBS`, and it answers one question: once +this PR merges, which `llms.txt` code blocks would `test_llms_txt_snippets_are_covered` +no longer find? Those, and only those, are the blocks `weaviate-io/static/llms.txt` +has to update in lockstep. + +It reuses this directory's matching logic (`SNIPPET_GLOBS`, the marker and fence +regexes, `_normalize`, `_load_llms_txt`), so it cannot disagree with the weekly job +about what "matches" means. Findings surface as GitHub warning annotations on the +changed snippet lines, plus a job summary carrying the new block to paste into +`llms.txt`. + +**It is advisory and always exits 0.** When a snippet PR is opened, weaviate-io has +not merged or deployed yet, so the live `llms.txt` legitimately cannot match yet; a +blocking check would fire on every honest PR and would just get overridden. It also +stays quiet whenever there is nothing to do: weaviate-io shipped first and `llms.txt` +already carries the new block, only scaffolding outside the markers changed, or a +region was moved or renamed without its code changing. + +Run it locally against uncommitted edits: + +```bash +uv run python tests/check_llms_txt_drift.py --base HEAD +``` + +The reverse direction (an `llms.txt` edit in weaviate-io that no longer matches these +snippets) is checked by a workflow in the weaviate-io repo. + ## Per-language gotchas - **Python** — `text2vec_ollama` / `generative_ollama` take `api_endpoint` and diff --git a/tests/check_llms_txt_drift.py b/tests/check_llms_txt_drift.py new file mode 100644 index 000000000..835fa6fa6 --- /dev/null +++ b/tests/check_llms_txt_drift.py @@ -0,0 +1,307 @@ +#!/usr/bin/env python3 +"""Advisory PR check: warn when a snippet change strands a block in llms.txt. + +`llms.txt` is hand-maintained in the **weaviate-io** repo (`static/llms.txt`), but its +code blocks must appear verbatim between `START`/`END` markers in this repo's snippet +files. The only thing enforcing that today is the weekly +`test_llms_txt_code.py::test_llms_txt_snippets_are_covered` job, so a snippet change +here can break the published `llms.txt` days before anyone notices. + +This script answers one question at PR time: once this PR merges, which `llms.txt` code +blocks would that weekly coverage test no longer find? Those blocks, and only those, are +the ones `weaviate-io/static/llms.txt` has to update in lockstep. + +It is deliberately advisory and **always exits 0**. A legitimate snippet PR cannot have a +matching live `llms.txt` yet, because weaviate-io has not merged or deployed, so a +blocking check here would fail every honest PR and get routinely overridden. Findings are +reported as GitHub warning annotations plus a job summary instead. + +Usage: + + python tests/check_llms_txt_drift.py --base + +The pre-change state is read with `git show :`; the post-change state is read +from the working tree, so the changed-file set is `git diff --name-only `. That also +makes the script easy to exercise locally: edit a snippet file and run it with +`--base HEAD`. + +Honors `LLMS_TXT_PATH` exactly like the guard tests do, so it can be pointed at a local +weaviate-io checkout instead of the live https://weaviate.io/llms.txt. +""" +import argparse +import os +import subprocess +import sys +from dataclasses import dataclass +from fnmatch import fnmatch +from typing import Optional + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + +# Reuse the guard test's matching logic (SNIPPET_GLOBS, marker/fence regexes, +# normalization, llms.txt loading) so this check and the weekly job can never +# disagree about what "matches" means. +import test_llms_txt_code as guard # noqa: E402 + +LLMS_TXT_SOURCE = "weaviate-io/static/llms.txt" + +# guard._load_llms_txt() calls pytest.skip() when the fetch fails, and Skipped derives +# from BaseException, so a bare `except Exception` would let it through. +_LOAD_FAILURES = (Exception, guard.pytest.skip.Exception) + + +@dataclass +class Finding: + """A marked region that exists at the base ref but not after the change.""" + + path: str + language: str + marker: str + old_code: str + new_code: Optional[str] # same marker's code after the change, if it still exists + new_line: Optional[int] # 1-based line of the surviving `START` marker + + +def _git(*args): + return subprocess.run(["git", *args], capture_output=True, text=True, check=False) + + +def _repo_root(): + result = _git("rev-parse", "--show-toplevel") + return result.stdout.strip() if result.returncode == 0 else None + + +def _snippet_patterns(): + return [(lang, pattern) for lang, patterns in guard.SNIPPET_GLOBS.items() for pattern in patterns] + + +def _language_for(path): + for language, pattern in _snippet_patterns(): + if fnmatch(path, pattern): + return language + return None + + +def _changed_snippet_files(base): + """Paths matching SNIPPET_GLOBS that differ between `base` and the working tree.""" + result = _git("diff", "--name-only", base) + if result.returncode != 0: + return None, result.stderr.strip() or f"git diff against {base} failed" + changed = [path for path in result.stdout.splitlines() if _language_for(path)] + return sorted(changed), None + + +def _regions(text): + """[(marker, normalized code, 1-based START line)] for each region in `text`.""" + found = [] + for match in guard.MARKER_RE.finditer(text): + line = text.count("\n", 0, match.start()) + 1 + found.append((match.group(1), guard._normalize(match.group(2)), line)) + return found + + +def _blob_at(ref, path): + """File contents at `ref`, or None if the file did not exist there.""" + result = _git("show", f"{ref}:{path}") + return result.stdout if result.returncode == 0 else None + + +def _working_tree_text(path): + if not os.path.exists(path): + return "" # file deleted by the change + with open(path, encoding="utf-8") as handle: + return handle.read() + + +def _lost_regions(base, changed_paths): + """Regions present at `base` whose exact code no longer exists anywhere in the repo. + + Comparing against every snippet file (not just the changed one) means a region that + was merely moved or renamed is correctly treated as still covered. + """ + surviving = guard._collect_marked_regions() + lost = [] + for path in changed_paths: + language = _language_for(path) + base_text = _blob_at(base, path) + if base_text is None: + continue # new file: nothing can be stranded + head_regions = {marker: (code, line) for marker, code, line in _regions(_working_tree_text(path))} + for marker, code, _ in _regions(base_text): + if code in surviving[language]: + continue + new_code, new_line = head_regions.get(marker, (None, None)) + lost.append(Finding(path, language, marker, code, new_code, new_line)) + return lost + + +def _llms_txt_blocks(): + """({language: {normalized code}}, None), or (None, reason) if llms.txt is unreadable.""" + try: + content = guard._load_llms_txt() + except _LOAD_FAILURES as exc: + return None, str(exc) + blocks = {language: set() for language in guard.SNIPPET_GLOBS} + for match in guard.FENCE_RE.finditer(content): + language = guard.LANG_ALIASES.get(match.group(1).lower()) + if language is not None: + blocks[language].add(guard._normalize(match.group(2))) + return blocks, None + + +def _escape(value, is_property=False): + escaped = value.replace("%", "%25").replace("\r", "%0D").replace("\n", "%0A") + if is_property: + escaped = escaped.replace(":", "%3A").replace(",", "%2C") + return escaped + + +def _annotate(level, message, path=None, line=None, title=None): + properties = [] + if path: + properties.append(f"file={_escape(path, True)}") + if line: + properties.append(f"line={line}") + if title: + properties.append(f"title={_escape(title, True)}") + joined = "," + ",".join(properties) if properties else "" + print(f"::{level}{joined}::{_escape(message)}") + + +def _write_summary(markdown): + print(markdown) + summary_path = os.environ.get("GITHUB_STEP_SUMMARY") + if summary_path: + with open(summary_path, "a", encoding="utf-8") as handle: + handle.write(markdown + "\n") + + +def _report_in_sync(headline): + _write_summary(f"## llms.txt snippet sync\n\n{headline}\n") + + +def _report_drift(findings): + for finding in findings: + if finding.new_code is None: + detail = f"The `{finding.marker}` region was removed or renamed" + else: + detail = f"The `{finding.marker}` region changed" + _annotate( + "warning", + f"{detail}, but {LLMS_TXT_SOURCE} still publishes the previous version. " + f"Update {LLMS_TXT_SOURCE} in lockstep with this PR, or the weekly llms.txt " + f"coverage job will fail once this merges.", + path=finding.path, + line=finding.new_line, + title="llms.txt needs a matching update", + ) + + rows = "\n".join( + f"| `{finding.path}` | `{finding.marker}` | " + f"{'removed or renamed' if finding.new_code is None else 'changed'} |" + for finding in findings + ) + blocks = "\n\n".join( + f"
{finding.marker} " + f"({'no replacement in this repo' if finding.new_code is None else 'new block to copy into llms.txt'})" + f"\n\n```{finding.language}\n" + f"{finding.new_code if finding.new_code is not None else finding.old_code}\n```\n\n
" + for finding in findings + ) + plural = "block" if len(findings) == 1 else "blocks" + _write_summary( + "## llms.txt snippet sync\n\n" + f"This PR strands {len(findings)} code {plural} that `{LLMS_TXT_SOURCE}` publishes " + "verbatim. **`weaviate-io/static/llms.txt` must be updated in the same window**, " + "otherwise the weekly llms.txt coverage job starts failing once this merges.\n\n" + "| Snippet file | Marked region | What happened |\n" + "|---|---|---|\n" + f"{rows}\n\n" + f"{blocks}\n\n" + "This check never blocks the merge: weaviate-io cannot have shipped yet when a " + "legitimate snippet PR is opened.\n" + ) + + +def main(): + parser = argparse.ArgumentParser( + description="Warn when a PR strands an llms.txt code block.", + formatter_class=argparse.RawDescriptionHelpFormatter, + ) + parser.add_argument( + "--base", + required=True, + help="git ref holding the pre-change state (on a PR, the base commit)", + ) + args = parser.parse_args() + + root = _repo_root() + if root is None: + _annotate("warning", "Not inside a git repository; skipping the llms.txt sync check.") + return 0 + os.chdir(root) + + changed, error = _changed_snippet_files(args.base) + if error is not None: + _annotate( + "warning", + f"Could not diff against {args.base} ({error}), so the llms.txt sync check was " + f"skipped. If this PR changes an llms.txt snippet, update {LLMS_TXT_SOURCE} too.", + title="llms.txt sync check could not run", + ) + return 0 + + if not changed: + _report_in_sync("No llms.txt-backed snippet files changed. Nothing to keep in sync.") + return 0 + + findings = _lost_regions(args.base, changed) + if not findings: + _report_in_sync( + f"{len(changed)} llms.txt snippet file(s) changed, but no `START`/`END` region " + f"lost its previous content, so `{LLMS_TXT_SOURCE}` stays valid." + ) + return 0 + + blocks, load_error = _llms_txt_blocks() + if blocks is None: + listed = ", ".join(f"`{path}`" for path in changed) + _annotate( + "warning", + f"Changed llms.txt snippet regions, but the published llms.txt could not be read " + f"({load_error}), so the comparison was skipped. Check {LLMS_TXT_SOURCE} by hand.", + title="llms.txt sync check could not run", + ) + _write_summary( + "## llms.txt snippet sync\n\n" + f"Could not read the published llms.txt ({load_error}). These files changed a " + f"marked region and may need a matching `{LLMS_TXT_SOURCE}` update: {listed}\n" + ) + return 0 + + stranded = [finding for finding in findings if finding.old_code in blocks[finding.language]] + if not stranded: + shipped = [ + finding + for finding in findings + if finding.new_code is not None and finding.new_code in blocks[finding.language] + ] + if shipped: + markers = ", ".join(f"`{finding.marker}`" for finding in shipped) + _report_in_sync( + f"`{LLMS_TXT_SOURCE}` already publishes the updated {markers} block(s). " + "weaviate-io shipped first, so there is nothing to do." + ) + else: + _report_in_sync( + f"Marked regions changed, but `{LLMS_TXT_SOURCE}` does not publish any of " + "their previous content, so nothing is stranded." + ) + return 0 + + _report_drift(stranded) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) From 67f9941f1de60cb628cea917c6d538733abdfe0a Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Sat, 1 Aug 2026 08:41:10 +0200 Subject: [PATCH 36/84] Drop the images label from three pages that never had screenshots The pages were labelled `images` on the assumption that they should carry screenshots and were missing them. They were never meant to have any, so there is no coverage to preserve and the label is simply wrong. Removing it also removes the reason for PAGES_MISSING_CONTENT_IMAGES, a second hand-maintained list that contradicted the feature labels a few lines above it. The hard failure for a page labelled `images` with no content image stays, and is now the only enforcement: a stale label fails instead of being skipped by name. Two of the three pages have no structural features left. Keep them in TEST_PAGES, because four checks (200, meta tags, heading hierarchy, LLM notice) parametrize over every entry regardless of feature, and dropping the entries would lose that coverage. An empty feature set would have exempted them from the h2 assertion, which keyed "content page" off a non-empty feature set, so record landing pages explicitly in LANDING_PAGES instead. That leaves _features_for without a caller, so it goes too. --- tests/README-INDEXABILITY.md | 14 +++++----- tests/test_docs_indexability.py | 46 +++++++++------------------------ 2 files changed, 20 insertions(+), 40 deletions(-) diff --git a/tests/README-INDEXABILITY.md b/tests/README-INDEXABILITY.md index d0b77b37a..ef180686f 100644 --- a/tests/README-INDEXABILITY.md +++ b/tests/README-INDEXABILITY.md @@ -21,7 +21,7 @@ Documentation content that is hidden behind JavaScript interactions (tabs, colla ### HTML structure tests (Part 1) -These tests fetch ~11 representative pages from all doc sections and check: +These tests fetch ~13 representative pages from all doc sections and check: | Test | What it checks | |------|---------------| @@ -81,7 +81,7 @@ HTML structure tests always run. Agent tests only run if `ANTHROPIC_API_KEY` and ## Test pages -The suite tests 11 representative URLs covering all doc sections: +The suite tests 13 representative URLs covering all doc sections: | Page | Features tested | |------|----------------| @@ -91,9 +91,11 @@ The suite tests 11 representative URLs covering all doc sections: | `/weaviate/search/hybrid` | tabs, code | | `/weaviate/connections/connect-cloud` | tabs, code | | `/weaviate/config-refs/collections` | details, table | -| `/weaviate/concepts/data-import` | images | -| `/cloud/quickstart` | code, images | -| `/cloud/manage-clusters/create` | images | +| `/weaviate/concepts/data-import` | no structural features (200, meta tags, headings, LLM notice only) | +| `/cloud/quickstart` | code | +| `/cloud/manage-clusters/create` | no structural features (200, meta tags, headings, LLM notice only) | +| `/cloud/tools/query-tool` | images | +| `/weaviate/manage-collections/tenant-states` | images | | `/query-agent/recipes/query-agent-ecommerce-assistant` | code | | `/weaviate/search` | landing page | @@ -129,4 +131,4 @@ TEST_PAGES = [ ] ``` -Available feature tags: `tabs`, `code`, `details`, `images`, `table`. Pages are parametrized — each feature tag enables the corresponding structural test for that page. +Available feature tags: `tabs`, `code`, `details`, `images`, `table`. Pages are parametrized — each feature tag enables the corresponding structural test for that page. Tag only what the page actually has: a page tagged `images` with no content image fails rather than passing quietly, which is what keeps the tags from going stale. diff --git a/tests/test_docs_indexability.py b/tests/test_docs_indexability.py index 0721a74ba..ff5ad51d6 100644 --- a/tests/test_docs_indexability.py +++ b/tests/test_docs_indexability.py @@ -31,33 +31,25 @@ ("/weaviate/search/hybrid", {"tabs", "code"}), ("/weaviate/connections/connect-cloud", {"tabs", "code"}), ("/weaviate/config-refs/collections", {"details", "table"}), - ("/weaviate/concepts/data-import", {"images"}), - ("/cloud/quickstart", {"code", "images"}), - ("/cloud/manage-clusters/create", {"images"}), + ("/weaviate/concepts/data-import", set()), + ("/cloud/quickstart", {"code"}), + ("/cloud/manage-clusters/create", set()), ("/cloud/tools/query-tool", {"images"}), ("/weaviate/manage-collections/tenant-states", {"images"}), ("/query-agent/recipes/query-agent-ecommerce-assistant", {"code"}), - ("/weaviate/search", set()), # landing page + ("/weaviate/search", set()), ] ALL_PATHS = [path for path, _ in TEST_PAGES] -# Pages labelled "images" that carry no content images of their own today. +# Pages that route readers onward instead of carrying content of their own, and +# so are exempt from the "content pages have h2 headings" rule. # -# The label is kept on purpose: these pages walk a reader through a UI, so they -# are the pages that most want screenshots, and the label records that intent. -# Until the screenshots exist there is nothing on the page for the alt-text -# check to assert, so it skips them by name and says so, rather than passing on -# the strength of the navbar chrome that used to leak into the check. -# -# Drop a page from this set the moment it gains a real content image; the -# alt-text check then enforces alt text on it. Any *other* page labelled -# "images" with no content images fails, so the label cannot go stale silently. -PAGES_MISSING_CONTENT_IMAGES = { - "/weaviate/concepts/data-import", - "/cloud/quickstart", - "/cloud/manage-clusters/create", -} +# This is tracked separately from the feature sets because an empty feature set +# says only that a page has none of the structural features the checks below +# assert on. A page can be plain prose, with no tabs, code, details, table or +# image, and still be a content page that owes the reader h2 headings. +LANDING_PAGES = {"/weaviate/search"} # --------------------------------------------------------------------------- # Fixtures @@ -90,13 +82,6 @@ def _get_soup(path: str) -> BeautifulSoup: return BeautifulSoup(resp.text, "html.parser") -def _features_for(path: str) -> set[str]: - for p, features in TEST_PAGES: - if p == path: - return features - return set() - - # --------------------------------------------------------------------------- # Part 1: HTML Structure Tests (no API keys needed) # --------------------------------------------------------------------------- @@ -139,8 +124,7 @@ def test_heading_hierarchy(path): assert len(h1s) == 1, f"{path}: expected 1 h1, found {len(h1s)}" # Content pages (not landing pages) should have h2s - features = _features_for(path) - if features: # non-empty features means it's a content page + if path not in LANDING_PAGES: h2s = soup.find_all("h2") assert len(h2s) > 0, f"{path}: content page has no h2 headings" @@ -238,12 +222,6 @@ def test_images_have_alt_text(path): content_images = _content_images(soup) if not content_images: - if path in PAGES_MISSING_CONTENT_IMAGES: - pytest.skip( - f"{path}: labelled 'images' but has no content image in the main " - "content region, so there is nothing here to assert on. This is a " - "content gap, tracked in PAGES_MISSING_CONTENT_IMAGES." - ) pytest.fail( f"{path}: labelled 'images' but has no content image in the main " "content region. Either the page lost its images, or the 'images' " From 0386fabcb55e3a8a86e85c2dca11bf766c5e9fa4 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Sat, 1 Aug 2026 09:36:37 +0200 Subject: [PATCH 37/84] Remove the empty alt that broke the site build Docusaurus validates headTags attributes with a Joi string() schema, which rejects the empty string, so `alt: ""` on the analytics beacon failed both `yarn build-dev` and the Netlify production build with: Error: "headTags[2].attributes.alt" is not allowed to be empty The attribute was never load-bearing. The alt-text check exempts the beacon structurally on its inline `display: none;`, and independently on `aria-hidden="true"`, so dropping the empty alt loses no coverage. --- src/scripts/scarf.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/scripts/scarf.js b/src/scripts/scarf.js index af63b2938..eab4276ab 100644 --- a/src/scripts/scarf.js +++ b/src/scripts/scarf.js @@ -5,10 +5,11 @@ const scarfScript = { src: "https://pixel.weaviate.cloud/a.png?x-pxid=a41b0758-a3a9-4874-a880-8b5d5a363d40", referrerPolicy: "no-referrer-when-downgrade", style: "display: none;", - // Decorative, hidden analytics beacon: empty alt plus aria-hidden keeps it - // out of the accessibility tree instead of leaving assistive technology to - // announce an image with no alt attribute. - alt: "", + // Decorative, hidden analytics beacon: aria-hidden is what keeps it out of + // the accessibility tree, so assistive technology never reaches it and never + // has to announce it. Do not add `alt: ""` here: Docusaurus validates + // headTags attributes with a Joi `string()` schema that rejects the empty + // string, so an empty alt fails the site build outright. "aria-hidden": "true", }, }; From 8853734e52d2c45bef5304bfb800c51d17c95854 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Sat, 1 Aug 2026 12:34:58 +0200 Subject: [PATCH 38/84] Document the landing-page trap and guard the snippet glob parity Four follow-ups from review of this branch: - Assert that every SNIPPET_GLOBS pattern is covered by the `paths:` filter in llms_txt_snippet_sync.yml. Java and C# snippets already live outside _includes/code/llms-txt/, so a fifth language landing outside the filter would disable the drift check silently. The workflow YAML is parsed rather than copied, and pyyaml is now a declared dependency so the guard cannot skip. - Document LANDING_PAGES in README-INDEXABILITY. An empty feature set does not exempt a page from the h2 assertion, which is the confusing failure a new landing page would otherwise hit. - Describe the reverse-direction check as landing with weaviate-io PR #3669, since that workflow is not on weaviate-io main yet. - Correct the drift script's "always exits 0" claim: it never fails the job once it runs, but argparse still exits 2 on a missing --base. --- pyproject.toml | 1 + tests/README-INDEXABILITY.md | 17 +++++++++++ tests/README-LLMS-TXT.md | 5 ++-- tests/check_llms_txt_drift.py | 11 ++++--- tests/test_llms_txt_code.py | 56 +++++++++++++++++++++++++++++++++++ uv.lock | 2 ++ 6 files changed, 86 insertions(+), 6 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 1f5796bff..657b44ece 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,6 +14,7 @@ dependencies = [ "playwright>=1.40.0", "pytest>=8.3.5", "python-dotenv>=1.1.1", + "pyyaml>=6.0", "requests>=2.32.3", "tqdm>=4.67.1", "weaviate-agents>=1.7.0", diff --git a/tests/README-INDEXABILITY.md b/tests/README-INDEXABILITY.md index ef180686f..ce68a3cec 100644 --- a/tests/README-INDEXABILITY.md +++ b/tests/README-INDEXABILITY.md @@ -132,3 +132,20 @@ TEST_PAGES = [ ``` Available feature tags: `tabs`, `code`, `details`, `images`, `table`. Pages are parametrized — each feature tag enables the corresponding structural test for that page. Tag only what the page actually has: a page tagged `images` with no content image fails rather than passing quietly, which is what keeps the tags from going stale. + +### Landing pages + +If the page you are adding routes readers onward instead of carrying content of its own — a hub page that is essentially a list of links to its children — also add its path to the `LANDING_PAGES` set in the same file: + +```python +LANDING_PAGES = {"/weaviate/search"} +``` + +`LANDING_PAGES` is the **only** thing that exempts a page from the "content pages have h2 headings" assertion in `test_heading_hierarchy`. An empty feature set does not exempt it. The two mean different things: + +- an empty feature set says the page has none of the structural features listed above (no tabs, no code, no details, no table, no images); +- `LANDING_PAGES` says the page owes the reader no h2 headings at all. + +A page can be plain prose with an empty feature set and still be a content page that must have h2s, which is why the exemption is tracked separately. + +So if you add a landing page with `set()` and leave it out of `LANDING_PAGES`, it fails with `content page has no h2 headings` — a confusing failure, because the feature set already looks like it says "this page has nothing". Add the path to `LANDING_PAGES` instead. diff --git a/tests/README-LLMS-TXT.md b/tests/README-LLMS-TXT.md index 7074057b4..1eab51daf 100644 --- a/tests/README-LLMS-TXT.md +++ b/tests/README-LLMS-TXT.md @@ -223,7 +223,7 @@ about what "matches" means. Findings surface as GitHub warning annotations on th changed snippet lines, plus a job summary carrying the new block to paste into `llms.txt`. -**It is advisory and always exits 0.** When a snippet PR is opened, weaviate-io has +**It is advisory and never fails the job once it runs.** When a snippet PR is opened, weaviate-io has not merged or deployed yet, so the live `llms.txt` legitimately cannot match yet; a blocking check would fire on every honest PR and would just get overridden. It also stays quiet whenever there is nothing to do: weaviate-io shipped first and `llms.txt` @@ -237,7 +237,8 @@ uv run python tests/check_llms_txt_drift.py --base HEAD ``` The reverse direction (an `llms.txt` edit in weaviate-io that no longer matches these -snippets) is checked by a workflow in the weaviate-io repo. +snippets) is the companion check that lands with weaviate-io PR #3669, as a workflow in +that repo. Until it merges there, this direction is the only one that is automated. ## Per-language gotchas diff --git a/tests/check_llms_txt_drift.py b/tests/check_llms_txt_drift.py index 835fa6fa6..0f32277df 100644 --- a/tests/check_llms_txt_drift.py +++ b/tests/check_llms_txt_drift.py @@ -11,10 +11,13 @@ blocks would that weekly coverage test no longer find? Those blocks, and only those, are the ones `weaviate-io/static/llms.txt` has to update in lockstep. -It is deliberately advisory and **always exits 0**. A legitimate snippet PR cannot have a -matching live `llms.txt` yet, because weaviate-io has not merged or deployed, so a -blocking check here would fail every honest PR and get routinely overridden. Findings are -reported as GitHub warning annotations plus a job summary instead. +It is deliberately advisory: **once it runs it never fails the job**, because every +reporting path exits 0. (Only a malformed invocation, such as omitting `--base`, exits +non-zero, and that comes from argparse before any checking happens.) A legitimate snippet +PR cannot have a matching live `llms.txt` yet, because weaviate-io has not merged or +deployed, so a blocking check here would fail every honest PR and get routinely +overridden. Findings are reported as GitHub warning annotations plus a job summary +instead. Usage: diff --git a/tests/test_llms_txt_code.py b/tests/test_llms_txt_code.py index e89ca3c39..d0df9d7fd 100644 --- a/tests/test_llms_txt_code.py +++ b/tests/test_llms_txt_code.py @@ -120,6 +120,62 @@ def test_llms_txt_snippets_are_covered(): ) +# The PR-time drift check only runs when the PR touches a path in this workflow's +# `paths:` filter, so a SNIPPET_GLOBS entry outside that filter disables the check +# for that language without any visible failure. Java and C# snippets already live +# outside `_includes/code/llms-txt/`, so a fifth language landing outside it is a +# realistic way to lose coverage silently. +SNIPPET_SYNC_WORKFLOW = os.path.join( + os.path.dirname(os.path.dirname(os.path.abspath(__file__))), + ".github", "workflows", "llms_txt_snippet_sync.yml", +) + + +def _glob_to_regex(pattern): + """Compile a GitHub `paths:` filter, where `**` spans directories and `*` does not.""" + out, i = [], 0 + while i < len(pattern): + if pattern.startswith("**", i): + out.append(".*") + i += 2 + elif pattern[i] == "*": + out.append("[^/]*") + i += 1 + else: + out.append(re.escape(pattern[i])) + i += 1 + return re.compile("".join(out) + r"\Z") + + +@pytest.mark.llms_txt +def test_snippet_globs_are_covered_by_workflow_paths(): + """Every SNIPPET_GLOBS pattern must trigger the snippet-sync workflow.""" + # Imported here, not at module scope: check_llms_txt_drift.py imports this + # module in a workflow that installs pytest and nothing else. + import yaml + + with open(SNIPPET_SYNC_WORKFLOW, encoding="utf-8") as handle: + workflow = yaml.safe_load(handle) + + # PyYAML reads the bare `on:` key as the YAML 1.1 boolean True. + triggers = workflow.get("on", workflow.get(True)) + filters = [_glob_to_regex(path) for path in triggers["pull_request"]["paths"]] + + uncovered = [ + pattern + for patterns in SNIPPET_GLOBS.values() + for pattern in patterns + if not any(filt.match(pattern) for filt in filters) + ] + + assert not uncovered, ( + "SNIPPET_GLOBS pattern(s) not covered by the `paths:` filter in " + f"{os.path.basename(SNIPPET_SYNC_WORKFLOW)}: {uncovered}. A snippet change under " + "these paths would not trigger the sync check, so llms.txt could drift unnoticed. " + "Add a matching entry to the workflow's `paths:` list." + ) + + # Each library: (weaviate/* GitHub repo, regex matching the # "**Library**: vX.Y.Z+" bullet in llms.txt). The regex anchors to the bullet's # prefix so adding new libraries to llms.txt doesn't break it. diff --git a/uv.lock b/uv.lock index 3b19c9f50..b0f0e87f5 100644 --- a/uv.lock +++ b/uv.lock @@ -1884,6 +1884,7 @@ dependencies = [ { name = "playwright" }, { name = "pytest" }, { name = "python-dotenv" }, + { name = "pyyaml" }, { name = "requests" }, { name = "tqdm" }, { name = "weaviate-agents" }, @@ -1903,6 +1904,7 @@ requires-dist = [ { name = "playwright", specifier = ">=1.40.0" }, { name = "pytest", specifier = ">=8.3.5" }, { name = "python-dotenv", specifier = ">=1.1.1" }, + { name = "pyyaml", specifier = ">=6.0" }, { name = "requests", specifier = ">=2.32.3" }, { name = "tqdm", specifier = ">=4.67.1" }, { name = "weaviate-agents", specifier = ">=1.7.0" }, From 86d12d521f6fd8f6cefb48df320e4b74316f8ad5 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Sat, 1 Aug 2026 12:56:37 +0200 Subject: [PATCH 39/84] Correct the llms.txt sync docs: the reverse direction is not automated --- tests/README-LLMS-TXT.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/README-LLMS-TXT.md b/tests/README-LLMS-TXT.md index 1eab51daf..0b22bf4a3 100644 --- a/tests/README-LLMS-TXT.md +++ b/tests/README-LLMS-TXT.md @@ -237,8 +237,10 @@ uv run python tests/check_llms_txt_drift.py --base HEAD ``` The reverse direction (an `llms.txt` edit in weaviate-io that no longer matches these -snippets) is the companion check that lands with weaviate-io PR #3669, as a workflow in -that repo. Until it merges there, this direction is the only one that is automated. +snippets) is not automated. There is no check in weaviate-io; this repo's PR-time warning +and the weekly `llms_txt_tests.yml` job are the only automation. An `llms.txt` edit made +directly in weaviate-io that breaks the verbatim match is not caught until the weekly job +runs. ## Per-language gotchas From 0c3efb1e43a05dc845885e120d88dbd02d94bfc2 Mon Sep 17 00:00:00 2001 From: Connor Shorten Date: Wed, 5 Aug 2026 07:20:47 -0400 Subject: [PATCH 40/84] clean initial description --- docs/query-agent/guides/search_mode.md | 54 +++++++++++++------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/docs/query-agent/guides/search_mode.md b/docs/query-agent/guides/search_mode.md index 6329919c1..c34e8a339 100644 --- a/docs/query-agent/guides/search_mode.md +++ b/docs/query-agent/guides/search_mode.md @@ -13,7 +13,7 @@ import TSCode from '!!raw-loader!/docs/query-agent/_includes/code/search_mode.mt -Search Mode transforms your query into actionable searches and returns the matching Weaviate objects directly — without generating an LLM-authored answer. +Search Mode transforms your query into actionable searches and returns the matching Weaviate objects directly. For example, you could ask: @@ -69,7 +69,7 @@ The `.search()` method accepts several arguments: | `limit` | `int` | The maximum number of results returned in this page of results. Defaults to `20`. Use [`.next()`](#pagination) to fetch additional pages. | | `filtering` | `Literal["recall", "precision"]` | Either `"recall"` or `"precision"` to control filter generation. `"recall"` favors more results across filter interpretations; `"precision"` favors strict intent match. See [Customized filtering](#customized-filtering) below. | | `diversity_weight` | `float \| None` | A value between `0.0` and `1.0` that biases the result ranking towards diversity using Maximal Marginal Relevance (MMR). See [Diversity ranking](#diversity-ranking) below. | -| `effort` | `Literal["low", "medium", "high"] \| None` | The amount of effort the agent puts into the search. Higher effort may improve result quality at the expense of increased latency and cost. See [Search effort](#search-effort) below. | +| `effort` | `Literal["low", "medium", "high"] \| None` | The amount of effort the agent puts into the search. Higher effort may improve result quality at the expense of increased latency and cost. See [Effort](#effort) below. |
@@ -80,86 +80,86 @@ The `.search()` method accepts several arguments: | `limit` | `number` | The maximum number of results returned in this page of results. Defaults to `20`. Use [`.next()`](#pagination) to fetch additional pages. | | `filtering` | `"recall" \| "precision"` | Either `"recall"` or `"precision"` to control filter generation. `"recall"` favors more results across filter interpretations; `"precision"` favors strict intent match. See [Customized filtering](#customized-filtering) below. | | `diversityWeight` | `number` | A value between `0.0` and `1.0` that biases the result ranking towards diversity using Maximal Marginal Relevance (MMR). See [Diversity ranking](#diversity-ranking) below. | -| `effort` | `"low" \| "medium" \| "high"` | The amount of effort the agent puts into the search. Higher effort may improve result quality at the expense of increased latency and cost. See [Search effort](#search-effort) below. | +| `effort` | `"low" \| "medium" \| "high"` | The amount of effort the agent puts into the search. Higher effort may improve result quality at the expense of increased latency and cost. See [Effort](#effort) below. | For more advanced searches, you can also specify _additional filters_ within the collection configuration. [See the page on additional filters for more detail](../reference/additional_filters.md). -### Customized filtering - -Search Mode uses query rewriting to transform your original query into one or multiple Weaviate queries, each with either a search query, metadata filters, or both. The `filtering` parameter controls how many Weaviate queries are generated. +### Effort -- **`"recall"`** (default): Generates multiple Weaviate queries spanning different filters and interpretations of the user query. You should use these when you prefer to get results, even if they don't match every criteria in your query. +The optional `effort` parameter controls the amount of effort the agent puts into the search. It accepts one of `"low"`, `"medium"`, or `"high"` — higher effort may improve result quality at the expense of increased latency and cost. When omitted, the search behaves as if the parameter did not exist. -- **`"precision"`**: Generates a single Weaviate query targeting the most likely interpretation of the user query. You should use this when you want the results to follow your query intent closely, even if that means potentially receiving no results. +The effort value is fixed for the lifetime of a search: paginating with [`.next()`](#pagination) reuses the same effort value on every page, just as the underlying searches are reused to keep the result set consistent. - -### Diversity ranking +### Customized filtering -`Search` supports adding diversity weighting to result rankings using Maximal Marginal Relevance (MMR). This is enabled by passing a `diversity_weight` parameter in the range of `0.0` to `1.0` — higher values favor more varied results over the most relevant ones. +Search Mode uses query rewriting to transform your original query into one or multiple Weaviate queries, each with either a search query, metadata filters, or both. The `filtering` parameter controls how many Weaviate queries are generated. -To use diversity ranking with target vectors, set the single target vector you want to use in the Query Agent's constructor. Diversity ranking is not yet supported with collections using multi-vector embeddings, and will only work across multiple collections if they share the same embedding model. +- **`"recall"`** (default): Generates multiple Weaviate queries spanning different filters and interpretations of the user query. You should use these when you prefer to get results, even if they don't match every criteria in your query. + +- **`"precision"`**: Generates a single Weaviate query targeting the most likely interpretation of the user query. You should use this when you want the results to follow your query intent closely, even if that means potentially receiving no results. + -### Search effort +### Diversity ranking -The optional `effort` parameter controls the amount of effort the agent puts into the search. It accepts one of `"low"`, `"medium"`, or `"high"` — higher effort may improve result quality at the expense of increased latency and cost. When omitted, the search behaves as if the parameter did not exist. +`Search` supports adding diversity weighting to result rankings using Maximal Marginal Relevance (MMR). This is enabled by passing a `diversity_weight` parameter in the range of `0.0` to `1.0` — higher values favor more varied results over the most relevant ones. -The effort value is fixed for the lifetime of a search: paginating with [`.next()`](#pagination) reuses the same effort value on every page, just as the underlying searches are reused to keep the result set consistent. +To use diversity ranking with target vectors, set the single target vector you want to use in the Query Agent's constructor. Diversity ranking is not yet supported with collections using multi-vector embeddings, and will only work across multiple collections if they share the same embedding model. From 9c6ce02d3c554371804b1809e1f0224a66450b6e Mon Sep 17 00:00:00 2001 From: Connor Shorten Date: Wed, 5 Aug 2026 07:22:46 -0400 Subject: [PATCH 41/84] add effort docs --- docs/query-agent/guides/search_mode.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/query-agent/guides/search_mode.md b/docs/query-agent/guides/search_mode.md index c34e8a339..cbb643c15 100644 --- a/docs/query-agent/guides/search_mode.md +++ b/docs/query-agent/guides/search_mode.md @@ -89,9 +89,7 @@ For more advanced searches, you can also specify _additional filters_ within the ### Effort -The optional `effort` parameter controls the amount of effort the agent puts into the search. It accepts one of `"low"`, `"medium"`, or `"high"` — higher effort may improve result quality at the expense of increased latency and cost. When omitted, the search behaves as if the parameter did not exist. - -The effort value is fixed for the lifetime of a search: paginating with [`.next()`](#pagination) reuses the same effort value on every page, just as the underlying searches are reused to keep the result set consistent. +The optional `effort` parameter controls the amount of effort the agent puts into the search. It accepts one of `"low"`, `"medium"`, or `"high"`. Higher effort may improve result quality at the expense of increased latency and cost. From 31f76fa4c854c2a1e454fd326946b63213dec2fa Mon Sep 17 00:00:00 2001 From: Connor Shorten Date: Wed, 5 Aug 2026 07:51:08 -0400 Subject: [PATCH 42/84] tweak search mode intro --- docs/query-agent/guides/search_mode.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/query-agent/guides/search_mode.md b/docs/query-agent/guides/search_mode.md index cbb643c15..005af0831 100644 --- a/docs/query-agent/guides/search_mode.md +++ b/docs/query-agent/guides/search_mode.md @@ -13,7 +13,7 @@ import TSCode from '!!raw-loader!/docs/query-agent/_includes/code/search_mode.mt -Search Mode transforms your query into actionable searches and returns the matching Weaviate objects directly. +Search Mode combines AI-powered semantic search with structured filtering and returns the matching Weaviate objects directly. For example, you could ask: @@ -21,6 +21,14 @@ For example, you could ask: And the agent will perform semantic search for `vintage shoes`, apply a filter for `price < 70`, and return the matching objects from your collections, ready for you to render or post-process. +You could also ask: + +> "Something comfortable to wear on a long flight" + +And the agent will use AI-powered search to find relevant objects, even when terms like `comfortable` or `long flight` never appear in your data. + +Under the hood, Search Mode does more than embed your query as-is. The agent writes one or more optimized semantic and structured queries, executes them against your collections, and reranks the retrieved objects by how well each one matches your original request. + For more details, see the page for [the Python client](https://weaviate-python-client.readthedocs.io/en/stable/weaviate-agents-python-client/docs/weaviate_agents.query.html#weaviate_agents.query.QueryAgent.search) or [the Typescript Client](https://weaviate.github.io/agents-typescript-client/classes/QueryAgent.html#search). ## Usage From fb34ea95f31c00cdb3e5b0b1e61f20fe1c782e74 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Thu, 6 Aug 2026 14:03:40 +0200 Subject: [PATCH 43/84] docs(backups): simplify chunking section, add version availability Restructure 'Chunking and file splitting' per feedback: lead with the mental model as two short bullet lists, add a mermaid per-file decision diagram, and halve the prose. All claims transcribed from the banked CodeBrief (4c21a268). Add 'Added in' banners: section-level v1.36.0 (backports v1.33.14/v1.34.11/v1.35.4) and per-variable rows for BACKUP_MIN_CHUNK_SIZE v1.36.3, BACKUP_SPLIT_FILE_SIZE v1.36.5. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01W7WuWNvSWD89uC4ACAV1AW --- docs/deploy/configuration/backups.md | 77 +++++++++++++++++++++------- 1 file changed, 59 insertions(+), 18 deletions(-) diff --git a/docs/deploy/configuration/backups.md b/docs/deploy/configuration/backups.md index bbb001fca..78f253ebd 100644 --- a/docs/deploy/configuration/backups.md +++ b/docs/deploy/configuration/backups.md @@ -782,34 +782,75 @@ If you would like your application to wait for the background backup process to ### Chunking and file splitting -Weaviate does not upload a [shard's](/weaviate/concepts/storage.md#logical-storage-units-indexes-shards-stores) files one by one. It packs them into chunks, and the way files are grouped into chunks determines how much of that backup a later [incremental backup](#incremental-backups) can reuse. Chunking runs on every backup, not only on incremental ones. - -Weaviate gives each of a shard's biggest files a chunk of its own, and only a file that gets its own chunk can be referenced individually by a later incremental backup. A chunk of its own is a requirement rather than a guarantee, because Weaviate only reuses files that it treats as immutable, so a large file that it keeps rewriting is uploaded again with every backup. All remaining files are packed together into shared chunks, and a shared chunk is uploaded again on every incremental backup whether or not anything in it changed, because only a chunk that holds a single big file can be skipped. A file larger than `BACKUP_SPLIT_FILE_SIZE` is spread across several chunks instead of being written into one. - -A file gets its own chunk once it reaches the qualifying size: the larger of `BACKUP_MIN_CHUNK_SIZE` and the size of the Nth largest file in the shard, where N is `BACKUP_MAX_INDIVIDUAL_FILES`. - -Because the larger of the two wins, `BACKUP_MIN_CHUNK_SIZE` is a floor on the qualifying size rather than a dial for it. Lowering it never reduces how many files get their own chunk, and it only increases that number while the shard holds fewer than `BACKUP_MAX_INDIVIDUAL_FILES` files above its current value. At the defaults, a shard with 100 or more files of at least `1MiB` is unaffected by a lower `BACKUP_MIN_CHUNK_SIZE`, because the size of the 100th largest file wins the comparison. To have more files referenced individually in that case, raise `BACKUP_MAX_INDIVIDUAL_FILES` instead, at the cost of more chunks per backup. +:::info Added in `v1.36.0` +Chunking and `BACKUP_CHUNK_TARGET_SIZE` were backported to `v1.33.14`, `v1.34.11`, and `v1.35.4`. The other variables were added later — see the table below. +::: -On an incremental backup, the `BACKUP_MAX_INDIVIDUAL_FILES` budget is reduced by the number of files that are reused from the base backup, so it is shared across a whole backup chain rather than being renewed for each backup in it. +On every backup, full or incremental, Weaviate packs each [shard's](/weaviate/concepts/storage.md#logical-storage-units-indexes-shards-stores) files into chunks: + +- Each of the shard's biggest files gets a **chunk of its own**. +- The remaining smaller files are packed together into **shared chunks** of roughly `BACKUP_CHUNK_TARGET_SIZE`. +- A file larger than `BACKUP_SPLIT_FILE_SIZE` is **split into parts**, and each part gets a chunk of its own that holds nothing else. + +Chunking matters because it determines how much a later [incremental backup](#incremental-backups) can reuse: + +- Only a file with a chunk of its own can be referenced from the base backup instead of copied again — and only if Weaviate treats the file as immutable. +- A big file that Weaviate keeps rewriting has its own chunk but is still re-uploaded on every backup. +- Shared chunks are re-uploaded on every incremental backup, even if nothing in them changed. + +A file gets its own chunk when it reaches the **qualifying size**: the larger of `BACKUP_MIN_CHUNK_SIZE` and the size of the shard's Nth largest file, where N is `BACKUP_MAX_INDIVIDUAL_FILES`, reduced on an incremental backup by the number of files already reused from the base backup. This budget is shared across a whole backup chain rather than renewed for each backup in it. Because the larger value wins, `BACKUP_MIN_CHUNK_SIZE` is a floor, not a dial: to have more files referenced individually, raise `BACKUP_MAX_INDIVIDUAL_FILES`. + +```mermaid +flowchart TD + File["Shard file"] + Qualifies{"Reaches the
qualifying size?"} + OverSplit{"Larger than
the split size?"} + Own["Own chunk"] + Parts["Split into parts,
one chunk per part"] + Shared["Packed into a
shared chunk"] + Immutable{"Immutable
file?"} + Reusable["Reusable by later
incremental backups"] + Reuploaded["Re-uploaded on
every backup"] + + File --> Qualifies + Qualifies -->|"No"| Shared + Qualifies -->|"Yes"| OverSplit + OverSplit -->|"No"| Own + OverSplit -->|"Yes"| Parts + Own --> Immutable + Parts --> Immutable + Immutable -->|"Yes"| Reusable + Immutable -->|"No"| Reuploaded + Shared --> Reuploaded + + style File fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style Qualifies fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style OverSplit fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style Own fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style Parts fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style Shared fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style Immutable fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style Reusable fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style Reuploaded fill:#ffffff,stroke:#B9C8DF,color:#130C49 +``` -A chunk that carries part of a split file holds nothing else, because Weaviate deliberately leaves the rest of that chunk empty rather than mixing split parts with regular files. The size of such a chunk is governed by `BACKUP_SPLIT_FILE_SIZE` rather than by `BACKUP_CHUNK_TARGET_SIZE`: Weaviate divides the file into roughly equal parts that are each at least half of the split size and no larger than the split size, so at the defaults these chunks are far larger than the target, not smaller. +The parts of a split file are sized by `BACKUP_SPLIT_FILE_SIZE`, not by the chunk target: Weaviate divides the file into roughly equal parts that are each at least half and at most the full split size. At the defaults, a chunk carrying a split part is therefore around `50GiB` — far larger than the `10MiB` chunk target, not smaller. -The three size variables below accept a plain number of bytes or a number with a unit suffix (`B`, `KB`, `MB`, `GB`, `TB`, `KiB`, `MiB`, `GiB`, `TiB`), for example `4MiB`. The decimal and binary suffixes are distinct: `MB` is 1,000,000 bytes while `MiB` is 1,048,576 bytes. They also accept `unlimited` or `nolimit`, which is how you disable file splitting through `BACKUP_SPLIT_FILE_SIZE`. All three are read at startup, so a restart is required to change them. `BACKUP_MAX_INDIVIDUAL_FILES` is a plain count instead of a size, and Weaviate reads it for each backup, so you can change it without a restart through the `backup_max_individual_files` [runtime configuration](./env-vars/runtime-config.md) key. +The three size variables accept a plain number of bytes or a number with a case-sensitive unit suffix (`B`, `KB`, `MB`, `GB`, `TB`, `KiB`, `MiB`, `GiB`, `TiB`), for example `4MiB`. Decimal and binary suffixes are distinct: `MB` is 1,000,000 bytes while `MiB` is 1,048,576 bytes. They also accept `unlimited` or `nolimit`, which is how you disable file splitting through `BACKUP_SPLIT_FILE_SIZE`. All three are read at startup, so changing them requires a restart. | Environment variable | Required | Description | | --- | --- | --- | -| `BACKUP_MIN_CHUNK_SIZE` | no | The floor on the qualifying size a file must reach before it is stored in its own chunk and becomes eligible to be referenced individually by a later incremental backup. Defaults to `1MiB`. | -| `BACKUP_CHUNK_TARGET_SIZE` | no | The size Weaviate aims for when packing several smaller files into a single chunk. Defaults to `10MiB`. | -| `BACKUP_SPLIT_FILE_SIZE` | no | The size above which a single file is split across multiple chunks instead of being written to one. Set it to `unlimited` to disable splitting. Defaults to `50GiB`. | -| `BACKUP_MAX_INDIVIDUAL_FILES` | no | How many of a shard's biggest files Weaviate aims to give a chunk of their own, and therefore how many become eligible to be referenced individually by a later incremental backup. This is a count rather than a size, and it must be greater than `0`. Defaults to `100`. Also settable without a restart through the `backup_max_individual_files` [runtime configuration](./env-vars/runtime-config.md) key.

Added in `v1.37.14` and `v1.38.7`. | +| `BACKUP_MIN_CHUNK_SIZE` | no | A floor on the qualifying size a file must reach to get a chunk of its own. Defaults to `1MiB`.

Added in `v1.36.3` (backported to `v1.34.18`, `v1.35.13`). | +| `BACKUP_CHUNK_TARGET_SIZE` | no | The size Weaviate aims for when packing several smaller files into a shared chunk. Defaults to `10MiB`.

Added in `v1.36.0` (backported to `v1.33.14`, `v1.34.11`, `v1.35.4`). | +| `BACKUP_SPLIT_FILE_SIZE` | no | The size above which a file is split into parts. Set it to `unlimited` to disable splitting. Defaults to `50GiB`.

Added in `v1.36.5` (backported to `v1.35.15`). | +| `BACKUP_MAX_INDIVIDUAL_FILES` | no | How many of a shard's biggest files Weaviate aims to give a chunk of their own — a target rather than a hard cap. This is a count, not a size, and it must be greater than `0`. Defaults to `100`. Settable without a restart through the `backup_max_individual_files` [runtime configuration](./env-vars/runtime-config.md) key.

Added in `v1.37.14` and `v1.38.7`. | :::note How Weaviate adjusts these values -These settings are lower bounds, not exact values, and Weaviate raises them when a smaller value would have no useful effect: +These settings are lower bounds rather than exact values: -- `BACKUP_CHUNK_TARGET_SIZE` is raised to the qualifying size if you set it lower, since a chunk that packs smaller files must still be able to hold one big file. -- `BACKUP_SPLIT_FILE_SIZE` is likewise raised to that size if you set it lower; otherwise no file would ever be big enough to split. -- If a shard holds fewer files than `BACKUP_MAX_INDIVIDUAL_FILES`, or than the reduced budget on an incremental backup, the qualifying size falls back to the size of the shard's smallest file, still raised to `BACKUP_MIN_CHUNK_SIZE` if that is larger. +- `BACKUP_CHUNK_TARGET_SIZE` and `BACKUP_SPLIT_FILE_SIZE` are raised to the qualifying size if you set them lower. +- If a shard holds fewer files than the `BACKUP_MAX_INDIVIDUAL_FILES` budget, the qualifying size falls back to the size of the shard's smallest file, still raised to `BACKUP_MIN_CHUNK_SIZE` if that is larger. ::: From acaa01d3bd98faf9c4a2fa2ff5e62e53f4c9a101 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Thu, 6 Aug 2026 14:17:12 +0200 Subject: [PATCH 44/84] docs(backups): scope the chunking knob guidance, tighten split-part bound MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Verifier fixes on fb34ea95: (1) which knob qualifies more files depends on whether the shard holds BACKUP_MAX_INDIVIDUAL_FILES files above the floor — the unconditional 'raise MAX_INDIVIDUAL_FILES' tip was false for smaller shards; (2) split-part chunks are up to 50GiB, not ~50GiB; (3) the small-shard fallback compares against the reduced budget on an incremental backup. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01W7WuWNvSWD89uC4ACAV1AW --- docs/deploy/configuration/backups.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/deploy/configuration/backups.md b/docs/deploy/configuration/backups.md index 78f253ebd..438f92003 100644 --- a/docs/deploy/configuration/backups.md +++ b/docs/deploy/configuration/backups.md @@ -798,7 +798,7 @@ Chunking matters because it determines how much a later [incremental backup](#in - A big file that Weaviate keeps rewriting has its own chunk but is still re-uploaded on every backup. - Shared chunks are re-uploaded on every incremental backup, even if nothing in them changed. -A file gets its own chunk when it reaches the **qualifying size**: the larger of `BACKUP_MIN_CHUNK_SIZE` and the size of the shard's Nth largest file, where N is `BACKUP_MAX_INDIVIDUAL_FILES`, reduced on an incremental backup by the number of files already reused from the base backup. This budget is shared across a whole backup chain rather than renewed for each backup in it. Because the larger value wins, `BACKUP_MIN_CHUNK_SIZE` is a floor, not a dial: to have more files referenced individually, raise `BACKUP_MAX_INDIVIDUAL_FILES`. +A file gets its own chunk when it reaches the **qualifying size**: the larger of `BACKUP_MIN_CHUNK_SIZE` and the size of the shard's Nth largest file, where N is `BACKUP_MAX_INDIVIDUAL_FILES`, reduced on an incremental backup by the number of files already reused from the base backup. This budget is shared across a whole backup chain rather than renewed for each backup in it. Because the larger value wins, `BACKUP_MIN_CHUNK_SIZE` is only a floor — lowering it never reduces how many files qualify. Which knob qualifies more files depends on the shard: with `BACKUP_MAX_INDIVIDUAL_FILES` or more files above the floor, raise `BACKUP_MAX_INDIVIDUAL_FILES`; with fewer, lower `BACKUP_MIN_CHUNK_SIZE`. ```mermaid flowchart TD @@ -834,7 +834,7 @@ flowchart TD style Reuploaded fill:#ffffff,stroke:#B9C8DF,color:#130C49 ``` -The parts of a split file are sized by `BACKUP_SPLIT_FILE_SIZE`, not by the chunk target: Weaviate divides the file into roughly equal parts that are each at least half and at most the full split size. At the defaults, a chunk carrying a split part is therefore around `50GiB` — far larger than the `10MiB` chunk target, not smaller. +The parts of a split file are sized by `BACKUP_SPLIT_FILE_SIZE`, not by the chunk target: Weaviate divides the file into roughly equal parts that are each at least half and at most the full split size. At the defaults, a chunk carrying a split part is therefore up to `50GiB` — far larger than the `10MiB` chunk target, not smaller. The three size variables accept a plain number of bytes or a number with a case-sensitive unit suffix (`B`, `KB`, `MB`, `GB`, `TB`, `KiB`, `MiB`, `GiB`, `TiB`), for example `4MiB`. Decimal and binary suffixes are distinct: `MB` is 1,000,000 bytes while `MiB` is 1,048,576 bytes. They also accept `unlimited` or `nolimit`, which is how you disable file splitting through `BACKUP_SPLIT_FILE_SIZE`. All three are read at startup, so changing them requires a restart. @@ -850,7 +850,7 @@ The three size variables accept a plain number of bytes or a number with a case- These settings are lower bounds rather than exact values: - `BACKUP_CHUNK_TARGET_SIZE` and `BACKUP_SPLIT_FILE_SIZE` are raised to the qualifying size if you set them lower. -- If a shard holds fewer files than the `BACKUP_MAX_INDIVIDUAL_FILES` budget, the qualifying size falls back to the size of the shard's smallest file, still raised to `BACKUP_MIN_CHUNK_SIZE` if that is larger. +- If a shard holds fewer files than the `BACKUP_MAX_INDIVIDUAL_FILES` budget (after subtracting files already reused on an incremental backup), the qualifying size falls back to the size of the shard's smallest file, still raised to `BACKUP_MIN_CHUNK_SIZE` if that is larger. ::: From b76dbd893365a066a04db44425ffab02f13c12e9 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Thu, 6 Aug 2026 14:20:35 +0200 Subject: [PATCH 45/84] docs(backups): state the knob-choice boundary against the reduced budget N The regime boundary at the raw env var was wrong on incrementals (backend.go:692 compares against the reduced budget); N is already defined in the preceding sentence. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01W7WuWNvSWD89uC4ACAV1AW --- docs/deploy/configuration/backups.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/deploy/configuration/backups.md b/docs/deploy/configuration/backups.md index 438f92003..cc3c64174 100644 --- a/docs/deploy/configuration/backups.md +++ b/docs/deploy/configuration/backups.md @@ -798,7 +798,7 @@ Chunking matters because it determines how much a later [incremental backup](#in - A big file that Weaviate keeps rewriting has its own chunk but is still re-uploaded on every backup. - Shared chunks are re-uploaded on every incremental backup, even if nothing in them changed. -A file gets its own chunk when it reaches the **qualifying size**: the larger of `BACKUP_MIN_CHUNK_SIZE` and the size of the shard's Nth largest file, where N is `BACKUP_MAX_INDIVIDUAL_FILES`, reduced on an incremental backup by the number of files already reused from the base backup. This budget is shared across a whole backup chain rather than renewed for each backup in it. Because the larger value wins, `BACKUP_MIN_CHUNK_SIZE` is only a floor — lowering it never reduces how many files qualify. Which knob qualifies more files depends on the shard: with `BACKUP_MAX_INDIVIDUAL_FILES` or more files above the floor, raise `BACKUP_MAX_INDIVIDUAL_FILES`; with fewer, lower `BACKUP_MIN_CHUNK_SIZE`. +A file gets its own chunk when it reaches the **qualifying size**: the larger of `BACKUP_MIN_CHUNK_SIZE` and the size of the shard's Nth largest file, where N is `BACKUP_MAX_INDIVIDUAL_FILES`, reduced on an incremental backup by the number of files already reused from the base backup. This budget is shared across a whole backup chain rather than renewed for each backup in it. Because the larger value wins, `BACKUP_MIN_CHUNK_SIZE` is only a floor — lowering it never reduces how many files qualify. Which knob qualifies more files depends on the shard: with N or more files above the floor, raise `BACKUP_MAX_INDIVIDUAL_FILES`; with fewer, lower `BACKUP_MIN_CHUNK_SIZE`. ```mermaid flowchart TD From 8182861c7815d76516ea5d7caefd1652dcecd2f8 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Thu, 6 Aug 2026 14:50:40 +0200 Subject: [PATCH 46/84] docs: fix the HIGH-severity findings from the docs deep review Fix pass over the 54 HIGH-severity findings of a 205-finding read-only review of docs.weaviate.io (/weaviate, /deploy, /cloud), taken at main commit 9102dca6. Every finding was re-verified against current HEAD before editing; five had already been fixed and one was refuted. Snippet and marker defects (FilteredTextBlock does per-line, case-sensitive substring matching with no uniqueness guard): - blank Java tabs on the generative starter guide (two marker defects) - xAI TS connect snippet dropped its API-key line to a casing typo - Go tabs concatenating two examples into non-compiling code (SingleGenerative* and Grouped* marker families) - image-search example response pulled from the wrong source file - three multi-vector tutorial sections rendering the same snippet - 10 RBAC OIDC tabs (Java + C#) rendered silently blank; the snippets are now written and were executed against a live RBAC stack Wrong or stale values, each verified at the release tag that introduced it rather than from a working tree: - hybrid alpha default 0.5 -> 0.75, and default fusion -> relativeScoreFusion - HFresh searchProbe 64 -> 256, version-qualified (v1.38.0/.1 still ship 64) - rescoreLimit split per index type; bq.rescoreLimit is silently ignored under hnsw, confirmed against a running instance - async replication defaults, framed as changed-in rather than wrong - empty-collections panic marked Fixed, with corrected version ranges (1.31.0 and 1.31.1 are still affected; 1.28 was never patched) - provider default models for OpenAI, Cohere and Jina AI - huggingface queryModel documented as the no-op it now is Provider API-key environment variables (31 files): docs told self-hosted users to set _API_KEY, but the modules read APIKEY, so the documented variable was silently ignored. Client-side variables in snippets are deliberately unchanged. Deleted endpoints in migration guides: /v1/cluster/schema-v1 (gone in v1.35.0) and /debug/index/rebuild/inverted/abort (replaced by /cancelReindexContext), including the debug port and the enabling flag, and the point of no return after cleanup. Retired docs/weaviate/tutorials/query.md, which was built on the removed Python v3 client and could not run, with a 301 to /weaviate/search. Also: services:html YAML corruption, a table rendering zero rows, a Python syntax error, generative-googles typo, a Docker page telling readers to edit values.yaml, and pre-Raft cluster limitations presented as current. --- _includes/code/csharp/RBACTest.cs | 108 +++++++ _includes/code/csharp/SearchGenerativeTest.cs | 4 +- .../go/docs/mainpkg/search-generative_test.go | 8 +- .../docs/model-providers/2-usage-text/main.go | 5 +- .../code/java-v6/src/test/java/RBACTest.java | 82 +++++ .../src/test/java/SearchGenerativeTest.java | 4 +- .../java/StarterGuidesGenerativeTest.java | 7 +- .../bq-compression-parameters.mdx | 2 +- .../rq-compression-parameters.mdx | 2 +- .../sq-compression-parameters.mdx | 2 +- docs/cloud/tools/collections-tool.mdx | 4 +- .../docker-installation.md | 2 +- docs/deploy/installation-guides/embedded.md | 10 +- docs/deploy/migration/weaviate-1-25.md | 19 +- docs/deploy/migration/weaviate-1-30.md | 124 ++++++-- docs/weaviate/api/graphql/search-operators.md | 6 +- docs/weaviate/best-practices/index.md | 4 +- docs/weaviate/client-libraries/csharp.mdx | 8 +- docs/weaviate/concepts/cluster.md | 14 +- .../weaviate/concepts/search/hybrid-search.md | 16 +- docs/weaviate/config-refs/collections.mdx | 12 +- .../config-refs/indexing/vector-index.mdx | 2 +- .../_includes/provider.connect.ts | 2 +- .../_includes/provider.generative.py | 5 +- .../_includes/provider.vectorizer.py | 5 +- .../_includes/provider.vectorizer.ts | 4 +- .../model-providers/anthropic/generative.md | 2 +- .../model-providers/anyscale/generative.md | 2 +- .../cohere/embeddings-multimodal.md | 2 +- .../model-providers/cohere/embeddings.md | 2 +- .../model-providers/cohere/generative.md | 7 +- .../model-providers/cohere/reranker.md | 2 +- .../contextualai/generative.md | 2 +- .../model-providers/contextualai/reranker.md | 2 +- .../model-providers/huggingface/embeddings.md | 16 +- .../jinaai/embeddings-colbert.md | 2 +- .../jinaai/embeddings-multimodal.md | 2 +- .../model-providers/jinaai/embeddings.md | 14 +- .../model-providers/jinaai/reranker.md | 2 +- .../model-providers/kubeai/embeddings.md | 2 +- .../model-providers/kubeai/generative.md | 2 +- .../model-providers/mistral/embeddings.md | 2 +- .../model-providers/mistral/generative.md | 2 +- .../nvidia/embeddings-multimodal.md | 2 +- .../model-providers/nvidia/embeddings.md | 2 +- .../model-providers/nvidia/generative.md | 2 +- .../model-providers/nvidia/reranker.md | 2 +- .../model-providers/octoai/embeddings.md | 2 +- .../model-providers/octoai/generative.md | 2 +- .../openai-azure/embeddings.md | 2 +- .../openai-azure/generative.md | 2 +- .../model-providers/openai/embeddings.md | 2 +- .../model-providers/openai/generative.md | 16 +- .../voyageai/embeddings-multimodal.md | 2 +- .../model-providers/voyageai/embeddings.md | 2 +- .../model-providers/voyageai/reranker.md | 2 +- .../model-providers/xai/generative.md | 2 +- docs/weaviate/modules/qna-openai.md | 10 +- docs/weaviate/modules/ref2vec-centroid.md | 2 +- .../more-resources/example-use-cases.md | 1 - docs/weaviate/release-notes/known-issues.mdx | 23 +- docs/weaviate/search/basics.md | 1 - docs/weaviate/search/generative.md | 12 +- docs/weaviate/search/hybrid.md | 3 +- docs/weaviate/search/image.md | 2 +- docs/weaviate/search/similarity.md | 1 - docs/weaviate/starter-guides/generative.md | 2 +- .../tutorials/multi-vector-embeddings.md | 16 +- docs/weaviate/tutorials/query.md | 294 ------------------ .../tutorials/vector-indexing-deep-dive.mdx | 6 +- docs/weaviate/tutorials/wikipedia.md | 2 +- netlify.toml | 8 + sidebars.js | 1 - 73 files changed, 511 insertions(+), 441 deletions(-) delete mode 100644 docs/weaviate/tutorials/query.md diff --git a/_includes/code/csharp/RBACTest.cs b/_includes/code/csharp/RBACTest.cs index a83b85b50..969442883 100644 --- a/_includes/code/csharp/RBACTest.cs +++ b/_includes/code/csharp/RBACTest.cs @@ -475,4 +475,112 @@ public async Task TestUserLifecycle() var usersAfterDelete = await client.Users.Db.List(); Assert.DoesNotContain(usersAfterDelete, u => u.UserId == testUser); } + + [Fact] + public async Task TestOidcUserLifecycle() + { + // An OIDC user is authenticated by the identity provider, so it is never + // created in Weaviate. Only its role assignments are managed here. + string testUser = "custom-user"; + string testRole = "testRole"; + + var permissions = new PermissionScope[] + { + new Permissions.Collections("TargetCollection*") { Read = true }, + }; + await client.Roles.Create(testRole, permissions); + + // START AssignOidcUserRole + await client.Users.Oidc.AssignRoles(testUser, new[] { testRole, "viewer" }); + // END AssignOidcUserRole + + // START ListOidcUserRoles + var oidcUserRoles = await client.Users.Oidc.GetRoles(testUser); + foreach (var role in oidcUserRoles) + { + Console.WriteLine(role.Name); + } + // END ListOidcUserRoles + + var oidcRoleNames = oidcUserRoles.Select(r => r.Name).ToList(); + Assert.Contains(testRole, oidcRoleNames); + Assert.Contains("viewer", oidcRoleNames); + + // START RevokeOidcUserRoles + await client.Users.Oidc.RevokeRoles(testUser, new[] { testRole }); + // END RevokeOidcUserRoles + + var rolesAfterRevoke = await client.Users.Oidc.GetRoles(testUser); + var namesAfterRevoke = rolesAfterRevoke.Select(r => r.Name).ToList(); + Assert.DoesNotContain(testRole, namesAfterRevoke); + Assert.Contains("viewer", namesAfterRevoke); + + // Leave no assignment behind for the next test run + await client.Users.Oidc.RevokeRoles(testUser, new[] { "viewer" }); + } + + [Fact] + public async Task TestOidcGroupLifecycle() + { + string testGroup = "/admin-group"; + string testRole = "testRole"; + + var permissions = new PermissionScope[] + { + new Permissions.Collections("TargetCollection*") { Read = true }, + }; + await client.Roles.Create(testRole, permissions); + + // START AssignOidcGroupRoles + await client.Groups.Oidc.AssignRoles(testGroup, new[] { testRole, "viewer" }); + // END AssignOidcGroupRoles + + // START GetOidcGroupRoles + var groupRoles = await client.Groups.Oidc.GetRoles(testGroup, includeFullRoles: true); + foreach (var role in groupRoles) + { + Console.WriteLine(role.Name); + } + // END GetOidcGroupRoles + + var groupRoleNames = groupRoles.Select(r => r.Name).ToList(); + Assert.Contains(testRole, groupRoleNames); + Assert.Contains("viewer", groupRoleNames); + + // START GetKnownOidcGroups + var knownGroups = await client.Groups.Oidc.GetKnownGroupNames(); + Console.WriteLine($"Known OIDC groups ({knownGroups.Count()}): {string.Join(", ", knownGroups)}"); + // END GetKnownOidcGroups + + // The C# client writes the group ID straight into the request path without + // URL-encoding it, so a leading slash collapses and Weaviate registers + // "/admin-group" as "admin-group". Compare the normalized form so this + // assertion keeps holding once the client encodes the path segment. + Assert.Contains(testGroup.TrimStart('/'), knownGroups.Select(g => g.TrimStart('/'))); + + // Known client defect: the DTO behind GetGroupAssignments declares its + // groupType as an enum without a string-enum converter, so decoding a + // non-empty response throws. The call below is the correct usage and + // starts passing as soon as the client adds the converter. + // START GetGroupAssignments + var groupAssignments = await client.Roles.GetGroupAssignments(testRole); + Console.WriteLine($"Groups assigned to role '{testRole}':"); + foreach (var assignment in groupAssignments) + { + Console.WriteLine($" - Group ID: {assignment.GroupId}, Type: {assignment.GroupType}"); + } + // END GetGroupAssignments + Assert.Contains( + groupAssignments, + a => a.GroupId.TrimStart('/') == testGroup.TrimStart('/') + ); + Assert.Contains(groupAssignments, a => a.GroupType == RbacGroupType.Oidc); + + // START RevokeOidcGroupRoles + await client.Groups.Oidc.RevokeRoles(testGroup, new[] { testRole, "viewer" }); + // END RevokeOidcGroupRoles + + var rolesAfterRevoke = await client.Groups.Oidc.GetRoles(testGroup); + Assert.Empty(rolesAfterRevoke); + } } diff --git a/_includes/code/csharp/SearchGenerativeTest.cs b/_includes/code/csharp/SearchGenerativeTest.cs index 236ab788b..c9b783472 100644 --- a/_includes/code/csharp/SearchGenerativeTest.cs +++ b/_includes/code/csharp/SearchGenerativeTest.cs @@ -188,7 +188,7 @@ public async Task TestSingleGenerativeParameters() [Fact] public async Task TestGroupedGenerative() { - // START GroupedGenerative + // START GroupedGenerativeBasic // highlight-start var task = "What do these animals have in common, if anything?"; // highlight-end @@ -204,7 +204,7 @@ public async Task TestGroupedGenerative() // print the generated response Console.WriteLine($"Grouped task result: {response.Generative?.Values.First()}"); - // END GroupedGenerative + // END GroupedGenerativeBasic } [Fact] diff --git a/_includes/code/howto/go/docs/mainpkg/search-generative_test.go b/_includes/code/howto/go/docs/mainpkg/search-generative_test.go index f9aa1a4e0..807fd1d5d 100644 --- a/_includes/code/howto/go/docs/mainpkg/search-generative_test.go +++ b/_includes/code/howto/go/docs/mainpkg/search-generative_test.go @@ -21,7 +21,7 @@ func TestSingleGenerative(t *testing.T) { client := setupClient() ctx := context.Background() - // START SingleGenerativeProperties Go + // START SingleGenerativeBasic Go generatePrompt := "Convert the following into a question for twitter. Include emojis for fun, but do not include the answer: {question}." gs := graphql.NewGenerativeSearch().SingleResult(generatePrompt) @@ -36,7 +36,7 @@ func TestSingleGenerative(t *testing.T) { WithConcepts([]string{"World history"})). WithLimit(2). Do(ctx) - // END SingleGenerativeProperties Go + // END SingleGenerativeBasic Go require.NoError(t, err) @@ -109,7 +109,7 @@ func TestGroupedGenerative(t *testing.T) { client := setupClient() ctx := context.Background() - // START GroupedGenerative Go + // START GroupedGenerativeBasic Go generatePrompt := "What do these animals have in common, if anything?" gs := graphql.NewGenerativeSearch().GroupedResult(generatePrompt) @@ -124,7 +124,7 @@ func TestGroupedGenerative(t *testing.T) { WithConcepts([]string{"Cute animals"})). WithLimit(3). Do(ctx) - // END GroupedGenerative Go + // END GroupedGenerativeBasic Go require.NoError(t, err) diff --git a/_includes/code/howto/go/docs/model-providers/2-usage-text/main.go b/_includes/code/howto/go/docs/model-providers/2-usage-text/main.go index e25ed6a6e..400ddbc45 100644 --- a/_includes/code/howto/go/docs/model-providers/2-usage-text/main.go +++ b/_includes/code/howto/go/docs/model-providers/2-usage-text/main.go @@ -424,10 +424,9 @@ func main() { Vectorizer: map[string]interface{}{ "text2vec-huggingface": map[string]interface{}{ "properties": []string{"title"}, - // Note: Use only one of (`model`), (`passage_model` and `query_model`), or (`endpoint_url`) + // Note: Use only one of (`model`), (`passage_model`), or (`endpoint_url`) "model": "sentence-transformers/all-MiniLM-L6-v2", - // "passage_model": "sentence-transformers/facebook-dpr-ctx_encoder-single-nq-base", // Required if using `query_model` - // "query_model": "sentence-transformers/facebook-dpr-question_encoder-single-nq-base", // Required if using `passage_model` + // "passage_model": "sentence-transformers/facebook-dpr-ctx_encoder-single-nq-base", // "endpoint_url": "", // // Optional parameters // "wait_for_model": true, diff --git a/_includes/code/java-v6/src/test/java/RBACTest.java b/_includes/code/java-v6/src/test/java/RBACTest.java index 60acb2d01..5a20589b4 100644 --- a/_includes/code/java-v6/src/test/java/RBACTest.java +++ b/_includes/code/java-v6/src/test/java/RBACTest.java @@ -14,6 +14,7 @@ import io.weaviate.client6.v1.api.rbac.TenantsPermission; import io.weaviate.client6.v1.api.rbac.UsersPermission; import io.weaviate.client6.v1.api.rbac.groups.GroupType; +import io.weaviate.client6.v1.api.rbac.roles.GroupAssignment; import io.weaviate.client6.v1.api.rbac.users.DbUser; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; @@ -428,4 +429,85 @@ void testUserLifecycle() throws IOException { // END DeleteUser assertThat(client.users.db.byName(testUser)).isEmpty(); } + + @Test + void testOidcUserLifecycle() throws IOException { + // An OIDC user is authenticated by the identity provider, so it is never + // created in Weaviate. Only its role assignments are managed here. + String testUser = "custom-user"; + String testRole = "testRole"; + + Permission[] permissions = new Permission[] {Permission + .collections("TargetCollection*", CollectionsPermission.Action.READ),}; + client.roles.create(testRole, permissions); + + // START AssignOidcUserRole + client.users.oidc.assignRoles(testUser, testRole, "viewer"); + // END AssignOidcUserRole + + // START ListOidcUserRoles + var oidcUserRoles = client.users.oidc.assignedRoles(testUser); + for (Role role : oidcUserRoles) { + System.out.println(role.name()); + } + // END ListOidcUserRoles + assertThat(oidcUserRoles).extracting(Role::name).contains(testRole, "viewer"); + + // START RevokeOidcUserRoles + client.users.oidc.revokeRoles(testUser, testRole); + // END RevokeOidcUserRoles + assertThat(client.users.oidc.assignedRoles(testUser)).extracting(Role::name) + .doesNotContain(testRole) + .contains("viewer"); + + // Leave no assignment behind for the next test run + client.users.oidc.revokeRoles(testUser, "viewer"); + } + + @Test + void testOidcGroupLifecycle() throws IOException { + String testGroup = "/admin-group"; + String testRole = "testRole"; + + Permission[] permissions = new Permission[] {Permission + .collections("TargetCollection*", CollectionsPermission.Action.READ),}; + client.roles.create(testRole, permissions); + + // START AssignOidcGroupRoles + client.groups.assignRoles(testGroup, testRole, "viewer"); + // END AssignOidcGroupRoles + + // START GetOidcGroupRoles + List groupRoles = client.groups.assignedRoles(testGroup, + g -> g.includePermissions(true)); + for (Role role : groupRoles) { + System.out.println(role.name()); + } + // END GetOidcGroupRoles + assertThat(groupRoles).extracting(Role::name).contains(testRole, "viewer"); + + // START GetKnownOidcGroups + List knownGroups = client.groups.knownGroupNames(); + System.out.println("Known OIDC groups (" + knownGroups.size() + "): " + knownGroups); + // END GetKnownOidcGroups + assertThat(knownGroups).contains(testGroup); + + // START GetGroupAssignments + List groupAssignments = client.roles.groupAssignments(testRole); + System.out.println("Groups assigned to role '" + testRole + "':"); + for (GroupAssignment assignment : groupAssignments) { + System.out.println(" - Group ID: " + assignment.groupId() + ", Type: " + + assignment.groupType()); + } + // END GetGroupAssignments + assertThat(groupAssignments).extracting(GroupAssignment::groupId) + .contains(testGroup); + assertThat(groupAssignments).extracting(GroupAssignment::groupType) + .contains(GroupType.OIDC); + + // START RevokeOidcGroupRoles + client.groups.revokeRoles(testGroup, testRole, "viewer"); + // END RevokeOidcGroupRoles + assertThat(client.groups.assignedRoles(testGroup)).isEmpty(); + } } diff --git a/_includes/code/java-v6/src/test/java/SearchGenerativeTest.java b/_includes/code/java-v6/src/test/java/SearchGenerativeTest.java index 1fdf34f53..0efef7e3c 100644 --- a/_includes/code/java-v6/src/test/java/SearchGenerativeTest.java +++ b/_includes/code/java-v6/src/test/java/SearchGenerativeTest.java @@ -163,7 +163,7 @@ void testSingleGenerativeParameters() { @Test void testGroupedGenerative() { - // START GroupedGenerativePython + // START GroupedGenerativeBasic // highlight-start String task = "What do these animals have in common, if anything?"; // highlight-end @@ -179,7 +179,7 @@ void testGroupedGenerative() { // print the generated response System.out.printf("Grouped task result: %s\n", response.generative().text()); - // END GroupedGenerativePython + // END GroupedGenerativeBasic } @Test diff --git a/_includes/code/java-v6/src/test/java/StarterGuidesGenerativeTest.java b/_includes/code/java-v6/src/test/java/StarterGuidesGenerativeTest.java index d8da5bfa9..0d7bd0f7b 100644 --- a/_includes/code/java-v6/src/test/java/StarterGuidesGenerativeTest.java +++ b/_includes/code/java-v6/src/test/java/StarterGuidesGenerativeTest.java @@ -24,6 +24,7 @@ class StarterGuidesGenerativeTest { private final ObjectMapper objectMapper = new ObjectMapper(); + // START ChunkText private List downloadAndChunk(String srcUrl, int chunkSize, int overlapSize) throws Exception { // Retrieve source text @@ -64,12 +65,14 @@ void testFullWorkflow() throws Exception { // === Connect to Local and Setup GitBookChunk Collection ======== // ================================================================= - // Re-instantiate for writing data (Connect to Local) + // START Instantiation + // Pass the API key for your LLM provider, OpenAI in this case, as a header client = WeaviateClient.connectToLocal(config -> config.setHeaders( Map.of("X-OpenAI-Api-Key", System.getenv("OPENAI_API_KEY")))); + // END Instantiation assertThat(client.isReady()).isTrue(); - // ChunkText + // Download and chunk the source text String proGitChapterUrl = "https://raw.githubusercontent.com/progit/progit2/main/book/01-introduction/sections/what-is-git.asc"; List chunkedText = downloadAndChunk(proGitChapterUrl, 150, 25); diff --git a/_includes/configuration/bq-compression-parameters.mdx b/_includes/configuration/bq-compression-parameters.mdx index 9552fb9b1..8e4773eb7 100644 --- a/_includes/configuration/bq-compression-parameters.mdx +++ b/_includes/configuration/bq-compression-parameters.mdx @@ -1,6 +1,6 @@ | Parameter | Type | Default | Details | | :---------------------- | :------ | :------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `bq` : `enabled` | boolean | `false` | Enable BQ. Weaviate uses binary quantization (BQ) compression when `true`.

The Python client does not use the `enabled` parameter. To enable BQ with the v4 client, set a `quantizer` in the collection definition. | -| `bq` : `rescoreLimit` | integer | -1 | The minimum number of candidates to fetch before rescoring. | +| `bq` : `rescoreLimit` | integer | `-1` | The minimum number of candidates to fetch before rescoring. A default of `-1` lets Weaviate pick the limit.
(only when using the `flat` vector index type)

Under the `hnsw` vector index type, BQ has no `rescoreLimit` setting. A value set there is accepted by the API but silently discarded, and it does not appear when you read the collection definition back. | | `bq` : `cache` | boolean | `false` | Whether to cache the vectors in memory.
(only when using the `flat` vector index type) | | `vectorCacheMaxObjects` | integer | `1e12` | Maximum number of objects in the memory cache. By default, this limit is set to one trillion (`1e12`) objects when a new collection is created. For sizing recommendations, see [Vector cache considerations](/weaviate/concepts/vector-index#vector-cache-considerations). | diff --git a/_includes/configuration/rq-compression-parameters.mdx b/_includes/configuration/rq-compression-parameters.mdx index 2e51380fa..52333c815 100644 --- a/_includes/configuration/rq-compression-parameters.mdx +++ b/_includes/configuration/rq-compression-parameters.mdx @@ -1,6 +1,6 @@ | Parameter | Type | Default | Details | | :---------------------- | :------ | :------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `rq`: `bits` | integer | `8` | The number of bits used to quantize each data point. Value can be `8` or `1`.

Learn more about [8-bit](/weaviate/concepts/vector-quantization#8-bit-rq) and [1-bit](/weaviate/concepts/vector-quantization#1-bit-rq) RQ. | -| `rq`: `rescoreLimit` | integer | `-1` | The minimum number of candidates to fetch before rescoring. | +| `rq`: `rescoreLimit` | integer | `20` (`hnsw`, 8-bit)
`512` (`hnsw`, 1-bit)
`-1` (`flat`) | The minimum number of candidates to fetch before rescoring.

The default depends on the vector index type, and under `hnsw` also on `bits`: `20` for 8-bit RQ and `512` for 1-bit RQ. Under the `flat` index type the default is `-1`, which lets Weaviate pick the limit.

These defaults apply to the `hnsw` and `flat` index types. For the HFresh index, see [HFresh index parameters](/weaviate/config-refs/indexing/vector-index#hfresh-index-parameters). | | `rq` : `cache` | boolean | `false` | Whether to cache the vectors in memory.
(only when using the `flat` vector index type) | | `vectorCacheMaxObjects` | integer | `1e12` | Maximum number of objects in the memory cache. By default, this limit is set to one trillion (`1e12`) objects when a new collection is created. For sizing recommendations, see [Vector cache considerations](/weaviate/concepts/vector-index#vector-cache-considerations). | diff --git a/_includes/configuration/sq-compression-parameters.mdx b/_includes/configuration/sq-compression-parameters.mdx index a49ed00b8..572eb4dc8 100644 --- a/_includes/configuration/sq-compression-parameters.mdx +++ b/_includes/configuration/sq-compression-parameters.mdx @@ -1,6 +1,6 @@ | Parameter | Type | Default | Details | | :---------------------- | :------ | :------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `sq`: `enabled` | boolean | `false` | Uses SQ when `true`.

The Python client does not use the `enabled` parameter. To enable SQ with the v4 client, set a `quantizer` in the collection definition. | -| `sq`: `rescoreLimit` | integer | -1 | The minimum number of candidates to fetch before rescoring. | +| `sq`: `rescoreLimit` | integer | `20` (`hnsw`)
`-1` (`flat`) | The minimum number of candidates to fetch before rescoring.

The default depends on the vector index type: `20` under `hnsw`, and `-1` under `flat`, which lets Weaviate pick the limit. | | `sq`: `trainingLimit` | integer | 100000 | The size of the training set to determine scalar bucket boundaries. | | `vectorCacheMaxObjects` | integer | `1e12` | Maximum number of objects in the memory cache. By default, this limit is set to one trillion (`1e12`) objects when a new collection is created. For sizing recommendations, see [Vector cache considerations](/weaviate/concepts/vector-index#vector-cache-considerations). | diff --git a/docs/cloud/tools/collections-tool.mdx b/docs/cloud/tools/collections-tool.mdx index 9d46212b9..546e26afd 100644 --- a/docs/cloud/tools/collections-tool.mdx +++ b/docs/cloud/tools/collections-tool.mdx @@ -262,7 +262,7 @@ Some collection settings that are not available in the console can be updated pr ### Enable TTL for a collection -[Time-to-live (TTL)](/docs/weaviate/manage-collections/time-to-live.mdx) allows you to set an expiration time for objects in a collection. TTLs are currently defined at the collection level. They can be set relative to an object's creation time, the last update time, or a specific DATE property within the object. +[Time-to-live (TTL)](/weaviate/manage-collections/time-to-live.mdx) allows you to set an expiration time for objects in a collection. TTLs are currently defined at the collection level. They can be set relative to an object's creation time, the last update time, or a specific DATE property within the object.
diff --git a/docs/deploy/installation-guides/docker-installation.md b/docs/deploy/installation-guides/docker-installation.md index 7da7faaa0..0d1f59c02 100644 --- a/docs/deploy/installation-guides/docker-installation.md +++ b/docs/deploy/installation-guides/docker-installation.md @@ -418,7 +418,7 @@ Alternatively you can run docker compose entirely detached with `docker compose ### Set `CLUSTER_HOSTNAME` if it may change over time -In some systems, the cluster hostname may change over time. This is known to create issues with a single-node Weaviate deployment. To avoid this, set the `CLUSTER_HOSTNAME` environment variable in the `values.yaml` file to the cluster hostname. +In some systems, the cluster hostname may change over time. This is known to create issues with a single-node Weaviate deployment. To avoid this, set the `CLUSTER_HOSTNAME` environment variable in your `docker-compose.yml` file to the cluster hostname. ```yaml --- diff --git a/docs/deploy/installation-guides/embedded.md b/docs/deploy/installation-guides/embedded.md index 686787c63..173e400be 100644 --- a/docs/deploy/installation-guides/embedded.md +++ b/docs/deploy/installation-guides/embedded.md @@ -47,7 +47,15 @@ To configure Embedded Weaviate, set these variables in your instantiation code o | `hostname` | string | 127.0.0.1 | Hostname or IP address | | `persistence_data_path` | string | varies | Data storage directory.

If `XDG_DATA_HOME` is set, the default is: `XDG_DATA_HOME/weaviate/`

If `XDG_DATA_HOME` is not set, the default is: `~/.local/share/weaviate` | | `port` | integer | 8079 | The Weaviate server request port. | -| `version` | string | Latest stable | Specify the version with one of the following:
-`"latest"`
- The version number as a string: `"1.19.6"`
- The URL of a Weaviate binary ([See below](/deploy/installation-guides/embedded.md#file-url)) | +| `version` | string | A version pinned in the client (see note) | Specify the version with one of the following:
-`"latest"`
- The version number as a string: `"1.19.6"`
- The URL of a Weaviate binary ([See below](/deploy/installation-guides/embedded.md#file-url)) | + +:::note Set `version` explicitly + +If you do not set `version`, Embedded Weaviate does not run the latest Weaviate release. The client falls back to a single Weaviate version that is fixed in the client source code when that client release is published. That pin only moves when the client is released again, so it can be several Weaviate minor releases behind the current one, and upgrading your client can also change which Weaviate version your embedded instance runs. + +Set `version` explicitly so you control which server version you get. Use `"latest"` to resolve the newest Weaviate release at startup, or pin a version number such as `"1.19.6"` for a reproducible environment. The version in use is printed in the embedded server startup logs. + +::: :::warning Do not modify `XDG_CACHE_HOME` or `XDG_DATA_HOME` The `XDG_DATA_HOME` and `XDG_CACHE_HOME` environment variables are widely used system variables. If you modify them, you may break other applications. diff --git a/docs/deploy/migration/weaviate-1-25.md b/docs/deploy/migration/weaviate-1-25.md index f93ae9165..f35223ece 100644 --- a/docs/deploy/migration/weaviate-1-25.md +++ b/docs/deploy/migration/weaviate-1-25.md @@ -32,7 +32,9 @@ As a result, to migrate from a pre-`1.25` version of Weaviate to `1.25` on kuber For more details, refer to the [upgrade instructions](#upgrade-instructions) below. -To downgrade from `1.25` to a pre-`1.25` version, you must perform a `POST` request to the `v1/cluster/schema-v1` endpoint to downgrade the metadata. Then, you must similarly delete the deployed `StatefulSet` and downgrade Weaviate to the desired version. +Downgrading from `1.25` to a pre-`1.25` version required a matching metadata step, performed with a `POST` request to the `v1/cluster/schema-v1` endpoint, followed by deleting the deployed `StatefulSet` and downgrading Weaviate to the desired version. + +That endpoint only exists in `v1.25.0` through `v1.34.20`. It was removed in `v1.35.0`, and there is no supported way to downgrade a `v1.35.0` or later instance to a pre-`1.25` version. For more details, refer to the [downgrade instructions](#downgrade-instructions) below. @@ -160,17 +162,26 @@ If the number of objects under `statistics` matches the number of replicas you h ## Downgrade instructions -If you need to downgrade from `1.25` to a pre-`1.25` version, you must perform a `POST` request to the `v1/cluster/schema-v1` (a payload is not required) to downgrade the cluster metadata. +:::caution Applies to `v1.25.0` through `v1.34.20` only + +The procedure below depends on the `v1/cluster/schema-v1` endpoint, which converted the Raft cluster metadata back into the pre-`1.25` format. + +- On `v1.25.0` through `v1.34.20`, follow the steps below. +- On `v1.35.0` and later, the endpoint no longer exists. A `POST` request to it returns `404`, and the code that writes the pre-`1.25` metadata store was removed at the same time. Weaviate provides no supported path to downgrade a `v1.35.0` or later instance to a pre-`1.25` version. If you need to run a pre-`1.25` version again, deploy it separately and restore a [backup](/deploy/configuration/backups.md) that was created before the upgrade. + +::: + +If you need to downgrade from `1.25` to a pre-`1.25` version, and your cluster runs `v1.25.0` through `v1.34.20`, you must perform a `POST` request to the `v1/cluster/schema-v1` endpoint (a payload is not required) to downgrade the cluster metadata. ### 1. Downgrade cluster metadata Perform the following request to downgrade the cluster metadata. This will prepare the cluster for a downgrade to a pre-`1.25` version. (Remember to replace `localhost:8080` with the correct URL & port.) ```bash -curl -X POST -s -o /dev/null -w "%{http_code}" localhost:8080/v1/cluster/schema-v1 +curl -X POST -s -o /dev/null -w "%{http_code}\n" localhost:8080/v1/cluster/schema-v1 ``` -This should return a `200` status code. +This should return a `200` status code. A `404` status code means the endpoint is not present, which is the case on `v1.35.0` and later. Do not continue with the downgrade in that case, because the cluster metadata has not been converted. ### 2. Delete StatefulSet diff --git a/docs/deploy/migration/weaviate-1-30.md b/docs/deploy/migration/weaviate-1-30.md index 56045215f..bcee132d0 100644 --- a/docs/deploy/migration/weaviate-1-30.md +++ b/docs/deploy/migration/weaviate-1-30.md @@ -28,6 +28,27 @@ Before starting the migration process, be aware of the following: - If possible, schedule migration to avoid large data imports/updates/deletes, especially during the re-indexing stage - BlockMax WAND may return slightly different scores than WAND if you search on multiple properties or have a delete-heavy workflow, as it computes term statistics differently +## Debug endpoints used in this guide + +Several steps below call Weaviate's debug endpoints under `/debug/index/rebuild/inverted/`. These endpoints have two requirements that differ from the regular REST API: + +- They are served by the debug HTTP listener on the Go profiling port, which defaults to `6060` and is set with [`GO_PROFILING_PORT`](/deploy/configuration/env-vars/index.md). They are **not** available on the main API port, which defaults to `8080`. A request to a debug route on the main port returns `404`. +- In `v1.36.18`, `v1.37.9`, `v1.38.1` and later, every debug route returns `404` unless [`DEBUG_ENDPOINTS_ENABLED`](/deploy/configuration/env-vars/index.md) is set to `true`. In earlier releases on each of those lines, the routes are served whenever profiling is not switched off with `GO_PROFILING_DISABLE`. + +To open the debug listener, restart the node with: + +```bash +DEBUG_ENDPOINTS_ENABLED=true +``` + +:::warning The debug listener is unauthenticated + +Anything that can reach the profiling port can call these endpoints, including the ones that change migration state. Keep the port reachable only from inside your cluster network, and set `DEBUG_ENDPOINTS_ENABLED` back to `false` when the migration is finished. + +::: + +In the examples below, replace `` with the address of the Weaviate node you are targeting, `` with the collection you are migrating, and `6060` with your `GO_PROFILING_PORT` if you changed it. + ## Migration process The migration involves three main stages: @@ -50,7 +71,7 @@ During this stage: 1. Restart your Weaviate instance with the following configuration: -``` +```bash REINDEX_MAP_TO_BLOCKMAX_AT_STARTUP=weaviate ``` @@ -60,18 +81,15 @@ If your node has a different name than "weaviate", replace it with your actual n ::: -2. Monitor the migration progress by checking: +2. Monitor the migration progress by checking the status endpoint: - ``` - http://:</debug/index/rebuild/inverted/status?collection= + ```bash + curl -s "http://:6060/debug/index/rebuild/inverted/status?collection=" ``` :::note -Replace: -- `` with the name of your Weaviate node -- `` with the actual port (default is `6060`) -- `` with the name of the collection being migrated. +This endpoint is served on the debug listener, not on the main API port. See [Debug endpoints used in this guide](#debug-endpoints-used-in-this-guide) for the port and the flag that enables it. ::: @@ -282,26 +300,92 @@ The migration process progresses through several stages, which can be monitored ### Aborting migration and rolling back -If you have issues with the reindexing process and want to stop it: +:::caution The `abort` endpoint was removed -1. Call the abort endpoint: +Earlier versions of this guide called `/debug/index/rebuild/inverted/abort`. That endpoint was removed in `v1.30.11`, `v1.31.5` and `v1.32.0`, so it returns `404` on every release covered by this guide. Use `cancelReindexContext` below instead. - ``` - http://:</debug/index/rebuild/inverted/abort - ``` +::: -2. To fully stop and rollback data to the initial stage, restart the server with: - ``` - REINDEX_MAP_TO_BLOCKMAX_AT_STARTUP=true - REINDEX_MAP_TO_BLOCKMAX_ROLLBACK=true - ``` +All of the endpoints in this section are served on the debug listener, not on the main API port. See [Debug endpoints used in this guide](#debug-endpoints-used-in-this-guide) for the port and the flag that enables them. -:::caution +#### Stop the reindexing work + +To cancel the node-wide reindex context, which stops the reindexing work on that node: + +```bash +curl -s -o /dev/null -w "%{http_code}\n" -X POST \ + "http://:6060/debug/index/rebuild/inverted/cancelReindexContext" +``` + +This returns `202`. It is the direct replacement for the removed `abort` endpoint: it takes no parameters and applies to the whole node. + +To pause one collection instead, so that the task stops cleanly at its next checkpoint and can be resumed later: + +```bash +curl -s "http://:6060/debug/index/rebuild/inverted/suspend?collection=" +``` + +Add `&shards=,` to pause only specific shards. Omit `shards` to pause every shard in the collection. To resume: + +```bash +curl -s "http://:6060/debug/index/rebuild/inverted/resume?collection=" +``` -Rolling back is only possible before cleanup! +:::note Read the response body, not only the status code + +`suspend`, `resume`, `rollback` and `unrollback` return `200` even when they do nothing. Failures are reported in the body, for example `{"error":"shard not found or not ready"}`, which is what you get when no migration has been started for that collection. ::: +#### Roll back to the old format + +To roll a collection back to the `mapcollection` format: + +```bash +curl -s "http://:6060/debug/index/rebuild/inverted/rollback?collection=" +``` + +This marks the collection for rollback. The rollback itself is applied the next time each shard is loaded, which means on the next node restart, or on tenant reactivation for multi-tenant collections. When it runs, Weaviate unswaps the ingest and backup buckets if they were already swapped, removes the reindex bucket directories, and clears the migration files. + +To cancel a rollback that you requested but that has not been applied yet: + +```bash +curl -s "http://:6060/debug/index/rebuild/inverted/unrollback?collection=" +``` + +:::caution Cleanup is the point of no return + +Rollback restores the old format from the `mapcollection` buckets that Stage 3 deletes. Once a shard has been tidied, there is nothing left to restore, and the rollback fails when the shard is loaded. The node logs an error: + +- `rollback: backup buckets are deleted, can not restore` in `v1.38.0` and later +- `rollback: searchable map buckets are deleted, can not restore` in earlier releases + +After cleanup, the only way back to the old format is to restore a [backup](/deploy/configuration/backups.md) that was created before the migration. Validate your BM25 and hybrid search results and performance before you run Stage 3. + +::: + +#### Endpoint availability + +These endpoints are not all present in every release covered by this guide. Check the release you run before you depend on one. + +| Endpoint | Purpose | Available in | +| :-- | :-- | :-- | +| `status?collection=` | Report the migration status per shard | All releases in this guide | +| `cancelReindexContext` | Cancel the node-wide reindex context | `v1.30.11`, `v1.31.5`, `v1.32.0` and later | +| `suspend`, `resume` | Pause and resume a collection | `v1.30.11`, `v1.31.5`, `v1.32.0` and later | +| `rollback`, `unrollback` | Request and cancel a rollback | `v1.30.11`, `v1.31.5`, `v1.32.0` and later | +| `start`, `unstart` | Set and clear the start trigger | `v1.30.11`, `v1.31.5`, `v1.32.0` and later | +| `overrides`, `set_overrides` | Read and write per-shard overrides | `v1.30.11`, `v1.31.5`, `v1.32.0` and later | +| `reset`, `unreset` | Set and clear the reset trigger | `v1.30.18`, `v1.31.11`, `v1.32.4` and later | +| `setProperties?properties=,` | Choose which properties to migrate | `v1.30.18`, `v1.31.11`, `v1.32.4` and later | +| `reload` | Reinitialize the selected shards without restarting the node | `v1.30.11`, `v1.31.5`, `v1.32.0` and later, up to `v1.37`. Removed in `v1.38.0` | + +Where a row lists several versions, the endpoint is present from that patch onwards on each of those release lines. A release earlier than the listed patch on its own line does not have it, even if it is numerically higher than a patch listed for an older line. + +`suspend`, `resume`, `rollback`, `unrollback`, `start`, `unstart`, `reset` and `unreset` work by creating or deleting a marker file in the migration directory of each selected shard, at `///lsm/.migrations/searchable_map_to_blockmax/`. `setProperties` writes the property list into a file in the same directory. Newer releases append a generation suffix to the directory name, for example `searchable_map_to_blockmax_1`. + +The migration task reads these files at its checkpoints, which is why a pause takes effect at the next checkpoint and a rollback at the next shard load, rather than immediately. + ## Environment variable reference - `REINDEX_MAP_TO_BLOCKMAX_AT_STARTUP=`: Enables and starts the migration process that converts the `property__searchable` from mapcollection to the inverted blockmax format (double writes are done). Required for other `REINDEX_MAP_TO_BLOCKMAX_*` variables to work diff --git a/docs/weaviate/api/graphql/search-operators.md b/docs/weaviate/api/graphql/search-operators.md index 17374ee78..7cd5023a7 100644 --- a/docs/weaviate/api/graphql/search-operators.md +++ b/docs/weaviate/api/graphql/search-operators.md @@ -268,13 +268,13 @@ This operator allows you to combine [BM25](#bm25) and vector search to get a "be | `bm25SearchOperator` | no | `object` | set how many of the (bm25) query tokens must be present within a single searched property for an object to be considered a match. (available from `v1.31.0`) | * Notes: - * `alpha` can be any number from 0 to 1, defaulting to 0.75. + * `alpha` can be any number from 0 to 1, defaulting to 0.75. See [Alpha parameter](/weaviate/concepts/search/hybrid-search.md#alpha-parameter). * `alpha` = 0 forces using a pure **keyword** search method (BM25) * `alpha` = 1 forces using a pure **vector** search method * `alpha` = 0.5 weighs the BM25 and vector methods evenly * `fusionType` can be `rankedFusion` or `relativeScoreFusion` - * `rankedFusion` (default) adds inverted ranks of the BM25 and vector search methods - * `relativeScoreFusion` adds normalized scores of the BM25 and vector search methods + * `relativeScoreFusion` (default from `v1.24`) adds normalized scores of the BM25 and vector search methods + * `rankedFusion` (default for `v1.23` and lower) adds inverted ranks of the BM25 and vector search methods ### Fusion algorithms diff --git a/docs/weaviate/best-practices/index.md b/docs/weaviate/best-practices/index.md index b218148ff..1abfc971d 100644 --- a/docs/weaviate/best-practices/index.md +++ b/docs/weaviate/best-practices/index.md @@ -270,8 +270,8 @@ from weaviate.classes.config import Property, DataType client.collections.create( name="WikiArticle", properties=[ - Property(name="title", data_type=DataType.TEXT) - Property(name="category", data_type=DataType.TEXT) + Property(name="title", data_type=DataType.TEXT), + Property(name="category", data_type=DataType.TEXT), ], ) ``` diff --git a/docs/weaviate/client-libraries/csharp.mdx b/docs/weaviate/client-libraries/csharp.mdx index c1f1590c3..cce6f704c 100644 --- a/docs/weaviate/client-libraries/csharp.mdx +++ b/docs/weaviate/client-libraries/csharp.mdx @@ -74,10 +74,10 @@ import BasicPrereqs from "/_includes/prerequisites-quickstart.md"; Get started with Weaviate using this C# example. The code walks you through these key steps: -1. **[Connect to Weaviate](docs/weaviate/connections/index.mdx)**: Establish a connection to a local (or Cloud) Weaviate instance. -1. **[Create a collection](../manage-collections/index.mdx)**: Define the data schema for a `Question` collection, using an Ollama model to vectorize the data. -1. **[Import data](../manage-objects/import.mdx)**: Fetch sample Jeopardy questions and use Weaviate's batch import for efficient ingestion and automatic vector embedding generation. -1. **[Search/query the database](../search/index.mdx)**: Execute a vector search to find questions semantically similar to the query `biology`. +1. **[Connect to Weaviate](/weaviate/connections/index.mdx)**: Establish a connection to a Weaviate Cloud instance, using credentials read from environment variables. +1. **[Create a collection](../manage-collections/index.mdx)**: Define a `Movie` collection that uses a Weaviate Embeddings model to vectorize the data. +1. **[Import data](../manage-objects/import.mdx)**: Insert a small set of movie objects in one batch, so Weaviate generates their vector embeddings automatically. +1. **[Search/query the database](../search/index.mdx)**: Execute a vector search to find movies semantically similar to the query `sci-fi`. diff --git a/docs/weaviate/concepts/cluster.md b/docs/weaviate/concepts/cluster.md index d5706acd1..efd253971 100644 --- a/docs/weaviate/concepts/cluster.md +++ b/docs/weaviate/concepts/cluster.md @@ -120,9 +120,17 @@ This only applies when creating a new class, rather than when adding more data t ## Consistency and current limitations -* Weaviate adopts the [Raft consensus algorithm](https://raft.github.io/) which is a log-based algorithm coordinated by an elected leader. This brings an additional benefit in that concurrent schema changes are now supported.
If you are a Kubernetes user, see the [`1.25 migration guide`](/deploy/migration/weaviate-1-25.md) before you upgrade. To upgrade, you have to delete your existing StatefulSet. -* As of `v1.8.0`, the process of broadcasting schema changes across the cluster uses a form of two-phase transaction that as of now cannot tolerate node failures during the lifetime of the transaction. -* As of `v1.8.0`, dynamically scaling a cluster is not fully supported yet. New nodes can be added to an existing cluster, however it does not affect the ownership of shards. Existing nodes can not yet be removed if data is present, as shards are not yet being moved to other nodes prior to a removal of a node. +* From `v1.25`, Weaviate uses the [Raft consensus algorithm](https://raft.github.io/) for cluster metadata such as collection definitions and tenant activity statuses. Raft is a log-based algorithm coordinated by an elected leader, so cluster metadata changes remain consistent even if a minority of nodes fail, and concurrent schema changes are supported. For details, see [Replication architecture: Cluster metadata](/weaviate/concepts/replication-architecture/consistency.md#cluster-metadata).
If you are a Kubernetes user, see the [`1.25 migration guide`](/deploy/migration/weaviate-1-25.md) before you upgrade. To upgrade, you have to delete your existing StatefulSet. +* Adding a node to an existing cluster does not by itself change the ownership of existing shards. To rebalance data across nodes, or to drain a node before you remove it, move its shard replicas with [replica movement](/deploy/configuration/replica-movement.mdx) as described in [Shard replica movement](#shard-replica-movement) above. + +
+ Behavior before `v1.25` and `v1.32` + +Prior to `v1.25`, schema changes were broadcast across the cluster with a form of two-phase transaction that could not tolerate node failures during the lifetime of the transaction. Raft replaced this mechanism. See [Replication architecture: Cluster metadata](/weaviate/concepts/replication-architecture/consistency.md#cluster-metadata) for the comparison. + +Prior to `v1.32`, shard replicas could not be moved between nodes, so a node that still held data could not be removed from a cluster. [Replica movement](/deploy/configuration/replica-movement.mdx) removes that limitation. + +
## Questions and feedback diff --git a/docs/weaviate/concepts/search/hybrid-search.md b/docs/weaviate/concepts/search/hybrid-search.md index 38159e38d..181fe96b5 100644 --- a/docs/weaviate/concepts/search/hybrid-search.md +++ b/docs/weaviate/concepts/search/hybrid-search.md @@ -82,7 +82,7 @@ With `relativeScoreFusion` (default from `v1.24`), each object is scored by *nor With `rankedFusion` (default for `v1.23` and lower), each object is scored according to its position in the results for the given search, starting from the highest score for the top-ranked object and decreasing down the order. The total score is calculated by adding these rank-based scores from the vector and keyword searches. -Generally, `relativeScoreFusion` might be a a good choice, which is why it is the default. +Generally, `relativeScoreFusion` might be a good choice, which is why it is the default. The main reason is that `relativeScoreFusion` retains more information from the original searches than `rankedFusion`, which only retains the rankings. More generally we believe that the nuances captured in the vector and keyword search metrics are more likely to be reflected in rankings produced by `relativeScoreFusion`. @@ -161,9 +161,19 @@ In contrast, for `rankedFusion`, the object **ID 2** is the top result, closely The alpha value determines the weight of the vector search results in the final hybrid search results. The alpha value can range from 0 to 1: -- `alpha = 0.5` (default): Equal weight to both searches -- `alpha > 0.5`: More weight to vector search +- `alpha = 0`: Keyword search only - `alpha < 0.5`: More weight to keyword search +- `alpha = 0.5`: Equal weight to both searches +- `alpha > 0.5`: More weight to vector search (`0.75` is the default) +- `alpha = 1`: Vector search only + +Lower `alpha` towards `0` to give the keyword component more influence. + +:::caution Set `alpha` explicitly +`0.75` is the server default. It applies only when a request reaches Weaviate with no `alpha` value, which is the case for GraphQL, and over gRPC from Weaviate `v1.36.7` and later, which added the ability for a client to leave `alpha` unset. + +Client libraries do not all leave `alpha` unset. Depending on your client and your server version, the effective weighting can differ from `0.75`, and in some cases can be a pure keyword search. Set `alpha` explicitly whenever the weighting matters, and check your client library page for its behavior. +::: ## Search thresholds diff --git a/docs/weaviate/config-refs/collections.mdx b/docs/weaviate/config-refs/collections.mdx index 752db36a6..056737b61 100644 --- a/docs/weaviate/config-refs/collections.mdx +++ b/docs/weaviate/config-refs/collections.mdx @@ -722,17 +722,23 @@ Some `asyncConfig` parameters have different defaults depending on whether the c | :--- | :--- | :--- | :--- | :--- | | `hashtreeHeight` | Integer | Height of the hash tree used for data comparison between nodes. Min: `0`, Max: `20` | `16` | `10` | | `frequency` | Integer | Frequency of periodic data comparison between nodes, in milliseconds. | `30000` | `30000` | -| `frequencyWhilePropagating` | Integer | Frequency of data comparison while propagation is active, in milliseconds. | `3000` | `3000` | +| `frequencyWhilePropagating` | Integer | Frequency of data comparison while propagation is active, in milliseconds. | `5000` | `5000` | | `loggingFrequency` | Integer | How often the async replication process logs its activity, in seconds. | `60` | `60` | | `diffBatchSize` | Integer | Number of object keys fetched per request during comparison. Min: `1`, Max: `10000` | `1000` | `1000` | | `diffPerNodeTimeout` | Integer | Timeout for a comparison response from a remote node, in seconds. | `10` | `10` | | `prePropagationTimeout` | Integer | Overall timeout for the pre-propagation phase, in seconds. | `300` | `300` | | `propagationTimeout` | Integer | Timeout for a propagation request to a remote node, in seconds. | `60` | `60` | -| `propagationLimit` | Integer | Maximum number of objects propagated in a single iteration. Min: `1`, Max: `1000000` | `10000` | `10000` | +| `propagationLimit` | Integer | Maximum number of objects propagated in a single iteration. Min: `1`, Max: `100000` | `1000` | `1000` | | `propagationDelay` | Integer | Delay before considering an object for propagation, in milliseconds. | `30000` | `30000` | -| `propagationConcurrency` | Integer | Number of concurrent workers for propagation. Min: `1`, Max: `20` | `5` | `5` | +| `propagationConcurrency` | Integer | Number of concurrent workers for propagation. Min: `1`, Max: `20` | `1` | `1` | | `propagationBatchSize` | Integer | Maximum number of objects per propagation batch. Min: `1`, Max: `1000` | `100` | `100` | +:::note Values changed in `v1.34.19`, `v1.35.14`, `v1.36.4` and `v1.37.0` +Three of the defaults above were changed in the patch releases `v1.34.19`, `v1.35.14` and `v1.36.4`, and apply to every release from `v1.37.0` onwards. On earlier releases of each of those lines, `frequencyWhilePropagating` defaults to `3000`, `propagationLimit` defaults to `10000`, and `propagationConcurrency` defaults to `5`. + +The maximum value for `propagationLimit` was lowered from `1000000` to `100000` one patch later, in `v1.34.20`, `v1.35.15` and `v1.36.6`. +::: + #### Code example - How to configure replication This code example shows how to configure the replication parameters through a client library: diff --git a/docs/weaviate/config-refs/indexing/vector-index.mdx b/docs/weaviate/config-refs/indexing/vector-index.mdx index 8b9a230f5..0589b6e95 100644 --- a/docs/weaviate/config-refs/indexing/vector-index.mdx +++ b/docs/weaviate/config-refs/indexing/vector-index.mdx @@ -186,7 +186,7 @@ HFresh only supports `cosine` and `l2-squared` distance metrics. Dot product is | `distance` | string | `cosine` | No | Distance metric. Only `cosine` and `l2-squared` are supported. | | `maxPostingSizeKB` | integer | `48` | Yes | Maximum size in KB for a posting list. Weaviate uses this value along with the vector dimensions to calculate the maximum number of vectors per posting. Min: `8`, Max: `1024`. Best set when you create the collection: an update is accepted but only affects newly-indexed data — data that is already indexed is not re-partitioned. | | `replicas` | integer | `4` | No | Number of posting lists in which a vector is added. Min: `1`, Max: `10`. | -| `searchProbe` | integer | `64` | Yes | Number of posting lists to search during a query. | +| `searchProbe` | integer | `256` | Yes | Number of posting lists to search during a query. The default is `256` in `v1.36.20`, `v1.37.10`, `v1.38.2` and later. Earlier releases on each of those lines default to `64`. | | `rq` | object | -- | Partial | Rotational quantization (RQ) compression configuration. RQ is mandatory for HFresh and cannot be turned off. Its `rescoreLimit` (default `350`) — the number of candidates rescored against uncompressed vectors — is mutable at runtime. | :::tip Tuning HFresh recall diff --git a/docs/weaviate/model-providers/_includes/provider.connect.ts b/docs/weaviate/model-providers/_includes/provider.connect.ts index 9ae69a6b1..149bf866a 100644 --- a/docs/weaviate/model-providers/_includes/provider.connect.ts +++ b/docs/weaviate/model-providers/_includes/provider.connect.ts @@ -57,7 +57,7 @@ const azureApiKey = process.env.AZURE_API_KEY || ''; // Replace with your infer // START VoyageAIInstantiation const voyageaiApiKey = process.env.VOYAGEAI_API_KEY || ''; // Replace with your inference API key // END VoyageAIInstantiation -// START Xainstantiation +// START XaiInstantiation const xaiApiKey = process.env.XAI_API_KEY || ''; // Replace with your inference API key // END XaiInstantiation diff --git a/docs/weaviate/model-providers/_includes/provider.generative.py b/docs/weaviate/model-providers/_includes/provider.generative.py index f4f820514..edfa32903 100644 --- a/docs/weaviate/model-providers/_includes/provider.generative.py +++ b/docs/weaviate/model-providers/_includes/provider.generative.py @@ -1026,7 +1026,10 @@ def import_data(): # presence_penalty=0, # temperature=0.7, # top_p=0.7, - # base_url="" + # base_url="", + # # For reasoning models such as the gpt-5 family: + # reasoning_effort="medium", # One of "minimal", "low", "medium", "high" + # verbosity="medium", # One of "low", "medium", "high" ) # highlight-end # Additional parameters not shown diff --git a/docs/weaviate/model-providers/_includes/provider.vectorizer.py b/docs/weaviate/model-providers/_includes/provider.vectorizer.py index 8b5511fa5..7672c649b 100644 --- a/docs/weaviate/model-providers/_includes/provider.vectorizer.py +++ b/docs/weaviate/model-providers/_includes/provider.vectorizer.py @@ -422,10 +422,9 @@ Configure.Vectors.text2vec_huggingface( name="title_vector", source_properties=["title"], - # NOTE: Use only one of (`model`), (`passage_model` and `query_model`), or (`endpoint_url`) + # NOTE: Use only one of (`model`), (`passage_model`), or (`endpoint_url`) model="sentence-transformers/all-MiniLM-L6-v2", - # passage_model="sentence-transformers/facebook-dpr-ctx_encoder-single-nq-base", # Required if using `query_model` - # query_model="sentence-transformers/facebook-dpr-question_encoder-single-nq-base", # Required if using `passage_model` + # passage_model="sentence-transformers/facebook-dpr-ctx_encoder-single-nq-base", # endpoint_url="", # # wait_for_model=True, diff --git a/docs/weaviate/model-providers/_includes/provider.vectorizer.ts b/docs/weaviate/model-providers/_includes/provider.vectorizer.ts index d1d9caa71..fb8a8e5ae 100644 --- a/docs/weaviate/model-providers/_includes/provider.vectorizer.ts +++ b/docs/weaviate/model-providers/_includes/provider.vectorizer.ts @@ -547,10 +547,10 @@ await client.collections.create({ weaviate.configure.vectors.text2VecHuggingFace({ name: 'title_vector', sourceProperties: ['title'], + // NOTE: Use only one of `model`, `passageModel`, or `endpointURL` model: 'sentence-transformers/all-MiniLM-L6-v2', // endpointURL: , - // passageModel: 'sentence-transformers/facebook-dpr-ctx_encoder-single-nq-base', // Required if using `query_model` - // queryModel: 'sentence-transformers/facebook-dpr-question_encoder-single-nq-base', // Required if using `passage_model` + // passageModel: 'sentence-transformers/facebook-dpr-ctx_encoder-single-nq-base', // waitForModel: true, // useCache: true, // useGPU: true, diff --git a/docs/weaviate/model-providers/anthropic/generative.md b/docs/weaviate/model-providers/anthropic/generative.md index d21a5c728..cd2d3a006 100644 --- a/docs/weaviate/model-providers/anthropic/generative.md +++ b/docs/weaviate/model-providers/anthropic/generative.md @@ -51,7 +51,7 @@ You must provide a valid Anthropic API key to Weaviate for this integration. Go Provide the API key to Weaviate using one of the following methods: -- Set the `ANTHROPIC_API_KEY` environment variable that is available to Weaviate. +- Set the `ANTHROPIC_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. diff --git a/docs/weaviate/model-providers/anyscale/generative.md b/docs/weaviate/model-providers/anyscale/generative.md index 142064a97..af46de106 100644 --- a/docs/weaviate/model-providers/anyscale/generative.md +++ b/docs/weaviate/model-providers/anyscale/generative.md @@ -51,7 +51,7 @@ You must provide a valid Anyscale API key to Weaviate for this integration. Go t Provide the API key to Weaviate using one of the following methods: -- Set the `ANYSCALE_API_KEY` environment variable that is available to Weaviate. +- Set the `ANYSCALE_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. diff --git a/docs/weaviate/model-providers/cohere/embeddings-multimodal.md b/docs/weaviate/model-providers/cohere/embeddings-multimodal.md index 9c2b723c5..525721bab 100644 --- a/docs/weaviate/model-providers/cohere/embeddings-multimodal.md +++ b/docs/weaviate/model-providers/cohere/embeddings-multimodal.md @@ -51,7 +51,7 @@ You must provide a valid Cohere API key to Weaviate for this integration. Go to Provide the API key to Weaviate using one of the following methods: -- Set the `COHERE_API_KEY` environment variable that is available to Weaviate. +- Set the `COHERE_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. diff --git a/docs/weaviate/model-providers/cohere/embeddings.md b/docs/weaviate/model-providers/cohere/embeddings.md index e3000c344..3250e0b7a 100644 --- a/docs/weaviate/model-providers/cohere/embeddings.md +++ b/docs/weaviate/model-providers/cohere/embeddings.md @@ -54,7 +54,7 @@ You must provide a valid Cohere API key to Weaviate for this integration. Go to Provide the API key to Weaviate using one of the following methods: -- Set the `COHERE_API_KEY` environment variable that is available to Weaviate. +- Set the `COHERE_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. diff --git a/docs/weaviate/model-providers/cohere/generative.md b/docs/weaviate/model-providers/cohere/generative.md index d04059380..a37cbf547 100644 --- a/docs/weaviate/model-providers/cohere/generative.md +++ b/docs/weaviate/model-providers/cohere/generative.md @@ -52,7 +52,7 @@ You must provide a valid Cohere API key to Weaviate for this integration. Go to Provide the API key to Weaviate using one of the following methods: -- Set the `COHERE_API_KEY` environment variable that is available to Weaviate. +- Set the `COHERE_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. @@ -264,8 +264,11 @@ In other words, when you have `n` search results, the generative model generates ### Available models +From Weaviate `v1.31.17`, `v1.32.10`, `v1.33.0` and later, Weaviate does not validate the model name, so you can set any model that your Cohere account can reach. The following models are commonly used: + +- `command-a-03-2025` (server default in `v1.31.17`, `v1.32.10`, `v1.33.0` and later) - `command-r-plus` -- `command-r` (default) +- `command-r` (server default before `v1.31.17`, `v1.32.10` and `v1.33.0`) - `command-xlarge` - `command-xlarge-beta` - `command-xlarge-nightly` diff --git a/docs/weaviate/model-providers/cohere/reranker.md b/docs/weaviate/model-providers/cohere/reranker.md index dcfccc4d4..e04e7c035 100644 --- a/docs/weaviate/model-providers/cohere/reranker.md +++ b/docs/weaviate/model-providers/cohere/reranker.md @@ -52,7 +52,7 @@ You must provide a valid Cohere API key to Weaviate for this integration. Go to Provide the API key to Weaviate using one of the following methods: -- Set the `COHERE_API_KEY` environment variable that is available to Weaviate. +- Set the `COHERE_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. diff --git a/docs/weaviate/model-providers/contextualai/generative.md b/docs/weaviate/model-providers/contextualai/generative.md index dd591044a..523f5d259 100644 --- a/docs/weaviate/model-providers/contextualai/generative.md +++ b/docs/weaviate/model-providers/contextualai/generative.md @@ -55,7 +55,7 @@ You must provide a valid Contextual AI API key to Weaviate for this integration. Provide the API key to Weaviate using one of the following methods: -- Set the `CONTEXTUAL_API_KEY` environment variable that is available to Weaviate. +- Set the `CONTEXTUALAI_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. diff --git a/docs/weaviate/model-providers/contextualai/reranker.md b/docs/weaviate/model-providers/contextualai/reranker.md index dfed9ddc4..bf4224f23 100644 --- a/docs/weaviate/model-providers/contextualai/reranker.md +++ b/docs/weaviate/model-providers/contextualai/reranker.md @@ -55,7 +55,7 @@ You must provide a valid Contextual AI API key to Weaviate for this integration. Provide the API key to Weaviate using one of the following methods: -- Set the `CONTEXTUAL_API_KEY` environment variable that is available to Weaviate. +- Set the `CONTEXTUALAI_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. diff --git a/docs/weaviate/model-providers/huggingface/embeddings.md b/docs/weaviate/model-providers/huggingface/embeddings.md index 3c24822fd..75644f6ff 100644 --- a/docs/weaviate/model-providers/huggingface/embeddings.md +++ b/docs/weaviate/model-providers/huggingface/embeddings.md @@ -53,7 +53,7 @@ You must provide a valid Hugging Face API key to Weaviate for this integration. Provide the API key to Weaviate using one of the following methods: -- Set the `HUGGINGFACE_API_KEY` environment variable that is available to Weaviate. +- Set the `HUGGINGFACE_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. @@ -119,7 +119,7 @@ Provide the API key to Weaviate using one of the following methods:
-You must specify one of the [available models](#available-models) for the vectorizer to use. +You can specify one of the [available models](#available-models) for the vectorizer to use. If you do not specify a model, Weaviate uses the server default, `sentence-transformers/msmarco-bert-base-dot-v5`. import VectorizationBehavior from '/_includes/vectorization.behavior.mdx'; @@ -169,13 +169,17 @@ The following examples show how to configure Hugging Face-specific options. Only select one of the following parameters to specify the model: - `model`, -- `passageModel` and `queryModel`, or +- `passageModel`, or - `endpointURL` -:::note Differences between `model`, `passageModel`/`queryModel` and `endpointURL` -The `passageModel` and `queryModel` parameters are used together to specify a [DPR](https://huggingface.co/docs/transformers/en/model_doc/dpr) passage and query model. +:::note Differences between `model`, `passageModel` and `endpointURL` +`model` and `passageModel` name the same thing. Weaviate reads `model` first and falls back to `passageModel`, then uses that model for both object and query vectorization. Setting both raises a validation error. -The `endpointURL` parameter is used to specify a [custom Hugging Face Inference Endpoint](https://huggingface.co/inference-endpoints). This parameter overrides the `model`, `passageModel`, and `queryModel` parameters. +The `endpointURL` parameter is used to specify a [custom Hugging Face Inference Endpoint](https://huggingface.co/inference-endpoints). This parameter overrides the `model` and `passageModel` parameters. +::: + +:::caution `queryModel` no longer has any effect +Weaviate no longer reads the `queryModel` parameter. Support for a separate [DPR](https://huggingface.co/docs/transformers/en/model_doc/dpr) query model was removed in `v1.26.9`, `v1.27.2` and `v1.28.0`. The client libraries still accept `queryModel` (`query_model` in Python) and send it to the server without an error, so any value you set there is silently ignored. Remove it from your collection configuration and use `model` or `passageModel` instead. ::: #### Additional parameters diff --git a/docs/weaviate/model-providers/jinaai/embeddings-colbert.md b/docs/weaviate/model-providers/jinaai/embeddings-colbert.md index 73897c343..9481fda96 100644 --- a/docs/weaviate/model-providers/jinaai/embeddings-colbert.md +++ b/docs/weaviate/model-providers/jinaai/embeddings-colbert.md @@ -52,7 +52,7 @@ You must provide a valid Jina AI API key to Weaviate for this integration. Go to Provide the API key to Weaviate using one of the following methods: -- Set the `JINAAI_API_KEY` environment variable that is available to Weaviate. +- Set the `JINAAI_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. diff --git a/docs/weaviate/model-providers/jinaai/embeddings-multimodal.md b/docs/weaviate/model-providers/jinaai/embeddings-multimodal.md index 4bc35c135..b254f6c61 100644 --- a/docs/weaviate/model-providers/jinaai/embeddings-multimodal.md +++ b/docs/weaviate/model-providers/jinaai/embeddings-multimodal.md @@ -50,7 +50,7 @@ You must provide a valid Jina AI API key to Weaviate for this integration. Go to Provide the API key to Weaviate using one of the following methods: -- Set the `JINAAI_API_KEY` environment variable that is available to Weaviate. +- Set the `JINAAI_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. diff --git a/docs/weaviate/model-providers/jinaai/embeddings.md b/docs/weaviate/model-providers/jinaai/embeddings.md index 1aed40823..42b956b99 100644 --- a/docs/weaviate/model-providers/jinaai/embeddings.md +++ b/docs/weaviate/model-providers/jinaai/embeddings.md @@ -53,7 +53,7 @@ You must provide a valid Jina AI API key to Weaviate for this integration. Go to Provide the API key to Weaviate using one of the following methods: -- Set the `JINAAI_API_KEY` environment variable that is available to Weaviate. +- Set the `JINAAI_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. @@ -329,13 +329,19 @@ The query below returns the `n` best scoring objects from the database, set by ` ### Available models +The server default changed in `v1.31.6` and `v1.32.0`. + +- `jina-embeddings-v4` (server default in `v1.31.6`, `v1.32.0` and later) + - When using this model, Weaviate will automatically use the appropriate `task` type, applying `retrieval.passage` for embedding entries and `retrieval.query` for queries. - `jina-embeddings-v3` - When using this model, Weaviate will automatically use the appropriate `task` type, applying `retrieval.passage` for embedding entries and `retrieval.query` for queries. - - By default, Weaviate uses `1024` dimensions -- `jina-embeddings-v2-base-en` (Default) +- `jina-embeddings-v2-base-en` (server default before `v1.31.6` and `v1.32.0`) - `jina-embeddings-v2-small-en` +- `jina-embeddings-v2-base-zh` +- `jina-embeddings-v2-base-es` +- `jina-embeddings-v2-base-code` -Note that `dimensions` is not applicable for the `jina-embeddings-v2` models. +If you do not set `dimensions`, Weaviate does not send a dimension count and the Jina AI API applies its own default for the model. Note that `dimensions` is not applicable for the `jina-embeddings-v2` models. ## Further resources diff --git a/docs/weaviate/model-providers/jinaai/reranker.md b/docs/weaviate/model-providers/jinaai/reranker.md index 3a2343fa0..11c830df0 100644 --- a/docs/weaviate/model-providers/jinaai/reranker.md +++ b/docs/weaviate/model-providers/jinaai/reranker.md @@ -50,7 +50,7 @@ You must provide a valid JinaAI API key to Weaviate for this integration. Go to Provide the API key to Weaviate using one of the following methods: -- Set the `JINAAI_API_KEY` environment variable that is available to Weaviate. +- Set the `JINAAI_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. diff --git a/docs/weaviate/model-providers/kubeai/embeddings.md b/docs/weaviate/model-providers/kubeai/embeddings.md index 188567a0a..2cac62fef 100644 --- a/docs/weaviate/model-providers/kubeai/embeddings.md +++ b/docs/weaviate/model-providers/kubeai/embeddings.md @@ -55,7 +55,7 @@ The OpenAI integration requires an API key value. To use KubeAI, provide any val Provide the API key to Weaviate using one of the following methods: -- Set the `OPENAI_API_KEY` environment variable that is available to Weaviate. +- Set the `OPENAI_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. diff --git a/docs/weaviate/model-providers/kubeai/generative.md b/docs/weaviate/model-providers/kubeai/generative.md index b3c867bd9..1278907ec 100644 --- a/docs/weaviate/model-providers/kubeai/generative.md +++ b/docs/weaviate/model-providers/kubeai/generative.md @@ -55,7 +55,7 @@ The OpenAI integration requires an API key value. To use KubeAI, provide any val Provide the API key to Weaviate using one of the following methods: -- Set the `OPENAI_API_KEY` environment variable that is available to Weaviate. +- Set the `OPENAI_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. diff --git a/docs/weaviate/model-providers/mistral/embeddings.md b/docs/weaviate/model-providers/mistral/embeddings.md index 6b3102f70..92cd583fe 100644 --- a/docs/weaviate/model-providers/mistral/embeddings.md +++ b/docs/weaviate/model-providers/mistral/embeddings.md @@ -53,7 +53,7 @@ You must provide a valid Mistral API key to Weaviate for this integration. Go to Provide the API key to Weaviate using one of the following methods: -- Set the `MISTRAL_API_KEY` environment variable that is available to Weaviate. +- Set the `MISTRAL_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. diff --git a/docs/weaviate/model-providers/mistral/generative.md b/docs/weaviate/model-providers/mistral/generative.md index 97aee3971..8ede2a11e 100644 --- a/docs/weaviate/model-providers/mistral/generative.md +++ b/docs/weaviate/model-providers/mistral/generative.md @@ -52,7 +52,7 @@ You must provide a valid Mistral API key to Weaviate for this integration. Go to Provide the API key to Weaviate using one of the following methods: -- Set the `MISTRAL_API_KEY` environment variable that is available to Weaviate. +- Set the `MISTRAL_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. diff --git a/docs/weaviate/model-providers/nvidia/embeddings-multimodal.md b/docs/weaviate/model-providers/nvidia/embeddings-multimodal.md index 8d10ef361..a15e386e5 100644 --- a/docs/weaviate/model-providers/nvidia/embeddings-multimodal.md +++ b/docs/weaviate/model-providers/nvidia/embeddings-multimodal.md @@ -51,7 +51,7 @@ You must provide a valid NVIDIA NIM API key to Weaviate for this integration. Go Provide the API key to Weaviate using one of the following methods: -- Set the `NVIDIA_API_KEY` environment variable that is available to Weaviate. +- Set the `NVIDIA_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. diff --git a/docs/weaviate/model-providers/nvidia/embeddings.md b/docs/weaviate/model-providers/nvidia/embeddings.md index ff5e0ba1f..82ef56644 100644 --- a/docs/weaviate/model-providers/nvidia/embeddings.md +++ b/docs/weaviate/model-providers/nvidia/embeddings.md @@ -53,7 +53,7 @@ You must provide a valid NVIDIA NIM API key to Weaviate for this integration. Go Provide the API key to Weaviate using one of the following methods: -- Set the `NVIDIA_API_KEY` environment variable that is available to Weaviate. +- Set the `NVIDIA_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. diff --git a/docs/weaviate/model-providers/nvidia/generative.md b/docs/weaviate/model-providers/nvidia/generative.md index 9d4675e8a..6e49a16c1 100644 --- a/docs/weaviate/model-providers/nvidia/generative.md +++ b/docs/weaviate/model-providers/nvidia/generative.md @@ -50,7 +50,7 @@ You must provide a valid API key to Weaviate for this integration. Go to [NVIDIA Provide the API key to Weaviate using one of the following methods: -- Set the `NVIDIA_API_KEY` environment variable that is available to Weaviate. +- Set the `NVIDIA_APIKEY` environment variable that is available to Weaviate. - Provide the token at runtime, as shown in the examples below. diff --git a/docs/weaviate/model-providers/nvidia/reranker.md b/docs/weaviate/model-providers/nvidia/reranker.md index e21d9a52d..bc95cfb42 100644 --- a/docs/weaviate/model-providers/nvidia/reranker.md +++ b/docs/weaviate/model-providers/nvidia/reranker.md @@ -51,7 +51,7 @@ You must provide a valid NVIDIA NIM API key to Weaviate for this integration. Go Provide the API key to Weaviate using one of the following methods: -- Set the `NVIDIA_API_KEY` environment variable that is available to Weaviate. +- Set the `NVIDIA_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. diff --git a/docs/weaviate/model-providers/octoai/embeddings.md b/docs/weaviate/model-providers/octoai/embeddings.md index 1df992d6a..5822ab176 100644 --- a/docs/weaviate/model-providers/octoai/embeddings.md +++ b/docs/weaviate/model-providers/octoai/embeddings.md @@ -54,7 +54,7 @@ You must provide a valid OctoAI API key to Weaviate for this integration. Go to Provide the API key to Weaviate using one of the following methods: -- Set the `OCTOAI_API_KEY` environment variable that is available to Weaviate. +- Set the `OCTOAI_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. diff --git a/docs/weaviate/model-providers/octoai/generative.md b/docs/weaviate/model-providers/octoai/generative.md index 54c6b914a..5637813c8 100644 --- a/docs/weaviate/model-providers/octoai/generative.md +++ b/docs/weaviate/model-providers/octoai/generative.md @@ -54,7 +54,7 @@ You must provide a valid OctoAI API key to Weaviate for this integration. Go to Provide the API key to Weaviate using one of the following methods: -- Set the `OCTOAI_API_KEY` environment variable that is available to Weaviate. +- Set the `OCTOAI_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. diff --git a/docs/weaviate/model-providers/openai-azure/embeddings.md b/docs/weaviate/model-providers/openai-azure/embeddings.md index 614cd6f9d..1bbc7480e 100644 --- a/docs/weaviate/model-providers/openai-azure/embeddings.md +++ b/docs/weaviate/model-providers/openai-azure/embeddings.md @@ -54,7 +54,7 @@ You must provide a valid Azure OpenAI API key to Weaviate for this integration. Provide the API key to Weaviate using one of the following methods: -- Set the `AZURE_API_KEY` environment variable that is available to Weaviate. +- Set the `AZURE_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. diff --git a/docs/weaviate/model-providers/openai-azure/generative.md b/docs/weaviate/model-providers/openai-azure/generative.md index b034457c3..c942f84eb 100644 --- a/docs/weaviate/model-providers/openai-azure/generative.md +++ b/docs/weaviate/model-providers/openai-azure/generative.md @@ -52,7 +52,7 @@ You must provide a valid Azure OpenAI API key to Weaviate for this integration. Provide the API key to Weaviate using one of the following methods: -- Set the `AZURE_API_KEY` environment variable that is available to Weaviate. +- Set the `AZURE_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. diff --git a/docs/weaviate/model-providers/openai/embeddings.md b/docs/weaviate/model-providers/openai/embeddings.md index e73187ac1..087da19d7 100644 --- a/docs/weaviate/model-providers/openai/embeddings.md +++ b/docs/weaviate/model-providers/openai/embeddings.md @@ -59,7 +59,7 @@ You must provide a valid OpenAI API key to Weaviate for this integration. Go to Provide the API key to Weaviate using one of the following methods: -- Set the `OPENAI_API_KEY` environment variable that is available to Weaviate. +- Set the `OPENAI_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. diff --git a/docs/weaviate/model-providers/openai/generative.md b/docs/weaviate/model-providers/openai/generative.md index e40782ba8..73520503e 100644 --- a/docs/weaviate/model-providers/openai/generative.md +++ b/docs/weaviate/model-providers/openai/generative.md @@ -57,7 +57,7 @@ You must provide a valid OpenAI API key to Weaviate for this integration. Go to Provide the API key to Weaviate using one of the following methods: -- Set the `OPENAI_API_KEY` environment variable that is available to Weaviate. +- Set the `OPENAI_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. @@ -163,6 +163,13 @@ Configure the following generative parameters to customize the model behavior. +From Weaviate `v1.31.15`, `v1.32.9`, `v1.33.0` and later, two additional parameters are available for reasoning models such as the `gpt-5` family: + +- `reasoningEffort`: How much reasoning the model does before it answers. One of `minimal`, `low`, `medium`, or `high`. If not set, the model provider default applies. +- `verbosity`: How detailed the generated answer is. One of `low`, `medium`, or `high`. If not set, the model provider default applies. + +The Python client exposes these as the `reasoning_effort` and `verbosity` arguments, both when you configure the collection and when you [select a model at runtime](#select-a-model-at-runtime). The TypeScript client does not expose them yet, so set them with another client or through the REST collection configuration API. + For further details on model parameters, see the [OpenAI API documentation](https://platform.openai.com/docs/api-reference/chat). ## Select a model at runtime @@ -294,7 +301,12 @@ You can also supply images as a part of the input when performing retrieval augm ### Available models -* [gpt-3.5-turbo](https://platform.openai.com/docs/models/gpt-3-5) (default) +From Weaviate `v1.31.17`, `v1.32.10`, `v1.33.0` and later, Weaviate does not validate the model name, so you can set any model that your OpenAI account can reach. The following models are recognized by Weaviate's token limit table: + +* [gpt-5](https://platform.openai.com/docs/models/gpt-5) +* [gpt-5-mini](https://platform.openai.com/docs/models/gpt-5-mini) (server default in `v1.30.16`, `v1.31.10`, `v1.32.3` and later) +* [gpt-5-nano](https://platform.openai.com/docs/models/gpt-5-nano) +* [gpt-3.5-turbo](https://platform.openai.com/docs/models/gpt-3-5) (server default before `v1.30.16`, `v1.31.10` and `v1.32.3`) * [gpt-3.5-turbo-16k](https://platform.openai.com/docs/models/gpt-3-5) * [gpt-3.5-turbo-1106](https://platform.openai.com/docs/models/gpt-3-5) * [gpt-4](https://platform.openai.com/docs/models/gpt-4-and-gpt-4-turbo) diff --git a/docs/weaviate/model-providers/voyageai/embeddings-multimodal.md b/docs/weaviate/model-providers/voyageai/embeddings-multimodal.md index 5e9b91790..2ebc51c23 100644 --- a/docs/weaviate/model-providers/voyageai/embeddings-multimodal.md +++ b/docs/weaviate/model-providers/voyageai/embeddings-multimodal.md @@ -53,7 +53,7 @@ You must provide a valid VoyageAI API key to Weaviate for this integration. Go t Provide the API key to Weaviate using one of the following methods: -- Set the `VOYAGEAI_API_KEY` environment variable that is available to Weaviate. +- Set the `VOYAGEAI_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. diff --git a/docs/weaviate/model-providers/voyageai/embeddings.md b/docs/weaviate/model-providers/voyageai/embeddings.md index 49b709857..b314b3127 100644 --- a/docs/weaviate/model-providers/voyageai/embeddings.md +++ b/docs/weaviate/model-providers/voyageai/embeddings.md @@ -54,7 +54,7 @@ You must provide a valid Voyage AI API key to Weaviate for this integration. Go Provide the API key to Weaviate using one of the following methods: -- Set the `VOYAGEAI_API_KEY` environment variable that is available to Weaviate. +- Set the `VOYAGEAI_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. diff --git a/docs/weaviate/model-providers/voyageai/reranker.md b/docs/weaviate/model-providers/voyageai/reranker.md index e8a903445..452eee945 100644 --- a/docs/weaviate/model-providers/voyageai/reranker.md +++ b/docs/weaviate/model-providers/voyageai/reranker.md @@ -52,7 +52,7 @@ You must provide a valid Voyage AI API key to Weaviate for this integration. Go Provide the API key to Weaviate using one of the following methods: -- Set the `VOYAGEAI_API_KEY` environment variable that is available to Weaviate. +- Set the `VOYAGEAI_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. diff --git a/docs/weaviate/model-providers/xai/generative.md b/docs/weaviate/model-providers/xai/generative.md index b4fb417f6..ebf28042a 100644 --- a/docs/weaviate/model-providers/xai/generative.md +++ b/docs/weaviate/model-providers/xai/generative.md @@ -54,7 +54,7 @@ You must provide a valid API key to Weaviate for this integration. Go to [xAI](h Provide the API key to Weaviate using one of the following methods: -- Set the `XAI_API_KEY` environment variable that is available to Weaviate. +- Set the `XAI_APIKEY` environment variable that is available to Weaviate. - Provide the API key at runtime, as shown in the examples below. diff --git a/docs/weaviate/modules/qna-openai.md b/docs/weaviate/modules/qna-openai.md index 166c3ade3..1986a1a2c 100644 --- a/docs/weaviate/modules/qna-openai.md +++ b/docs/weaviate/modules/qna-openai.md @@ -47,12 +47,12 @@ For requests that require the OpenAI organization name, you can provide it at qu You can provide your API key in two ways: -1. During the **configuration** of your Docker instance, by adding `OPENAI_API_KEY` or `AZURE_API_KEY` as appropriate under `environment` to your `Docker Compose` file, like this: +1. During the **configuration** of your Docker instance, by adding `OPENAI_APIKEY` or `AZURE_APIKEY` as appropriate under `environment` to your `Docker Compose` file, like this: ```yaml environment: - OPENAI_API_KEY: 'your-key-goes-here' # For use with OpenAI. Setting this parameter is optional; you can also provide the key at runtime. - AZURE_API_KEY: 'your-key-goes-here' # For use with Azure OpenAI. Setting this parameter is optional; you can also provide the key at runtime. + OPENAI_APIKEY: 'your-key-goes-here' # For use with OpenAI. Setting this parameter is optional; you can also provide the key at runtime. + AZURE_APIKEY: 'your-key-goes-here' # For use with Azure OpenAI. Setting this parameter is optional; you can also provide the key at runtime. ... ``` @@ -100,9 +100,9 @@ services: AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' ENABLE_MODULES: 'text2vec-openai,qna-openai' - OPENAI_API_KEY: sk-foobar # For use with OpenAI. Setting this parameter is optional; you can also provide the key at runtime. + OPENAI_APIKEY: sk-foobar # For use with OpenAI. Setting this parameter is optional; you can also provide the key at runtime. OPENAI_ORGANIZATION: your-orgname # For use with OpenAI. Setting this parameter is optional; you can also provide the key at runtime. - AZURE_API_KEY: sk-foobar # For use with Azure OpenAI. Setting this parameter is optional; you can also provide the key at runtime. + AZURE_APIKEY: sk-foobar # For use with Azure OpenAI. Setting this parameter is optional; you can also provide the key at runtime. CLUSTER_HOSTNAME: 'node1' ``` diff --git a/docs/weaviate/modules/ref2vec-centroid.md b/docs/weaviate/modules/ref2vec-centroid.md index dddbe55c5..83b68b250 100644 --- a/docs/weaviate/modules/ref2vec-centroid.md +++ b/docs/weaviate/modules/ref2vec-centroid.md @@ -23,7 +23,7 @@ Which modules to use in a Weaviate instance can be specified in the `Docker Comp ```yaml --- -services:html +services: weaviate: command: - --host diff --git a/docs/weaviate/more-resources/example-use-cases.md b/docs/weaviate/more-resources/example-use-cases.md index e68cad09a..2f449ebfd 100644 --- a/docs/weaviate/more-resources/example-use-cases.md +++ b/docs/weaviate/more-resources/example-use-cases.md @@ -37,7 +37,6 @@ Vector databases help to address some of large language models (LLMs) limitation |Title | Description | Modality | Code | | --- | --- | --- | --- | - | Verba, the golden RAGtriever ([Video](https://www.youtube.com/watch?v=OSt3sFT1i18)) | Retrieval-Augmented Generation (RAG) system to chat with Weaviate documentation and blog posts. | Text | [Python](https://github.com/weaviate/Verba) | | HealthSearch ([Blog](https://weaviate.io/blog/healthsearch-demo)) | Recommendation system of health products based on symptoms. | Text | [Python](https://github.com/weaviate/healthsearch-demo) | | Magic Chat | Search through Magic The Gathering cards | Text | [Python](https://github.com/weaviate/st-weaviate-connection/tree/main) | diff --git a/docs/weaviate/release-notes/known-issues.mdx b/docs/weaviate/release-notes/known-issues.mdx index cd34aaf11..75e193c09 100644 --- a/docs/weaviate/release-notes/known-issues.mdx +++ b/docs/weaviate/release-notes/known-issues.mdx @@ -18,7 +18,7 @@ This page documents significant known issues in Weaviate, their symptoms, and re | Issue | Affected Versions | Resolution | Fixed In | | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------- | -------------------------------- | -| [Empty collections panic](#empty-collections-panic) | 1.28 - 1.31 | In Progress | - | +| [Empty collections panic](#empty-collections-panic) | 1.28 (all), 1.29.0-8, 1.30.0-8, 1.31.0, 1.31.1 | Fixed | 1.29.9+, 1.30.9+, 1.31.2+, 1.32.0+ | | [Database restoration blocked](#database-restoration-blocked) | 1.27.23-26, 1.28.14-15, 1.29.5-7, 1.30.3 | Fixed | 1.27.27, 1.28.16, 1.29.8, 1.30.4 | | [RAFT snapshot compatibility on downgrade](#raft-snapshot-compatibility-on-downgrade) | 1.28.13+, 1.29.5+, 1.30.2+ (when downgrading to 1.27.25 or earlier) | Fixed | 1.27.26 | | [RAFT bootstrap timeout](#raft-bootstrap-timeout) | 1.25 - 1.28 | Workaround | - | @@ -426,8 +426,8 @@ echo "vm.max_map_count=8388608" >> /etc/sysctl.conf :::info Impact summary -- **Affected versions:** 1.28, 1.29, 1.30, 1.31 -- **Resolution:** In progress +- **Affected versions:** 1.28 (all patch releases), 1.29.0 - 1.29.8, 1.30.0 - 1.30.8, 1.31.0 and 1.31.1 +- **Resolution:** Fixed in 1.29.9, 1.30.9, 1.31.2 and 1.32.0 ::: @@ -447,12 +447,23 @@ RAFT snapshots with no collections (previously called classes) cause a nil map a #### Resolution -**Option 1: Upgrade (when available)** -Upgrade to patched version containing the fix. +**Option 1: Upgrade (recommended)** + +Upgrade to a release that contains the fix: + +- 1.29.9 and later 1.29 releases +- 1.30.9 and later 1.30 releases +- 1.31.2 and later 1.31 releases +- 1.32.0 and later + +Two points to watch when you choose a target release: + +- 1.31.0 and 1.31.1 do **not** contain the fix. Within the 1.31 line, upgrade to 1.31.2 or later. +- The 1.28 line was never patched. If you run 1.28, upgrade to one of the releases listed above. **Option 2: Remove empty snapshot** -Identify and remove the problematic snapshot: +If you cannot upgrade yet, identify and remove the problematic snapshot: ```bash # Navigate to RAFT directory diff --git a/docs/weaviate/search/basics.md b/docs/weaviate/search/basics.md index 7560d9825..6e2d29d1f 100644 --- a/docs/weaviate/search/basics.md +++ b/docs/weaviate/search/basics.md @@ -644,7 +644,6 @@ import QueryReplication from '/\_includes/code/replication.get.object.by.id.mdx' - [Connect to Weaviate](/weaviate/connections) - [API References: GraphQL: Get](../api/graphql/get.md) -- For tutorials, see [Queries](/weaviate/tutorials/query.md) - For search using the GraphQL API, see [GraphQL API](../api/graphql/get.md) ## Questions and feedback diff --git a/docs/weaviate/search/generative.md b/docs/weaviate/search/generative.md index 025cb56ef..bf79ab346 100644 --- a/docs/weaviate/search/generative.md +++ b/docs/weaviate/search/generative.md @@ -338,24 +338,24 @@ Grouped task search returns one response that includes all of the query results. diff --git a/docs/weaviate/search/hybrid.md b/docs/weaviate/search/hybrid.md index 0956af111..6fee913e0 100644 --- a/docs/weaviate/search/hybrid.md +++ b/docs/weaviate/search/hybrid.md @@ -232,6 +232,8 @@ Hybrid search results can favor the keyword component or the vector component. T - An `alpha` of `1` is a pure vector search. - An `alpha` of `0` is a pure keyword search. +If you do not set `alpha`, the effective weighting depends on your client. See [Alpha parameter](/weaviate/concepts/search/hybrid-search.md#alpha-parameter). + Example response @@ -553,16 +553,16 @@ To perform a hybrid search with user-provided embeddings, provide the query vect diff --git a/docs/weaviate/tutorials/query.md b/docs/weaviate/tutorials/query.md deleted file mode 100644 index a75f1eca8..000000000 --- a/docs/weaviate/tutorials/query.md +++ /dev/null @@ -1,294 +0,0 @@ ---- -title: Queries in detail -description: Learn effective query techniques in Weaviate to retrieve accurate results. -sidebar_position: 50 -image: og/docs/tutorials.jpg -# tags: ['basics'] ---- - -import UpdateInProgressNote from '/\_includes/update-in-progress.mdx'; - - - -In this section, we will explore different queries that you can perform with Weaviate. Here, we will expand on the `nearText` queries that you may have seen in the [Quickstart tutorial](docs/weaviate/quickstart/index.md) to show you different query types, filters and metrics that can be used. - -By the end of this section, you will have performed vector and scalar searches separately as well as in combination to retrieve individual objects and aggregations. - -## Prerequisites - -We recommend you complete the [Quickstart tutorial](docs/weaviate/quickstart/index.md) first. - -Before you start this tutorial, you should follow the steps in the Quickstart to have: - -- An instance of Weaviate running (e.g. on the [Weaviate Cloud](/go/console?utm_content=tutorial)), -- An API key for your preferred inference API, such as OpenAI, Cohere, or Hugging Face, -- Installed your preferred Weaviate client library, -- Set up a `Question` class in your schema, and -- Imported the `jeopardy_tiny.json` data. - -## Object retrieval with `Get` - -:::tip GraphQL -Weaviate's queries are built using GraphQL. If this is new to you, don't worry. We will take it step-by-step and build up from the basics. Also, in many cases, the GraphQL syntax is abstracted by the client. - -You can query Weaviate using one or a combination of a semantic (i.e. vector) search and a lexical (i.e. scalar) search. As you've seen, a vector search allows for similarity-based searches, while scalar searches allow filtering by exact matches. -::: - -First, we will start by making queries to Weaviate to retrieve **Question** objects that we imported earlier. - -The Weaviate function for retrieving objects is `Get`. - -This might be familiar for some of you. If you have completed our [Imports in detail tutorial](./import.mdx), you may have performed a `Get` query to confirm that the data import was successful. Here is the same code as a reminder: - -import CodeImportGet from '/\_includes/code/quickstart.import.get.mdx'; - - - -This query simply asks Weaviate for _some_ objects of this (`Question`) class. - -Of course, in most cases we would want to retrieve information on some criteria. Let's build on this query by adding a vector search. - -### `Get` with `nearText` - -This is a vector search using a `Get` query. - -import CodeAutoschemaNeartext from '/\_includes/code/quickstart/neartext.mdx' - - - -This might also look familiar, as it was used in the [Quickstart tutorial](docs/weaviate/quickstart/index.md). But let's break it down a little. - -Here, we are using a `nearText` operator. What we are doing is to provide Weaviate with a query `concept` of `biology`. Weaviate then converts this into a vector through the inference API (OpenAI in this particular example) and uses that vector as the basis for a vector search. - -Also note here that we pass the API key in the header. This is required as the inference API is used to vectorize the input query. - -Additionally, we use the `limit` argument to only fetch a maximum of two (2) objects. - -If you run this query, you should see the entries on _"DNA"_ and _"species"_ returned by Weaviate. - -### `Get` with `nearVector` - -In some cases, you might wish to input a vector directly as a search query. For example, you might be running Weaviate with a custom, external vectorizer. In such a case, you can use the `nearVector` operator to provide the query vector to Weaviate. - -For example, here is an example Python code obtaining an OpenAI embedding manually and providing it through the `nearVector` operator: - -```python -import openai - -openai.api_key = "YOUR-OPENAI-API-KEY" -model="text-embedding-ada-002" -oai_resp = openai.Embedding.create(input = ["biology"], model=model) - -oai_embedding = oai_resp['data'][0]['embedding'] - -result = ( - client.query - .get("Question", ["question", "answer"]) - .with_near_vector({ - "vector": oai_embedding, - "certainty": 0.7 - }) - .with_limit(2) - .do() -) - -print(json.dumps(result, indent=4)) -``` - -And it should return the same results as above. - -Note that we used the same OpenAI embedding model (`text-embedding-ada-002`) here so that the vectors are in the same vector "space". - -You might also have noticed that we have added a `certainty` argument in the `with_near_vector` method. This lets you specify a similarity threshold for objects, and can be very useful for ensuring that no distant objects are returned. - -## Additional properties - -We can ask Weaviate to return `_additional` properties for any returned objects. This allows us to obtain properties such as the `vector` of each returned object as well as the actual `certainty` value, so we can verify how close each object is to our query vector. Here is a query that will return the `certainty` value: - -import CodeQueryNeartextAdditional from '/\_includes/code/quickstart.query.neartext.additional.mdx' - - - -Try it out, and you should see a response like this: - -```json -{ - "data": { - "Get": { - "Question": [ - { - "_additional": { - "certainty": 0.9030631184577942 - }, - "answer": "DNA", - "category": "SCIENCE", - "question": "In 1953 Watson & Crick built a model of the molecular structure of this, the gene-carrying substance" - }, - { - "_additional": { - "certainty": 0.900638073682785 - }, - "answer": "species", - "category": "SCIENCE", - "question": "2000 news: the Gunnison sage grouse isn't just another northern sage grouse, but a new one of this classification" - } - ] - } - } -} -``` - -You can try modifying this query to see if you retrieve the vector (note - it will be a looooong response 😉). - -We encourage you to also try out different queries and see how that changes the results and distances not only with this dataset but also with different datasets, and/or vectorizers. - -## Filters - -As useful as it is, sometimes vector search alone may not be sufficient. For example, you may actually only be interested in **Question** objects in a particular category, for instance. - -In these cases, you can use Weaviate's scalar filtering capabilities - either alone, or in combination with the vector search. - -Try the following: - -import CodeQueryWhere1 from '/\_includes/code/quickstart.query.where.1.mdx' - - - -This query asks Weaviate for **Question** objects whose category contains the string `ANIMALS`. You should see a result like this: - -```json -{ - "data": { - "Get": { - "Question": [ - { - "answer": "the diamondback rattler", - "category": "ANIMALS", - "question": "Heaviest of all poisonous snakes is this North American rattlesnake" - }, - { - "answer": "Elephant", - "category": "ANIMALS", - "question": "It's the only living mammal in the order Proboseidea" - }, - { - "answer": "the nose or snout", - "category": "ANIMALS", - "question": "The gavial looks very much like a crocodile except for this bodily feature" - }, - { - "answer": "Antelope", - "category": "ANIMALS", - "question": "Weighing around a ton, the eland is the largest species of this animal in Africa" - } - ] - } - } -} -``` - -Now that you've seen a scalar filter, let's see how it can be combined with vector search functions. - -### Vector search with scalar filters - -Combining a filter with a vector search is an additive process. Let us show you what we mean by that. - -import CodeQueryWhere2 from '/\_includes/code/quickstart.query.where.2.mdx' - - - -This query asks Weaviate for **Question** objects that are closest to "biology", but within the category of `ANIMALS`. You should see a result like this: - -```json -{ - "data": { - "Get": { - "Question": [ - { - "_additional": { - "certainty": 0.8918434679508209 - }, - "answer": "the nose or snout", - "category": "ANIMALS", - "question": "The gavial looks very much like a crocodile except for this bodily feature" - }, - { - "_additional": { - "certainty": 0.8867587149143219 - }, - "answer": "Elephant", - "category": "ANIMALS", - "question": "It's the only living mammal in the order Proboseidea" - } - ] - } - } -} -``` - -Note that the results are confined to the choices from the 'animals' category. Note that these results, while not being cutting-edge science, are biological factoids. - -## Metadata with `Aggregate` - -As the name suggests, the `Aggregate` function can be used to show aggregated data such as on entire classes or groups of objects. - -For example, the following query will return the number of data objects in the `Question` class: - -import CodeQueryAggregate1 from '/\_includes/code/quickstart.query.aggregate.1.mdx' - - - -And you can also use the `Aggregate` function with filters, just as you saw with the `Get` function above. For example, this query will return the number of **Question** objects with the category "ANIMALS". - -import CodeQueryAggregate2 from '/\_includes/code/quickstart.query.aggregate.2.mdx' - - - -And as you saw above, there are four objects that match the query filter. - -```json -{ - "data": { - "Aggregate": { - "Question": [ - { - "meta": { - "count": 4 - } - } - ] - } - } -} -``` - -Here, Weaviate has identified the same objects that you saw earlier in the similar `Get` queries. The difference is that instead of returning the individual objects you are seeing the requested aggregated statistic (count) here. - -As you can see, the `Aggregate` function can return handy aggregated, or metadata, information from the Weaviate Database. - -## Recap - -- `Get` queries are used for retrieving data objects. -- `Aggregate` queries can be used to retrieve metadata, or aggregated data. -- Operators such as `nearText` or `nearVector` can be used for vector queries. -- Scalar filters can be used for exact filtering, taking advantage of inverted indexes. -- Vector and scalar filters can be combined, and are available on both `Get` and `Aggregate` queries - -## Suggested reading - -- [Tutorial: Schemas in detail](../starter-guides/managing-collections/index.mdx) -- [Tutorial: Import in detail](./import.mdx) -- [Tutorial: Introduction to modules](./modules.md) -- [Tutorial: Introduction to Weaviate Console](/cloud/tools/query-tool.mdx) - -## Notes - -### How is certainty calculated? - -`certainty` in Weaviate is a measure of distance from the vector to the data objects. You can also calculate the cosine similarity based on the certainty as described [here](/weaviate/config-refs/distances#distance-vs-certainty). - -## Questions and feedback - -import DocsFeedback from '/\_includes/docs-feedback.mdx'; - - diff --git a/docs/weaviate/tutorials/vector-indexing-deep-dive.mdx b/docs/weaviate/tutorials/vector-indexing-deep-dive.mdx index f977ece02..80e8db767 100644 --- a/docs/weaviate/tutorials/vector-indexing-deep-dive.mdx +++ b/docs/weaviate/tutorials/vector-indexing-deep-dive.mdx @@ -124,9 +124,11 @@ To create a collection with the `HFresh` index using default settings, simply pa - `distance_metric`: `cosine` - `replicas`: `4` (number of posting lists per vector) -- `search_probe`: `64` (number of posting lists to search) +- `search_probe`: `256` (number of posting lists to search) - `max_posting_size_kb`: `48` +The `search_probe` default is `256` in `v1.36.20`, `v1.37.10`, `v1.38.2` and later. Earlier releases on each of those lines default to `64`. + Date: Thu, 6 Aug 2026 14:54:39 +0200 Subject: [PATCH 47/84] docs(backups): collapse the chunking diagram, cut em dashes and semicolons Wrap the mermaid flowchart in a
collapsible in place, matching the summary formatting used in authentication.md. Split the five em-dash and one semicolon constructions into separate sentences without changing any claim: the necessary-but-not-sufficient immutability condition, the floor-not-cap framing, the reduced-budget N boundary, and the split-part size direction are all preserved. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01W7WuWNvSWD89uC4ACAV1AW --- docs/deploy/configuration/backups.md | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/docs/deploy/configuration/backups.md b/docs/deploy/configuration/backups.md index cc3c64174..016555915 100644 --- a/docs/deploy/configuration/backups.md +++ b/docs/deploy/configuration/backups.md @@ -783,7 +783,7 @@ If you would like your application to wait for the background backup process to ### Chunking and file splitting :::info Added in `v1.36.0` -Chunking and `BACKUP_CHUNK_TARGET_SIZE` were backported to `v1.33.14`, `v1.34.11`, and `v1.35.4`. The other variables were added later — see the table below. +Chunking and `BACKUP_CHUNK_TARGET_SIZE` were backported to `v1.33.14`, `v1.34.11`, and `v1.35.4`. The other variables were added later. See the table below. ::: On every backup, full or incremental, Weaviate packs each [shard's](/weaviate/concepts/storage.md#logical-storage-units-indexes-shards-stores) files into chunks: @@ -794,11 +794,16 @@ On every backup, full or incremental, Weaviate packs each [shard's](/weaviate/co Chunking matters because it determines how much a later [incremental backup](#incremental-backups) can reuse: -- Only a file with a chunk of its own can be referenced from the base backup instead of copied again — and only if Weaviate treats the file as immutable. +- Only a file with a chunk of its own can be referenced from the base backup instead of copied again, and only if Weaviate also treats the file as immutable. - A big file that Weaviate keeps rewriting has its own chunk but is still re-uploaded on every backup. - Shared chunks are re-uploaded on every incremental backup, even if nothing in them changed. -A file gets its own chunk when it reaches the **qualifying size**: the larger of `BACKUP_MIN_CHUNK_SIZE` and the size of the shard's Nth largest file, where N is `BACKUP_MAX_INDIVIDUAL_FILES`, reduced on an incremental backup by the number of files already reused from the base backup. This budget is shared across a whole backup chain rather than renewed for each backup in it. Because the larger value wins, `BACKUP_MIN_CHUNK_SIZE` is only a floor — lowering it never reduces how many files qualify. Which knob qualifies more files depends on the shard: with N or more files above the floor, raise `BACKUP_MAX_INDIVIDUAL_FILES`; with fewer, lower `BACKUP_MIN_CHUNK_SIZE`. +A file gets its own chunk when it reaches the **qualifying size**: the larger of `BACKUP_MIN_CHUNK_SIZE` and the size of the shard's Nth largest file, where N is `BACKUP_MAX_INDIVIDUAL_FILES`, reduced on an incremental backup by the number of files already reused from the base backup. This budget is shared across a whole backup chain rather than renewed for each backup in it. Because the larger value wins, `BACKUP_MIN_CHUNK_SIZE` is only a floor. Lowering it never reduces how many files qualify. Which knob qualifies more files depends on the shard. With N or more files above the floor, raise `BACKUP_MAX_INDIVIDUAL_FILES`. With fewer, lower `BACKUP_MIN_CHUNK_SIZE`. + +
+ + Diagram: how a file becomes a chunk + ```mermaid flowchart TD @@ -834,7 +839,9 @@ flowchart TD style Reuploaded fill:#ffffff,stroke:#B9C8DF,color:#130C49 ``` -The parts of a split file are sized by `BACKUP_SPLIT_FILE_SIZE`, not by the chunk target: Weaviate divides the file into roughly equal parts that are each at least half and at most the full split size. At the defaults, a chunk carrying a split part is therefore up to `50GiB` — far larger than the `10MiB` chunk target, not smaller. +
+ +The parts of a split file are sized by `BACKUP_SPLIT_FILE_SIZE`, not by the chunk target: Weaviate divides the file into roughly equal parts that are each at least half and at most the full split size. At the defaults, a chunk carrying a split part is therefore up to `50GiB`. That is far larger than the `10MiB` chunk target, not smaller. The three size variables accept a plain number of bytes or a number with a case-sensitive unit suffix (`B`, `KB`, `MB`, `GB`, `TB`, `KiB`, `MiB`, `GiB`, `TiB`), for example `4MiB`. Decimal and binary suffixes are distinct: `MB` is 1,000,000 bytes while `MiB` is 1,048,576 bytes. They also accept `unlimited` or `nolimit`, which is how you disable file splitting through `BACKUP_SPLIT_FILE_SIZE`. All three are read at startup, so changing them requires a restart. @@ -843,7 +850,7 @@ The three size variables accept a plain number of bytes or a number with a case- | `BACKUP_MIN_CHUNK_SIZE` | no | A floor on the qualifying size a file must reach to get a chunk of its own. Defaults to `1MiB`.

Added in `v1.36.3` (backported to `v1.34.18`, `v1.35.13`). | | `BACKUP_CHUNK_TARGET_SIZE` | no | The size Weaviate aims for when packing several smaller files into a shared chunk. Defaults to `10MiB`.

Added in `v1.36.0` (backported to `v1.33.14`, `v1.34.11`, `v1.35.4`). | | `BACKUP_SPLIT_FILE_SIZE` | no | The size above which a file is split into parts. Set it to `unlimited` to disable splitting. Defaults to `50GiB`.

Added in `v1.36.5` (backported to `v1.35.15`). | -| `BACKUP_MAX_INDIVIDUAL_FILES` | no | How many of a shard's biggest files Weaviate aims to give a chunk of their own — a target rather than a hard cap. This is a count, not a size, and it must be greater than `0`. Defaults to `100`. Settable without a restart through the `backup_max_individual_files` [runtime configuration](./env-vars/runtime-config.md) key.

Added in `v1.37.14` and `v1.38.7`. | +| `BACKUP_MAX_INDIVIDUAL_FILES` | no | How many of a shard's biggest files Weaviate aims to give a chunk of their own. This is a target rather than a hard cap. The value is a count, not a size, and it must be greater than `0`. Defaults to `100`. Settable without a restart through the `backup_max_individual_files` [runtime configuration](./env-vars/runtime-config.md) key.

Added in `v1.37.14` and `v1.38.7`. | :::note How Weaviate adjusts these values From 85a21d7f650eb9a30a576661f5ce266505b17bc0 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Thu, 6 Aug 2026 17:33:17 +0200 Subject: [PATCH 48/84] docs(model-providers): fix medium-severity review findings in provider and recipe pages Wrong model id: the NVIDIA reranker default was written `nnvidia/...`, which is not a valid model id if copy-pasted. Template leaks from cloned provider pages: the NVIDIA overview told readers to configure the Cohere models, and the Databricks overview told them to configure OpenAI, shipped the OpenAI RAG illustration, and carried two broken possessives. All 25 provider overview pages were checked; those were the only two. Stale and missing model information: added embed-v4.0 to the Cohere multimodal list, which the page's own example already used; documented base_url on the Mistral full-parameter samples, matching the OpenAI ones. OctoAI: the pages carried a deprecation banner but still read as working walkthroughs. Every module method has returned a shutdown error server-side since v1.25.22, v1.26.8, and v1.27.1, so the samples are now marked as a record. Version wording is normalized to the house forms: a capability that was introduced and backported reads "Added in vX, and backported to vA, vB"; a changed default also states what earlier releases on those lines used. Also: a self-referencing link in the Voyage AI further-reading list, two Colab badges missing the blob/main segment, a Jupyter kernel error published as expected output, a deprecated vectorizer_config call, duplicate sidebar positions and a mislabeled category, and the remaining em dashes. --- .../model-providers/_includes/provider.generative.py | 1 + .../model-providers/_includes/provider.generative.ts | 3 ++- .../model-providers/_includes/provider.vectorizer.py | 6 ++++-- .../model-providers/_includes/provider.vectorizer.ts | 6 ++++-- .../weaviate/model-providers/anthropic/generative.md | 2 +- .../model-providers/cohere/embeddings-multimodal.md | 1 + docs/weaviate/model-providers/cohere/generative.md | 10 +++++++--- .../model-providers/contextualai/generative.md | 2 +- docs/weaviate/model-providers/databricks/index.md | 8 ++++---- .../model-providers/digitalocean/embeddings.md | 4 ++-- .../model-providers/friendliai/_category_.json | 2 +- .../model-providers/google/embeddings-multimodal.md | 4 ++-- docs/weaviate/model-providers/google/embeddings.md | 9 ++++++--- docs/weaviate/model-providers/jinaai/embeddings.md | 6 +++--- docs/weaviate/model-providers/kubeai/_category_.json | 4 ++-- .../model-providers/model2vec/_category_.json | 4 ++-- docs/weaviate/model-providers/nvidia/index.md | 2 +- docs/weaviate/model-providers/nvidia/reranker.md | 2 +- .../octoai/_includes/octoai_deprecation.md | 3 +++ docs/weaviate/model-providers/openai/generative.md | 12 ++++++++---- .../model-providers/transformers/embeddings.md | 2 +- docs/weaviate/model-providers/voyageai/embeddings.md | 2 +- docs/weaviate/recipes/multi-vector-colipali-rag.md | 12 +----------- .../recipes/rag_titan-text-express-v1_bedrock.md | 4 ++-- docs/weaviate/recipes/weaviate_embeddings_service.md | 2 +- 25 files changed, 62 insertions(+), 51 deletions(-) diff --git a/docs/weaviate/model-providers/_includes/provider.generative.py b/docs/weaviate/model-providers/_includes/provider.generative.py index edfa32903..4cd4d43f2 100644 --- a/docs/weaviate/model-providers/_includes/provider.generative.py +++ b/docs/weaviate/model-providers/_includes/provider.generative.py @@ -824,6 +824,7 @@ def import_data(): # model="mistral-large", # temperature=0.7, # max_tokens=500, + # base_url="", ) # highlight-end ) diff --git a/docs/weaviate/model-providers/_includes/provider.generative.ts b/docs/weaviate/model-providers/_includes/provider.generative.ts index bd20325c6..e3ddc4ae0 100644 --- a/docs/weaviate/model-providers/_includes/provider.generative.ts +++ b/docs/weaviate/model-providers/_includes/provider.generative.ts @@ -734,7 +734,8 @@ await client.collections.create({ // These parameters are optional // model: 'mistral-large', // temperature: 0.7, - // maxTokens: 500 + // maxTokens: 500, + // baseURL: '', }), // highlight-end }); diff --git a/docs/weaviate/model-providers/_includes/provider.vectorizer.py b/docs/weaviate/model-providers/_includes/provider.vectorizer.py index 7672c649b..1cf7cf74b 100644 --- a/docs/weaviate/model-providers/_includes/provider.vectorizer.py +++ b/docs/weaviate/model-providers/_includes/provider.vectorizer.py @@ -689,7 +689,9 @@ Configure.Vectors.text2vec_mistral( name="title_vector", source_properties=["title"], - model="mistral-embed" + model="mistral-embed", + # # Further options + # base_url="", ) ], # highlight-end @@ -966,7 +968,7 @@ # highlight-start vector_config=[ Configure.Vectors.text2vec_digitalocean( - model="qwen3-embedding-0.6b", # Required — choose from the DigitalOcean Serverless Inference catalogue + model="qwen3-embedding-0.6b", # Required. Choose from the DigitalOcean Serverless Inference catalogue name="title_vector", source_properties=["title"], ) diff --git a/docs/weaviate/model-providers/_includes/provider.vectorizer.ts b/docs/weaviate/model-providers/_includes/provider.vectorizer.ts index fb8a8e5ae..11f5bef7a 100644 --- a/docs/weaviate/model-providers/_includes/provider.vectorizer.ts +++ b/docs/weaviate/model-providers/_includes/provider.vectorizer.ts @@ -327,7 +327,7 @@ await client.collections.create({ // highlight-start vectorizers: [ weaviate.configure.vectors.text2VecDigitalOcean({ - model: 'qwen3-embedding-0.6b', // Required — choose from the DigitalOcean Serverless Inference catalogue + model: 'qwen3-embedding-0.6b', // Required. Choose from the DigitalOcean Serverless Inference catalogue name: 'title_vector', sourceProperties: ['title'], }) @@ -838,7 +838,9 @@ await client.collections.create({ weaviate.configure.vectors.text2VecMistral({ name: 'title_vector', sourceProperties: ['title'], - model: 'mistral-embed' + model: 'mistral-embed', + // Further options + // baseURL: '', }, ), ], diff --git a/docs/weaviate/model-providers/anthropic/generative.md b/docs/weaviate/model-providers/anthropic/generative.md index cd2d3a006..889be8b1f 100644 --- a/docs/weaviate/model-providers/anthropic/generative.md +++ b/docs/weaviate/model-providers/anthropic/generative.md @@ -301,7 +301,7 @@ The default base URL is `https://api.anthropic.com`. ### Available models -Any model available in the Anthropic API can be used with Weaviate. If you do not specify a model, Weaviate uses `claude-haiku-4-5` by default. +Any model available in the Anthropic API can be used with Weaviate. If you do not specify a model, Weaviate uses `claude-haiku-4-5` by default. That default was set in `v1.34.0`, and backported to `v1.31.20`, `v1.32.17`, and `v1.33.5`. Earlier releases on each of those lines default to `claude-3-5-sonnet-20240620`. See the [Anthropic API documentation](https://docs.anthropic.com/en/docs/about-claude/models#model-names) for the most up-to-date list of available models. diff --git a/docs/weaviate/model-providers/cohere/embeddings-multimodal.md b/docs/weaviate/model-providers/cohere/embeddings-multimodal.md index 525721bab..aaeffa4ce 100644 --- a/docs/weaviate/model-providers/cohere/embeddings-multimodal.md +++ b/docs/weaviate/model-providers/cohere/embeddings-multimodal.md @@ -294,6 +294,7 @@ The query below returns the `n` most similar objects to the input image from the ### Available models +- `embed-v4.0` - `embed-multilingual-v3.0` (Default) - `embed-multilingual-light-v3.0` - `embed-english-v3.0` diff --git a/docs/weaviate/model-providers/cohere/generative.md b/docs/weaviate/model-providers/cohere/generative.md index a37cbf547..6bc94c00c 100644 --- a/docs/weaviate/model-providers/cohere/generative.md +++ b/docs/weaviate/model-providers/cohere/generative.md @@ -264,11 +264,15 @@ In other words, when you have `n` search results, the generative model generates ### Available models -From Weaviate `v1.31.17`, `v1.32.10`, `v1.33.0` and later, Weaviate does not validate the model name, so you can set any model that your Cohere account can reach. The following models are commonly used: +Weaviate does not validate the model name, so you can set any model that your Cohere account can reach. Name validation was removed in `v1.33.0`, and backported to `v1.31.17` and `v1.32.10`. -- `command-a-03-2025` (server default in `v1.31.17`, `v1.32.10`, `v1.33.0` and later) +The server default is `command-a-03-2025`. It changed in `v1.33.0`, and was backported to `v1.31.17` and `v1.32.10`. Earlier releases on each of those lines default to `command-r`. + +The following models are commonly used: + +- `command-a-03-2025` (server default) - `command-r-plus` -- `command-r` (server default before `v1.31.17`, `v1.32.10` and `v1.33.0`) +- `command-r` (previous server default) - `command-xlarge` - `command-xlarge-beta` - `command-xlarge-nightly` diff --git a/docs/weaviate/model-providers/contextualai/generative.md b/docs/weaviate/model-providers/contextualai/generative.md index 523f5d259..654f1030d 100644 --- a/docs/weaviate/model-providers/contextualai/generative.md +++ b/docs/weaviate/model-providers/contextualai/generative.md @@ -163,7 +163,7 @@ Configure the following generative parameters to customize the model behavior. For further details on model parameters, see the [Contextual AI API documentation](https://docs.contextual.ai/api-reference/generate/generate). -If a parameter is not specified, Weaviate uses the server-side default for that parameter. They are: +If a parameter is not specified, Weaviate uses the server default for that parameter. They are: - model = `"v2"` - temperature = `0.0` diff --git a/docs/weaviate/model-providers/databricks/index.md b/docs/weaviate/model-providers/databricks/index.md index 15feb7118..7fff6036d 100644 --- a/docs/weaviate/model-providers/databricks/index.md +++ b/docs/weaviate/model-providers/databricks/index.md @@ -25,11 +25,11 @@ Databricks' embedding models transform text data into vector embeddings, capturi ### Generative AI models for RAG -![Single prompt RAG integration generates individual outputs per search result](../_includes/integration_openai_rag_single.png) +![Single prompt RAG integration generates individual outputs per search result](../_includes/integration_databricks_rag_single.png) -Databrick' generative AI models can generate human-like text based on given prompts and contexts. +Databricks' 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' efficient storage and fast retrieval capabilities with Databrick' generative AI models to generate personalized and context-aware responses. +[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 Databricks' generative AI models to generate personalized and context-aware responses. [Databricks generative AI integration page](./generative.md) @@ -43,7 +43,7 @@ In turn, they simplify the process of building AI-driven applications to speed u You must provide a valid Databricks personal access token to Weaviate for these integrations. Refer to the [Databricks documentation](https://docs.databricks.com/en/dev-tools/auth/pat.html) for instructions on generating your personal access token in your workspace. -Then, go to the relevant integration page to learn how to configure Weaviate with the OpenAI models and start using them in your applications. +Then, go to the relevant integration page to learn how to configure Weaviate with the Databricks models and start using them in your applications. - [Text Embeddings](./embeddings.md) - [Generative AI](./generative.md) diff --git a/docs/weaviate/model-providers/digitalocean/embeddings.md b/docs/weaviate/model-providers/digitalocean/embeddings.md index 256f70f8e..403d011b9 100644 --- a/docs/weaviate/model-providers/digitalocean/embeddings.md +++ b/docs/weaviate/model-providers/digitalocean/embeddings.md @@ -164,7 +164,7 @@ When you perform a [hybrid search](../../search/hybrid.md), Weaviate fuses keywo ### Available models -DigitalOcean's Serverless Inference catalogue includes several embedding-capable models. See the [DigitalOcean Serverless Inference docs](https://docs.digitalocean.com/products/inference/how-to/use-serverless-inference/) for the live list — model availability and dimensions can change. +DigitalOcean's Serverless Inference catalogue includes several embedding-capable models. See the [DigitalOcean Serverless Inference docs](https://docs.digitalocean.com/products/inference/how-to/use-serverless-inference/) for the live list, as model availability and dimensions can change. :::note Dimensions parameter currently not supported @@ -180,7 +180,7 @@ DigitalOcean's `/v1/embeddings` endpoint does not accept a `dimensions` request ### Code examples -Once the vectorizer is configured, Weaviate handles model inference transparently. The standard [client library how-tos](../../client-libraries/index.mdx) apply unchanged — no DigitalOcean-specific code is required at query or import time beyond the configuration shown above. +Once the vectorizer is configured, Weaviate handles model inference transparently. The standard [client library how-tos](../../client-libraries/index.mdx) apply unchanged. No DigitalOcean-specific code is required at query or import time beyond the configuration shown above. ## Questions and feedback diff --git a/docs/weaviate/model-providers/friendliai/_category_.json b/docs/weaviate/model-providers/friendliai/_category_.json index c00e1815e..7aa7693ab 100644 --- a/docs/weaviate/model-providers/friendliai/_category_.json +++ b/docs/weaviate/model-providers/friendliai/_category_.json @@ -1,4 +1,4 @@ { "label": "FriendliAI", - "position": 226 + "position": 227 } diff --git a/docs/weaviate/model-providers/google/embeddings-multimodal.md b/docs/weaviate/model-providers/google/embeddings-multimodal.md index 7a4a6fa32..469dbc0a3 100644 --- a/docs/weaviate/model-providers/google/embeddings-multimodal.md +++ b/docs/weaviate/model-providers/google/embeddings-multimodal.md @@ -326,8 +326,8 @@ The query below returns the `n` most similar objects to the input image from the ### Available models -- `gemini-embedding-2` (Vertex AI and Gemini API, added in 1.36.13) — Vertex AI and Gemini API; supports text, images, PDFs, and audio (Gemini API only, up to 180 seconds); `3072` dimensions -- `multimodalembedding@001` (Vertex AI only) — supports text, images, and video; dimensions: `128`, `256`, `512`, `1408` +- `gemini-embedding-2` (Vertex AI and Gemini API, added in 1.36.13). Supports text, images, PDFs, and audio (Gemini API only, up to 180 seconds); `3072` dimensions +- `multimodalembedding@001` (Vertex AI only). Supports text, images, and video; dimensions: `128`, `256`, `512`, `1408` ## Further resources diff --git a/docs/weaviate/model-providers/google/embeddings.md b/docs/weaviate/model-providers/google/embeddings.md index 9320d3231..bbda3e2af 100644 --- a/docs/weaviate/model-providers/google/embeddings.md +++ b/docs/weaviate/model-providers/google/embeddings.md @@ -399,10 +399,13 @@ The query below returns the `n` best scoring objects from the database, set by ` - `gemini-embedding-001` (default) **Vertex AI:** + +`gemini-embedding-001`, `text-embedding-005`, and `text-multilingual-embedding-002` were added in `v1.31.5`, and backported to `v1.30.11`. + - `gemini-embedding-2` -- `gemini-embedding-001` (default, added in 1.30.11, 1.31.5 and onwards) -- `text-embedding-005` (added in 1.30.11, 1.31.5 and onwards) -- `text-multilingual-embedding-002` (added in 1.30.11, 1.31.5 and onwards) +- `gemini-embedding-001` (default) +- `text-embedding-005` +- `text-multilingual-embedding-002`
Deprecated models diff --git a/docs/weaviate/model-providers/jinaai/embeddings.md b/docs/weaviate/model-providers/jinaai/embeddings.md index 42b956b99..460aca635 100644 --- a/docs/weaviate/model-providers/jinaai/embeddings.md +++ b/docs/weaviate/model-providers/jinaai/embeddings.md @@ -329,13 +329,13 @@ The query below returns the `n` best scoring objects from the database, set by ` ### Available models -The server default changed in `v1.31.6` and `v1.32.0`. +The server default changed in `v1.32.0`, and was backported to `v1.31.6`. Earlier releases on each of those lines default to `jina-embeddings-v2-base-en`. -- `jina-embeddings-v4` (server default in `v1.31.6`, `v1.32.0` and later) +- `jina-embeddings-v4` (server default) - When using this model, Weaviate will automatically use the appropriate `task` type, applying `retrieval.passage` for embedding entries and `retrieval.query` for queries. - `jina-embeddings-v3` - When using this model, Weaviate will automatically use the appropriate `task` type, applying `retrieval.passage` for embedding entries and `retrieval.query` for queries. -- `jina-embeddings-v2-base-en` (server default before `v1.31.6` and `v1.32.0`) +- `jina-embeddings-v2-base-en` (previous server default) - `jina-embeddings-v2-small-en` - `jina-embeddings-v2-base-zh` - `jina-embeddings-v2-base-es` diff --git a/docs/weaviate/model-providers/kubeai/_category_.json b/docs/weaviate/model-providers/kubeai/_category_.json index a2c5ceb93..b319d23e4 100644 --- a/docs/weaviate/model-providers/kubeai/_category_.json +++ b/docs/weaviate/model-providers/kubeai/_category_.json @@ -1,4 +1,4 @@ { - "label": "KubeAI (Locally hosted)", - "position": 320 + "label": "KubeAI (locally hosted)", + "position": 330 } diff --git a/docs/weaviate/model-providers/model2vec/_category_.json b/docs/weaviate/model-providers/model2vec/_category_.json index 8f8d4ff1e..88b85a984 100644 --- a/docs/weaviate/model-providers/model2vec/_category_.json +++ b/docs/weaviate/model-providers/model2vec/_category_.json @@ -1,4 +1,4 @@ { - "label": "GPT4All (locally hosted)", - "position": 320 + "label": "Model2Vec (locally hosted)", + "position": 340 } diff --git a/docs/weaviate/model-providers/nvidia/index.md b/docs/weaviate/model-providers/nvidia/index.md index 9adbfd246..75fa0f487 100644 --- a/docs/weaviate/model-providers/nvidia/index.md +++ b/docs/weaviate/model-providers/nvidia/index.md @@ -54,7 +54,7 @@ In turn, it simplifies the process of building AI-driven applications to speed u You must provide a valid NVIDIA API key to Weaviate for this integration. Go to [NVIDIA](https://build.nvidia.com/) to sign up and obtain an API key. -Then, go to the relevant integration page to learn how to configure Weaviate with the Cohere models and start using them in your applications. +Then, go to the relevant integration page to learn how to configure Weaviate with the NVIDIA models and start using them in your applications. - [Text Embeddings](./embeddings.md) - [Multimodal Embeddings](./embeddings-multimodal.md) diff --git a/docs/weaviate/model-providers/nvidia/reranker.md b/docs/weaviate/model-providers/nvidia/reranker.md index bc95cfb42..57a29e85a 100644 --- a/docs/weaviate/model-providers/nvidia/reranker.md +++ b/docs/weaviate/model-providers/nvidia/reranker.md @@ -170,7 +170,7 @@ Any search in Weaviate can be combined with a reranker to perform reranking oper You can use any reranker model [on NVIDIA NIM APIs](https://build.nvidia.com/models) with Weaviate. -The default model is `nnvidia/rerank-qa-mistral-4b`. +The default model is `nvidia/rerank-qa-mistral-4b`. ## Further resources diff --git a/docs/weaviate/model-providers/octoai/_includes/octoai_deprecation.md b/docs/weaviate/model-providers/octoai/_includes/octoai_deprecation.md index 681cad6b3..c2e4de674 100644 --- a/docs/weaviate/model-providers/octoai/_includes/octoai_deprecation.md +++ b/docs/weaviate/model-providers/octoai/_includes/octoai_deprecation.md @@ -7,6 +7,9 @@ OctoAI announced that they are winding down the commercial availability of its services by **31 October 2024**. Accordingly, the Weaviate OctoAI integrations are deprecated. Do not use these integrations for new projects.
+From Weaviate `v1.25.22`, `v1.26.8`, and `v1.27.1`, the `text2vec-octoai` and `generative-octoai` modules are inactive. Every vectorization and generation request they receive fails server-side with the error `OctoAI is permanently shut down`. The configuration, import, search, and RAG examples on these pages therefore no longer run against OctoAI, and are kept only as a record of how the integrations used to be configured. Of the options below, only "bring your own vectors" (Option 1) keeps an existing OctoAI collection usable. +
+ If you have a collection that is using an OctoAI integration, consider your options depending on whether you are using OctoAI's embedding models ([your options](#for-collections-with-octoai-embedding-integrations)) or generative models ([your options](#for-collections-with-octoai-generative-ai-integrations)). #### For collections with OctoAI embedding integrations diff --git a/docs/weaviate/model-providers/openai/generative.md b/docs/weaviate/model-providers/openai/generative.md index 73520503e..92d773409 100644 --- a/docs/weaviate/model-providers/openai/generative.md +++ b/docs/weaviate/model-providers/openai/generative.md @@ -163,7 +163,7 @@ Configure the following generative parameters to customize the model behavior. -From Weaviate `v1.31.15`, `v1.32.9`, `v1.33.0` and later, two additional parameters are available for reasoning models such as the `gpt-5` family: +Two additional parameters are available for reasoning models such as the `gpt-5` family. They were added in `v1.33.0`, and backported to `v1.31.15` and `v1.32.9`: - `reasoningEffort`: How much reasoning the model does before it answers. One of `minimal`, `low`, `medium`, or `high`. If not set, the model provider default applies. - `verbosity`: How detailed the generated answer is. One of `low`, `medium`, or `high`. If not set, the model provider default applies. @@ -301,12 +301,16 @@ You can also supply images as a part of the input when performing retrieval augm ### Available models -From Weaviate `v1.31.17`, `v1.32.10`, `v1.33.0` and later, Weaviate does not validate the model name, so you can set any model that your OpenAI account can reach. The following models are recognized by Weaviate's token limit table: +Weaviate does not validate the model name, so you can set any model that your OpenAI account can reach. Name validation was removed in `v1.33.0`, and backported to `v1.31.17` and `v1.32.10`. + +The server default is `gpt-5-mini`. It changed in `v1.32.3`, and was backported to `v1.30.16` and `v1.31.10`. Earlier releases on each of those lines default to `gpt-3.5-turbo`. + +The following models are recognized by Weaviate's token limit table: * [gpt-5](https://platform.openai.com/docs/models/gpt-5) -* [gpt-5-mini](https://platform.openai.com/docs/models/gpt-5-mini) (server default in `v1.30.16`, `v1.31.10`, `v1.32.3` and later) +* [gpt-5-mini](https://platform.openai.com/docs/models/gpt-5-mini) (server default) * [gpt-5-nano](https://platform.openai.com/docs/models/gpt-5-nano) -* [gpt-3.5-turbo](https://platform.openai.com/docs/models/gpt-3-5) (server default before `v1.30.16`, `v1.31.10` and `v1.32.3`) +* [gpt-3.5-turbo](https://platform.openai.com/docs/models/gpt-3-5) (previous server default) * [gpt-3.5-turbo-16k](https://platform.openai.com/docs/models/gpt-3-5) * [gpt-3.5-turbo-1106](https://platform.openai.com/docs/models/gpt-3-5) * [gpt-4](https://platform.openai.com/docs/models/gpt-4-and-gpt-4-turbo) diff --git a/docs/weaviate/model-providers/transformers/embeddings.md b/docs/weaviate/model-providers/transformers/embeddings.md index 409b7636b..28ebd31ae 100644 --- a/docs/weaviate/model-providers/transformers/embeddings.md +++ b/docs/weaviate/model-providers/transformers/embeddings.md @@ -188,7 +188,7 @@ Specify `passageInferenceUrl` and `queryInferenceUrl` if using a [DPR](https://h #### Additional parameters -- `poolingStrategy` – the pooling strategy to use when the input exceeds the model's context window. +- `poolingStrategy`: the pooling strategy to use when the input exceeds the model's context window. - Default: `masked_mean`. Allowed values: `masked_mean` or `cls`. ([Read more on this topic.](https://arxiv.org/abs/1908.10084)) diff --git a/docs/weaviate/model-providers/voyageai/embeddings.md b/docs/weaviate/model-providers/voyageai/embeddings.md index b314b3127..7e727befd 100644 --- a/docs/weaviate/model-providers/voyageai/embeddings.md +++ b/docs/weaviate/model-providers/voyageai/embeddings.md @@ -388,7 +388,7 @@ The `voyage-context-3` model uses Voyage AI's [contextual embeddings API](https: ### Other integrations - [Voyage AI multimodal embedding embeddings models + Weaviate](./embeddings-multimodal.md) -- [Voyage AI reranker models + Weaviate](./embeddings.md). +- [Voyage AI reranker models + Weaviate](./reranker.md). ### Code examples diff --git a/docs/weaviate/recipes/multi-vector-colipali-rag.md b/docs/weaviate/recipes/multi-vector-colipali-rag.md index e2189ed69..1468bd07d 100644 --- a/docs/weaviate/recipes/multi-vector-colipali-rag.md +++ b/docs/weaviate/recipes/multi-vector-colipali-rag.md @@ -444,7 +444,7 @@ Python output: True ``` -For this tutorial, you will need the Weaviate `v1.29.0` or higher. +This tutorial requires Weaviate `v1.29.0` and later. Let's make sure we have the required version: ```python @@ -578,16 +578,6 @@ As an example of what we are going to build, consider the following actual demo query = "How does DeepSeek-V2 compare against the LLaMA family of LLMs?" ``` -Python output: - -```text -Running cells with 'Python 3.13.5' requires the ipykernel package. - -Install 'ipykernel' into the Python environment. - -Command: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall' -``` - By inspecting the first page of the [DeepSeek-V2 paper](https://arxiv.org/abs/2405.04434), we see that it does indeed contain a figure that is relevant for answering our query: diff --git a/docs/weaviate/recipes/rag_titan-text-express-v1_bedrock.md b/docs/weaviate/recipes/rag_titan-text-express-v1_bedrock.md index 9ef947bc9..d735b7d2c 100644 --- a/docs/weaviate/recipes/rag_titan-text-express-v1_bedrock.md +++ b/docs/weaviate/recipes/rag_titan-text-express-v1_bedrock.md @@ -7,7 +7,7 @@ integration: False agent: False tags: ['Generative Search', 'RAG', 'AWS'] --- -[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/weaviate/recipes/weaviate-features/model-providers/aws/rag_titan-text-express-v1_bedrock.ipynb) +[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/weaviate/recipes/blob/main/weaviate-features/model-providers/aws/rag_titan-text-express-v1_bedrock.ipynb) ## Dependencies @@ -57,7 +57,7 @@ if (client.collections.exists("JeopardyQuestion")): client.collections.create( name="JeopardyQuestion", - vectorizer_config=wc.Configure.Vectorizer.text2vec_aws( + vector_config=wc.Configure.Vectors.text2vec_aws( service="bedrock", #this is crucial model="cohere.embed-english-v3", # select the model, make sure it is enabled for your account # model="amazon.titan-embed-text-v1", # select the model, make sure it is enabled for your account diff --git a/docs/weaviate/recipes/weaviate_embeddings_service.md b/docs/weaviate/recipes/weaviate_embeddings_service.md index e9f70b66d..2e2b62fc2 100644 --- a/docs/weaviate/recipes/weaviate_embeddings_service.md +++ b/docs/weaviate/recipes/weaviate_embeddings_service.md @@ -8,7 +8,7 @@ agent: False tags: ["Weaviate Embeddings", "Weaviate Cloud"] --- -[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/weaviate/recipes/weaviate-services/embedding-service/weaviate_embeddings_service.ipynb) +[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/weaviate/recipes/blob/main/weaviate-services/embedding-service/weaviate_embeddings_service.ipynb) # Weaviate Embedding Service From 21df533f31d8bb766a751784aec114d39a8642b7 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Thu, 6 Aug 2026 17:33:17 +0200 Subject: [PATCH 49/84] docs(search,api): fix snippets that do not parse, a mis-targeted anchor, and stale gRPC support Two snippets could not be copy-pasted. The IsNull example in the GraphQL filter reference was missing a closing paren and two braces, so it would not parse; all 14 code blocks on that page were checked for balance and it was the only one. The gRPC page's docker-compose block opened with a four-backtick fence and an invalid info string, so the page rendered a literal ```yaml line as content. gRPC client support was documented as Python and TypeScript only, with others "in the near future". Java and C# have first-class gRPC; the Go client uses it for batch imports and offers gRPC search through its experimental API only, so Go is described separately rather than claimed at parity. The hybrid search page linked to search-operators#variables-2, which lands on nearText's Variables section, not hybrid's. That page has six identically titled Variables headings, so the ordinal anchors are positional and shift whenever a heading moves. The link now targets the uniquely named fusion-algorithms section instead of a more accurate ordinal. The cross-references tutorial had a TypeScript source imported but never rendered, so the tab was simply absent; the import path was also extensionless. The Spark connector tutorial ended on a removed v3 client call. Em dashes removed across the search partition. --- _includes/feature-notes/boost.mdx | 2 +- docs/weaviate/api/graphql/filters.md | 7 +++- docs/weaviate/api/grpc.md | 8 ++-- docs/weaviate/search/bm25.md | 6 +-- docs/weaviate/search/boost.md | 40 ++++++++++---------- docs/weaviate/search/filters.md | 8 ++-- docs/weaviate/search/hybrid.md | 4 +- docs/weaviate/search/query-profile.md | 2 +- docs/weaviate/search/rerank.md | 2 +- docs/weaviate/search/similarity.md | 4 +- docs/weaviate/tutorials/cross-references.mdx | 12 +++++- docs/weaviate/tutorials/spark-connector.md | 16 ++++++-- 12 files changed, 64 insertions(+), 47 deletions(-) diff --git a/_includes/feature-notes/boost.mdx b/_includes/feature-notes/boost.mdx index 68167df1d..449fd66d6 100644 --- a/_includes/feature-notes/boost.mdx +++ b/_includes/feature-notes/boost.mdx @@ -1,3 +1,3 @@ -:::caution Preview — added in `v1.38` +:::caution Preview: added in `v1.38` This is a preview feature. The API may change in future releases. ::: diff --git a/docs/weaviate/api/graphql/filters.md b/docs/weaviate/api/graphql/filters.md index e4a150a43..cc274b75b 100644 --- a/docs/weaviate/api/graphql/filters.md +++ b/docs/weaviate/api/graphql/filters.md @@ -243,7 +243,7 @@ The `ContainsAny`, `ContainsAll` and `ContainsNone` operators filter objects usi These operators expect an array of values and return objects that match based on the input values. -They are not limited to text. They work on `text`/`string`, `int`, `number`, `boolean`, `date`, and `uuid` properties — and on the array variants of each (`int[]`, `number[]`, etc.). A scalar property is treated as a single-element set: the object matches if its value satisfies the operator against the candidate list. +They are not limited to text. They work on `text`/`string`, `int`, `number`, `boolean`, `date`, and `uuid` properties, and on the array variants of each (`int[]`, `number[]`, etc.). A scalar property is treated as a single-element set: the object matches if its value satisfies the operator against the candidate list. Pass the candidate values using the argument that matches the property's data type: `valueText` for `text`/`string`, `valueInt` for `int`, `valueNumber` for `number`, `valueBoolean` for `boolean`, and `valueDate` for `date`. For `uuid`/`uuid[]` properties, pass the UUIDs as strings using `valueText` (there is no `valueUuid` argument). For example, a `ContainsAny` query on an `int` property with a value of `[10, 20, 30]` returns objects whose property holds at least one of those integers. @@ -588,8 +588,11 @@ Using the `IsNull` operator allows you to do filter for objects where given prop Get { (where: { operator: IsNull, - valueBoolean: + valueBoolean: , path: [] + }) { + + } } } ``` diff --git a/docs/weaviate/api/grpc.md b/docs/weaviate/api/grpc.md index 4decc0bda..57b20cd39 100644 --- a/docs/weaviate/api/grpc.md +++ b/docs/weaviate/api/grpc.md @@ -7,7 +7,7 @@ image: og/docs/api.jpg Starting with Weaviate `v1.19.0`, a gRPC interface has been progressively added to Weaviate. gRPC is a high-performance, open-source universal RPC framework that is contract-based and can be used in any environment. It is based on HTTP/2 and Protocol Buffers, and is therefore very fast and efficient. -As of Weaviate `v1.23.7`, the gRPC interface is considered stable. The [Python (`v4` version)](../client-libraries/python/index.mdx) and [TypeScript (`v3` version)](../client-libraries/typescript/index.mdx) client libraries support gRPC, and the other client libraries will follow. +As of Weaviate `v1.23.7`, the gRPC interface is considered stable. The [Python](../client-libraries/python/index.mdx), [TypeScript](../client-libraries/typescript/index.mdx), [Java](../client-libraries/java/index.mdx), and [C#](../client-libraries/csharp.mdx) client libraries use gRPC. The [Go](../client-libraries/go.md) client uses gRPC for batch imports, and offers gRPC search through its experimental API. ## Protocol Buffer (Protobuf) definitions @@ -33,8 +33,6 @@ We suggest using the default port `50051` for gRPC calls. It can be modified thr Note that [Weaviate Cloud](/go/console?utm_content=api) uses port `443` for gRPC. ::: -````yaml: - ```yaml --- services: @@ -44,11 +42,11 @@ services: - "8080:8080" # REST calls - "50051:50051" # gRPC calls # ... Other settings -```` +``` ### Client-side -You can use the gRPC interface through the [Python (`v4` version)](../client-libraries/python/index.mdx) and [TypeScript (`v3` version)](../client-libraries/typescript/index.mdx) client libraries. Other client libraries will also introduce gRPC support in the near future. +You can use the gRPC interface through the [Python](../client-libraries/python/index.mdx), [TypeScript](../client-libraries/typescript/index.mdx), [Java](../client-libraries/java/index.mdx), and [C#](../client-libraries/csharp.mdx) client libraries. The [Go](../client-libraries/go.md) client sends batch imports over gRPC. Its gRPC search API is still experimental, and is reached through `Experimental().Search()` rather than the regular query builder. Alternatively, you can use other tools, such as the `grpcurl` command-line tool, to interact with the gRPC API. Some options include: diff --git a/docs/weaviate/search/bm25.md b/docs/weaviate/search/bm25.md index 414e6f856..061990ce0 100644 --- a/docs/weaviate/search/bm25.md +++ b/docs/weaviate/search/bm25.md @@ -454,8 +454,8 @@ See [Inverted index: Accent folding](../concepts/indexing/inverted-index.md#acce By default, Weaviate filters out common English stopwords (like "a", "the", "is") from BM25 scoring. You can customize this behavior: -- **Custom presets**: Define named stopword lists per collection via `invertedIndexConfig.stopwordPresets` — useful for non-English languages or domain-specific terms. -- **Per-property overrides**: Assign different stopword presets to individual properties via `textAnalyzer.stopwordPreset` — useful for multilingual collections where each property contains text in a different language. +- **Custom presets**: Define named stopword lists per collection via `invertedIndexConfig.stopwordPresets`, useful for non-English languages or domain-specific terms. +- **Per-property overrides**: Assign different stopword presets to individual properties via `textAnalyzer.stopwordPreset`, useful for multilingual collections where each property contains text in a different language. Stopwords are still indexed and only filtered at query time, so changing the configuration does not require reindexing. @@ -769,7 +769,7 @@ Set the tokenization method to `trigram` at the property level when creating you -Keyword (BM25) queries accept an optional `boost` argument that promotes or demotes matching documents without removing them — useful for biasing results by recency, popularity, a soft filter, or another property. Matching documents move up. Everything else stays in the results but ranks lower. +Keyword (BM25) queries accept an optional `boost` argument that promotes or demotes matching documents without removing them. This is useful for biasing results by recency, popularity, a soft filter, or another property. Matching documents move up. Everything else stays in the results but ranks lower. See [Boost](./boost.md) for the supported condition types (filter, property value, time decay, numeric decay), curve choices, blending semantics, and depth tuning. diff --git a/docs/weaviate/search/boost.md b/docs/weaviate/search/boost.md index 7fe9c60c7..f9012bd0e 100644 --- a/docs/weaviate/search/boost.md +++ b/docs/weaviate/search/boost.md @@ -2,7 +2,7 @@ title: Boost sidebar_position: 76 image: og/docs/howto.jpg -description: Soft-rank vector, hybrid, and BM25 results — promote or demote matching documents without filtering them out. Worked Python examples for filter, property, time-decay, numeric-decay, and blended boosts. +description: Soft-rank vector, hybrid, and BM25 results by promoting or demoting matching documents without filtering them out. Worked Python examples for filter, property, time-decay, numeric-decay, and blended boosts. # tags: ['boost', 'search', 'ranking'] --- @@ -14,7 +14,7 @@ import BoostPreview from '/_includes/feature-notes/boost.mdx'; -**Boost** soft-ranks search results — promote or demote matching documents without removing them from the result set. Matching documents move up. Non-matching documents stay in the results but rank lower. +**Boost** soft-ranks search results: it promotes or demotes matching documents without removing them from the result set. Matching documents move up. Non-matching documents stay in the results but rank lower. Apply boost to vector, hybrid, BM25, near-text, near-vector, near-object, near-image, and near-media queries. @@ -23,7 +23,7 @@ Apply boost to vector, hybrid, BM25, near-text, near-vector, near-object, near-i A boost is a **post-retrieval rescorer**: 1. The primary search (vector, hybrid, BM25, ...) fetches `depth` candidate results. Set `depth` higher than `offset + limit` if you want boost to consider candidates beyond the first page. -2. The boost scorer rescores those candidates in memory by evaluating each condition per candidate, normalizing per result set, and blending with the primary score. There are no new index queries — the cost is per-candidate in-memory scoring, not extra shard fan-out. Both primary and boost scores are min-max normalized into `[0, 1]` before blending, and the final score is renormalized to `[0, 1]`. +2. The boost scorer rescores those candidates in memory by evaluating each condition per candidate, normalizing per result set, and blending with the primary score. There are no new index queries. The cost is per-candidate in-memory scoring, not extra shard fan-out. Both primary and boost scores are min-max normalized into `[0, 1]` before blending, and the final score is renormalized to `[0, 1]`. 3. The user's original `offset` and `limit` are applied **after** the re-sort. ## Condition types @@ -96,9 +96,9 @@ Continuous `[0, 1]` score that **decays with distance from an origin time**. The ### Numeric decay {#numeric-decay} -Like time decay but for numeric (`int`, `number`) properties. Use this when "closer to X is better" — prices near a target, distances near a coordinate, ages near a band. Same `scale` / `offset` / `decay` / `curve` semantics as time decay, with all values expressed as numbers. +Like time decay but for numeric (`int`, `number`) properties. Use this when "closer to X is better": prices near a target, distances near a coordinate, ages near a band. Same `scale` / `offset` / `decay` / `curve` semantics as time decay, with all values expressed as numbers. -`scale` must be `> 0` and `decay` (if set) must be in `(0, 1]` — same as time decay. +`scale` must be `> 0` and `decay` (if set) must be in `(0, 1]`, same as time decay. @@ -117,11 +117,11 @@ The three decay curves shape how score falls off with distance. At `distance == | Curve | Shape | When to use | |---|---|---| -| `EXPONENTIAL` (default) | Heavy tail — score halves geometrically every `scale` past the origin. | "Recency matters, but don't aggressively flatten older items to zero." | -| `GAUSSIAN` | Bell curve — sharp falloff past `scale`. | "Items close to the origin are great, items far away are nearly worthless." | -| `LINEAR` | Straight line — score reaches zero at a finite distance past `scale`. | "Predictable falloff with a clear cutoff." | +| `EXPONENTIAL` (default) | Heavy tail: score halves geometrically every `scale` past the origin. | "Recency matters, but don't aggressively flatten older items to zero." | +| `GAUSSIAN` | Bell curve: sharp falloff past `scale`. | "Items close to the origin are great, items far away are nearly worthless." | +| `LINEAR` | Straight line: score reaches zero at a finite distance past `scale`. | "Predictable falloff with a clear cutoff." | -Only these three values are accepted — anything else is rejected at request time. +Only these three values are accepted. Anything else is rejected at request time. ## Blending and weights @@ -131,10 +131,10 @@ A boost must carry **at least one** and **at most 20** conditions. Use `Boost.bl final_score = (1 − weight) · primary_norm + weight · boost_norm ``` -- **`weight`** — the outer blending weight, in `[0, 1]`. Defaults to `0.5`. +- **`weight`**: the outer blending weight, in `[0, 1]`. Defaults to `0.5`. - **`weight: 0`** is a no-op: the boost short-circuits and primary results are returned unchanged. -- **Per-condition `weight`** — a `float` defaulting to `1.0`. Use it to balance multiple boosts ("recency twice as important as popularity"). -- **Negative per-condition `weight`** — *demotes* matching documents. They stay in the result set but rank lower than non-matching ones. +- **Per-condition `weight`**: a `float` defaulting to `1.0`. Use it to balance multiple boosts ("recency twice as important as popularity"). +- **Negative per-condition `weight`**: *demotes* matching documents. They stay in the result set but rank lower than non-matching ones. @@ -149,7 +149,7 @@ final_score = (1 − weight) · primary_norm + weight · boost_norm ### Negative weights demote -A condition with `weight: -1.0` (or `-2.0`, etc.) reverses the effect: documents that match the condition rank below non-matching ones instead of above them. They are not removed. This is useful for deprioritizing — for example, surfacing drafts last without filtering them out. +A condition with `weight: -1.0` (or `-2.0`, etc.) reverses the effect: documents that match the condition rank below non-matching ones instead of above them. They are not removed. This is useful for deprioritizing (for example, surfacing drafts last without filtering them out). @@ -171,12 +171,12 @@ A condition with `weight: -1.0` (or `-2.0`, etc.) reverses the effect: documents | Default | `100` | | Operator override | [`QUERY_BOOST_DEFAULT_DEPTH`](/deploy/configuration/env-vars#QUERY_BOOST_DEFAULT_DEPTH) env var | | Hard cap | `QUERY_MAXIMUM_RESULTS` (cluster-wide limit) | -| Lower bound | At least `offset + limit` — boost always sees enough to fill the page | -| Accepted range | `≥ 0` — `0` means "use the default" | +| Lower bound | At least `offset + limit`, so boost always sees enough to fill the page | +| Accepted range | `≥ 0`, where `0` means "use the default" | :::tip Raise `depth` to reorder beyond the top page -Boost can only reorder what the primary search already retrieved. If your boost should reorder past the default top-100 — for example, to pull a popular older article back to page 1 — pass a higher `depth` on the query. +Boost can only reorder what the primary search already retrieved. If your boost should reorder past the default top-100 (for example, to pull a popular older article back to page 1), pass a higher `depth` on the query. Higher `depth` increases the primary search cost (BM25 / vector index work) and per-candidate scoring cost. Set it as tight as your use case allows. @@ -184,10 +184,10 @@ Higher `depth` increases the primary search cost (BM25 / vector index work) and ## Further resources -- [Rerank](./rerank.md) — second-stage reranking with an external model. -- [Hybrid search](./hybrid.md) — the BM25 / vector `alpha` blend. -- [Filters](./filters.md) — hard filters (remove non-matching docs). -- [BM25](./bm25.md) — keyword search. +- [Rerank](./rerank.md): second-stage reranking with an external model. +- [Hybrid search](./hybrid.md): the BM25 / vector `alpha` blend. +- [Filters](./filters.md): hard filters (remove non-matching docs). +- [BM25](./bm25.md): keyword search. ## Questions and feedback diff --git a/docs/weaviate/search/filters.md b/docs/weaviate/search/filters.md index 29ba28f5e..2c2b7c6c1 100644 --- a/docs/weaviate/search/filters.md +++ b/docs/weaviate/search/filters.md @@ -1069,7 +1069,7 @@ This filter requires the [property null state](../config-refs/indexing/inverted- :::caution Preview feature -Available from Weaviate `v1.38` as a preview, gated by the `WEAVIATE_PREVIEW_NESTED_FILTERING=on` environment variable on the server. The path syntax and operator semantics are stable, but the on-disk encoding may change before GA — don't rely on persistent state from preview clusters carrying over to the GA release. The env var is removed at GA and the feature is enabled unconditionally. +Available from Weaviate `v1.38` as a preview, gated by the `WEAVIATE_PREVIEW_NESTED_FILTERING=on` environment variable on the server. The path syntax and operator semantics are stable, but the on-disk encoding may change before GA. Don't rely on persistent state from preview clusters carrying over to the GA release. The env var is removed at GA and the feature is enabled unconditionally. ::: @@ -1094,7 +1094,7 @@ The filter property is a single dotted path. The dot is the only separator. An o | `cars.tires.width` | Any tire on any car (recursive across two `object[]` levels) | | `cars[1].tires[2].brand` | The second car's third tire's `brand` (positional through nesting) | -`[N]` on a segment requires that segment to be an `object[]` (array). Every intermediate segment must be `object` or `object[]` — you cannot pivot through a scalar. The leaf may be any supported scalar type. +`[N]` on a segment requires that segment to be an `object[]` (array). Every intermediate segment must be `object` or `object[]`. You cannot pivot through a scalar. The leaf may be any supported scalar type. ### Match any element (default) @@ -1128,7 +1128,7 @@ Use `[N]` to pin a path segment to a specific array index. Indices are 0-based. ### Same-element correlation across leaves -Combining two leaf filters with `And` matches when **the same element** in the parent array satisfies both. A document with one car `(Toyota, blue)` and another `(Honda, red)` would not match `cars.make = "Toyota" AND cars.color = "red"` — both conditions must hold on the **same** car. +Combining two leaf filters with `And` matches when **the same element** in the parent array satisfies both. A document with one car `(Toyota, blue)` and another `(Honda, red)` would not match `cars.make = "Toyota" AND cars.color = "red"`. Both conditions must hold on the **same** car. @@ -1176,7 +1176,7 @@ Pointing a path at an `object` or `object[]` segment (rather than a scalar leaf) :::note - **Allowed leaf data types**: `text`, `int`, `number`, `boolean`, `date`, `uuid`, and their array variants. `blob`, `blobHash`, `geoCoordinates`, `phoneNumber`, and cross-references (`cref`) are not allowed inside nested objects for nested filtering. -- **`IndexFilterable` is required**: nested filtering uses the filterable inverted index on each leaf. `IndexRangeFilters` and `IndexSearchable` flags exist on nested-property definitions but are not yet exercised by the nested searcher — range filters on nested numeric leaves currently use the filterable bucket. +- **`IndexFilterable` is required**: nested filtering uses the filterable inverted index on each leaf. `IndexRangeFilters` and `IndexSearchable` flags exist on nested-property definitions but are not yet exercised by the nested searcher. Range filters on nested numeric leaves currently use the filterable bucket. - **Tokenization matters**: nested `text` leaves use the same tokenization options as flat properties. For exact-match filters on names, codes, or identifiers, set `tokenization: field` on the leaf so the value is stored as a single token. - **Reference-path vs nested-path**: a reference-path filter is a multi-element `Path` (`["inCity", "City", "name"]`) traversing cross-references; a nested-path filter is a **single-element** path with dots inside it (`["cars.make"]`). diff --git a/docs/weaviate/search/hybrid.md b/docs/weaviate/search/hybrid.md index 6fee913e0..bbf729067 100644 --- a/docs/weaviate/search/hybrid.md +++ b/docs/weaviate/search/hybrid.md @@ -376,7 +376,7 @@ The output is like this: Additional information -For a discussion of fusion methods, see [this blog post](https://weaviate.io/blog/hybrid-search-fusion-algorithms) and [this reference page](../api/graphql/search-operators.md#variables-2) +For a discussion of fusion methods, see [this blog post](https://weaviate.io/blog/hybrid-search-fusion-algorithms) and [this reference page](../api/graphql/search-operators.md#fusion-algorithms).
@@ -1045,7 +1045,7 @@ import TokenizationNote from '/\_includes/tokenization.mdx' -Hybrid queries accept an optional `boost` argument that promotes or demotes matching documents without removing them — useful for biasing results by recency, popularity, a soft filter, or another property. +Hybrid queries accept an optional `boost` argument that promotes or demotes matching documents without removing them. This is useful for biasing results by recency, popularity, a soft filter, or another property. The boost runs once over the **fused** hybrid result. The BM25 and vector sub-search legs do not see the boost themselves. Hybrid's own `alpha` blend runs first, and the boost rescores the fused candidate pool on top. diff --git a/docs/weaviate/search/query-profile.md b/docs/weaviate/search/query-profile.md index 4e14bab48..b5fd13c9f 100644 --- a/docs/weaviate/search/query-profile.md +++ b/docs/weaviate/search/query-profile.md @@ -16,7 +16,7 @@ import QueryProfileNote from '/_includes/feature-notes/query-profile.mdx'; -Query profiling provides per-shard timing breakdowns for search queries. Enable it on any search request to see how long each phase takes — vector search, keyword scoring, filter evaluation, object retrieval — broken down by shard and cluster node. +Query profiling provides per-shard timing breakdowns for search queries. Enable it on any search request to see how long each phase takes (vector search, keyword scoring, filter evaluation, object retrieval), broken down by shard and cluster node. Profiling uses the same instrumentation as [slow query logging](/deploy/configuration/logging.md#slow-query-logging). It adds minimal overhead when enabled and zero overhead when disabled. diff --git a/docs/weaviate/search/rerank.md b/docs/weaviate/search/rerank.md index 2dac8f571..7ff1139cc 100644 --- a/docs/weaviate/search/rerank.md +++ b/docs/weaviate/search/rerank.md @@ -201,7 +201,7 @@ The response should look like this: -For lightweight result reordering based on filters, property values, or time / numeric decay — without calling an external rerank model — use [Boost](./boost.md). Rerank and Boost can be used independently. Pick rerank when you need a smarter model to re-rank the top-N, and Boost when you want to bias by simple signals already on the objects. +For lightweight result reordering based on filters, property values, or time / numeric decay (without calling an external rerank model), use [Boost](./boost.md). Rerank and Boost can be used independently. Pick rerank when you need a smarter model to re-rank the top-N, and Boost when you want to bias by simple signals already on the objects. ## Related pages diff --git a/docs/weaviate/search/similarity.md b/docs/weaviate/search/similarity.md index 4a5cbac5d..86bc718ad 100644 --- a/docs/weaviate/search/similarity.md +++ b/docs/weaviate/search/similarity.md @@ -673,7 +673,7 @@ import V137Preview from '/\_includes/feature-notes/v137-preview.mdx'; -Standard vector search returns the closest matches to the query, which often means a cluster of near-duplicate results. **Maximum Marginal Relevance (MMR)** reranks results to balance relevance with diversity — each selected result must add something new to the result set. +Standard vector search returns the closest matches to the query, which often means a cluster of near-duplicate results. **Maximum Marginal Relevance (MMR)** reranks results to balance relevance with diversity: each selected result must add something new to the result set. Add the `diversity_selection` parameter to any vector search query: @@ -721,7 +721,7 @@ A larger candidate set (higher top-level `limit`) gives MMR more results to choo -Vector search queries accept an optional `boost` argument that promotes or demotes matching documents without removing them — useful for biasing results by recency, popularity, a soft filter, or another property. Matching documents move up. Everything else stays in the results but ranks lower. +Vector search queries accept an optional `boost` argument that promotes or demotes matching documents without removing them. This is useful for biasing results by recency, popularity, a soft filter, or another property. Matching documents move up. Everything else stays in the results but ranks lower. See [Boost](./boost.md) for the supported condition types (filter, property value, time decay, numeric decay), curve choices, blending semantics, and depth tuning. diff --git a/docs/weaviate/tutorials/cross-references.mdx b/docs/weaviate/tutorials/cross-references.mdx index d17ab920c..de2ad6150 100644 --- a/docs/weaviate/tutorials/cross-references.mdx +++ b/docs/weaviate/tutorials/cross-references.mdx @@ -18,7 +18,7 @@ import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; import XRefCrudPythonCode from '!!raw-loader!/_includes/code/howto/manage-data.cross-refs.py'; -import XRefCrudTSCode from '!!raw-loader!/_includes/code/howto/manage-data.cross-refs'; +import XRefCrudTSCode from '!!raw-loader!/_includes/code/howto/manage-data.cross-refs.ts'; import XRefCrudGoCode from '!!raw-loader!/_includes/code/howto/go/docs/manage-data.cross-refs_test.go'; import SearchBasicsPythonCode from '!!raw-loader!/_includes/code/howto/search.basics.py'; @@ -37,7 +37,7 @@ We will refer to the originating object as the **source** object, and the object ### Prerequisites -This tutorial assumes that you have completed the [QuickStart tutorial](docs/weaviate/quickstart/index.md) and have access to a Weaviate instance with write access. +This tutorial assumes that you have completed the [QuickStart tutorial](../quickstart/index.md) and have access to a Weaviate instance with write access. ## When to use cross-references @@ -112,6 +112,14 @@ An example syntax is shown below: + + + Date: Thu, 6 Aug 2026 17:33:48 +0200 Subject: [PATCH 50/84] docs(client-libraries,concepts): correct client version claims and self-contradicting statements The Java and C# pages both required Weaviate 1.33.0. Both are wrong: the C# client's shipped library asserts a minimum of 1.32.0, and the Java client README says v1.32. The identical wrong sentence on both pages was a copy-paste. The Go page claimed compatibility with Go 1.16, roughly ten releases stale. It now derives the requirement from the go directive for the client version the site actually pins, so it stays true as that pin moves. Three names for one line in the Java get-started example: the prose said Ollama, the code called text2vecTransformers, and the comment said Contextionary. The source now uses text2vecOllama, matching the prose and the Python and TypeScript equivalents. That file is CI-executed; the lane already runs Ollama and pulls nomic-embed-text, and a sibling snippet uses the same call. Concepts said the client libraries in all languages support all API functions, which this repo contradicts elsewhere. It now says coverage varies by language and points at the client pages, rather than enumerating gaps that would go stale. The client list also omitted C#, and the vector index list omitted two index types, so it now links to the indexing page instead of enumerating. Also: the Java async client reference pointed at the retired pre-v6 class and package; a shell env assignment used a hyphen instead of an equals sign, twice, so Docker silently set the wrong variable; a demo table row shipped a "tbd" placeholder and another had the wrong modality; a flat-index link pointed at the inverted-index page; and the compression table said RQ was HNSW-only. --- _includes/code/java-v6/src/test/java/GetStartedTest.java | 6 +++++- docs/weaviate/best-practices/code-generation.md | 8 ++++---- docs/weaviate/best-practices/index.md | 6 +++--- docs/weaviate/client-libraries/csharp.mdx | 2 +- docs/weaviate/client-libraries/go.md | 2 +- docs/weaviate/client-libraries/java/index.mdx | 4 ++-- docs/weaviate/client-libraries/python/index.mdx | 4 ++-- docs/weaviate/concepts/interface.md | 8 ++++---- docs/weaviate/concepts/vector-quantization.md | 2 +- docs/weaviate/more-resources/example-datasets.md | 4 ++-- docs/weaviate/more-resources/example-use-cases.md | 4 ++-- docs/weaviate/more-resources/faq.md | 6 +++--- docs/weaviate/more-resources/performance.md | 4 ++-- docs/weaviate/starter-guides/custom-vectors.mdx | 2 +- docs/weaviate/starter-guides/managing-resources/index.md | 2 +- .../starter-guides/managing-resources/indexing.mdx | 2 +- 16 files changed, 35 insertions(+), 31 deletions(-) diff --git a/_includes/code/java-v6/src/test/java/GetStartedTest.java b/_includes/code/java-v6/src/test/java/GetStartedTest.java index fd71c41fb..439838e2a 100644 --- a/_includes/code/java-v6/src/test/java/GetStartedTest.java +++ b/_includes/code/java-v6/src/test/java/GetStartedTest.java @@ -39,7 +39,11 @@ void testGetStartedWorkflow() throws Exception { col -> col.properties(Property.text("answer"), Property.text("question"), Property.text("category")) - .vectorConfig(VectorConfig.text2vecTransformers()) // Configure the Contextionary embedding model + .vectorConfig(VectorConfig.text2vecOllama(v -> v + // If using Docker you might need: http://host.docker.internal:11434 + .apiEndpoint("http://ollama:11434") + .model("nomic-embed-text") // The model to use + )) // Configure the Ollama embedding model ); CollectionHandle> questions = client.collections.use(collectionName); // highlight-end diff --git a/docs/weaviate/best-practices/code-generation.md b/docs/weaviate/best-practices/code-generation.md index e15a344d0..96a07712b 100644 --- a/docs/weaviate/best-practices/code-generation.md +++ b/docs/weaviate/best-practices/code-generation.md @@ -18,12 +18,12 @@ Here are some tips for writing Weaviate client library code with generative AI m Weaviate provides two [MCP](https://modelcontextprotocol.io/) servers that integrate with AI development tools like Claude Code, Claude Desktop, Cursor, and VS Code: -- **[Weaviate MCP Server](../configuration/mcp-server.mdx)** — Built into Weaviate itself. Lets AI assistants inspect schemas, search data, and modify objects in your Weaviate instance directly. Enable with `MCP_SERVER_ENABLED=true`. -- **[Weaviate Docs MCP Server](../mcp/docs-mcp-server.mdx)** — A standalone server that gives AI assistants access to Weaviate's documentation, reducing hallucinations when generating Weaviate code. +- **[Weaviate MCP Server](../configuration/mcp-server.mdx)**: Built into Weaviate itself. Lets AI assistants inspect schemas, search data, and modify objects in your Weaviate instance directly. Enable with `MCP_SERVER_ENABLED=true`. +- **[Weaviate Docs MCP Server](../mcp/docs-mcp-server.mdx)**: A standalone server that gives AI assistants access to Weaviate's documentation, reducing hallucinations when generating Weaviate code. ### Weaviate Agent Skills -**[Weaviate Agent Skills](https://github.com/weaviate/agent-skills)** gives AI coding agents (Claude Code, Cursor, GitHub Copilot, and others) built-in knowledge of Weaviate — covering search, collection management, data import, and complete application blueprints such as RAG, agentic RAG, and chatbots. When the skill is installed, agents can discover and use it automatically, reducing hallucinations and speeding up Weaviate development. +**[Weaviate Agent Skills](https://github.com/weaviate/agent-skills)** gives AI coding agents (Claude Code, Cursor, GitHub Copilot, and others) built-in knowledge of Weaviate, covering search, collection management, data import, and complete application blueprints such as RAG, agentic RAG, and chatbots. When the skill is installed, agents can discover and use it automatically, reducing hallucinations and speeding up Weaviate development. Install with: @@ -100,7 +100,7 @@ Review the documentation of your specific IDE to see if it has this feature, and ### Consider using the Query Agent -The [Query Agent](/query-agent) is a pre-built agentic search service that decides the search terms, filters, sorts, and other search parameters for you — the [modes overview](/query-agent/guides/index.md) covers what it can do. +The [Query Agent](/query-agent) is a pre-built agentic search service that decides the search terms, filters, sorts, and other search parameters for you. The [modes overview](/query-agent/guides/index.md) covers what it can do. The Query Agent is available to Weaviate Cloud users for interacting with their Weaviate Cloud instance in natural language. For some use cases, this may be a better approach than using AI-powered code generation tools. diff --git a/docs/weaviate/best-practices/index.md b/docs/weaviate/best-practices/index.md index 1abfc971d..cbad4f313 100644 --- a/docs/weaviate/best-practices/index.md +++ b/docs/weaviate/best-practices/index.md @@ -99,7 +99,7 @@ As the size of your dataset grows, the accompanying vector indexes can lead to h If you have a large number of vectors, consider using vector quantization to reduce the memory footprint of the vector index. This will reduce the required memory, and allow you to scale more effectively at lower costs. -If memory is your priority, you can also consider the disk-based [HFresh index](/weaviate/concepts/vector-index#hfresh-index) — an index-level alternative to quantization for reducing the memory footprint. +If memory is your priority, you can also consider the disk-based [HFresh index](/weaviate/concepts/vector-index#hfresh-index), an index-level alternative to quantization for reducing the memory footprint. ![Overview of quantization schemes](../../../_includes/images/concepts/quantization_overview_light.png#gh-light-mode-only "Overview of quantization schemes") ![Overview of quantization schemes](../../../_includes/images/concepts/quantization_overview_dark.png#gh-dark-mode-only "Overview of quantization schemes") @@ -362,11 +362,11 @@ When using Weaviate in an asynchronous environment, consider using the asynchron #### Python -The Weaviate Python client `4.7.0` and higher includes an [asynchronous client API (`WeaviateAsyncClient`)](../client-libraries/python/async.md). +The Weaviate Python client includes an [asynchronous client API (`WeaviateAsyncClient`)](../client-libraries/python/async.md). #### Java -The Weaviate Java client `5.0.0` and higher includes an [asynchronous client API (`WeaviateAsyncClient`)](https://javadoc.io/doc/io.weaviate/client/latest/io/weaviate/client/v1/async/WeaviateAsyncClient.html). +The Weaviate Java client includes an [asynchronous client API (`WeaviateClientAsync`)](https://javadoc.io/doc/io.weaviate/client6/latest/io/weaviate/client6/v1/api/WeaviateClientAsync.html). ## Questions and feedback diff --git a/docs/weaviate/client-libraries/csharp.mdx b/docs/weaviate/client-libraries/csharp.mdx index cce6f704c..a5acd5ac4 100644 --- a/docs/weaviate/client-libraries/csharp.mdx +++ b/docs/weaviate/client-libraries/csharp.mdx @@ -46,7 +46,7 @@ dotnet add package Weaviate.Client --version ||site.csharp_client_version|| #### Weaviate version compatibility -The C# client requires Weaviate `1.33.0` or higher. Generally, we encourage you to use the latest version of the C# client and the Weaviate Database. +The C# client requires Weaviate `v1.32.0` and later. Generally, we encourage you to use the latest version of the C# client and the Weaviate Database. #### gRPC diff --git a/docs/weaviate/client-libraries/go.md b/docs/weaviate/client-libraries/go.md index 095e543e9..217340086 100644 --- a/docs/weaviate/client-libraries/go.md +++ b/docs/weaviate/client-libraries/go.md @@ -24,7 +24,7 @@ The latest Go client is version `v||site.go_client_version||`. ::: -The Weaviate Go client is compatible with Go 1.16+. +The Weaviate Go client requires Go `1.25` and later, as declared by the `go` directive in `go.mod` for client `v||site.go_client_version||`. Newer client releases can raise this requirement, so check `go.mod` for the release you install. ## Installation The client doesn't support the old Go modules system. Create a repository for your code before you import the Weaviate client. diff --git a/docs/weaviate/client-libraries/java/index.mdx b/docs/weaviate/client-libraries/java/index.mdx index 8caaf9690..e62f4de07 100644 --- a/docs/weaviate/client-libraries/java/index.mdx +++ b/docs/weaviate/client-libraries/java/index.mdx @@ -75,7 +75,7 @@ This ensures that all dynamically-loaded dependencies of `io.grpc` are resolved #### Weaviate version compatibility -The `v6` Java client requires Weaviate `1.33.0` or higher. Generally, we encourage you to use the latest version of the Java client and the Weaviate Database. +The `v6` Java client requires Weaviate `v1.32.0` and later. Generally, we encourage you to use the latest version of the Java client and the Weaviate Database. #### gRPC @@ -104,7 +104,7 @@ import BasicPrereqs from "/_includes/prerequisites-quickstart.md"; Get started with Weaviate using this Java example. The code walks you through these key steps: -1. **[Connect to Weaviate](docs/weaviate/connections/index.mdx)**: Establish a connection to a local (or Cloud) Weaviate instance. +1. **[Connect to Weaviate](../../connections/index.mdx)**: Establish a connection to a local (or Cloud) Weaviate instance. 1. **[Create a collection](../../manage-collections/index.mdx)**: Define the data schema for a `Question` collection, using an Ollama model to vectorize the data. 1. **[Import data](../../manage-objects/import.mdx)**: Fetch sample Jeopardy questions and use Weaviate's batch import for efficient ingestion and automatic vector embedding generation. 1. **[Search/query the database](../../search/index.mdx)**: Execute a vector search to find questions semantically similar to the query `biology`. diff --git a/docs/weaviate/client-libraries/python/index.mdx b/docs/weaviate/client-libraries/python/index.mdx index b4b4cb635..aadc6757c 100644 --- a/docs/weaviate/client-libraries/python/index.mdx +++ b/docs/weaviate/client-libraries/python/index.mdx @@ -55,7 +55,7 @@ pip install --pre -U "weaviate-client==4.*"` #### Weaviate version compatibility -The `v4` Python client requires Weaviate `1.23.7` or higher. Generally, we encourage you to use the latest version of the Python client and the Weaviate Database. +The `v4` Python client requires Weaviate `v1.23.7` and later. Generally, we encourage you to use the latest version of the Python client and the Weaviate Database. In Weaviate Cloud, clusters are compatible with the `v4` client as of 31 January, 2024. Clusters created before this date will not be compatible with the `v4` client. @@ -94,7 +94,7 @@ import BasicPrereqs from "/_includes/prerequisites-quickstart.md"; Get started with Weaviate using this Python example. The code walks you through these key steps: -1. **[Connect to Weaviate](docs/weaviate/connections/index.mdx)**: Establish a connection to a local (or Cloud) Weaviate instance. +1. **[Connect to Weaviate](../../connections/index.mdx)**: Establish a connection to a local (or Cloud) Weaviate instance. 1. **[Create a collection](../../manage-collections/index.mdx)**: Define the data schema for a `Question` collection, using an Ollama model to vectorize the data. 1. **[Import data](../../manage-objects/import.mdx)**: Fetch sample Jeopardy questions and use Weaviate's batch import for efficient ingestion and automatic vector embedding generation. 1. **[Search/query the database](../../search/index.mdx)**: Execute a vector search to find questions semantically similar to the query `biology`. diff --git a/docs/weaviate/concepts/interface.md b/docs/weaviate/concepts/interface.md index da45c9c4e..a0ca8b35b 100644 --- a/docs/weaviate/concepts/interface.md +++ b/docs/weaviate/concepts/interface.md @@ -6,7 +6,7 @@ image: og/docs/concepts.jpg # tags: ['architecture', 'interface', 'API design'] --- -You can manage and use Weaviate through its APIs. Weaviate has a RESTful API and a GraphQL API. The client libraries in all languages support all API functions. Some clients, e.g. the Python client, have additional functionality, such as full schema management and batching operations. This way, Weaviate is easy to use in custom projects. Additionally, the APIs are intuitive, so it is easy to integrate into your existing data landscape. +You can manage and use Weaviate through its APIs. Weaviate has a RESTful API and a GraphQL API. The client libraries broadly mirror this API surface, although feature coverage can vary by language; see the [client library pages](/weaviate/client-libraries/index.mdx) for what each one supports. Some clients, e.g. the Python client, have additional functionality, such as full schema management and batching operations. This way, Weaviate is easy to use in custom projects. Additionally, the APIs are intuitive, so it is easy to integrate into your existing data landscape. This page contains information on how Weaviate's APIs are designed, and how you can use Weaviate Console to search through your Weaviate instance with GraphQL. @@ -27,8 +27,8 @@ Weaviate has both a RESTful API and a GraphQL API. Currently, there is no featur - **Data search** -> GraphQL API - **Explorative data search** -> GraphQL API - **Data analysis (meta data)** -> GraphQL API -- **Near real time on very large datasets in production** -> Client libraries (Python, Go, Java, JavaScript) using both APIs under the hood -- **Easy to integrate in applications** -> Client libraries (Python, Go, Java, JavaScript) using both APIs under the hood +- **Near real time on very large datasets in production** -> Client libraries (Python, Go, Java, JavaScript, C#) using both APIs under the hood +- **Easy to integrate in applications** -> Client libraries (Python, Go, Java, JavaScript, C#) using both APIs under the hood ## GraphQL @@ -137,7 +137,7 @@ The [Weaviate Console](/go/console?utm_content=others) is a dashboard to manage ## Weaviate Clients -Weaviate has several client libraries: in [Go](/weaviate/client-libraries/go.md), [Java](/weaviate/client-libraries/java/index.mdx), [Python](/weaviate/client-libraries/python/index.mdx) and [TypeScript/JavaScript](/weaviate/client-libraries/typescript/index.mdx). The client libraries in all languages support all API functions. Some clients, e.g. the Python client, have additional functionality, such as full schema management and batching operations. This way, Weaviate is easy to use in custom projects. The APIs are intuitive to use, so it is easy to integrate Weaviate into your existing data landscape. +Weaviate has several client libraries: in [C#](/weaviate/client-libraries/csharp.mdx), [Go](/weaviate/client-libraries/go.md), [Java](/weaviate/client-libraries/java/index.mdx), [Python](/weaviate/client-libraries/python/index.mdx) and [TypeScript/JavaScript](/weaviate/client-libraries/typescript/index.mdx). The client libraries broadly mirror the server API surface, although feature coverage varies by language. See the [client library pages](/weaviate/client-libraries/index.mdx) for what each one supports. Some clients, e.g. the Python client, have additional functionality, such as full schema management and batching operations. This way, Weaviate is easy to use in custom projects. The APIs are intuitive to use, so it is easy to integrate Weaviate into your existing data landscape. ## Further resources diff --git a/docs/weaviate/concepts/vector-quantization.md b/docs/weaviate/concepts/vector-quantization.md index c1f949274..8ca7994fb 100644 --- a/docs/weaviate/concepts/vector-quantization.md +++ b/docs/weaviate/concepts/vector-quantization.md @@ -197,7 +197,7 @@ You might be also interested in our blog post [HNSW+PQ - Exploring ANN algorithm ### With a flat index -[RQ](#rotational-quantization) and [BQ](#binary-quantization) can be applied to a [flat index](./indexing/inverted-index.md). As a flat index search is a brute-force method, compression reduces the amount of data Weaviate has to read and increases speed. +[RQ](#rotational-quantization) and [BQ](#binary-quantization) can be applied to a [flat index](./indexing/vector-index.md#flat-index). As a flat index search is a brute-force method, compression reduces the amount of data Weaviate has to read and increases speed. ## Rescoring diff --git a/docs/weaviate/more-resources/example-datasets.md b/docs/weaviate/more-resources/example-datasets.md index aabf0fdbc..0d7a6d6bb 100644 --- a/docs/weaviate/more-resources/example-datasets.md +++ b/docs/weaviate/more-resources/example-datasets.md @@ -105,7 +105,7 @@ export CACHE_DIR= # Optionally you can set the batch size (if not specified by default 200) export BATCH_SIZE= # Make sure to replace WEAVIATE_ORIGIN with the Weaviate origin as mentioned in the basics above -docker run -it -e weaviate_host=$WEAVIATE_ORIGIN -e cache_dir-$CACHE_DIR -e batch_size=$BATCH_SIZE semitechnologies/weaviate-demo-newspublications:latest +docker run -it -e weaviate_host=$WEAVIATE_ORIGIN -e cache_dir=$CACHE_DIR -e batch_size=$BATCH_SIZE semitechnologies/weaviate-demo-newspublications:latest ``` @@ -125,7 +125,7 @@ export CACHE_DIR= # Optionally you can set the batch size (if not specified by default 200) export BATCH_SIZE= # Run docker -docker run -it --network=$WEAVIATE_NETWORK -e weaviate_host=$WEAVIATE_ORIGIN -e cache_dir-$CACHE_DIR -e batch_size=$BATCH_SIZE semitechnologies/weaviate-demo-newspublications:latest +docker run -it --network=$WEAVIATE_NETWORK -e weaviate_host=$WEAVIATE_ORIGIN -e cache_dir=$CACHE_DIR -e batch_size=$BATCH_SIZE semitechnologies/weaviate-demo-newspublications:latest ``` ## Questions and feedback diff --git a/docs/weaviate/more-resources/example-use-cases.md b/docs/weaviate/more-resources/example-use-cases.md index 2f449ebfd..35f046e32 100644 --- a/docs/weaviate/more-resources/example-use-cases.md +++ b/docs/weaviate/more-resources/example-use-cases.md @@ -53,7 +53,7 @@ Weaviate can leverage its vectorization capabilities to enable automatic, real-t |Title | Description | Modality | Code | | --- | --- | --- | --- | | Toxic Comment Classification | Classify whether a comment is toxic or non-toxic. | Text | [Python](https://github.com/weaviate-tutorials/DEMO-classification-toxic-comment) | -| Audio Genre Classification | Classify the music genre of an audio file. | Image | [Python](https://github.com/weaviate-tutorials/DEMO-classification-audio-genre/) | +| Audio Genre Classification | Classify the music genre of an audio file. | Audio | [Python](https://github.com/weaviate-tutorials/DEMO-classification-audio-genre/) | ## Other use cases @@ -61,7 +61,7 @@ Weaviate's [modular ecosystem](../modules/index.md) unlocks many other use cases |Title | Description | Code | | --- | --- | --- | -| Named Entity Recognition (NER)| tbd | [Python](https://github.com/weaviate/weaviate-examples/tree/main/example-with-NER-module) | +| Named Entity Recognition (NER)| Extract named entities, such as people, organizations and locations, from text stored in Weaviate. | [Python](https://github.com/weaviate/weaviate-examples/tree/main/example-with-NER-module) | ## Questions and feedback diff --git a/docs/weaviate/more-resources/faq.md b/docs/weaviate/more-resources/faq.md index 032f58deb..9e385c719 100644 --- a/docs/weaviate/more-resources/faq.md +++ b/docs/weaviate/more-resources/faq.md @@ -675,7 +675,7 @@ If you need resources from the previous version of Weaviate Academy, check out t
Answer -> The Weaviate Community Slack has been decommissioned. We've moved community discussions to the [Weaviate Community Forum](https://forum.weaviate.io/), which offers better long-term discoverability — conversations are indexed and searchable, so valuable answers don't get lost over time. +> The Weaviate Community Slack has been decommissioned. We've moved community discussions to the [Weaviate Community Forum](https://forum.weaviate.io/), which offers better long-term discoverability: conversations are indexed and searchable, so valuable answers don't get lost over time. > > Join us at [forum.weaviate.io](https://forum.weaviate.io/) to ask questions, share ideas, and connect with the community. For private support inquiries, you can reach us at [support@weaviate.io](mailto:support@weaviate.io). @@ -688,8 +688,8 @@ If you need resources from the previous version of Weaviate Academy, check out t > Yes, Weaviate provides two MCP (Model Context Protocol) servers: > -> - **[Weaviate MCP server](/weaviate/configuration/mcp-server.mdx)** — Built into Weaviate itself. Exposes tools for inspecting schemas, searching data (vector/hybrid), and modifying objects. Runs on the same port as the REST API at `/v1/mcp`. Disabled by default — enable with `MCP_SERVER_ENABLED=true`. -> - **[Weaviate Docs MCP server](/weaviate/mcp/docs-mcp-server.mdx)** — A standalone server that gives LLMs access to Weaviate's documentation. Useful for AI-assisted development with Weaviate. +> - **[Weaviate MCP server](/weaviate/configuration/mcp-server.mdx)**: Built into Weaviate itself. Exposes tools for inspecting schemas, searching data (vector/hybrid), and modifying objects. Runs on the same port as the REST API at `/v1/mcp`. Disabled by default. Enable it with `MCP_SERVER_ENABLED=true`. +> - **[Weaviate Docs MCP server](/weaviate/mcp/docs-mcp-server.mdx)**: A standalone server that gives LLMs access to Weaviate's documentation. Useful for AI-assisted development with Weaviate. > > Both servers use the Streamable HTTP transport and work with MCP clients like Claude Code, Claude Desktop, Cursor, and VS Code. diff --git a/docs/weaviate/more-resources/performance.md b/docs/weaviate/more-resources/performance.md index e7ba6e1d7..fa89d89ce 100644 --- a/docs/weaviate/more-resources/performance.md +++ b/docs/weaviate/more-resources/performance.md @@ -26,7 +26,7 @@ Inverted indexes are used often in document retrieval systems and search engines The inverted index currently does not do any weighing (e.g. tf-idf) for sorting, since the vector index is used for these features like sorting. The inverted index is thus, at the moment, rather a binary operation: including or excluding data objects from the query result list, which results in an 'allow list'. ## Vector index -Everything that has a vector, thus every data object in Weaviate, is also indexed in the vector index. Weaviate currently supports [HNSW](https://arxiv.org/abs/1603.09320) and flat vector indexes. +Everything that has a vector, thus every data object in Weaviate, is also indexed in the vector index. Weaviate supports several vector index types, which trade off search speed, recall and resource use in different ways. The default is [HNSW](https://arxiv.org/abs/1603.09320). See [Concepts: vector index](../concepts/indexing/vector-index.md) for more information about the vector index. @@ -54,7 +54,7 @@ A tip is to avoid deeply nested filters in the queries. Additionally, try to mak ## Profiling query performance -To diagnose slow queries, use [query profiling](/weaviate/search/query-profile.md) to get per-shard timing breakdowns. This shows exactly how long each phase takes — vector search, keyword scoring, filter evaluation, object retrieval — broken down by shard and cluster node. +To diagnose slow queries, use [query profiling](/weaviate/search/query-profile.md) to get per-shard timing breakdowns. This shows exactly how long each phase takes (vector search, keyword scoring, filter evaluation, and object retrieval), broken down by shard and cluster node. ## Questions and feedback diff --git a/docs/weaviate/starter-guides/custom-vectors.mdx b/docs/weaviate/starter-guides/custom-vectors.mdx index a1e5e11c9..49958d3c3 100644 --- a/docs/weaviate/starter-guides/custom-vectors.mdx +++ b/docs/weaviate/starter-guides/custom-vectors.mdx @@ -77,7 +77,7 @@ To install a client library, use the installer for the client language: -The v4 client requires Weaviate 1.23.7 or higher.

+The v4 client requires Weaviate `v1.23.7` and later.

```bash pip install -U weaviate-client diff --git a/docs/weaviate/starter-guides/managing-resources/index.md b/docs/weaviate/starter-guides/managing-resources/index.md index af24ddfbc..83689343f 100644 --- a/docs/weaviate/starter-guides/managing-resources/index.md +++ b/docs/weaviate/starter-guides/managing-resources/index.md @@ -145,7 +145,7 @@ Weaviate supports the following vector compression methods: | Product Quantization (PQ) | HNSW | Yes | Each vector becomes an array of integer-based centroids ([read more](../../concepts/vector-quantization.md#product-quantization)) | | Binary Quantization (BQ) | HNSW, Flat | No | Each vector dimension becomes a bit ([read more](../../concepts/vector-quantization.md#binary-quantization)) | | Scalar Quantization (SQ) | HNSW | Yes | Each vector dimension becomes an integer ([read more](../../concepts/vector-quantization.md#scalar-quantization)) | -| Rotational Quantization (RQ) | HNSW | No | Each vector is rotated then quantized to an integer ([read more](../../concepts/vector-quantization.md#rotational-quantization)) | +| Rotational Quantization (RQ) | All index types | No | Each vector is rotated then quantized to an integer ([read more](../../concepts/vector-quantization.md#rotational-quantization)) | As a starting point, use the following guidelines for selecting a compression method: diff --git a/docs/weaviate/starter-guides/managing-resources/indexing.mdx b/docs/weaviate/starter-guides/managing-resources/indexing.mdx index 450abef8b..8baa226a4 100644 --- a/docs/weaviate/starter-guides/managing-resources/indexing.mdx +++ b/docs/weaviate/starter-guides/managing-resources/indexing.mdx @@ -100,7 +100,7 @@ import HFreshStatus from '/_includes/feature-notes/hfresh_status.mdx'; HFresh indexes are well-suited when memory efficiency is a priority, especially with high-dimensional vectors. They use mandatory 1-bit rotational quantization (RQ) for postings and 8-bit RQ for centroids. Only the compressed centroid index is kept in memory. The posting lists live on disk, so memory usage stays low even as the collection grows. The trade-off is lower peak query throughput than HNSW, so HFresh is a good fit when you can tolerate higher query latency in exchange for smaller memory requirements. :::tip Tuning -Start with the default parameters. If recall is too low, increase `searchProbe` or the RQ `rescoreLimit` — both take effect at runtime. +Start with the default parameters. If recall is too low, increase `searchProbe` or the RQ `rescoreLimit`. Both take effect at runtime. ::: :::note From bd80a2e598b0b7d3ba1f08e0349587a83d383431 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Thu, 6 Aug 2026 17:33:48 +0200 Subject: [PATCH 51/84] docs(deploy,configuration): fix commands that fail on paste, wrong parameter names, and missing reference Three things break when copy-pasted: the EKS helm upgrade ended on a dangling line continuation so the shell hangs, a second one was found in the 1.25 migration guide, the backup module was named gcs-backup when the module id is backup-gcs, and the MUVERA parameter was documented as repetition when the real name is repetitions, contradicted by the page's own tested sample. Undocumented reference content operators can hit: six environment variables (the hybrid result floor, the three CORS settings, and the three backup chunking overrides) with their defaults and the releases they arrived in, and the six reserved property-name suffixes that cause a hard validation error with nothing in the docs to explain it. The SQ compression page imported TypeScript code and rendered none of it. Two sections now have TypeScript tabs; the third has no such snippet, and since all three tab sets share a group id, a reader who picked TypeScript would silently have been served Python there, so that section says so explicitly. The SQ options source turned out to be a Binary Quantization copy-paste, and both SQ sources passed a cache option that the TypeScript client's sq helper does not accept, so neither would have compiled. Also: HNSW_STARTUP_WAIT_FOR_VECTOR_CACHE is deprecated and was not marked so while its neighbour was; the combined module example used an environment variable core no longer reads; embedded XDG paths are used verbatim rather than having a subdirectory appended; two Go tabs were tagged as bash and a curl tab as Python; language-agnostic prose used Python-only parameter spellings; the tenant status vocabulary was the deprecated HOT/COLD; the MCP hybrid tool's filters argument was undocumented; the spellcheck module linked to the NER page; client versions moved out of prose into install commands; and HFresh is now mentioned on the compression guide, since it is the default for free clusters. --- .../howto/configure-sq/sq-compression-v3.ts | 12 +++--- .../configure-sq/sq-compression.options-v3.ts | 14 +++---- docs/cloud/embeddings/quickstart.mdx | 42 +++++++++++++++---- .../manage-collections/enable-compression.mdx | 4 ++ docs/deploy/configuration/backups.md | 2 +- docs/deploy/configuration/env-vars/index.md | 13 ++++-- .../configuration/env-vars/runtime-config.md | 4 +- docs/deploy/configuration/export.md | 4 +- docs/deploy/configuration/monitoring.md | 10 ++--- docs/deploy/installation-guides/eks.md | 2 +- docs/deploy/installation-guides/embedded.md | 4 +- .../installation-guides/spcs-integration.mdx | 2 +- docs/deploy/migration/weaviate-1-25.md | 2 +- docs/deploy/production/aws/hardening-eks.md | 4 +- docs/weaviate/concepts/modules.md | 2 +- docs/weaviate/config-refs/collections.mdx | 17 ++++++++ docs/weaviate/configuration/authz-authn.md | 2 +- .../compression/multi-vectors.md | 10 ++--- .../compression/sq-compression.md | 20 +++++++++ docs/weaviate/configuration/mcp-server.mdx | 11 +++-- docs/weaviate/configuration/modules.md | 5 ++- .../manage-collections/inverted-index.mdx | 26 ++++++------ .../manage-collections/multi-tenancy.mdx | 6 +-- docs/weaviate/modules/index.md | 2 +- 24 files changed, 148 insertions(+), 72 deletions(-) diff --git a/_includes/code/howto/configure-sq/sq-compression-v3.ts b/_includes/code/howto/configure-sq/sq-compression-v3.ts index f5af4099f..fd6e290c2 100644 --- a/_includes/code/howto/configure-sq/sq-compression-v3.ts +++ b/_includes/code/howto/configure-sq/sq-compression-v3.ts @@ -1,5 +1,3 @@ -// not yet supported in client 3.0.8 - import assert from 'assert'; import weaviate from 'weaviate-client'; // START-ANY @@ -27,7 +25,7 @@ const collection = await client.collections.create({ let collectionConfig = await collection.config.get(); -assert.equal(collectionConfig.vectorizers.default.indexConfig.quantizer.type, "SQ") +assert.equal(collectionConfig.vectorizers.default.indexConfig.quantizer.type, "sq") // Clean-up await client.collections.delete(collectionName); @@ -49,10 +47,10 @@ const collection = await client.collections.create({ vectorizers: weaviate.configure.vectors.selfProvided({ vectorIndexConfig: weaviate.configure.vectorIndex.hnsw({ quantizer: weaviate.configure.vectorIndex.quantizer.sq({ - cache: true, // Enable caching - rescoreLimit: 200, // The minimum number of candidates to fetch before rescoring + rescoreLimit: 200, // The minimum number of candidates to fetch before rescoring + trainingLimit: 50000, // The size of the training set used to determine the bucket boundaries }), - vectorCacheMaxObjects: 10000 // Cache size (used if `cache` enabled) + vectorCacheMaxObjects: 100000 // Maximum number of objects in the vector cache }) }) }) @@ -60,7 +58,7 @@ const collection = await client.collections.create({ let collectionConfig = await collection.config.get(); -assert.equal(collectionConfig.vectorizers.default.indexConfig.quantizer.type, "SQ") +assert.equal(collectionConfig.vectorizers.default.indexConfig.quantizer.type, "sq") // Clean-up await client.collections.delete(collectionName); diff --git a/_includes/code/howto/configure-sq/sq-compression.options-v3.ts b/_includes/code/howto/configure-sq/sq-compression.options-v3.ts index 8af478c8e..34422eb12 100644 --- a/_includes/code/howto/configure-sq/sq-compression.options-v3.ts +++ b/_includes/code/howto/configure-sq/sq-compression.options-v3.ts @@ -11,24 +11,24 @@ const collectionName = 'MyCollection'; // Prep await client.collections.delete(collectionName); -// START BQWithOptions +// START SQWithOptions const collection = await client.collections.create({ name: 'MyCollection', vectorizers: weaviate.configure.vectors.selfProvided({ vectorIndexConfig: weaviate.configure.vectorIndex.hnsw({ - quantizer: weaviate.configure.vectorIndex.quantizer.bq({ - cache: true, // Enable caching - rescoreLimit: 200, // The minimum number of candidates to fetch before rescoring + quantizer: weaviate.configure.vectorIndex.quantizer.sq({ + rescoreLimit: 200, // The minimum number of candidates to fetch before rescoring + trainingLimit: 50000, // The size of the training set used to determine the bucket boundaries }), - vectorCacheMaxObjects: 10000 // Cache size (used if `cache` enabled) + vectorCacheMaxObjects: 100000 // Maximum number of objects in the vector cache }) }) }) -// END BQWithOptions +// END SQWithOptions let collectionConfig = await collection.config.get(); -assert.equal(collectionConfig.vectorizers.default.indexConfig.quantizer.type, "bq") +assert.equal(collectionConfig.vectorizers.default.indexConfig.quantizer.type, "sq") // Clean-up await client.collections.delete(collectionName); diff --git a/docs/cloud/embeddings/quickstart.mdx b/docs/cloud/embeddings/quickstart.mdx index 804f0457c..8538cbb7c 100644 --- a/docs/cloud/embeddings/quickstart.mdx +++ b/docs/cloud/embeddings/quickstart.mdx @@ -80,14 +80,40 @@ import PromptStarter from "/src/components/PromptStarter"; To use Weaviate Embeddings, you will need: - - -- A Weaviate Cloud free cluster running at least Weaviate `1.28.5` -- A Weaviate client library that supports Weaviate Embeddings: - - **Python** client version `4.9.5` or higher - - **JavaScript/TypeScript** client version `3.2.5` or higher - - **Java** or **C#** clients - - **Go** client is not yet officially supported; you must pass the `X-Weaviate-Api-Key` and `X-Weaviate-Cluster-Url` headers manually upon instantiation as shown below. +- A Weaviate Cloud free cluster running Weaviate `v1.28.5` and later +- A Weaviate client library that supports Weaviate Embeddings. Install a supported release: + + + + +```bash +pip install -U "weaviate-client>=4.9.5" +``` + + + + +```bash +npm install weaviate-client@^3.2.5 +``` + + + + +The Java client supports Weaviate Embeddings. Install it as shown in the [client library page](/weaviate/client-libraries/java). + + + + +The C# client supports Weaviate Embeddings. Install it as shown in the [client library page](/weaviate/client-libraries/csharp). + + + + +The Go client does not support Weaviate Embeddings directly. Install it as shown in the [client library page](/weaviate/client-libraries/go), then pass the `X-Weaviate-Api-Key` and `X-Weaviate-Cluster-Url` headers manually upon instantiation, as shown below. + + + ## Step 1: Set up Weaviate diff --git a/docs/cloud/manage-collections/enable-compression.mdx b/docs/cloud/manage-collections/enable-compression.mdx index b261411c8..95b671cd0 100644 --- a/docs/cloud/manage-collections/enable-compression.mdx +++ b/docs/cloud/manage-collections/enable-compression.mdx @@ -85,6 +85,10 @@ Replace `YOUR-WEAVIATE-CLOUD-URL` with your cluster URL (e.g., `https://your-clu The update syntax depends on your collection's **vector index type** (HNSW, flat, or dynamic) and whether it uses **named vectors**. +:::note HFresh collections are already compressed +This procedure does not apply to collections that use the [HFresh index](/weaviate/concepts/vector-index#hfresh-index), which is the index behind the **Cost Optimized** optimization profile and therefore the only index available on [free clusters](../manage-clusters/create.mdx#optimization-profile). HFresh has [rotational quantization (RQ)](../../weaviate/configuration/compression/rq-compression.md) built in and always on: the in-memory centroid index uses 8-bit RQ and the on-disk posting lists use 1-bit RQ. Weaviate rejects a request that tries to add PQ, SQ or BQ to an HFresh index, or that tries to disable its RQ, so there is nothing to enable. HFresh collections are also not listed by the categorization example below. +::: + #### HNSW index (default) Most collections use the HNSW index. To enable compression: diff --git a/docs/deploy/configuration/backups.md b/docs/deploy/configuration/backups.md index de8ac6b11..22a4d57ea 100644 --- a/docs/deploy/configuration/backups.md +++ b/docs/deploy/configuration/backups.md @@ -316,7 +316,7 @@ The `*` character matches any sequence of characters. For example, `Article*` ma | name | type | required | default | description | | ---- | ---- | ---- | ---- |---- | | `CPUPercentage` | number | no | `50%` | An optional integer to set the desired CPU core utilization ranging from 1%-80%. | -| `ChunkSize` | number | no | `128MB` | An optional integer represents the desired size for chunks. Weaviate will attempt to come close the specified size, with a minimum of 2MB, default of 128MB, and a maximum of 512MB.| +| `ChunkSize` | number | no | `128MB` | An optional integer represents the desired size for chunks. Weaviate will attempt to come close the specified size, with a minimum of 2MB, default of 128MB, and a maximum of 512MB. This is a per-request setting. The operator-level chunking defaults are set separately with the [`BACKUP_MIN_CHUNK_SIZE`, `BACKUP_CHUNK_TARGET_SIZE` and `BACKUP_SPLIT_FILE_SIZE`](/deploy/configuration/env-vars/index.md#general) environment variables.| | `CompressionLevel`| string | no | `DefaultCompression` | An optional [compression level](#compression-levels) to be used. | | `Path` | string | no | `""` | An optional string to manually set the backup location. If not provided, the backup will be stored in the default location. Introduced in Weaviate `v1.27.2`. | | `incremental_base_backup_id` | string | no | `None` | The ID of a previous backup to use as the base for an [incremental backup](#incremental-backups). Files unchanged since the base backup are stored as references rather than copied. Introduced in Weaviate `v1.37`. | diff --git a/docs/deploy/configuration/env-vars/index.md b/docs/deploy/configuration/env-vars/index.md index 65c811c77..52d7f153b 100644 --- a/docs/deploy/configuration/env-vars/index.md +++ b/docs/deploy/configuration/env-vars/index.md @@ -32,6 +32,12 @@ import APITable from '@site/src/components/APITable'; | --- | --- | --- | --- | | `ASYNC_INDEXING` | If set, Weaviate creates vector indexes asynchronously to the object creation process. This can be useful for importing large amounts of data. (default: `false`) | `boolean` | `false` | | `AUTOSCHEMA_ENABLED` | Whether to infer the schema where necessary with the autoschema (default: `true`) | `boolean` | `true` | +| `BACKUP_CHUNK_TARGET_SIZE` | Target size of a backup chunk when Weaviate packs several small shard files into one chunk. Weaviate raises the effective value to at least the big-file threshold derived from `BACKUP_MIN_CHUNK_SIZE`. This is a server-level setting and is separate from the per-request [`ChunkSize`](/deploy/configuration/backups.md#available-config-object-properties) option. Accepts a plain byte count or a value with a unit (`B`, `KiB`, `MiB`, `GiB`, `TiB`, `KB`, `MB`, `GB`, `TB`). Default: `10MiB`
Added in `v1.36`, and backported to `v1.33.14`, `v1.34.11`, and `v1.35.4` | `string` | `32MiB` | +| `BACKUP_MIN_CHUNK_SIZE` | Lower bound for the big-file threshold used when chunking a backup. A shard file at or above the threshold is written to its own chunk, which lets an incremental backup skip it when it has not changed; smaller files are packed together. This is a server-level setting and is separate from the per-request [`ChunkSize`](/deploy/configuration/backups.md#available-config-object-properties) option. Accepts a plain byte count or a value with a unit (`B`, `KiB`, `MiB`, `GiB`, `TiB`, `KB`, `MB`, `GB`, `TB`). Default: `1MiB`
Added in `v1.37`, and backported to `v1.34.18`, `v1.35.13`, and `v1.36.3` | `string` | `4MiB` | +| `BACKUP_SPLIT_FILE_SIZE` | Size at which a single large shard file is split across several backup chunks. This is a server-level setting and is separate from the per-request [`ChunkSize`](/deploy/configuration/backups.md#available-config-object-properties) option. Accepts a plain byte count or a value with a unit (`B`, `KiB`, `MiB`, `GiB`, `TiB`, `KB`, `MB`, `GB`, `TB`). Default: `50GiB`
Added in `v1.37`, and backported to `v1.35.15` and `v1.36.5` | `string` | `10GiB` | +| `CORS_ALLOW_HEADERS` | Value of the `Access-Control-Allow-Headers` response header on the REST API, which controls the request headers a browser may send cross-origin. The default is the long list of headers Weaviate itself reads, including `Content-Type`, `Authorization` and the per-provider API-key headers. Default: the built-in header list | `string - comma separated names` | `Content-Type, Authorization` | +| `CORS_ALLOW_METHODS` | Value of the `Access-Control-Allow-Methods` response header on the REST API, which controls the HTTP methods a browser may use cross-origin. Default: `*` | `string - comma separated names` | `GET, POST, OPTIONS` | +| `CORS_ALLOW_ORIGIN` | Value of the `Access-Control-Allow-Origin` response header on the REST API, which controls the origins a browser may call Weaviate from. Set this to reach Weaviate directly from browser code on a specific site. Default: `*` | `string` | `https://example.com` | | `DEFAULT_QUANTIZATION` | Default quantization technique - can be overridden by the quantization method specified in the collection definition. Available values: `rq-8`, `rq-1`, `pq`, `bq`, `sq` and `none`. Default: `none`.

Note: If the selected quantization method isn't supported for the index type of a collection (for example PQ & SQ aren't supported for the flat index), the quantization won't be applied to that collection.

Added in `v1.33` | `string` | `rq-8` | | `DEFAULT_SHARDING_COUNT` | Default `desiredCount` for new single-tenant collections, used when the collection definition does not specify one. An explicit `desiredCount` in the class creation request still takes precedence. A value of `0` (default) uses the cluster node count. Multi-tenant collections are unaffected. Must be `<= 512`. Runtime-configurable. Default: `0`
Added in `v1.37` | `string - number` | `12` | | `DEFAULT_VECTOR_INDEX` | Default vector index type for new collections (and named vectors), used when the collection definition does not specify one. An explicit `vectorIndexType` in the collection definition still takes precedence. Available values: `hnsw`, `flat`, `dynamic`, and `hfresh`. Runtime-configurable. Default: `hnsw`
Added in `v1.37.3` | `string` | `flat` | @@ -57,7 +63,7 @@ import APITable from '@site/src/components/APITable'; | `INVERTED_SORTER_DISABLED` | Forces the "objects bucket" strategy and doesn't consider inverted sorting. Most users should never set this flag; it exists for benchmarking and as a safety net. Default: `false` | `boolean` | `false` | | `GO_PROFILING_DISABLE` | If `true`, disables Go profiling. Default: `false`. | `boolean` | `false` | | `GO_PROFILING_PORT` | Sets the port for the Go profiler. Default: `6060` | `integer` | `6060` | -| `DEBUG_ENDPOINTS_ENABLED` | Gate for the debug HTTP listener (the profiling port set by `GO_PROFILING_PORT`, default `6060`), which serves Weaviate's **unauthenticated** internal debug and profiling endpoints — `/debug/config`, Go profiling (`/debug/pprof/*`, `/debug/fgprof`), and various maintenance and diagnostic routes. [Runtime-configurable](/deploy/configuration/env-vars/runtime-config.md) via the `debug_endpoints_enabled` override. Default: `false`. `GO_PROFILING_DISABLE` still controls whether the listener binds at all.
Added in `v1.37.9` | `boolean` | `true` | +| `DEBUG_ENDPOINTS_ENABLED` | Gate for the debug HTTP listener (the profiling port set by `GO_PROFILING_PORT`, default `6060`), which serves Weaviate's **unauthenticated** internal debug and profiling endpoints: `/debug/config`, Go profiling (`/debug/pprof/*`, `/debug/fgprof`), and various maintenance and diagnostic routes. [Runtime-configurable](/deploy/configuration/env-vars/runtime-config.md) via the `debug_endpoints_enabled` override. Default: `false`. `GO_PROFILING_DISABLE` still controls whether the listener binds at all.
Added in `v1.37.9` | `boolean` | `true` | | `GRPC_MAX_MESSAGE_SIZE` | Maximum gRPC message size in bytes. Requests larger than this limit (e.g. a large `insert_many` call) are rejected. Default: `104858000` (approximately 100 MB) | `string - number` | `2000000000` | | `GRPC_PORT` | The port on which Weaviate's gRPC server listens for incoming requests. Default: `50051` | `string - number` | `50052` | | `HNSW_GEO_INDEX_EF` | Balance geo index search speed and recall. This value controls the search depth for geo-based queries. Default: `800`
Added in `v1.31.22` | `string - number` | `1000` | @@ -96,11 +102,12 @@ import APITable from '@site/src/components/APITable'; | `QUERY_BOOST_DEFAULT_DEPTH` | Default candidate-pool size used when a [Boost](/weaviate/search/boost.md) query does not set its own `depth`. The primary search retrieves this many candidates before the boost rescorer runs. Must be a positive integer and is hard-capped by `QUERY_MAXIMUM_RESULTS`. Default: `100`
Added in `v1.38` | `string - number` | `200` | | `QUERY_CROSS_REFERENCE_DEPTH_LIMIT` | Sets the maximum depth of cross-references to be resolved in a query. Defaults to 5. | `string - number` | `3` | | `QUERY_DEFAULTS_LIMIT` | Sets the default number of objects to be returned in a query. | `string - number` | `25`
Defaults to `10`| +| `QUERY_HYBRID_MAXIMUM_RESULTS` | Minimum size of the candidate pool that each leg of a [hybrid search](/weaviate/search/hybrid.md) retrieves before fusion. Each of the keyword and vector sub-searches fetches at least `offset` plus this many candidates, so that paging deeper into a hybrid result set stays consistent. Raise it if hybrid results shift between pages; higher values cost more work per query. Default: `100`
Added in `v1.32`, and backported to `v1.30.12` and `v1.31.6` | `string - number` | `200` | | `QUERY_MAXIMUM_RESULTS` | Sets the maximum total number of objects that can be retrieved. | `string - number` | `10000` | | `QUERY_SLOW_LOG_ENABLED` | Log slow queries for debugging. Requires a restart to update. | `boolean` | `False` | | `QUERY_SLOW_LOG_THRESHOLD` | Set a threshold time for slow query logging. Requires a restart to update. | `string` | `2s`
Values are times: `3h`, `2s`, `100ms` | | `REINDEX_SET_TO_ROARINGSET_AT_STARTUP` | Allow Weaviate to perform a one-off re-indexing to use Roaring Bitmaps. | `boolean` | `true` | -| `REVECTORIZE_CHECK_DISABLED` | Disables the optimization that reuses an object's existing vector when it is updated and none of its vectorized properties changed. By default (`false`) this check runs and skips unnecessary re-vectorization; set to `true` to re-vectorize on every update. Disabling removes a read-before-write — which can raise write throughput, or force always-fresh vectors — at the cost of an extra embedding call (and API cost, for remote vectorizers) per update. Default: `false` | `boolean` | `false` | +| `REVECTORIZE_CHECK_DISABLED` | Disables the optimization that reuses an object's existing vector when it is updated and none of its vectorized properties changed. By default (`false`) this check runs and skips unnecessary re-vectorization; set to `true` to re-vectorize on every update. Disabling removes a read-before-write. That can raise write throughput, and it guarantees a fresh vector on every update, at the cost of one extra embedding call per update (and the associated API cost, for remote vectorizers). Default: `false` | `boolean` | `false` | | `TENANT_ACTIVITY_READ_LOG_LEVEL` | Sets the log level for tenant read activity. Useful for analysis or debugging purposes. Default: `debug` | `string` | `info` | | `TENANT_ACTIVITY_WRITE_LOG_LEVEL` | Sets the log level for tenant write activity. Useful for analysis or debugging purposes. Default: `debug` | `string` | `info` | | `TOKENIZER_CONCURRENCY_COUNT` | Limit the combined number of GSE and Kagome tokenizers running at the same time. Default: `GOMAXPROCS` | `string - number` | `NUMBER_OF_CPU_CORES` | @@ -224,7 +231,7 @@ For more information on authentication and authorization, see the [Authenticatio | `CLUSTER_GOSSIP_BIND_PORT` | Port for exchanging network state information. | `string - number` | `7102` | | `CLUSTER_HOSTNAME` | Hostname of a node. Always set this value if the default OS hostname might change over time. | `string` | `node1` | | `CLUSTER_JOIN` | The service name of the "founding" member node in a cluster setup | `string` | `weaviate-node-1:7100` | -| `HNSW_STARTUP_WAIT_FOR_VECTOR_CACHE` | If `true`, vector cache prefill is synchronous when a node starts. The node reports ready to serve when the cache is hot. Default changed to `true` in `v1.36.6`. For collections where [dynamic lazy shard loading](/weaviate/concepts/storage#dynamic-lazy-shard-loading) is active, this is always overridden to `false` regardless of the configured value. The configured value only applies to eagerly-loaded collections. | `boolean` | `true` | +| `HNSW_STARTUP_WAIT_FOR_VECTOR_CACHE` | If `true`, vector cache prefill is synchronous when a node starts. The node reports ready to serve when the cache is hot. Default changed to `true` in `v1.36.6`. **Deprecated in `v1.36.6`.** Setting it still overrides auto-detection, but Weaviate logs a deprecation warning at startup and the variable will be removed in a future version. When it is unset, prefill behavior is governed by [dynamic lazy shard loading](/weaviate/concepts/storage#dynamic-lazy-shard-loading). For collections where dynamic lazy shard loading is active, this is always overridden to `false` regardless of the configured value. The configured value only applies to eagerly-loaded collections. | `boolean` | `true` | | `COLLECTION_RETRIEVAL_STRATEGY`| Set collection definition retrieval behavior for a data request.

  • `LeaderOnly` (default): Always requests the definition from the leader node.
  • `LocalOnly`: Always use the local definition
  • `LeaderOnMismatch`: Requests the definition if outdated.
([Read more](/weaviate/concepts/replication-architecture/consistency.md#collection-definition-requests-in-queries)) | `string` | `LeaderOnly` | | `RAFT_BOOTSTRAP_EXPECT` | The number of voter notes at bootstrapping time | `string - number` | `1` | | `RAFT_BOOTSTRAP_TIMEOUT` | The time in seconds to wait for the cluster to bootstrap | `string - number` | `90` | diff --git a/docs/deploy/configuration/env-vars/runtime-config.md b/docs/deploy/configuration/env-vars/runtime-config.md index 137ead48b..e4f555f75 100644 --- a/docs/deploy/configuration/env-vars/runtime-config.md +++ b/docs/deploy/configuration/env-vars/runtime-config.md @@ -120,14 +120,14 @@ The following overrides are currently supported: ### MCP -Added in `v1.38`. Toggling these at runtime does not require a cluster restart — the HTTP handlers stay registered and per-request checks pick up the new value. See [MCP server — Toggle without restart](/weaviate/configuration/mcp-server.mdx#toggle-without-restart) for behavior details. +Added in `v1.38`. Toggling these at runtime does not require a cluster restart: the HTTP handlers stay registered and per-request checks pick up the new value. See [MCP server: Toggle without restart](/weaviate/configuration/mcp-server.mdx#toggle-without-restart) for behavior details. | Runtime override name | Environment variable name | | :-------------------------------- | :---------------------------------- | | `mcp_server_enabled` | `MCP_SERVER_ENABLED` | | `mcp_server_write_access_enabled` | `MCP_SERVER_WRITE_ACCESS_ENABLED` | -`MCP_SERVER_CONFIG_PATH` is intentionally **not** runtime-configurable — tool descriptions are baked into the tool schemas at registration. +`MCP_SERVER_CONFIG_PATH` is intentionally **not** runtime-configurable, because tool descriptions are baked into the tool schemas at registration. Refer to the [Environment variables](./index.md) page for descriptions on each configuration option diff --git a/docs/deploy/configuration/export.md b/docs/deploy/configuration/export.md index b172b9815..7ede285ab 100644 --- a/docs/deploy/configuration/export.md +++ b/docs/deploy/configuration/export.md @@ -10,7 +10,7 @@ import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBl import PyCode from '!!raw-loader!/\_includes/code/howto/configure.export.py'; import CsCode from '!!raw-loader!/\_includes/code/csharp/ManageDataExportTest.cs'; -:::caution Preview — added in `v1.37` +:::caution Preview (added in `v1.37`) This is a preview feature. The API may change in future releases. ::: @@ -206,7 +206,7 @@ Files are named `{collection}_{shard}_{rangeIndex}.parquet`. Collection and tena | COLD | Exported directly from disk without loading into memory (remains COLD). | | OFFLOADED | Skipped. The skip reason is recorded in the shard status. | -The tenant list is snapshotted when the export is created — tenants created during the export are not included. +The tenant list is snapshotted when the export is created. Tenants created during the export are not included. ## Permissions diff --git a/docs/deploy/configuration/monitoring.md b/docs/deploy/configuration/monitoring.md index 4ecf2dc15..fcec0e0db 100644 --- a/docs/deploy/configuration/monitoring.md +++ b/docs/deploy/configuration/monitoring.md @@ -500,10 +500,10 @@ Added in `v1.38`. These metrics track tool traffic, latency, auth failures, and Label values: -- **`tool`** — the MCP tool name (e.g. `weaviate-query-hybrid`, `weaviate-objects-upsert`). -- **`status`** — `success` · `error` · `denied` · `write_disabled`. `denied` covers authorization failures classified via the `Forbidden` / `Unauthenticated` error families. `write_disabled` is emitted when a write call hits the runtime guard. -- **`reason`** — `missing_token` · `invalid_token` · `forbidden` · `unauthenticated`. `missing_token` and `invalid_token` are detected at the principal-extraction step; `forbidden` and `unauthenticated` are detected at authorization time. -- **`write_access`** — `enabled` / `disabled`, matching the live state of `MCP_SERVER_WRITE_ACCESS_ENABLED` at the time of the `tools/list` call. +- **`tool`**: the MCP tool name (e.g. `weaviate-query-hybrid`, `weaviate-objects-upsert`). +- **`status`**: `success` · `error` · `denied` · `write_disabled`. `denied` covers authorization failures classified via the `Forbidden` / `Unauthenticated` error families. `write_disabled` is emitted when a write call hits the runtime guard. +- **`reason`**: `missing_token` · `invalid_token` · `forbidden` · `unauthenticated`. `missing_token` and `invalid_token` are detected at the principal-extraction step; `forbidden` and `unauthenticated` are detected at authorization time. +- **`write_access`**: `enabled` / `disabled`, matching the live state of `MCP_SERVER_WRITE_ACCESS_ENABLED` at the time of the `tools/list` call. --- @@ -530,7 +530,7 @@ your uses perfectly: ## Query profiling -For per-query performance analysis, Weaviate provides [query profiling](/weaviate/search/query-profile.md). Unlike Prometheus metrics which show aggregate performance, query profiling provides per-shard timing breakdowns for individual queries — useful for diagnosing specific slow queries. +For per-query performance analysis, Weaviate provides [query profiling](/weaviate/search/query-profile.md). Unlike Prometheus metrics which show aggregate performance, query profiling provides per-shard timing breakdowns for individual queries, which is useful for diagnosing specific slow queries. ## `nodes` API Endpoint diff --git a/docs/deploy/installation-guides/eks.md b/docs/deploy/installation-guides/eks.md index 36b5d4784..5a97e91f2 100644 --- a/docs/deploy/installation-guides/eks.md +++ b/docs/deploy/installation-guides/eks.md @@ -203,7 +203,7 @@ replicas: 3 ```bash helm upgrade --install weaviate weaviate/weaviate \ --namespace weaviate \ - --values values.yaml \ + --values values.yaml ``` #### Verify your deployment diff --git a/docs/deploy/installation-guides/embedded.md b/docs/deploy/installation-guides/embedded.md index 173e400be..2c77b3a83 100644 --- a/docs/deploy/installation-guides/embedded.md +++ b/docs/deploy/installation-guides/embedded.md @@ -43,9 +43,9 @@ To configure Embedded Weaviate, set these variables in your instantiation code o | Parameter | Type | Default | Description | | :-- | :-- | :-- | :-- | | `additional_env_vars` | string | None. | Pass additional environment variables, such as API keys, to the server. | -| `binary_path` | string | varies | Binary download directory. If the binary is not present, the client downloads the binary.

If `XDG_CACHE_HOME` is set, the default is: `XDG_CACHE_HOME/weaviate-embedded/`

If `XDG_CACHE_HOME` is not set, the default is: `~/.cache/weaviate-embedded` | +| `binary_path` | string | varies | Binary download directory. If the binary is not present, the client downloads the binary.

If `XDG_CACHE_HOME` is set, its value is used verbatim as the default. No subdirectory is appended, so `XDG_CACHE_HOME=/foo` makes the default exactly `/foo`.

If `XDG_CACHE_HOME` is not set, the default is: `~/.cache/weaviate-embedded/` | | `hostname` | string | 127.0.0.1 | Hostname or IP address | -| `persistence_data_path` | string | varies | Data storage directory.

If `XDG_DATA_HOME` is set, the default is: `XDG_DATA_HOME/weaviate/`

If `XDG_DATA_HOME` is not set, the default is: `~/.local/share/weaviate` | +| `persistence_data_path` | string | varies | Data storage directory.

If `XDG_DATA_HOME` is set, its value is used verbatim as the default. No subdirectory is appended, so `XDG_DATA_HOME=/foo` makes the default exactly `/foo`.

If `XDG_DATA_HOME` is not set, the default is: `~/.local/share/weaviate` | | `port` | integer | 8079 | The Weaviate server request port. | | `version` | string | A version pinned in the client (see note) | Specify the version with one of the following:
-`"latest"`
- The version number as a string: `"1.19.6"`
- The URL of a Weaviate binary ([See below](/deploy/installation-guides/embedded.md#file-url)) | diff --git a/docs/deploy/installation-guides/spcs-integration.mdx b/docs/deploy/installation-guides/spcs-integration.mdx index 8c724bbd7..862614201 100644 --- a/docs/deploy/installation-guides/spcs-integration.mdx +++ b/docs/deploy/installation-guides/spcs-integration.mdx @@ -316,7 +316,7 @@ response = collection.query.near_text(query="animal",limit=2, include_vector=Tru for o in response.objects: print(o.vector) -# Hybrid search client.close() +# Hybrid search response = collection.query.hybrid( query="animals", limit=5 diff --git a/docs/deploy/migration/weaviate-1-25.md b/docs/deploy/migration/weaviate-1-25.md index f35223ece..9a943f5af 100644 --- a/docs/deploy/migration/weaviate-1-25.md +++ b/docs/deploy/migration/weaviate-1-25.md @@ -103,7 +103,7 @@ Here, the image tag is overridden to `1.25.0`. You can also modify this value di helm upgrade weaviate weaviate/weaviate \ --namespace weaviate \ --values ./values.yaml \ - --set image.tag="1.25.0" \ + --set image.tag="1.25.0" ``` ### 4. Verify update diff --git a/docs/deploy/production/aws/hardening-eks.md b/docs/deploy/production/aws/hardening-eks.md index c338082aa..ce516d9aa 100644 --- a/docs/deploy/production/aws/hardening-eks.md +++ b/docs/deploy/production/aws/hardening-eks.md @@ -4,7 +4,7 @@ sidebar_label: Hardening EKS deployments description: Harden your self-hosted Weaviate deployment on Amazon EKS. --- -You've got a Weaviate deployment running on EKS—awesome! Now it's time to make it production-ready and secure. +You've got a Weaviate deployment running on EKS. Awesome! Now it's time to make it production-ready and secure. While Weaviate is a powerful vector database, like any self-hosted service, it needs proper security hardening. Your first deployment focused on getting things running; for production, we need to tighten things up. @@ -254,7 +254,7 @@ Set up alerts for issues that matter: - 🚨 Backup failures :::tip Alert Fatigue -Don't go overboard—alert fatigue is real. Focus on actionable, critical alerts. +Don't go overboard. Alert fatigue is real. Focus on actionable, critical alerts. ::: ### Use proper dashboards diff --git a/docs/weaviate/concepts/modules.md b/docs/weaviate/concepts/modules.md index 1998a9e4e..6791ee8f9 100644 --- a/docs/weaviate/concepts/modules.md +++ b/docs/weaviate/concepts/modules.md @@ -43,7 +43,7 @@ Reader or Generator modules can be used on top of a Vectorizer module. These mod ### Other modules -These include those such as `gcs-backup` or `text-spellcheck`. +These include those such as `backup-gcs` or `text-spellcheck`. ## Dependencies diff --git a/docs/weaviate/config-refs/collections.mdx b/docs/weaviate/config-refs/collections.mdx index 056737b61..e97108ebd 100644 --- a/docs/weaviate/config-refs/collections.mdx +++ b/docs/weaviate/config-refs/collections.mdx @@ -263,6 +263,23 @@ Additionally, we strongly recommend that you do not use the following words as p - `vector` - `_vector` +##### Reserved suffixes + +A property name may also not *end* in one of the following suffixes, because each would collide with an internal index that Weaviate derives from another property: + +- `_searchable` +- `_rangeable` +- `_temp` +- `__meta_count` +- `_propertyLength` +- `_nullState` + +A property whose name ends in one of these suffixes, such as `comments_temp`, is rejected with a validation error: `'comments_temp' is not a valid property name: suffix '_temp' is reserved for internal indices`. + +This check runs when you create a collection or add a property to an existing collection. It is not applied when an existing collection definition is loaded, so a collection created before the check was introduced continues to work, and a backup that contains such a property still restores. + +The check was added in `v1.38.0`, and backported to `v1.35.20`, `v1.36.15`, and `v1.37.5`. + #### `tokenization` You can customize how `text` data is tokenized and indexed in the inverted index. Tokenization influences the results returned by the [`bm25`](../api/graphql/search-operators.md#bm25) and [`hybrid`](../api/graphql/search-operators.md#hybrid) operators, and [`where` filters](../api/graphql/filters.md). diff --git a/docs/weaviate/configuration/authz-authn.md b/docs/weaviate/configuration/authz-authn.md index 767b86aa7..3ad1f36fd 100644 --- a/docs/weaviate/configuration/authz-authn.md +++ b/docs/weaviate/configuration/authz-authn.md @@ -113,7 +113,7 @@ With [undifferentiated access](../../deploy/configuration/authorization.md#undif - [Configuration: OIDC](/deploy/configuration/oidc.md) - [Configuration: RBAC](/weaviate/configuration/rbac/index.mdx) - [Configuration: Environment variables - Authentication and Authorization](/deploy/configuration/env-vars/index.md#authentication-and-authorization) -- [Weaviate MCP server](/weaviate/configuration/mcp-server.mdx) — authenticates via API key and respects RBAC permissions. +- [Weaviate MCP server](/weaviate/configuration/mcp-server.mdx) (authenticates via API key and respects RBAC permissions) ## Questions and feedback diff --git a/docs/weaviate/configuration/compression/multi-vectors.md b/docs/weaviate/configuration/compression/multi-vectors.md index be4537281..549cf4940 100644 --- a/docs/weaviate/configuration/compression/multi-vectors.md +++ b/docs/weaviate/configuration/compression/multi-vectors.md @@ -69,12 +69,12 @@ The [Weaviate Embeddings multimodal model](/weaviate/model-providers/weaviate/em
The final dimensionality of the MUVERA encoded vector will be -`repetition * 2^ksim * dprojections`. Carefully tuning these parameters +`repetitions * 2^ksim * dprojections`. Carefully tuning these parameters is crucial to balance memory usage and retrieval accuracy. These parameters can be used to fine-tune MUVERA: -- **`ksim`** (`int`): +- **`ksim`** (`int`, default: `4`): The number of Gaussian vectors sampled for the SimHash partitioning function. This parameter determines the number of bits in the hash, and consequently, the number of buckets created in the space partitioning step. The total @@ -83,7 +83,7 @@ These parameters can be used to fine-tune MUVERA: the accuracy of the approximation but also increasing the dimensionality of the intermediate encoded vectors. -- **`dprojections`** (`int`): +- **`dprojections`** (`int`, default: `16`): The dimensionality of the sub-vectors after the random linear projection in the dimensionality reduction step. After partitioning the multi-vector embedding into buckets, each bucket's aggregated vector is projected down @@ -92,9 +92,9 @@ These parameters can be used to fine-tune MUVERA: fixed-dimensional encoding, leading to lower memory consumption but potentially at the cost of some information loss and retrieval accuracy. -- **`repetition`** (`int`): +- **`repetitions`** (`int`, default: `10`): The number of times the space partitioning and dimensionality reduction - steps are repeated. This repetition allows for capturing different perspectives + steps are repeated. Each repetition captures a different perspective of the multi-vector embedding and can improve the robustness and accuracy of the final fixed-dimensional encoding. The resulting single vectors from each repetition are concatenated. A higher number of repetitions increases diff --git a/docs/weaviate/configuration/compression/sq-compression.md b/docs/weaviate/configuration/compression/sq-compression.md index e512bdec1..ce3ae4cdf 100644 --- a/docs/weaviate/configuration/compression/sq-compression.md +++ b/docs/weaviate/configuration/compression/sq-compression.md @@ -35,6 +35,14 @@ SQ can be enabled at collection creation time through the collection definition: language="py" /> + + + + + + - - No — it's built into the Weaviate Server binary, not a separate package you install. Setting MCP_SERVER_ENABLED=true exposes the MCP endpoint on the same port as the REST API; nothing extra to run or deploy. The separate "Weaviate Docs MCP server" (Kapa-powered, serves documentation to LLMs) is a distinct product. + No. It's built into the Weaviate Server binary, not a separate package you install. Setting MCP_SERVER_ENABLED=true exposes the MCP endpoint on the same port as the REST API; nothing extra to run or deploy. The separate "Weaviate Docs MCP server" (Kapa-powered, serves documentation to LLMs) is a distinct product. - question: Which tools does the Weaviate MCP server expose? answer: >- - Four tools, gated by RBAC permissions — weaviate-collections-get-config (inspect collection schemas), weaviate-tenants-list (list tenants in a multi-tenant collection), weaviate-query-hybrid (run hybrid vector + keyword searches), and weaviate-objects-upsert (create or update objects, requires write access). + Four tools, gated by RBAC permissions. They are weaviate-collections-get-config (inspect collection schemas), weaviate-tenants-list (list tenants in a multi-tenant collection), weaviate-query-hybrid (run hybrid vector + keyword searches), and weaviate-objects-upsert (create or update objects, requires write access). - question: How do I request a new MCP tool or feature? answer: >- Open a feature request on the Weaviate GitHub repo at https://github.com/weaviate/weaviate/issues/new/choose. Pick the "Feature request" template and describe the tool, parameter, or capability you'd like the MCP server to expose, with a concrete use case. @@ -244,7 +244,7 @@ Lists tenants for multi-tenant collections. - `collection_name` (string, required): The collection to inspect. -**Returns:** List of tenants and their activity status (HOT/COLD). +**Returns:** List of tenants and their activity status (`ACTIVE` or `INACTIVE`, and `OFFLOADED` for tenants that have been offloaded to cold storage). ### `weaviate-query-hybrid` @@ -260,7 +260,10 @@ Performs a hybrid search combining vector similarity and keyword matching (BM25) - `target_vectors` (array, optional): Named vectors to use for vector search. - `target_properties` (array, optional): Properties to search with BM25. If omitted, searches all text properties. - `return_properties` (array, optional): Properties to include in results. -- `return_metadata` (array, optional): Metadata fields to return (e.g., `id`, `distance`, `score`, `creationTimeUnix`). +- `return_metadata` (array, optional): Metadata fields to return (e.g., `id`, `vector`, `distance`, `score`, `creationTimeUnix`, `lastUpdateTimeUnix`). +- `filters` (object, optional): A [where filter](/weaviate/api/graphql/filters.md) applied before scoring. + +A leaf filter is an object with `path` (an array of property names), `operator`, and a typed value field. The typed value field is one of `valueText`, `valueInt`, `valueNumber`, `valueBoolean`, `valueDate`, the corresponding `value*Array` field for a `Contains*` operator, or `valueGeoRange` for `WithinGeoRange`. Combine leaves with `{"operator": "And" | "Or", "operands": [ ... ]}`, nested to any depth. The supported operators are `And`, `Or`, `Not`, `Equal`, `NotEqual`, `Like`, `GreaterThan`, `GreaterThanEqual`, `LessThan`, `LessThanEqual`, `ContainsAny`, `ContainsAll`, `ContainsNone`, `WithinGeoRange`, and `IsNull`. See [Concepts: Filtering](/weaviate/concepts/filtering.md) for how filters interact with search. **Returns:** Ranked objects with similarity scores and distances. diff --git a/docs/weaviate/configuration/modules.md b/docs/weaviate/configuration/modules.md index c4264ba89..805b2b8f8 100644 --- a/docs/weaviate/configuration/modules.md +++ b/docs/weaviate/configuration/modules.md @@ -57,16 +57,17 @@ services: The list of API-based modules can be found on the [model provider integrations page](../model-providers/index.md#api-based). You can also inspect the [source code](https://github.com/weaviate/weaviate/blob/main/adapters/handlers/rest/configure_api.go) where the list is defined. -This can be combined with enabling individual modules. For example, the example below enables all API-based modules, Ollama modules and the `backup-s3` module. +Enabling individual modules can be combined with the API-based modules. For example, since API-based modules are enabled by default from `v1.33`, the example below enables the Ollama modules and the `backup-s3` module alongside them. ```yaml services: weaviate: environment: - ENABLE_API_BASED_MODULES: 'true' ENABLE_MODULES: 'text2vec-ollama,generative-ollama,backup-s3' ``` +To opt out of the API-based modules from `v1.33` onwards, set `API_BASED_MODULES_DISABLED` to `true`. The older `ENABLE_API_BASED_MODULES` variable is no longer read. + Note that enabling multiple vectorizer (e.g. `text2vec`, `multi2vec`) modules will disable the [`Explore` functionality](../api/graphql/explore.md). If you need to use `Explore`, you should only enable one vectorizer module. ### Module-specific variables diff --git a/docs/weaviate/manage-collections/inverted-index.mdx b/docs/weaviate/manage-collections/inverted-index.mdx index 76cd11557..9c697a5f7 100644 --- a/docs/weaviate/manage-collections/inverted-index.mdx +++ b/docs/weaviate/manage-collections/inverted-index.mdx @@ -32,13 +32,13 @@ You can [enable inverted indexes](#enable-inverted-index-for-keyword-searches-an
Enabling inverted index -The inverted index in Weaviate can be enabled through parameters at the property level: +The inverted index in Weaviate can be enabled through parameters at the property level. The names below are the REST and camelCase client spellings; the Python client uses the snake_case equivalent, so `indexFilterable` is `index_filterable`, `indexSearchable` is `index_searchable` and `indexRangeFilters` is `index_range_filters`. -**`index_filterable`** - Controls whether a property can be used in where filters. When set to `true`, the property values are indexed for efficient filtering operations. Disable this for properties that don't need filtering to save storage space. +**`indexFilterable`** - Controls whether a property can be used in where filters. When set to `true`, the property values are indexed for efficient filtering operations. Disable this for properties that don't need filtering to save storage space. -**`index_searchable`** - Determines whether a property participates in keyword search queries. When `true`, the property's text content is tokenized and indexed for search. Set to `false` for properties that shouldn't be searchable to improve performance. +**`indexSearchable`** - Determines whether a property participates in keyword search queries. When `true`, the property's text content is tokenized and indexed for search. Set to `false` for properties that shouldn't be searchable to improve performance. -**`index_range_filters`** - Enables range filtering capabilities (greater than, less than, etc.) for numerical and date properties. When enabled, additional indexing structures are created to support efficient range queries. +**`indexRangeFilters`** - Enables range filtering capabilities (greater than, less than, etc.) for numerical and date properties. When enabled, additional indexing structures are created to support efficient range queries.
@@ -92,17 +92,17 @@ The inverted index in Weaviate can be enabled through parameters at the property
Inverted index parameters -The inverted index in Weaviate can be configured through various parameters at the collection level: +The inverted index in Weaviate can be configured through various parameters at the collection level. The names below are the REST and camelCase client spellings. In REST, `b` and `k1` are members of the `bm25` object. The Python client uses the snake_case equivalent, so they are `bm25_b`, `bm25_k1`, `index_null_state`, `index_property_length` and `index_timestamps`. -**`bm25_b`** - Controls the degree of normalization by document length in the BM25 ranking algorithm. Values range from 0 to 1, where 0 means no length normalization and 1 means full normalization. Higher values favor shorter documents. +**`bm25`: `b`** - Controls the degree of normalization by document length in the BM25 ranking algorithm. Values range from 0 to 1, where 0 means no length normalization and 1 means full normalization. Higher values favor shorter documents. -**`bm25_k1`** - Controls term frequency saturation in BM25. Higher values make term frequency more important, while lower values reduce the impact of term frequency on scoring. +**`bm25`: `k1`** - Controls term frequency saturation in BM25. Higher values make term frequency more important, while lower values reduce the impact of term frequency on scoring. -**`index_null_state`** - Determines whether null values are indexed. When enabled, you can filter for objects that have null values in specific properties. +**`indexNullState`** - Determines whether null values are indexed. When enabled, you can filter for objects that have null values in specific properties. -**`index_property_length`** - Controls whether the length of text properties is indexed. When enabled, allows filtering based on text length and can improve certain ranking algorithms. +**`indexPropertyLength`** - Controls whether the length of text properties is indexed. When enabled, allows filtering based on text length and can improve certain ranking algorithms. -**`index_timestamps`** - Enables indexing of creation and update timestamps for objects, allowing filtering and sorting operations. +**`indexTimestamps`** - Enables indexing of creation and update timestamps for objects, allowing filtering and sorting operations.
@@ -151,7 +151,7 @@ The inverted index in Weaviate can be configured through various parameters at t ## Drop an inverted index -Drop (delete) an inverted index from a property. This is a destructive operation — the index data is removed from disk. To use the index again, it must be regenerated. +Drop (delete) an inverted index from a property. This is a destructive operation: the index data is removed from disk. To use the index again, it must be regenerated. The following index types can be dropped: `searchable`, `filterable`, `rangeFilters`. @@ -201,7 +201,7 @@ Tokenization determines how text content is broken down into individual terms th **`word`** - The default tokenization that splits text on whitespace and punctuation, converting to lowercase. Best for general text search where you want to match individual words. -**`lowercase`** - Splits text on whitespace only, then lowercases each token. Preserves symbols (like `&`, `@`, `_`) that `word` tokenization would strip. Good for case-insensitive matching where punctuation is meaningful — e.g. code snippets or email addresses. +**`lowercase`** - Splits text on whitespace only, then lowercases each token. Preserves symbols (like `&`, `@`, `_`) that `word` tokenization would strip. Good for case-insensitive matching where punctuation is meaningful, such as code snippets or email addresses. **`whitespace`** - Splits text only on whitespace characters, preserving punctuation and case. Good when punctuation is meaningful for search. @@ -211,7 +211,7 @@ Tokenization determines how text content is broken down into individual terms th **`gse`** - Language-aware tokenization for Chinese and Japanese text. Disabled by default. Enable with the `ENABLE_TOKENIZER_GSE` environment variable. For Korean text, see the `kagome_kr` option. -For the full list of supported tokenizers — including `kagome_ja`, `kagome_kr`, and the per-property text-analyzer options — see the [tokenization reference](../config-refs/collections.mdx#tokenization). +For the full list of supported tokenizers (including `kagome_ja`, `kagome_kr`, and the per-property text-analyzer options), see the [tokenization reference](../config-refs/collections.mdx#tokenization).
diff --git a/docs/weaviate/manage-collections/multi-tenancy.mdx b/docs/weaviate/manage-collections/multi-tenancy.mdx index d0580fee3..7a0ba94e3 100644 --- a/docs/weaviate/manage-collections/multi-tenancy.mdx +++ b/docs/weaviate/manage-collections/multi-tenancy.mdx @@ -99,7 +99,7 @@ import AutoTenant from "/_includes/auto-tenant.mdx"; text={GoCodeAuto} startMarker="// START enable autoMT" endMarker="// END enable autoMT" - language="bash" + language="goraw" />
@@ -123,7 +123,7 @@ import AutoTenant from "/_includes/auto-tenant.mdx"; text={CurlCode} startMarker="# START CreateWithAMT" endMarker="# END CreateWithAMT" - language="py" + language="bash" /> @@ -154,7 +154,7 @@ Use the client to update the auto-tenant creation setting. Auto-tenant is only a text={GoCodeAuto} startMarker="// Start update autoMT" endMarker="// END update autoMT" - language="bash" + language="gonew" /> diff --git a/docs/weaviate/modules/index.md b/docs/weaviate/modules/index.md index b21f43ea5..7e42eb79d 100644 --- a/docs/weaviate/modules/index.md +++ b/docs/weaviate/modules/index.md @@ -113,7 +113,7 @@ In addition to the above, there are other modules such as: - [qna-transformers](./qna-transformers.md): Question-answering (answer extraction) capability using transformers models. - [qna-openai](./qna-openai.md): Question-answering (answer extraction) capability using OpenAI models. - [ner-transformers](./ner-transformers.md): Named entity recognition capability using transformers models. -- [text-spellcheck](./ner-transformers.md): Spell checking capability for GraphQL queries. +- [text-spellcheck](./spellcheck.md): Spell checking capability for GraphQL queries. - [sum-transformers](./sum-transformers.md): Summarize text using transformer models. - [usage-modules](./usage-modules.md): Collect and upload usage analytics to GCS or S3 for the purposes of billing. From fd1bca6560246390dfeb6e288ac305053d12def6 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Thu, 6 Aug 2026 17:33:48 +0200 Subject: [PATCH 52/84] docs(deploy,configuration): fix commands that fail on paste, wrong parameter names, and missing reference Three things break when copy-pasted: the EKS helm upgrade ended on a dangling line continuation so the shell hangs, a second one was found in the 1.25 migration guide, the backup module was named gcs-backup when the module id is backup-gcs, and the MUVERA parameter was documented as repetition when the real name is repetitions, contradicted by the page's own tested sample. Undocumented reference content operators can hit: six environment variables (the hybrid result floor, the three CORS settings, and the three backup chunking overrides) with their defaults and the releases they arrived in, and the six reserved property-name suffixes that cause a hard validation error with nothing in the docs to explain it. The SQ compression page imported TypeScript code and rendered none of it. Two sections now have TypeScript tabs; the third has no such snippet, and since all three tab sets share a group id, a reader who picked TypeScript would silently have been served Python there, so that section says so explicitly. The SQ options source turned out to be a Binary Quantization copy-paste, and both SQ sources passed a cache option that the TypeScript client's sq helper does not accept, so neither would have compiled. Also: HNSW_STARTUP_WAIT_FOR_VECTOR_CACHE is deprecated and was not marked so while its neighbour was; the combined module example used an environment variable core no longer reads; embedded XDG paths are used verbatim rather than having a subdirectory appended; two Go tabs were tagged as bash and a curl tab as Python; language-agnostic prose used Python-only parameter spellings; the tenant status vocabulary was the deprecated HOT/COLD; the MCP hybrid tool's filters argument was undocumented; the spellcheck module linked to the NER page; client versions moved out of prose into install commands; and HFresh is now mentioned on the compression guide, since it is the default for free clusters. --- .../howto/configure-sq/sq-compression-v3.ts | 12 +++--- .../configure-sq/sq-compression.options-v3.ts | 14 +++---- docs/cloud/embeddings/quickstart.mdx | 42 +++++++++++++++---- .../manage-collections/enable-compression.mdx | 4 ++ docs/deploy/configuration/backups.md | 2 +- docs/deploy/configuration/env-vars/index.md | 13 ++++-- .../configuration/env-vars/runtime-config.md | 4 +- docs/deploy/configuration/export.md | 4 +- docs/deploy/configuration/monitoring.md | 10 ++--- docs/deploy/installation-guides/eks.md | 2 +- docs/deploy/installation-guides/embedded.md | 4 +- .../installation-guides/spcs-integration.mdx | 2 +- docs/deploy/migration/weaviate-1-25.md | 2 +- docs/deploy/production/aws/hardening-eks.md | 4 +- docs/weaviate/concepts/modules.md | 2 +- docs/weaviate/config-refs/collections.mdx | 17 ++++++++ docs/weaviate/configuration/authz-authn.md | 2 +- .../compression/multi-vectors.md | 10 ++--- .../compression/sq-compression.md | 20 +++++++++ docs/weaviate/configuration/mcp-server.mdx | 11 +++-- docs/weaviate/configuration/modules.md | 5 ++- .../manage-collections/inverted-index.mdx | 26 ++++++------ .../manage-collections/multi-tenancy.mdx | 6 +-- docs/weaviate/modules/index.md | 2 +- 24 files changed, 148 insertions(+), 72 deletions(-) diff --git a/_includes/code/howto/configure-sq/sq-compression-v3.ts b/_includes/code/howto/configure-sq/sq-compression-v3.ts index f5af4099f..fd6e290c2 100644 --- a/_includes/code/howto/configure-sq/sq-compression-v3.ts +++ b/_includes/code/howto/configure-sq/sq-compression-v3.ts @@ -1,5 +1,3 @@ -// not yet supported in client 3.0.8 - import assert from 'assert'; import weaviate from 'weaviate-client'; // START-ANY @@ -27,7 +25,7 @@ const collection = await client.collections.create({ let collectionConfig = await collection.config.get(); -assert.equal(collectionConfig.vectorizers.default.indexConfig.quantizer.type, "SQ") +assert.equal(collectionConfig.vectorizers.default.indexConfig.quantizer.type, "sq") // Clean-up await client.collections.delete(collectionName); @@ -49,10 +47,10 @@ const collection = await client.collections.create({ vectorizers: weaviate.configure.vectors.selfProvided({ vectorIndexConfig: weaviate.configure.vectorIndex.hnsw({ quantizer: weaviate.configure.vectorIndex.quantizer.sq({ - cache: true, // Enable caching - rescoreLimit: 200, // The minimum number of candidates to fetch before rescoring + rescoreLimit: 200, // The minimum number of candidates to fetch before rescoring + trainingLimit: 50000, // The size of the training set used to determine the bucket boundaries }), - vectorCacheMaxObjects: 10000 // Cache size (used if `cache` enabled) + vectorCacheMaxObjects: 100000 // Maximum number of objects in the vector cache }) }) }) @@ -60,7 +58,7 @@ const collection = await client.collections.create({ let collectionConfig = await collection.config.get(); -assert.equal(collectionConfig.vectorizers.default.indexConfig.quantizer.type, "SQ") +assert.equal(collectionConfig.vectorizers.default.indexConfig.quantizer.type, "sq") // Clean-up await client.collections.delete(collectionName); diff --git a/_includes/code/howto/configure-sq/sq-compression.options-v3.ts b/_includes/code/howto/configure-sq/sq-compression.options-v3.ts index 8af478c8e..34422eb12 100644 --- a/_includes/code/howto/configure-sq/sq-compression.options-v3.ts +++ b/_includes/code/howto/configure-sq/sq-compression.options-v3.ts @@ -11,24 +11,24 @@ const collectionName = 'MyCollection'; // Prep await client.collections.delete(collectionName); -// START BQWithOptions +// START SQWithOptions const collection = await client.collections.create({ name: 'MyCollection', vectorizers: weaviate.configure.vectors.selfProvided({ vectorIndexConfig: weaviate.configure.vectorIndex.hnsw({ - quantizer: weaviate.configure.vectorIndex.quantizer.bq({ - cache: true, // Enable caching - rescoreLimit: 200, // The minimum number of candidates to fetch before rescoring + quantizer: weaviate.configure.vectorIndex.quantizer.sq({ + rescoreLimit: 200, // The minimum number of candidates to fetch before rescoring + trainingLimit: 50000, // The size of the training set used to determine the bucket boundaries }), - vectorCacheMaxObjects: 10000 // Cache size (used if `cache` enabled) + vectorCacheMaxObjects: 100000 // Maximum number of objects in the vector cache }) }) }) -// END BQWithOptions +// END SQWithOptions let collectionConfig = await collection.config.get(); -assert.equal(collectionConfig.vectorizers.default.indexConfig.quantizer.type, "bq") +assert.equal(collectionConfig.vectorizers.default.indexConfig.quantizer.type, "sq") // Clean-up await client.collections.delete(collectionName); diff --git a/docs/cloud/embeddings/quickstart.mdx b/docs/cloud/embeddings/quickstart.mdx index 804f0457c..8538cbb7c 100644 --- a/docs/cloud/embeddings/quickstart.mdx +++ b/docs/cloud/embeddings/quickstart.mdx @@ -80,14 +80,40 @@ import PromptStarter from "/src/components/PromptStarter"; To use Weaviate Embeddings, you will need: - - -- A Weaviate Cloud free cluster running at least Weaviate `1.28.5` -- A Weaviate client library that supports Weaviate Embeddings: - - **Python** client version `4.9.5` or higher - - **JavaScript/TypeScript** client version `3.2.5` or higher - - **Java** or **C#** clients - - **Go** client is not yet officially supported; you must pass the `X-Weaviate-Api-Key` and `X-Weaviate-Cluster-Url` headers manually upon instantiation as shown below. +- A Weaviate Cloud free cluster running Weaviate `v1.28.5` and later +- A Weaviate client library that supports Weaviate Embeddings. Install a supported release: + + + + +```bash +pip install -U "weaviate-client>=4.9.5" +``` + + + + +```bash +npm install weaviate-client@^3.2.5 +``` + + + + +The Java client supports Weaviate Embeddings. Install it as shown in the [client library page](/weaviate/client-libraries/java). + + + + +The C# client supports Weaviate Embeddings. Install it as shown in the [client library page](/weaviate/client-libraries/csharp). + + + + +The Go client does not support Weaviate Embeddings directly. Install it as shown in the [client library page](/weaviate/client-libraries/go), then pass the `X-Weaviate-Api-Key` and `X-Weaviate-Cluster-Url` headers manually upon instantiation, as shown below. + + + ## Step 1: Set up Weaviate diff --git a/docs/cloud/manage-collections/enable-compression.mdx b/docs/cloud/manage-collections/enable-compression.mdx index b261411c8..95b671cd0 100644 --- a/docs/cloud/manage-collections/enable-compression.mdx +++ b/docs/cloud/manage-collections/enable-compression.mdx @@ -85,6 +85,10 @@ Replace `YOUR-WEAVIATE-CLOUD-URL` with your cluster URL (e.g., `https://your-clu The update syntax depends on your collection's **vector index type** (HNSW, flat, or dynamic) and whether it uses **named vectors**. +:::note HFresh collections are already compressed +This procedure does not apply to collections that use the [HFresh index](/weaviate/concepts/vector-index#hfresh-index), which is the index behind the **Cost Optimized** optimization profile and therefore the only index available on [free clusters](../manage-clusters/create.mdx#optimization-profile). HFresh has [rotational quantization (RQ)](../../weaviate/configuration/compression/rq-compression.md) built in and always on: the in-memory centroid index uses 8-bit RQ and the on-disk posting lists use 1-bit RQ. Weaviate rejects a request that tries to add PQ, SQ or BQ to an HFresh index, or that tries to disable its RQ, so there is nothing to enable. HFresh collections are also not listed by the categorization example below. +::: + #### HNSW index (default) Most collections use the HNSW index. To enable compression: diff --git a/docs/deploy/configuration/backups.md b/docs/deploy/configuration/backups.md index de8ac6b11..22a4d57ea 100644 --- a/docs/deploy/configuration/backups.md +++ b/docs/deploy/configuration/backups.md @@ -316,7 +316,7 @@ The `*` character matches any sequence of characters. For example, `Article*` ma | name | type | required | default | description | | ---- | ---- | ---- | ---- |---- | | `CPUPercentage` | number | no | `50%` | An optional integer to set the desired CPU core utilization ranging from 1%-80%. | -| `ChunkSize` | number | no | `128MB` | An optional integer represents the desired size for chunks. Weaviate will attempt to come close the specified size, with a minimum of 2MB, default of 128MB, and a maximum of 512MB.| +| `ChunkSize` | number | no | `128MB` | An optional integer represents the desired size for chunks. Weaviate will attempt to come close the specified size, with a minimum of 2MB, default of 128MB, and a maximum of 512MB. This is a per-request setting. The operator-level chunking defaults are set separately with the [`BACKUP_MIN_CHUNK_SIZE`, `BACKUP_CHUNK_TARGET_SIZE` and `BACKUP_SPLIT_FILE_SIZE`](/deploy/configuration/env-vars/index.md#general) environment variables.| | `CompressionLevel`| string | no | `DefaultCompression` | An optional [compression level](#compression-levels) to be used. | | `Path` | string | no | `""` | An optional string to manually set the backup location. If not provided, the backup will be stored in the default location. Introduced in Weaviate `v1.27.2`. | | `incremental_base_backup_id` | string | no | `None` | The ID of a previous backup to use as the base for an [incremental backup](#incremental-backups). Files unchanged since the base backup are stored as references rather than copied. Introduced in Weaviate `v1.37`. | diff --git a/docs/deploy/configuration/env-vars/index.md b/docs/deploy/configuration/env-vars/index.md index 65c811c77..52d7f153b 100644 --- a/docs/deploy/configuration/env-vars/index.md +++ b/docs/deploy/configuration/env-vars/index.md @@ -32,6 +32,12 @@ import APITable from '@site/src/components/APITable'; | --- | --- | --- | --- | | `ASYNC_INDEXING` | If set, Weaviate creates vector indexes asynchronously to the object creation process. This can be useful for importing large amounts of data. (default: `false`) | `boolean` | `false` | | `AUTOSCHEMA_ENABLED` | Whether to infer the schema where necessary with the autoschema (default: `true`) | `boolean` | `true` | +| `BACKUP_CHUNK_TARGET_SIZE` | Target size of a backup chunk when Weaviate packs several small shard files into one chunk. Weaviate raises the effective value to at least the big-file threshold derived from `BACKUP_MIN_CHUNK_SIZE`. This is a server-level setting and is separate from the per-request [`ChunkSize`](/deploy/configuration/backups.md#available-config-object-properties) option. Accepts a plain byte count or a value with a unit (`B`, `KiB`, `MiB`, `GiB`, `TiB`, `KB`, `MB`, `GB`, `TB`). Default: `10MiB`
Added in `v1.36`, and backported to `v1.33.14`, `v1.34.11`, and `v1.35.4` | `string` | `32MiB` | +| `BACKUP_MIN_CHUNK_SIZE` | Lower bound for the big-file threshold used when chunking a backup. A shard file at or above the threshold is written to its own chunk, which lets an incremental backup skip it when it has not changed; smaller files are packed together. This is a server-level setting and is separate from the per-request [`ChunkSize`](/deploy/configuration/backups.md#available-config-object-properties) option. Accepts a plain byte count or a value with a unit (`B`, `KiB`, `MiB`, `GiB`, `TiB`, `KB`, `MB`, `GB`, `TB`). Default: `1MiB`
Added in `v1.37`, and backported to `v1.34.18`, `v1.35.13`, and `v1.36.3` | `string` | `4MiB` | +| `BACKUP_SPLIT_FILE_SIZE` | Size at which a single large shard file is split across several backup chunks. This is a server-level setting and is separate from the per-request [`ChunkSize`](/deploy/configuration/backups.md#available-config-object-properties) option. Accepts a plain byte count or a value with a unit (`B`, `KiB`, `MiB`, `GiB`, `TiB`, `KB`, `MB`, `GB`, `TB`). Default: `50GiB`
Added in `v1.37`, and backported to `v1.35.15` and `v1.36.5` | `string` | `10GiB` | +| `CORS_ALLOW_HEADERS` | Value of the `Access-Control-Allow-Headers` response header on the REST API, which controls the request headers a browser may send cross-origin. The default is the long list of headers Weaviate itself reads, including `Content-Type`, `Authorization` and the per-provider API-key headers. Default: the built-in header list | `string - comma separated names` | `Content-Type, Authorization` | +| `CORS_ALLOW_METHODS` | Value of the `Access-Control-Allow-Methods` response header on the REST API, which controls the HTTP methods a browser may use cross-origin. Default: `*` | `string - comma separated names` | `GET, POST, OPTIONS` | +| `CORS_ALLOW_ORIGIN` | Value of the `Access-Control-Allow-Origin` response header on the REST API, which controls the origins a browser may call Weaviate from. Set this to reach Weaviate directly from browser code on a specific site. Default: `*` | `string` | `https://example.com` | | `DEFAULT_QUANTIZATION` | Default quantization technique - can be overridden by the quantization method specified in the collection definition. Available values: `rq-8`, `rq-1`, `pq`, `bq`, `sq` and `none`. Default: `none`.

Note: If the selected quantization method isn't supported for the index type of a collection (for example PQ & SQ aren't supported for the flat index), the quantization won't be applied to that collection.

Added in `v1.33` | `string` | `rq-8` | | `DEFAULT_SHARDING_COUNT` | Default `desiredCount` for new single-tenant collections, used when the collection definition does not specify one. An explicit `desiredCount` in the class creation request still takes precedence. A value of `0` (default) uses the cluster node count. Multi-tenant collections are unaffected. Must be `<= 512`. Runtime-configurable. Default: `0`
Added in `v1.37` | `string - number` | `12` | | `DEFAULT_VECTOR_INDEX` | Default vector index type for new collections (and named vectors), used when the collection definition does not specify one. An explicit `vectorIndexType` in the collection definition still takes precedence. Available values: `hnsw`, `flat`, `dynamic`, and `hfresh`. Runtime-configurable. Default: `hnsw`
Added in `v1.37.3` | `string` | `flat` | @@ -57,7 +63,7 @@ import APITable from '@site/src/components/APITable'; | `INVERTED_SORTER_DISABLED` | Forces the "objects bucket" strategy and doesn't consider inverted sorting. Most users should never set this flag; it exists for benchmarking and as a safety net. Default: `false` | `boolean` | `false` | | `GO_PROFILING_DISABLE` | If `true`, disables Go profiling. Default: `false`. | `boolean` | `false` | | `GO_PROFILING_PORT` | Sets the port for the Go profiler. Default: `6060` | `integer` | `6060` | -| `DEBUG_ENDPOINTS_ENABLED` | Gate for the debug HTTP listener (the profiling port set by `GO_PROFILING_PORT`, default `6060`), which serves Weaviate's **unauthenticated** internal debug and profiling endpoints — `/debug/config`, Go profiling (`/debug/pprof/*`, `/debug/fgprof`), and various maintenance and diagnostic routes. [Runtime-configurable](/deploy/configuration/env-vars/runtime-config.md) via the `debug_endpoints_enabled` override. Default: `false`. `GO_PROFILING_DISABLE` still controls whether the listener binds at all.
Added in `v1.37.9` | `boolean` | `true` | +| `DEBUG_ENDPOINTS_ENABLED` | Gate for the debug HTTP listener (the profiling port set by `GO_PROFILING_PORT`, default `6060`), which serves Weaviate's **unauthenticated** internal debug and profiling endpoints: `/debug/config`, Go profiling (`/debug/pprof/*`, `/debug/fgprof`), and various maintenance and diagnostic routes. [Runtime-configurable](/deploy/configuration/env-vars/runtime-config.md) via the `debug_endpoints_enabled` override. Default: `false`. `GO_PROFILING_DISABLE` still controls whether the listener binds at all.
Added in `v1.37.9` | `boolean` | `true` | | `GRPC_MAX_MESSAGE_SIZE` | Maximum gRPC message size in bytes. Requests larger than this limit (e.g. a large `insert_many` call) are rejected. Default: `104858000` (approximately 100 MB) | `string - number` | `2000000000` | | `GRPC_PORT` | The port on which Weaviate's gRPC server listens for incoming requests. Default: `50051` | `string - number` | `50052` | | `HNSW_GEO_INDEX_EF` | Balance geo index search speed and recall. This value controls the search depth for geo-based queries. Default: `800`
Added in `v1.31.22` | `string - number` | `1000` | @@ -96,11 +102,12 @@ import APITable from '@site/src/components/APITable'; | `QUERY_BOOST_DEFAULT_DEPTH` | Default candidate-pool size used when a [Boost](/weaviate/search/boost.md) query does not set its own `depth`. The primary search retrieves this many candidates before the boost rescorer runs. Must be a positive integer and is hard-capped by `QUERY_MAXIMUM_RESULTS`. Default: `100`
Added in `v1.38` | `string - number` | `200` | | `QUERY_CROSS_REFERENCE_DEPTH_LIMIT` | Sets the maximum depth of cross-references to be resolved in a query. Defaults to 5. | `string - number` | `3` | | `QUERY_DEFAULTS_LIMIT` | Sets the default number of objects to be returned in a query. | `string - number` | `25`
Defaults to `10`| +| `QUERY_HYBRID_MAXIMUM_RESULTS` | Minimum size of the candidate pool that each leg of a [hybrid search](/weaviate/search/hybrid.md) retrieves before fusion. Each of the keyword and vector sub-searches fetches at least `offset` plus this many candidates, so that paging deeper into a hybrid result set stays consistent. Raise it if hybrid results shift between pages; higher values cost more work per query. Default: `100`
Added in `v1.32`, and backported to `v1.30.12` and `v1.31.6` | `string - number` | `200` | | `QUERY_MAXIMUM_RESULTS` | Sets the maximum total number of objects that can be retrieved. | `string - number` | `10000` | | `QUERY_SLOW_LOG_ENABLED` | Log slow queries for debugging. Requires a restart to update. | `boolean` | `False` | | `QUERY_SLOW_LOG_THRESHOLD` | Set a threshold time for slow query logging. Requires a restart to update. | `string` | `2s`
Values are times: `3h`, `2s`, `100ms` | | `REINDEX_SET_TO_ROARINGSET_AT_STARTUP` | Allow Weaviate to perform a one-off re-indexing to use Roaring Bitmaps. | `boolean` | `true` | -| `REVECTORIZE_CHECK_DISABLED` | Disables the optimization that reuses an object's existing vector when it is updated and none of its vectorized properties changed. By default (`false`) this check runs and skips unnecessary re-vectorization; set to `true` to re-vectorize on every update. Disabling removes a read-before-write — which can raise write throughput, or force always-fresh vectors — at the cost of an extra embedding call (and API cost, for remote vectorizers) per update. Default: `false` | `boolean` | `false` | +| `REVECTORIZE_CHECK_DISABLED` | Disables the optimization that reuses an object's existing vector when it is updated and none of its vectorized properties changed. By default (`false`) this check runs and skips unnecessary re-vectorization; set to `true` to re-vectorize on every update. Disabling removes a read-before-write. That can raise write throughput, and it guarantees a fresh vector on every update, at the cost of one extra embedding call per update (and the associated API cost, for remote vectorizers). Default: `false` | `boolean` | `false` | | `TENANT_ACTIVITY_READ_LOG_LEVEL` | Sets the log level for tenant read activity. Useful for analysis or debugging purposes. Default: `debug` | `string` | `info` | | `TENANT_ACTIVITY_WRITE_LOG_LEVEL` | Sets the log level for tenant write activity. Useful for analysis or debugging purposes. Default: `debug` | `string` | `info` | | `TOKENIZER_CONCURRENCY_COUNT` | Limit the combined number of GSE and Kagome tokenizers running at the same time. Default: `GOMAXPROCS` | `string - number` | `NUMBER_OF_CPU_CORES` | @@ -224,7 +231,7 @@ For more information on authentication and authorization, see the [Authenticatio | `CLUSTER_GOSSIP_BIND_PORT` | Port for exchanging network state information. | `string - number` | `7102` | | `CLUSTER_HOSTNAME` | Hostname of a node. Always set this value if the default OS hostname might change over time. | `string` | `node1` | | `CLUSTER_JOIN` | The service name of the "founding" member node in a cluster setup | `string` | `weaviate-node-1:7100` | -| `HNSW_STARTUP_WAIT_FOR_VECTOR_CACHE` | If `true`, vector cache prefill is synchronous when a node starts. The node reports ready to serve when the cache is hot. Default changed to `true` in `v1.36.6`. For collections where [dynamic lazy shard loading](/weaviate/concepts/storage#dynamic-lazy-shard-loading) is active, this is always overridden to `false` regardless of the configured value. The configured value only applies to eagerly-loaded collections. | `boolean` | `true` | +| `HNSW_STARTUP_WAIT_FOR_VECTOR_CACHE` | If `true`, vector cache prefill is synchronous when a node starts. The node reports ready to serve when the cache is hot. Default changed to `true` in `v1.36.6`. **Deprecated in `v1.36.6`.** Setting it still overrides auto-detection, but Weaviate logs a deprecation warning at startup and the variable will be removed in a future version. When it is unset, prefill behavior is governed by [dynamic lazy shard loading](/weaviate/concepts/storage#dynamic-lazy-shard-loading). For collections where dynamic lazy shard loading is active, this is always overridden to `false` regardless of the configured value. The configured value only applies to eagerly-loaded collections. | `boolean` | `true` | | `COLLECTION_RETRIEVAL_STRATEGY`| Set collection definition retrieval behavior for a data request.

  • `LeaderOnly` (default): Always requests the definition from the leader node.
  • `LocalOnly`: Always use the local definition
  • `LeaderOnMismatch`: Requests the definition if outdated.
([Read more](/weaviate/concepts/replication-architecture/consistency.md#collection-definition-requests-in-queries)) | `string` | `LeaderOnly` | | `RAFT_BOOTSTRAP_EXPECT` | The number of voter notes at bootstrapping time | `string - number` | `1` | | `RAFT_BOOTSTRAP_TIMEOUT` | The time in seconds to wait for the cluster to bootstrap | `string - number` | `90` | diff --git a/docs/deploy/configuration/env-vars/runtime-config.md b/docs/deploy/configuration/env-vars/runtime-config.md index 137ead48b..e4f555f75 100644 --- a/docs/deploy/configuration/env-vars/runtime-config.md +++ b/docs/deploy/configuration/env-vars/runtime-config.md @@ -120,14 +120,14 @@ The following overrides are currently supported: ### MCP -Added in `v1.38`. Toggling these at runtime does not require a cluster restart — the HTTP handlers stay registered and per-request checks pick up the new value. See [MCP server — Toggle without restart](/weaviate/configuration/mcp-server.mdx#toggle-without-restart) for behavior details. +Added in `v1.38`. Toggling these at runtime does not require a cluster restart: the HTTP handlers stay registered and per-request checks pick up the new value. See [MCP server: Toggle without restart](/weaviate/configuration/mcp-server.mdx#toggle-without-restart) for behavior details. | Runtime override name | Environment variable name | | :-------------------------------- | :---------------------------------- | | `mcp_server_enabled` | `MCP_SERVER_ENABLED` | | `mcp_server_write_access_enabled` | `MCP_SERVER_WRITE_ACCESS_ENABLED` | -`MCP_SERVER_CONFIG_PATH` is intentionally **not** runtime-configurable — tool descriptions are baked into the tool schemas at registration. +`MCP_SERVER_CONFIG_PATH` is intentionally **not** runtime-configurable, because tool descriptions are baked into the tool schemas at registration. Refer to the [Environment variables](./index.md) page for descriptions on each configuration option diff --git a/docs/deploy/configuration/export.md b/docs/deploy/configuration/export.md index b172b9815..7ede285ab 100644 --- a/docs/deploy/configuration/export.md +++ b/docs/deploy/configuration/export.md @@ -10,7 +10,7 @@ import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBl import PyCode from '!!raw-loader!/\_includes/code/howto/configure.export.py'; import CsCode from '!!raw-loader!/\_includes/code/csharp/ManageDataExportTest.cs'; -:::caution Preview — added in `v1.37` +:::caution Preview (added in `v1.37`) This is a preview feature. The API may change in future releases. ::: @@ -206,7 +206,7 @@ Files are named `{collection}_{shard}_{rangeIndex}.parquet`. Collection and tena | COLD | Exported directly from disk without loading into memory (remains COLD). | | OFFLOADED | Skipped. The skip reason is recorded in the shard status. | -The tenant list is snapshotted when the export is created — tenants created during the export are not included. +The tenant list is snapshotted when the export is created. Tenants created during the export are not included. ## Permissions diff --git a/docs/deploy/configuration/monitoring.md b/docs/deploy/configuration/monitoring.md index 4ecf2dc15..fcec0e0db 100644 --- a/docs/deploy/configuration/monitoring.md +++ b/docs/deploy/configuration/monitoring.md @@ -500,10 +500,10 @@ Added in `v1.38`. These metrics track tool traffic, latency, auth failures, and Label values: -- **`tool`** — the MCP tool name (e.g. `weaviate-query-hybrid`, `weaviate-objects-upsert`). -- **`status`** — `success` · `error` · `denied` · `write_disabled`. `denied` covers authorization failures classified via the `Forbidden` / `Unauthenticated` error families. `write_disabled` is emitted when a write call hits the runtime guard. -- **`reason`** — `missing_token` · `invalid_token` · `forbidden` · `unauthenticated`. `missing_token` and `invalid_token` are detected at the principal-extraction step; `forbidden` and `unauthenticated` are detected at authorization time. -- **`write_access`** — `enabled` / `disabled`, matching the live state of `MCP_SERVER_WRITE_ACCESS_ENABLED` at the time of the `tools/list` call. +- **`tool`**: the MCP tool name (e.g. `weaviate-query-hybrid`, `weaviate-objects-upsert`). +- **`status`**: `success` · `error` · `denied` · `write_disabled`. `denied` covers authorization failures classified via the `Forbidden` / `Unauthenticated` error families. `write_disabled` is emitted when a write call hits the runtime guard. +- **`reason`**: `missing_token` · `invalid_token` · `forbidden` · `unauthenticated`. `missing_token` and `invalid_token` are detected at the principal-extraction step; `forbidden` and `unauthenticated` are detected at authorization time. +- **`write_access`**: `enabled` / `disabled`, matching the live state of `MCP_SERVER_WRITE_ACCESS_ENABLED` at the time of the `tools/list` call. --- @@ -530,7 +530,7 @@ your uses perfectly: ## Query profiling -For per-query performance analysis, Weaviate provides [query profiling](/weaviate/search/query-profile.md). Unlike Prometheus metrics which show aggregate performance, query profiling provides per-shard timing breakdowns for individual queries — useful for diagnosing specific slow queries. +For per-query performance analysis, Weaviate provides [query profiling](/weaviate/search/query-profile.md). Unlike Prometheus metrics which show aggregate performance, query profiling provides per-shard timing breakdowns for individual queries, which is useful for diagnosing specific slow queries. ## `nodes` API Endpoint diff --git a/docs/deploy/installation-guides/eks.md b/docs/deploy/installation-guides/eks.md index 36b5d4784..5a97e91f2 100644 --- a/docs/deploy/installation-guides/eks.md +++ b/docs/deploy/installation-guides/eks.md @@ -203,7 +203,7 @@ replicas: 3 ```bash helm upgrade --install weaviate weaviate/weaviate \ --namespace weaviate \ - --values values.yaml \ + --values values.yaml ``` #### Verify your deployment diff --git a/docs/deploy/installation-guides/embedded.md b/docs/deploy/installation-guides/embedded.md index 173e400be..2c77b3a83 100644 --- a/docs/deploy/installation-guides/embedded.md +++ b/docs/deploy/installation-guides/embedded.md @@ -43,9 +43,9 @@ To configure Embedded Weaviate, set these variables in your instantiation code o | Parameter | Type | Default | Description | | :-- | :-- | :-- | :-- | | `additional_env_vars` | string | None. | Pass additional environment variables, such as API keys, to the server. | -| `binary_path` | string | varies | Binary download directory. If the binary is not present, the client downloads the binary.

If `XDG_CACHE_HOME` is set, the default is: `XDG_CACHE_HOME/weaviate-embedded/`

If `XDG_CACHE_HOME` is not set, the default is: `~/.cache/weaviate-embedded` | +| `binary_path` | string | varies | Binary download directory. If the binary is not present, the client downloads the binary.

If `XDG_CACHE_HOME` is set, its value is used verbatim as the default. No subdirectory is appended, so `XDG_CACHE_HOME=/foo` makes the default exactly `/foo`.

If `XDG_CACHE_HOME` is not set, the default is: `~/.cache/weaviate-embedded/` | | `hostname` | string | 127.0.0.1 | Hostname or IP address | -| `persistence_data_path` | string | varies | Data storage directory.

If `XDG_DATA_HOME` is set, the default is: `XDG_DATA_HOME/weaviate/`

If `XDG_DATA_HOME` is not set, the default is: `~/.local/share/weaviate` | +| `persistence_data_path` | string | varies | Data storage directory.

If `XDG_DATA_HOME` is set, its value is used verbatim as the default. No subdirectory is appended, so `XDG_DATA_HOME=/foo` makes the default exactly `/foo`.

If `XDG_DATA_HOME` is not set, the default is: `~/.local/share/weaviate` | | `port` | integer | 8079 | The Weaviate server request port. | | `version` | string | A version pinned in the client (see note) | Specify the version with one of the following:
-`"latest"`
- The version number as a string: `"1.19.6"`
- The URL of a Weaviate binary ([See below](/deploy/installation-guides/embedded.md#file-url)) | diff --git a/docs/deploy/installation-guides/spcs-integration.mdx b/docs/deploy/installation-guides/spcs-integration.mdx index 8c724bbd7..862614201 100644 --- a/docs/deploy/installation-guides/spcs-integration.mdx +++ b/docs/deploy/installation-guides/spcs-integration.mdx @@ -316,7 +316,7 @@ response = collection.query.near_text(query="animal",limit=2, include_vector=Tru for o in response.objects: print(o.vector) -# Hybrid search client.close() +# Hybrid search response = collection.query.hybrid( query="animals", limit=5 diff --git a/docs/deploy/migration/weaviate-1-25.md b/docs/deploy/migration/weaviate-1-25.md index f35223ece..9a943f5af 100644 --- a/docs/deploy/migration/weaviate-1-25.md +++ b/docs/deploy/migration/weaviate-1-25.md @@ -103,7 +103,7 @@ Here, the image tag is overridden to `1.25.0`. You can also modify this value di helm upgrade weaviate weaviate/weaviate \ --namespace weaviate \ --values ./values.yaml \ - --set image.tag="1.25.0" \ + --set image.tag="1.25.0" ``` ### 4. Verify update diff --git a/docs/deploy/production/aws/hardening-eks.md b/docs/deploy/production/aws/hardening-eks.md index c338082aa..ce516d9aa 100644 --- a/docs/deploy/production/aws/hardening-eks.md +++ b/docs/deploy/production/aws/hardening-eks.md @@ -4,7 +4,7 @@ sidebar_label: Hardening EKS deployments description: Harden your self-hosted Weaviate deployment on Amazon EKS. --- -You've got a Weaviate deployment running on EKS—awesome! Now it's time to make it production-ready and secure. +You've got a Weaviate deployment running on EKS. Awesome! Now it's time to make it production-ready and secure. While Weaviate is a powerful vector database, like any self-hosted service, it needs proper security hardening. Your first deployment focused on getting things running; for production, we need to tighten things up. @@ -254,7 +254,7 @@ Set up alerts for issues that matter: - 🚨 Backup failures :::tip Alert Fatigue -Don't go overboard—alert fatigue is real. Focus on actionable, critical alerts. +Don't go overboard. Alert fatigue is real. Focus on actionable, critical alerts. ::: ### Use proper dashboards diff --git a/docs/weaviate/concepts/modules.md b/docs/weaviate/concepts/modules.md index 1998a9e4e..6791ee8f9 100644 --- a/docs/weaviate/concepts/modules.md +++ b/docs/weaviate/concepts/modules.md @@ -43,7 +43,7 @@ Reader or Generator modules can be used on top of a Vectorizer module. These mod ### Other modules -These include those such as `gcs-backup` or `text-spellcheck`. +These include those such as `backup-gcs` or `text-spellcheck`. ## Dependencies diff --git a/docs/weaviate/config-refs/collections.mdx b/docs/weaviate/config-refs/collections.mdx index 056737b61..e97108ebd 100644 --- a/docs/weaviate/config-refs/collections.mdx +++ b/docs/weaviate/config-refs/collections.mdx @@ -263,6 +263,23 @@ Additionally, we strongly recommend that you do not use the following words as p - `vector` - `_vector` +##### Reserved suffixes + +A property name may also not *end* in one of the following suffixes, because each would collide with an internal index that Weaviate derives from another property: + +- `_searchable` +- `_rangeable` +- `_temp` +- `__meta_count` +- `_propertyLength` +- `_nullState` + +A property whose name ends in one of these suffixes, such as `comments_temp`, is rejected with a validation error: `'comments_temp' is not a valid property name: suffix '_temp' is reserved for internal indices`. + +This check runs when you create a collection or add a property to an existing collection. It is not applied when an existing collection definition is loaded, so a collection created before the check was introduced continues to work, and a backup that contains such a property still restores. + +The check was added in `v1.38.0`, and backported to `v1.35.20`, `v1.36.15`, and `v1.37.5`. + #### `tokenization` You can customize how `text` data is tokenized and indexed in the inverted index. Tokenization influences the results returned by the [`bm25`](../api/graphql/search-operators.md#bm25) and [`hybrid`](../api/graphql/search-operators.md#hybrid) operators, and [`where` filters](../api/graphql/filters.md). diff --git a/docs/weaviate/configuration/authz-authn.md b/docs/weaviate/configuration/authz-authn.md index 767b86aa7..3ad1f36fd 100644 --- a/docs/weaviate/configuration/authz-authn.md +++ b/docs/weaviate/configuration/authz-authn.md @@ -113,7 +113,7 @@ With [undifferentiated access](../../deploy/configuration/authorization.md#undif - [Configuration: OIDC](/deploy/configuration/oidc.md) - [Configuration: RBAC](/weaviate/configuration/rbac/index.mdx) - [Configuration: Environment variables - Authentication and Authorization](/deploy/configuration/env-vars/index.md#authentication-and-authorization) -- [Weaviate MCP server](/weaviate/configuration/mcp-server.mdx) — authenticates via API key and respects RBAC permissions. +- [Weaviate MCP server](/weaviate/configuration/mcp-server.mdx) (authenticates via API key and respects RBAC permissions) ## Questions and feedback diff --git a/docs/weaviate/configuration/compression/multi-vectors.md b/docs/weaviate/configuration/compression/multi-vectors.md index be4537281..549cf4940 100644 --- a/docs/weaviate/configuration/compression/multi-vectors.md +++ b/docs/weaviate/configuration/compression/multi-vectors.md @@ -69,12 +69,12 @@ The [Weaviate Embeddings multimodal model](/weaviate/model-providers/weaviate/em The final dimensionality of the MUVERA encoded vector will be -`repetition * 2^ksim * dprojections`. Carefully tuning these parameters +`repetitions * 2^ksim * dprojections`. Carefully tuning these parameters is crucial to balance memory usage and retrieval accuracy. These parameters can be used to fine-tune MUVERA: -- **`ksim`** (`int`): +- **`ksim`** (`int`, default: `4`): The number of Gaussian vectors sampled for the SimHash partitioning function. This parameter determines the number of bits in the hash, and consequently, the number of buckets created in the space partitioning step. The total @@ -83,7 +83,7 @@ These parameters can be used to fine-tune MUVERA: the accuracy of the approximation but also increasing the dimensionality of the intermediate encoded vectors. -- **`dprojections`** (`int`): +- **`dprojections`** (`int`, default: `16`): The dimensionality of the sub-vectors after the random linear projection in the dimensionality reduction step. After partitioning the multi-vector embedding into buckets, each bucket's aggregated vector is projected down @@ -92,9 +92,9 @@ These parameters can be used to fine-tune MUVERA: fixed-dimensional encoding, leading to lower memory consumption but potentially at the cost of some information loss and retrieval accuracy. -- **`repetition`** (`int`): +- **`repetitions`** (`int`, default: `10`): The number of times the space partitioning and dimensionality reduction - steps are repeated. This repetition allows for capturing different perspectives + steps are repeated. Each repetition captures a different perspective of the multi-vector embedding and can improve the robustness and accuracy of the final fixed-dimensional encoding. The resulting single vectors from each repetition are concatenated. A higher number of repetitions increases diff --git a/docs/weaviate/configuration/compression/sq-compression.md b/docs/weaviate/configuration/compression/sq-compression.md index e512bdec1..ce3ae4cdf 100644 --- a/docs/weaviate/configuration/compression/sq-compression.md +++ b/docs/weaviate/configuration/compression/sq-compression.md @@ -35,6 +35,14 @@ SQ can be enabled at collection creation time through the collection definition: language="py" />
+ + + + + + - - No — it's built into the Weaviate Server binary, not a separate package you install. Setting MCP_SERVER_ENABLED=true exposes the MCP endpoint on the same port as the REST API; nothing extra to run or deploy. The separate "Weaviate Docs MCP server" (Kapa-powered, serves documentation to LLMs) is a distinct product. + No. It's built into the Weaviate Server binary, not a separate package you install. Setting MCP_SERVER_ENABLED=true exposes the MCP endpoint on the same port as the REST API; nothing extra to run or deploy. The separate "Weaviate Docs MCP server" (Kapa-powered, serves documentation to LLMs) is a distinct product. - question: Which tools does the Weaviate MCP server expose? answer: >- - Four tools, gated by RBAC permissions — weaviate-collections-get-config (inspect collection schemas), weaviate-tenants-list (list tenants in a multi-tenant collection), weaviate-query-hybrid (run hybrid vector + keyword searches), and weaviate-objects-upsert (create or update objects, requires write access). + Four tools, gated by RBAC permissions. They are weaviate-collections-get-config (inspect collection schemas), weaviate-tenants-list (list tenants in a multi-tenant collection), weaviate-query-hybrid (run hybrid vector + keyword searches), and weaviate-objects-upsert (create or update objects, requires write access). - question: How do I request a new MCP tool or feature? answer: >- Open a feature request on the Weaviate GitHub repo at https://github.com/weaviate/weaviate/issues/new/choose. Pick the "Feature request" template and describe the tool, parameter, or capability you'd like the MCP server to expose, with a concrete use case. @@ -244,7 +244,7 @@ Lists tenants for multi-tenant collections. - `collection_name` (string, required): The collection to inspect. -**Returns:** List of tenants and their activity status (HOT/COLD). +**Returns:** List of tenants and their activity status (`ACTIVE` or `INACTIVE`, and `OFFLOADED` for tenants that have been offloaded to cold storage). ### `weaviate-query-hybrid` @@ -260,7 +260,10 @@ Performs a hybrid search combining vector similarity and keyword matching (BM25) - `target_vectors` (array, optional): Named vectors to use for vector search. - `target_properties` (array, optional): Properties to search with BM25. If omitted, searches all text properties. - `return_properties` (array, optional): Properties to include in results. -- `return_metadata` (array, optional): Metadata fields to return (e.g., `id`, `distance`, `score`, `creationTimeUnix`). +- `return_metadata` (array, optional): Metadata fields to return (e.g., `id`, `vector`, `distance`, `score`, `creationTimeUnix`, `lastUpdateTimeUnix`). +- `filters` (object, optional): A [where filter](/weaviate/api/graphql/filters.md) applied before scoring. + +A leaf filter is an object with `path` (an array of property names), `operator`, and a typed value field. The typed value field is one of `valueText`, `valueInt`, `valueNumber`, `valueBoolean`, `valueDate`, the corresponding `value*Array` field for a `Contains*` operator, or `valueGeoRange` for `WithinGeoRange`. Combine leaves with `{"operator": "And" | "Or", "operands": [ ... ]}`, nested to any depth. The supported operators are `And`, `Or`, `Not`, `Equal`, `NotEqual`, `Like`, `GreaterThan`, `GreaterThanEqual`, `LessThan`, `LessThanEqual`, `ContainsAny`, `ContainsAll`, `ContainsNone`, `WithinGeoRange`, and `IsNull`. See [Concepts: Filtering](/weaviate/concepts/filtering.md) for how filters interact with search. **Returns:** Ranked objects with similarity scores and distances. diff --git a/docs/weaviate/configuration/modules.md b/docs/weaviate/configuration/modules.md index c4264ba89..805b2b8f8 100644 --- a/docs/weaviate/configuration/modules.md +++ b/docs/weaviate/configuration/modules.md @@ -57,16 +57,17 @@ services: The list of API-based modules can be found on the [model provider integrations page](../model-providers/index.md#api-based). You can also inspect the [source code](https://github.com/weaviate/weaviate/blob/main/adapters/handlers/rest/configure_api.go) where the list is defined. -This can be combined with enabling individual modules. For example, the example below enables all API-based modules, Ollama modules and the `backup-s3` module. +Enabling individual modules can be combined with the API-based modules. For example, since API-based modules are enabled by default from `v1.33`, the example below enables the Ollama modules and the `backup-s3` module alongside them. ```yaml services: weaviate: environment: - ENABLE_API_BASED_MODULES: 'true' ENABLE_MODULES: 'text2vec-ollama,generative-ollama,backup-s3' ``` +To opt out of the API-based modules from `v1.33` onwards, set `API_BASED_MODULES_DISABLED` to `true`. The older `ENABLE_API_BASED_MODULES` variable is no longer read. + Note that enabling multiple vectorizer (e.g. `text2vec`, `multi2vec`) modules will disable the [`Explore` functionality](../api/graphql/explore.md). If you need to use `Explore`, you should only enable one vectorizer module. ### Module-specific variables diff --git a/docs/weaviate/manage-collections/inverted-index.mdx b/docs/weaviate/manage-collections/inverted-index.mdx index 76cd11557..9c697a5f7 100644 --- a/docs/weaviate/manage-collections/inverted-index.mdx +++ b/docs/weaviate/manage-collections/inverted-index.mdx @@ -32,13 +32,13 @@ You can [enable inverted indexes](#enable-inverted-index-for-keyword-searches-an
Enabling inverted index -The inverted index in Weaviate can be enabled through parameters at the property level: +The inverted index in Weaviate can be enabled through parameters at the property level. The names below are the REST and camelCase client spellings; the Python client uses the snake_case equivalent, so `indexFilterable` is `index_filterable`, `indexSearchable` is `index_searchable` and `indexRangeFilters` is `index_range_filters`. -**`index_filterable`** - Controls whether a property can be used in where filters. When set to `true`, the property values are indexed for efficient filtering operations. Disable this for properties that don't need filtering to save storage space. +**`indexFilterable`** - Controls whether a property can be used in where filters. When set to `true`, the property values are indexed for efficient filtering operations. Disable this for properties that don't need filtering to save storage space. -**`index_searchable`** - Determines whether a property participates in keyword search queries. When `true`, the property's text content is tokenized and indexed for search. Set to `false` for properties that shouldn't be searchable to improve performance. +**`indexSearchable`** - Determines whether a property participates in keyword search queries. When `true`, the property's text content is tokenized and indexed for search. Set to `false` for properties that shouldn't be searchable to improve performance. -**`index_range_filters`** - Enables range filtering capabilities (greater than, less than, etc.) for numerical and date properties. When enabled, additional indexing structures are created to support efficient range queries. +**`indexRangeFilters`** - Enables range filtering capabilities (greater than, less than, etc.) for numerical and date properties. When enabled, additional indexing structures are created to support efficient range queries.
@@ -92,17 +92,17 @@ The inverted index in Weaviate can be enabled through parameters at the property
Inverted index parameters -The inverted index in Weaviate can be configured through various parameters at the collection level: +The inverted index in Weaviate can be configured through various parameters at the collection level. The names below are the REST and camelCase client spellings. In REST, `b` and `k1` are members of the `bm25` object. The Python client uses the snake_case equivalent, so they are `bm25_b`, `bm25_k1`, `index_null_state`, `index_property_length` and `index_timestamps`. -**`bm25_b`** - Controls the degree of normalization by document length in the BM25 ranking algorithm. Values range from 0 to 1, where 0 means no length normalization and 1 means full normalization. Higher values favor shorter documents. +**`bm25`: `b`** - Controls the degree of normalization by document length in the BM25 ranking algorithm. Values range from 0 to 1, where 0 means no length normalization and 1 means full normalization. Higher values favor shorter documents. -**`bm25_k1`** - Controls term frequency saturation in BM25. Higher values make term frequency more important, while lower values reduce the impact of term frequency on scoring. +**`bm25`: `k1`** - Controls term frequency saturation in BM25. Higher values make term frequency more important, while lower values reduce the impact of term frequency on scoring. -**`index_null_state`** - Determines whether null values are indexed. When enabled, you can filter for objects that have null values in specific properties. +**`indexNullState`** - Determines whether null values are indexed. When enabled, you can filter for objects that have null values in specific properties. -**`index_property_length`** - Controls whether the length of text properties is indexed. When enabled, allows filtering based on text length and can improve certain ranking algorithms. +**`indexPropertyLength`** - Controls whether the length of text properties is indexed. When enabled, allows filtering based on text length and can improve certain ranking algorithms. -**`index_timestamps`** - Enables indexing of creation and update timestamps for objects, allowing filtering and sorting operations. +**`indexTimestamps`** - Enables indexing of creation and update timestamps for objects, allowing filtering and sorting operations.
@@ -151,7 +151,7 @@ The inverted index in Weaviate can be configured through various parameters at t ## Drop an inverted index -Drop (delete) an inverted index from a property. This is a destructive operation — the index data is removed from disk. To use the index again, it must be regenerated. +Drop (delete) an inverted index from a property. This is a destructive operation: the index data is removed from disk. To use the index again, it must be regenerated. The following index types can be dropped: `searchable`, `filterable`, `rangeFilters`. @@ -201,7 +201,7 @@ Tokenization determines how text content is broken down into individual terms th **`word`** - The default tokenization that splits text on whitespace and punctuation, converting to lowercase. Best for general text search where you want to match individual words. -**`lowercase`** - Splits text on whitespace only, then lowercases each token. Preserves symbols (like `&`, `@`, `_`) that `word` tokenization would strip. Good for case-insensitive matching where punctuation is meaningful — e.g. code snippets or email addresses. +**`lowercase`** - Splits text on whitespace only, then lowercases each token. Preserves symbols (like `&`, `@`, `_`) that `word` tokenization would strip. Good for case-insensitive matching where punctuation is meaningful, such as code snippets or email addresses. **`whitespace`** - Splits text only on whitespace characters, preserving punctuation and case. Good when punctuation is meaningful for search. @@ -211,7 +211,7 @@ Tokenization determines how text content is broken down into individual terms th **`gse`** - Language-aware tokenization for Chinese and Japanese text. Disabled by default. Enable with the `ENABLE_TOKENIZER_GSE` environment variable. For Korean text, see the `kagome_kr` option. -For the full list of supported tokenizers — including `kagome_ja`, `kagome_kr`, and the per-property text-analyzer options — see the [tokenization reference](../config-refs/collections.mdx#tokenization). +For the full list of supported tokenizers (including `kagome_ja`, `kagome_kr`, and the per-property text-analyzer options), see the [tokenization reference](../config-refs/collections.mdx#tokenization).
diff --git a/docs/weaviate/manage-collections/multi-tenancy.mdx b/docs/weaviate/manage-collections/multi-tenancy.mdx index d0580fee3..7a0ba94e3 100644 --- a/docs/weaviate/manage-collections/multi-tenancy.mdx +++ b/docs/weaviate/manage-collections/multi-tenancy.mdx @@ -99,7 +99,7 @@ import AutoTenant from "/_includes/auto-tenant.mdx"; text={GoCodeAuto} startMarker="// START enable autoMT" endMarker="// END enable autoMT" - language="bash" + language="goraw" /> @@ -123,7 +123,7 @@ import AutoTenant from "/_includes/auto-tenant.mdx"; text={CurlCode} startMarker="# START CreateWithAMT" endMarker="# END CreateWithAMT" - language="py" + language="bash" />
@@ -154,7 +154,7 @@ Use the client to update the auto-tenant creation setting. Auto-tenant is only a text={GoCodeAuto} startMarker="// Start update autoMT" endMarker="// END update autoMT" - language="bash" + language="gonew" /> diff --git a/docs/weaviate/modules/index.md b/docs/weaviate/modules/index.md index b21f43ea5..7e42eb79d 100644 --- a/docs/weaviate/modules/index.md +++ b/docs/weaviate/modules/index.md @@ -113,7 +113,7 @@ In addition to the above, there are other modules such as: - [qna-transformers](./qna-transformers.md): Question-answering (answer extraction) capability using transformers models. - [qna-openai](./qna-openai.md): Question-answering (answer extraction) capability using OpenAI models. - [ner-transformers](./ner-transformers.md): Named entity recognition capability using transformers models. -- [text-spellcheck](./ner-transformers.md): Spell checking capability for GraphQL queries. +- [text-spellcheck](./spellcheck.md): Spell checking capability for GraphQL queries. - [sum-transformers](./sum-transformers.md): Summarize text using transformer models. - [usage-modules](./usage-modules.md): Collect and upload usage analytics to GCS or S3 for the purposes of billing. From 528163c341a8dba48321c30fcdd8fb395200a435 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Thu, 6 Aug 2026 17:33:17 +0200 Subject: [PATCH 53/84] docs(model-providers): fix medium-severity review findings in provider and recipe pages Wrong model id: the NVIDIA reranker default was written `nnvidia/...`, which is not a valid model id if copy-pasted. Template leaks from cloned provider pages: the NVIDIA overview told readers to configure the Cohere models, and the Databricks overview told them to configure OpenAI, shipped the OpenAI RAG illustration, and carried two broken possessives. All 25 provider overview pages were checked; those were the only two. Stale and missing model information: added embed-v4.0 to the Cohere multimodal list, which the page's own example already used; documented base_url on the Mistral full-parameter samples, matching the OpenAI ones. OctoAI: the pages carried a deprecation banner but still read as working walkthroughs. Every module method has returned a shutdown error server-side since v1.25.22, v1.26.8, and v1.27.1, so the samples are now marked as a record. Version wording is normalized to the house forms: a capability that was introduced and backported reads "Added in vX, and backported to vA, vB"; a changed default also states what earlier releases on those lines used. Also: a self-referencing link in the Voyage AI further-reading list, two Colab badges missing the blob/main segment, a Jupyter kernel error published as expected output, a deprecated vectorizer_config call, duplicate sidebar positions and a mislabeled category, and the remaining em dashes. --- .../model-providers/_includes/provider.generative.py | 1 + .../model-providers/_includes/provider.generative.ts | 3 ++- .../model-providers/_includes/provider.vectorizer.py | 6 ++++-- .../model-providers/_includes/provider.vectorizer.ts | 6 ++++-- .../weaviate/model-providers/anthropic/generative.md | 2 +- .../model-providers/cohere/embeddings-multimodal.md | 1 + docs/weaviate/model-providers/cohere/generative.md | 10 +++++++--- .../model-providers/contextualai/generative.md | 2 +- docs/weaviate/model-providers/databricks/index.md | 8 ++++---- .../model-providers/digitalocean/embeddings.md | 4 ++-- .../model-providers/friendliai/_category_.json | 2 +- .../model-providers/google/embeddings-multimodal.md | 4 ++-- docs/weaviate/model-providers/google/embeddings.md | 9 ++++++--- docs/weaviate/model-providers/jinaai/embeddings.md | 6 +++--- docs/weaviate/model-providers/kubeai/_category_.json | 4 ++-- .../model-providers/model2vec/_category_.json | 4 ++-- docs/weaviate/model-providers/nvidia/index.md | 2 +- docs/weaviate/model-providers/nvidia/reranker.md | 2 +- .../octoai/_includes/octoai_deprecation.md | 3 +++ docs/weaviate/model-providers/openai/generative.md | 12 ++++++++---- .../model-providers/transformers/embeddings.md | 2 +- docs/weaviate/model-providers/voyageai/embeddings.md | 2 +- docs/weaviate/recipes/multi-vector-colipali-rag.md | 12 +----------- .../recipes/rag_titan-text-express-v1_bedrock.md | 4 ++-- docs/weaviate/recipes/weaviate_embeddings_service.md | 2 +- 25 files changed, 62 insertions(+), 51 deletions(-) diff --git a/docs/weaviate/model-providers/_includes/provider.generative.py b/docs/weaviate/model-providers/_includes/provider.generative.py index edfa32903..4cd4d43f2 100644 --- a/docs/weaviate/model-providers/_includes/provider.generative.py +++ b/docs/weaviate/model-providers/_includes/provider.generative.py @@ -824,6 +824,7 @@ def import_data(): # model="mistral-large", # temperature=0.7, # max_tokens=500, + # base_url="", ) # highlight-end ) diff --git a/docs/weaviate/model-providers/_includes/provider.generative.ts b/docs/weaviate/model-providers/_includes/provider.generative.ts index bd20325c6..e3ddc4ae0 100644 --- a/docs/weaviate/model-providers/_includes/provider.generative.ts +++ b/docs/weaviate/model-providers/_includes/provider.generative.ts @@ -734,7 +734,8 @@ await client.collections.create({ // These parameters are optional // model: 'mistral-large', // temperature: 0.7, - // maxTokens: 500 + // maxTokens: 500, + // baseURL: '', }), // highlight-end }); diff --git a/docs/weaviate/model-providers/_includes/provider.vectorizer.py b/docs/weaviate/model-providers/_includes/provider.vectorizer.py index 7672c649b..1cf7cf74b 100644 --- a/docs/weaviate/model-providers/_includes/provider.vectorizer.py +++ b/docs/weaviate/model-providers/_includes/provider.vectorizer.py @@ -689,7 +689,9 @@ Configure.Vectors.text2vec_mistral( name="title_vector", source_properties=["title"], - model="mistral-embed" + model="mistral-embed", + # # Further options + # base_url="", ) ], # highlight-end @@ -966,7 +968,7 @@ # highlight-start vector_config=[ Configure.Vectors.text2vec_digitalocean( - model="qwen3-embedding-0.6b", # Required — choose from the DigitalOcean Serverless Inference catalogue + model="qwen3-embedding-0.6b", # Required. Choose from the DigitalOcean Serverless Inference catalogue name="title_vector", source_properties=["title"], ) diff --git a/docs/weaviate/model-providers/_includes/provider.vectorizer.ts b/docs/weaviate/model-providers/_includes/provider.vectorizer.ts index fb8a8e5ae..11f5bef7a 100644 --- a/docs/weaviate/model-providers/_includes/provider.vectorizer.ts +++ b/docs/weaviate/model-providers/_includes/provider.vectorizer.ts @@ -327,7 +327,7 @@ await client.collections.create({ // highlight-start vectorizers: [ weaviate.configure.vectors.text2VecDigitalOcean({ - model: 'qwen3-embedding-0.6b', // Required — choose from the DigitalOcean Serverless Inference catalogue + model: 'qwen3-embedding-0.6b', // Required. Choose from the DigitalOcean Serverless Inference catalogue name: 'title_vector', sourceProperties: ['title'], }) @@ -838,7 +838,9 @@ await client.collections.create({ weaviate.configure.vectors.text2VecMistral({ name: 'title_vector', sourceProperties: ['title'], - model: 'mistral-embed' + model: 'mistral-embed', + // Further options + // baseURL: '', }, ), ], diff --git a/docs/weaviate/model-providers/anthropic/generative.md b/docs/weaviate/model-providers/anthropic/generative.md index cd2d3a006..889be8b1f 100644 --- a/docs/weaviate/model-providers/anthropic/generative.md +++ b/docs/weaviate/model-providers/anthropic/generative.md @@ -301,7 +301,7 @@ The default base URL is `https://api.anthropic.com`. ### Available models -Any model available in the Anthropic API can be used with Weaviate. If you do not specify a model, Weaviate uses `claude-haiku-4-5` by default. +Any model available in the Anthropic API can be used with Weaviate. If you do not specify a model, Weaviate uses `claude-haiku-4-5` by default. That default was set in `v1.34.0`, and backported to `v1.31.20`, `v1.32.17`, and `v1.33.5`. Earlier releases on each of those lines default to `claude-3-5-sonnet-20240620`. See the [Anthropic API documentation](https://docs.anthropic.com/en/docs/about-claude/models#model-names) for the most up-to-date list of available models. diff --git a/docs/weaviate/model-providers/cohere/embeddings-multimodal.md b/docs/weaviate/model-providers/cohere/embeddings-multimodal.md index 525721bab..aaeffa4ce 100644 --- a/docs/weaviate/model-providers/cohere/embeddings-multimodal.md +++ b/docs/weaviate/model-providers/cohere/embeddings-multimodal.md @@ -294,6 +294,7 @@ The query below returns the `n` most similar objects to the input image from the ### Available models +- `embed-v4.0` - `embed-multilingual-v3.0` (Default) - `embed-multilingual-light-v3.0` - `embed-english-v3.0` diff --git a/docs/weaviate/model-providers/cohere/generative.md b/docs/weaviate/model-providers/cohere/generative.md index a37cbf547..6bc94c00c 100644 --- a/docs/weaviate/model-providers/cohere/generative.md +++ b/docs/weaviate/model-providers/cohere/generative.md @@ -264,11 +264,15 @@ In other words, when you have `n` search results, the generative model generates ### Available models -From Weaviate `v1.31.17`, `v1.32.10`, `v1.33.0` and later, Weaviate does not validate the model name, so you can set any model that your Cohere account can reach. The following models are commonly used: +Weaviate does not validate the model name, so you can set any model that your Cohere account can reach. Name validation was removed in `v1.33.0`, and backported to `v1.31.17` and `v1.32.10`. -- `command-a-03-2025` (server default in `v1.31.17`, `v1.32.10`, `v1.33.0` and later) +The server default is `command-a-03-2025`. It changed in `v1.33.0`, and was backported to `v1.31.17` and `v1.32.10`. Earlier releases on each of those lines default to `command-r`. + +The following models are commonly used: + +- `command-a-03-2025` (server default) - `command-r-plus` -- `command-r` (server default before `v1.31.17`, `v1.32.10` and `v1.33.0`) +- `command-r` (previous server default) - `command-xlarge` - `command-xlarge-beta` - `command-xlarge-nightly` diff --git a/docs/weaviate/model-providers/contextualai/generative.md b/docs/weaviate/model-providers/contextualai/generative.md index 523f5d259..654f1030d 100644 --- a/docs/weaviate/model-providers/contextualai/generative.md +++ b/docs/weaviate/model-providers/contextualai/generative.md @@ -163,7 +163,7 @@ Configure the following generative parameters to customize the model behavior. For further details on model parameters, see the [Contextual AI API documentation](https://docs.contextual.ai/api-reference/generate/generate). -If a parameter is not specified, Weaviate uses the server-side default for that parameter. They are: +If a parameter is not specified, Weaviate uses the server default for that parameter. They are: - model = `"v2"` - temperature = `0.0` diff --git a/docs/weaviate/model-providers/databricks/index.md b/docs/weaviate/model-providers/databricks/index.md index 15feb7118..7fff6036d 100644 --- a/docs/weaviate/model-providers/databricks/index.md +++ b/docs/weaviate/model-providers/databricks/index.md @@ -25,11 +25,11 @@ Databricks' embedding models transform text data into vector embeddings, capturi ### Generative AI models for RAG -![Single prompt RAG integration generates individual outputs per search result](../_includes/integration_openai_rag_single.png) +![Single prompt RAG integration generates individual outputs per search result](../_includes/integration_databricks_rag_single.png) -Databrick' generative AI models can generate human-like text based on given prompts and contexts. +Databricks' 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' efficient storage and fast retrieval capabilities with Databrick' generative AI models to generate personalized and context-aware responses. +[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 Databricks' generative AI models to generate personalized and context-aware responses. [Databricks generative AI integration page](./generative.md) @@ -43,7 +43,7 @@ In turn, they simplify the process of building AI-driven applications to speed u You must provide a valid Databricks personal access token to Weaviate for these integrations. Refer to the [Databricks documentation](https://docs.databricks.com/en/dev-tools/auth/pat.html) for instructions on generating your personal access token in your workspace. -Then, go to the relevant integration page to learn how to configure Weaviate with the OpenAI models and start using them in your applications. +Then, go to the relevant integration page to learn how to configure Weaviate with the Databricks models and start using them in your applications. - [Text Embeddings](./embeddings.md) - [Generative AI](./generative.md) diff --git a/docs/weaviate/model-providers/digitalocean/embeddings.md b/docs/weaviate/model-providers/digitalocean/embeddings.md index 256f70f8e..403d011b9 100644 --- a/docs/weaviate/model-providers/digitalocean/embeddings.md +++ b/docs/weaviate/model-providers/digitalocean/embeddings.md @@ -164,7 +164,7 @@ When you perform a [hybrid search](../../search/hybrid.md), Weaviate fuses keywo ### Available models -DigitalOcean's Serverless Inference catalogue includes several embedding-capable models. See the [DigitalOcean Serverless Inference docs](https://docs.digitalocean.com/products/inference/how-to/use-serverless-inference/) for the live list — model availability and dimensions can change. +DigitalOcean's Serverless Inference catalogue includes several embedding-capable models. See the [DigitalOcean Serverless Inference docs](https://docs.digitalocean.com/products/inference/how-to/use-serverless-inference/) for the live list, as model availability and dimensions can change. :::note Dimensions parameter currently not supported @@ -180,7 +180,7 @@ DigitalOcean's `/v1/embeddings` endpoint does not accept a `dimensions` request ### Code examples -Once the vectorizer is configured, Weaviate handles model inference transparently. The standard [client library how-tos](../../client-libraries/index.mdx) apply unchanged — no DigitalOcean-specific code is required at query or import time beyond the configuration shown above. +Once the vectorizer is configured, Weaviate handles model inference transparently. The standard [client library how-tos](../../client-libraries/index.mdx) apply unchanged. No DigitalOcean-specific code is required at query or import time beyond the configuration shown above. ## Questions and feedback diff --git a/docs/weaviate/model-providers/friendliai/_category_.json b/docs/weaviate/model-providers/friendliai/_category_.json index c00e1815e..7aa7693ab 100644 --- a/docs/weaviate/model-providers/friendliai/_category_.json +++ b/docs/weaviate/model-providers/friendliai/_category_.json @@ -1,4 +1,4 @@ { "label": "FriendliAI", - "position": 226 + "position": 227 } diff --git a/docs/weaviate/model-providers/google/embeddings-multimodal.md b/docs/weaviate/model-providers/google/embeddings-multimodal.md index 7a4a6fa32..469dbc0a3 100644 --- a/docs/weaviate/model-providers/google/embeddings-multimodal.md +++ b/docs/weaviate/model-providers/google/embeddings-multimodal.md @@ -326,8 +326,8 @@ The query below returns the `n` most similar objects to the input image from the ### Available models -- `gemini-embedding-2` (Vertex AI and Gemini API, added in 1.36.13) — Vertex AI and Gemini API; supports text, images, PDFs, and audio (Gemini API only, up to 180 seconds); `3072` dimensions -- `multimodalembedding@001` (Vertex AI only) — supports text, images, and video; dimensions: `128`, `256`, `512`, `1408` +- `gemini-embedding-2` (Vertex AI and Gemini API, added in 1.36.13). Supports text, images, PDFs, and audio (Gemini API only, up to 180 seconds); `3072` dimensions +- `multimodalembedding@001` (Vertex AI only). Supports text, images, and video; dimensions: `128`, `256`, `512`, `1408` ## Further resources diff --git a/docs/weaviate/model-providers/google/embeddings.md b/docs/weaviate/model-providers/google/embeddings.md index 9320d3231..bbda3e2af 100644 --- a/docs/weaviate/model-providers/google/embeddings.md +++ b/docs/weaviate/model-providers/google/embeddings.md @@ -399,10 +399,13 @@ The query below returns the `n` best scoring objects from the database, set by ` - `gemini-embedding-001` (default) **Vertex AI:** + +`gemini-embedding-001`, `text-embedding-005`, and `text-multilingual-embedding-002` were added in `v1.31.5`, and backported to `v1.30.11`. + - `gemini-embedding-2` -- `gemini-embedding-001` (default, added in 1.30.11, 1.31.5 and onwards) -- `text-embedding-005` (added in 1.30.11, 1.31.5 and onwards) -- `text-multilingual-embedding-002` (added in 1.30.11, 1.31.5 and onwards) +- `gemini-embedding-001` (default) +- `text-embedding-005` +- `text-multilingual-embedding-002`
Deprecated models diff --git a/docs/weaviate/model-providers/jinaai/embeddings.md b/docs/weaviate/model-providers/jinaai/embeddings.md index 42b956b99..460aca635 100644 --- a/docs/weaviate/model-providers/jinaai/embeddings.md +++ b/docs/weaviate/model-providers/jinaai/embeddings.md @@ -329,13 +329,13 @@ The query below returns the `n` best scoring objects from the database, set by ` ### Available models -The server default changed in `v1.31.6` and `v1.32.0`. +The server default changed in `v1.32.0`, and was backported to `v1.31.6`. Earlier releases on each of those lines default to `jina-embeddings-v2-base-en`. -- `jina-embeddings-v4` (server default in `v1.31.6`, `v1.32.0` and later) +- `jina-embeddings-v4` (server default) - When using this model, Weaviate will automatically use the appropriate `task` type, applying `retrieval.passage` for embedding entries and `retrieval.query` for queries. - `jina-embeddings-v3` - When using this model, Weaviate will automatically use the appropriate `task` type, applying `retrieval.passage` for embedding entries and `retrieval.query` for queries. -- `jina-embeddings-v2-base-en` (server default before `v1.31.6` and `v1.32.0`) +- `jina-embeddings-v2-base-en` (previous server default) - `jina-embeddings-v2-small-en` - `jina-embeddings-v2-base-zh` - `jina-embeddings-v2-base-es` diff --git a/docs/weaviate/model-providers/kubeai/_category_.json b/docs/weaviate/model-providers/kubeai/_category_.json index a2c5ceb93..b319d23e4 100644 --- a/docs/weaviate/model-providers/kubeai/_category_.json +++ b/docs/weaviate/model-providers/kubeai/_category_.json @@ -1,4 +1,4 @@ { - "label": "KubeAI (Locally hosted)", - "position": 320 + "label": "KubeAI (locally hosted)", + "position": 330 } diff --git a/docs/weaviate/model-providers/model2vec/_category_.json b/docs/weaviate/model-providers/model2vec/_category_.json index 8f8d4ff1e..88b85a984 100644 --- a/docs/weaviate/model-providers/model2vec/_category_.json +++ b/docs/weaviate/model-providers/model2vec/_category_.json @@ -1,4 +1,4 @@ { - "label": "GPT4All (locally hosted)", - "position": 320 + "label": "Model2Vec (locally hosted)", + "position": 340 } diff --git a/docs/weaviate/model-providers/nvidia/index.md b/docs/weaviate/model-providers/nvidia/index.md index 9adbfd246..75fa0f487 100644 --- a/docs/weaviate/model-providers/nvidia/index.md +++ b/docs/weaviate/model-providers/nvidia/index.md @@ -54,7 +54,7 @@ In turn, it simplifies the process of building AI-driven applications to speed u You must provide a valid NVIDIA API key to Weaviate for this integration. Go to [NVIDIA](https://build.nvidia.com/) to sign up and obtain an API key. -Then, go to the relevant integration page to learn how to configure Weaviate with the Cohere models and start using them in your applications. +Then, go to the relevant integration page to learn how to configure Weaviate with the NVIDIA models and start using them in your applications. - [Text Embeddings](./embeddings.md) - [Multimodal Embeddings](./embeddings-multimodal.md) diff --git a/docs/weaviate/model-providers/nvidia/reranker.md b/docs/weaviate/model-providers/nvidia/reranker.md index bc95cfb42..57a29e85a 100644 --- a/docs/weaviate/model-providers/nvidia/reranker.md +++ b/docs/weaviate/model-providers/nvidia/reranker.md @@ -170,7 +170,7 @@ Any search in Weaviate can be combined with a reranker to perform reranking oper You can use any reranker model [on NVIDIA NIM APIs](https://build.nvidia.com/models) with Weaviate. -The default model is `nnvidia/rerank-qa-mistral-4b`. +The default model is `nvidia/rerank-qa-mistral-4b`. ## Further resources diff --git a/docs/weaviate/model-providers/octoai/_includes/octoai_deprecation.md b/docs/weaviate/model-providers/octoai/_includes/octoai_deprecation.md index 681cad6b3..c2e4de674 100644 --- a/docs/weaviate/model-providers/octoai/_includes/octoai_deprecation.md +++ b/docs/weaviate/model-providers/octoai/_includes/octoai_deprecation.md @@ -7,6 +7,9 @@ OctoAI announced that they are winding down the commercial availability of its services by **31 October 2024**. Accordingly, the Weaviate OctoAI integrations are deprecated. Do not use these integrations for new projects.
+From Weaviate `v1.25.22`, `v1.26.8`, and `v1.27.1`, the `text2vec-octoai` and `generative-octoai` modules are inactive. Every vectorization and generation request they receive fails server-side with the error `OctoAI is permanently shut down`. The configuration, import, search, and RAG examples on these pages therefore no longer run against OctoAI, and are kept only as a record of how the integrations used to be configured. Of the options below, only "bring your own vectors" (Option 1) keeps an existing OctoAI collection usable. +
+ If you have a collection that is using an OctoAI integration, consider your options depending on whether you are using OctoAI's embedding models ([your options](#for-collections-with-octoai-embedding-integrations)) or generative models ([your options](#for-collections-with-octoai-generative-ai-integrations)). #### For collections with OctoAI embedding integrations diff --git a/docs/weaviate/model-providers/openai/generative.md b/docs/weaviate/model-providers/openai/generative.md index 73520503e..92d773409 100644 --- a/docs/weaviate/model-providers/openai/generative.md +++ b/docs/weaviate/model-providers/openai/generative.md @@ -163,7 +163,7 @@ Configure the following generative parameters to customize the model behavior. -From Weaviate `v1.31.15`, `v1.32.9`, `v1.33.0` and later, two additional parameters are available for reasoning models such as the `gpt-5` family: +Two additional parameters are available for reasoning models such as the `gpt-5` family. They were added in `v1.33.0`, and backported to `v1.31.15` and `v1.32.9`: - `reasoningEffort`: How much reasoning the model does before it answers. One of `minimal`, `low`, `medium`, or `high`. If not set, the model provider default applies. - `verbosity`: How detailed the generated answer is. One of `low`, `medium`, or `high`. If not set, the model provider default applies. @@ -301,12 +301,16 @@ You can also supply images as a part of the input when performing retrieval augm ### Available models -From Weaviate `v1.31.17`, `v1.32.10`, `v1.33.0` and later, Weaviate does not validate the model name, so you can set any model that your OpenAI account can reach. The following models are recognized by Weaviate's token limit table: +Weaviate does not validate the model name, so you can set any model that your OpenAI account can reach. Name validation was removed in `v1.33.0`, and backported to `v1.31.17` and `v1.32.10`. + +The server default is `gpt-5-mini`. It changed in `v1.32.3`, and was backported to `v1.30.16` and `v1.31.10`. Earlier releases on each of those lines default to `gpt-3.5-turbo`. + +The following models are recognized by Weaviate's token limit table: * [gpt-5](https://platform.openai.com/docs/models/gpt-5) -* [gpt-5-mini](https://platform.openai.com/docs/models/gpt-5-mini) (server default in `v1.30.16`, `v1.31.10`, `v1.32.3` and later) +* [gpt-5-mini](https://platform.openai.com/docs/models/gpt-5-mini) (server default) * [gpt-5-nano](https://platform.openai.com/docs/models/gpt-5-nano) -* [gpt-3.5-turbo](https://platform.openai.com/docs/models/gpt-3-5) (server default before `v1.30.16`, `v1.31.10` and `v1.32.3`) +* [gpt-3.5-turbo](https://platform.openai.com/docs/models/gpt-3-5) (previous server default) * [gpt-3.5-turbo-16k](https://platform.openai.com/docs/models/gpt-3-5) * [gpt-3.5-turbo-1106](https://platform.openai.com/docs/models/gpt-3-5) * [gpt-4](https://platform.openai.com/docs/models/gpt-4-and-gpt-4-turbo) diff --git a/docs/weaviate/model-providers/transformers/embeddings.md b/docs/weaviate/model-providers/transformers/embeddings.md index 409b7636b..28ebd31ae 100644 --- a/docs/weaviate/model-providers/transformers/embeddings.md +++ b/docs/weaviate/model-providers/transformers/embeddings.md @@ -188,7 +188,7 @@ Specify `passageInferenceUrl` and `queryInferenceUrl` if using a [DPR](https://h #### Additional parameters -- `poolingStrategy` – the pooling strategy to use when the input exceeds the model's context window. +- `poolingStrategy`: the pooling strategy to use when the input exceeds the model's context window. - Default: `masked_mean`. Allowed values: `masked_mean` or `cls`. ([Read more on this topic.](https://arxiv.org/abs/1908.10084)) diff --git a/docs/weaviate/model-providers/voyageai/embeddings.md b/docs/weaviate/model-providers/voyageai/embeddings.md index b314b3127..7e727befd 100644 --- a/docs/weaviate/model-providers/voyageai/embeddings.md +++ b/docs/weaviate/model-providers/voyageai/embeddings.md @@ -388,7 +388,7 @@ The `voyage-context-3` model uses Voyage AI's [contextual embeddings API](https: ### Other integrations - [Voyage AI multimodal embedding embeddings models + Weaviate](./embeddings-multimodal.md) -- [Voyage AI reranker models + Weaviate](./embeddings.md). +- [Voyage AI reranker models + Weaviate](./reranker.md). ### Code examples diff --git a/docs/weaviate/recipes/multi-vector-colipali-rag.md b/docs/weaviate/recipes/multi-vector-colipali-rag.md index e2189ed69..1468bd07d 100644 --- a/docs/weaviate/recipes/multi-vector-colipali-rag.md +++ b/docs/weaviate/recipes/multi-vector-colipali-rag.md @@ -444,7 +444,7 @@ Python output: True ``` -For this tutorial, you will need the Weaviate `v1.29.0` or higher. +This tutorial requires Weaviate `v1.29.0` and later. Let's make sure we have the required version: ```python @@ -578,16 +578,6 @@ As an example of what we are going to build, consider the following actual demo query = "How does DeepSeek-V2 compare against the LLaMA family of LLMs?" ``` -Python output: - -```text -Running cells with 'Python 3.13.5' requires the ipykernel package. - -Install 'ipykernel' into the Python environment. - -Command: '/opt/homebrew/bin/python3 -m pip install ipykernel -U --user --force-reinstall' -``` - By inspecting the first page of the [DeepSeek-V2 paper](https://arxiv.org/abs/2405.04434), we see that it does indeed contain a figure that is relevant for answering our query: diff --git a/docs/weaviate/recipes/rag_titan-text-express-v1_bedrock.md b/docs/weaviate/recipes/rag_titan-text-express-v1_bedrock.md index 9ef947bc9..d735b7d2c 100644 --- a/docs/weaviate/recipes/rag_titan-text-express-v1_bedrock.md +++ b/docs/weaviate/recipes/rag_titan-text-express-v1_bedrock.md @@ -7,7 +7,7 @@ integration: False agent: False tags: ['Generative Search', 'RAG', 'AWS'] --- -[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/weaviate/recipes/weaviate-features/model-providers/aws/rag_titan-text-express-v1_bedrock.ipynb) +[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/weaviate/recipes/blob/main/weaviate-features/model-providers/aws/rag_titan-text-express-v1_bedrock.ipynb) ## Dependencies @@ -57,7 +57,7 @@ if (client.collections.exists("JeopardyQuestion")): client.collections.create( name="JeopardyQuestion", - vectorizer_config=wc.Configure.Vectorizer.text2vec_aws( + vector_config=wc.Configure.Vectors.text2vec_aws( service="bedrock", #this is crucial model="cohere.embed-english-v3", # select the model, make sure it is enabled for your account # model="amazon.titan-embed-text-v1", # select the model, make sure it is enabled for your account diff --git a/docs/weaviate/recipes/weaviate_embeddings_service.md b/docs/weaviate/recipes/weaviate_embeddings_service.md index e9f70b66d..2e2b62fc2 100644 --- a/docs/weaviate/recipes/weaviate_embeddings_service.md +++ b/docs/weaviate/recipes/weaviate_embeddings_service.md @@ -8,7 +8,7 @@ agent: False tags: ["Weaviate Embeddings", "Weaviate Cloud"] --- -[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/weaviate/recipes/weaviate-services/embedding-service/weaviate_embeddings_service.ipynb) +[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/weaviate/recipes/blob/main/weaviate-services/embedding-service/weaviate_embeddings_service.ipynb) # Weaviate Embedding Service From d90c18457a8261075e95d4082339ee47c35bc349 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Thu, 6 Aug 2026 17:33:48 +0200 Subject: [PATCH 54/84] docs(client-libraries,concepts): correct client version claims and self-contradicting statements The Java and C# pages both required Weaviate 1.33.0. Both are wrong: the C# client's shipped library asserts a minimum of 1.32.0, and the Java client README says v1.32. The identical wrong sentence on both pages was a copy-paste. The Go page claimed compatibility with Go 1.16, roughly ten releases stale. It now derives the requirement from the go directive for the client version the site actually pins, so it stays true as that pin moves. Three names for one line in the Java get-started example: the prose said Ollama, the code called text2vecTransformers, and the comment said Contextionary. The source now uses text2vecOllama, matching the prose and the Python and TypeScript equivalents. That file is CI-executed; the lane already runs Ollama and pulls nomic-embed-text, and a sibling snippet uses the same call. Concepts said the client libraries in all languages support all API functions, which this repo contradicts elsewhere. It now says coverage varies by language and points at the client pages, rather than enumerating gaps that would go stale. The client list also omitted C#, and the vector index list omitted two index types, so it now links to the indexing page instead of enumerating. Also: the Java async client reference pointed at the retired pre-v6 class and package; a shell env assignment used a hyphen instead of an equals sign, twice, so Docker silently set the wrong variable; a demo table row shipped a "tbd" placeholder and another had the wrong modality; a flat-index link pointed at the inverted-index page; and the compression table said RQ was HNSW-only. --- _includes/code/java-v6/src/test/java/GetStartedTest.java | 6 +++++- docs/weaviate/best-practices/code-generation.md | 8 ++++---- docs/weaviate/best-practices/index.md | 6 +++--- docs/weaviate/client-libraries/csharp.mdx | 2 +- docs/weaviate/client-libraries/go.md | 2 +- docs/weaviate/client-libraries/java/index.mdx | 4 ++-- docs/weaviate/client-libraries/python/index.mdx | 4 ++-- docs/weaviate/concepts/interface.md | 8 ++++---- docs/weaviate/concepts/vector-quantization.md | 2 +- docs/weaviate/more-resources/example-datasets.md | 4 ++-- docs/weaviate/more-resources/example-use-cases.md | 4 ++-- docs/weaviate/more-resources/faq.md | 6 +++--- docs/weaviate/more-resources/performance.md | 4 ++-- docs/weaviate/starter-guides/custom-vectors.mdx | 2 +- docs/weaviate/starter-guides/managing-resources/index.md | 2 +- .../starter-guides/managing-resources/indexing.mdx | 2 +- 16 files changed, 35 insertions(+), 31 deletions(-) diff --git a/_includes/code/java-v6/src/test/java/GetStartedTest.java b/_includes/code/java-v6/src/test/java/GetStartedTest.java index fd71c41fb..439838e2a 100644 --- a/_includes/code/java-v6/src/test/java/GetStartedTest.java +++ b/_includes/code/java-v6/src/test/java/GetStartedTest.java @@ -39,7 +39,11 @@ void testGetStartedWorkflow() throws Exception { col -> col.properties(Property.text("answer"), Property.text("question"), Property.text("category")) - .vectorConfig(VectorConfig.text2vecTransformers()) // Configure the Contextionary embedding model + .vectorConfig(VectorConfig.text2vecOllama(v -> v + // If using Docker you might need: http://host.docker.internal:11434 + .apiEndpoint("http://ollama:11434") + .model("nomic-embed-text") // The model to use + )) // Configure the Ollama embedding model ); CollectionHandle> questions = client.collections.use(collectionName); // highlight-end diff --git a/docs/weaviate/best-practices/code-generation.md b/docs/weaviate/best-practices/code-generation.md index e15a344d0..96a07712b 100644 --- a/docs/weaviate/best-practices/code-generation.md +++ b/docs/weaviate/best-practices/code-generation.md @@ -18,12 +18,12 @@ Here are some tips for writing Weaviate client library code with generative AI m Weaviate provides two [MCP](https://modelcontextprotocol.io/) servers that integrate with AI development tools like Claude Code, Claude Desktop, Cursor, and VS Code: -- **[Weaviate MCP Server](../configuration/mcp-server.mdx)** — Built into Weaviate itself. Lets AI assistants inspect schemas, search data, and modify objects in your Weaviate instance directly. Enable with `MCP_SERVER_ENABLED=true`. -- **[Weaviate Docs MCP Server](../mcp/docs-mcp-server.mdx)** — A standalone server that gives AI assistants access to Weaviate's documentation, reducing hallucinations when generating Weaviate code. +- **[Weaviate MCP Server](../configuration/mcp-server.mdx)**: Built into Weaviate itself. Lets AI assistants inspect schemas, search data, and modify objects in your Weaviate instance directly. Enable with `MCP_SERVER_ENABLED=true`. +- **[Weaviate Docs MCP Server](../mcp/docs-mcp-server.mdx)**: A standalone server that gives AI assistants access to Weaviate's documentation, reducing hallucinations when generating Weaviate code. ### Weaviate Agent Skills -**[Weaviate Agent Skills](https://github.com/weaviate/agent-skills)** gives AI coding agents (Claude Code, Cursor, GitHub Copilot, and others) built-in knowledge of Weaviate — covering search, collection management, data import, and complete application blueprints such as RAG, agentic RAG, and chatbots. When the skill is installed, agents can discover and use it automatically, reducing hallucinations and speeding up Weaviate development. +**[Weaviate Agent Skills](https://github.com/weaviate/agent-skills)** gives AI coding agents (Claude Code, Cursor, GitHub Copilot, and others) built-in knowledge of Weaviate, covering search, collection management, data import, and complete application blueprints such as RAG, agentic RAG, and chatbots. When the skill is installed, agents can discover and use it automatically, reducing hallucinations and speeding up Weaviate development. Install with: @@ -100,7 +100,7 @@ Review the documentation of your specific IDE to see if it has this feature, and ### Consider using the Query Agent -The [Query Agent](/query-agent) is a pre-built agentic search service that decides the search terms, filters, sorts, and other search parameters for you — the [modes overview](/query-agent/guides/index.md) covers what it can do. +The [Query Agent](/query-agent) is a pre-built agentic search service that decides the search terms, filters, sorts, and other search parameters for you. The [modes overview](/query-agent/guides/index.md) covers what it can do. The Query Agent is available to Weaviate Cloud users for interacting with their Weaviate Cloud instance in natural language. For some use cases, this may be a better approach than using AI-powered code generation tools. diff --git a/docs/weaviate/best-practices/index.md b/docs/weaviate/best-practices/index.md index 1abfc971d..cbad4f313 100644 --- a/docs/weaviate/best-practices/index.md +++ b/docs/weaviate/best-practices/index.md @@ -99,7 +99,7 @@ As the size of your dataset grows, the accompanying vector indexes can lead to h If you have a large number of vectors, consider using vector quantization to reduce the memory footprint of the vector index. This will reduce the required memory, and allow you to scale more effectively at lower costs. -If memory is your priority, you can also consider the disk-based [HFresh index](/weaviate/concepts/vector-index#hfresh-index) — an index-level alternative to quantization for reducing the memory footprint. +If memory is your priority, you can also consider the disk-based [HFresh index](/weaviate/concepts/vector-index#hfresh-index), an index-level alternative to quantization for reducing the memory footprint. ![Overview of quantization schemes](../../../_includes/images/concepts/quantization_overview_light.png#gh-light-mode-only "Overview of quantization schemes") ![Overview of quantization schemes](../../../_includes/images/concepts/quantization_overview_dark.png#gh-dark-mode-only "Overview of quantization schemes") @@ -362,11 +362,11 @@ When using Weaviate in an asynchronous environment, consider using the asynchron #### Python -The Weaviate Python client `4.7.0` and higher includes an [asynchronous client API (`WeaviateAsyncClient`)](../client-libraries/python/async.md). +The Weaviate Python client includes an [asynchronous client API (`WeaviateAsyncClient`)](../client-libraries/python/async.md). #### Java -The Weaviate Java client `5.0.0` and higher includes an [asynchronous client API (`WeaviateAsyncClient`)](https://javadoc.io/doc/io.weaviate/client/latest/io/weaviate/client/v1/async/WeaviateAsyncClient.html). +The Weaviate Java client includes an [asynchronous client API (`WeaviateClientAsync`)](https://javadoc.io/doc/io.weaviate/client6/latest/io/weaviate/client6/v1/api/WeaviateClientAsync.html). ## Questions and feedback diff --git a/docs/weaviate/client-libraries/csharp.mdx b/docs/weaviate/client-libraries/csharp.mdx index cce6f704c..a5acd5ac4 100644 --- a/docs/weaviate/client-libraries/csharp.mdx +++ b/docs/weaviate/client-libraries/csharp.mdx @@ -46,7 +46,7 @@ dotnet add package Weaviate.Client --version ||site.csharp_client_version|| #### Weaviate version compatibility -The C# client requires Weaviate `1.33.0` or higher. Generally, we encourage you to use the latest version of the C# client and the Weaviate Database. +The C# client requires Weaviate `v1.32.0` and later. Generally, we encourage you to use the latest version of the C# client and the Weaviate Database. #### gRPC diff --git a/docs/weaviate/client-libraries/go.md b/docs/weaviate/client-libraries/go.md index 095e543e9..217340086 100644 --- a/docs/weaviate/client-libraries/go.md +++ b/docs/weaviate/client-libraries/go.md @@ -24,7 +24,7 @@ The latest Go client is version `v||site.go_client_version||`. ::: -The Weaviate Go client is compatible with Go 1.16+. +The Weaviate Go client requires Go `1.25` and later, as declared by the `go` directive in `go.mod` for client `v||site.go_client_version||`. Newer client releases can raise this requirement, so check `go.mod` for the release you install. ## Installation The client doesn't support the old Go modules system. Create a repository for your code before you import the Weaviate client. diff --git a/docs/weaviate/client-libraries/java/index.mdx b/docs/weaviate/client-libraries/java/index.mdx index 8caaf9690..e62f4de07 100644 --- a/docs/weaviate/client-libraries/java/index.mdx +++ b/docs/weaviate/client-libraries/java/index.mdx @@ -75,7 +75,7 @@ This ensures that all dynamically-loaded dependencies of `io.grpc` are resolved #### Weaviate version compatibility -The `v6` Java client requires Weaviate `1.33.0` or higher. Generally, we encourage you to use the latest version of the Java client and the Weaviate Database. +The `v6` Java client requires Weaviate `v1.32.0` and later. Generally, we encourage you to use the latest version of the Java client and the Weaviate Database. #### gRPC @@ -104,7 +104,7 @@ import BasicPrereqs from "/_includes/prerequisites-quickstart.md"; Get started with Weaviate using this Java example. The code walks you through these key steps: -1. **[Connect to Weaviate](docs/weaviate/connections/index.mdx)**: Establish a connection to a local (or Cloud) Weaviate instance. +1. **[Connect to Weaviate](../../connections/index.mdx)**: Establish a connection to a local (or Cloud) Weaviate instance. 1. **[Create a collection](../../manage-collections/index.mdx)**: Define the data schema for a `Question` collection, using an Ollama model to vectorize the data. 1. **[Import data](../../manage-objects/import.mdx)**: Fetch sample Jeopardy questions and use Weaviate's batch import for efficient ingestion and automatic vector embedding generation. 1. **[Search/query the database](../../search/index.mdx)**: Execute a vector search to find questions semantically similar to the query `biology`. diff --git a/docs/weaviate/client-libraries/python/index.mdx b/docs/weaviate/client-libraries/python/index.mdx index b4b4cb635..aadc6757c 100644 --- a/docs/weaviate/client-libraries/python/index.mdx +++ b/docs/weaviate/client-libraries/python/index.mdx @@ -55,7 +55,7 @@ pip install --pre -U "weaviate-client==4.*"` #### Weaviate version compatibility -The `v4` Python client requires Weaviate `1.23.7` or higher. Generally, we encourage you to use the latest version of the Python client and the Weaviate Database. +The `v4` Python client requires Weaviate `v1.23.7` and later. Generally, we encourage you to use the latest version of the Python client and the Weaviate Database. In Weaviate Cloud, clusters are compatible with the `v4` client as of 31 January, 2024. Clusters created before this date will not be compatible with the `v4` client. @@ -94,7 +94,7 @@ import BasicPrereqs from "/_includes/prerequisites-quickstart.md"; Get started with Weaviate using this Python example. The code walks you through these key steps: -1. **[Connect to Weaviate](docs/weaviate/connections/index.mdx)**: Establish a connection to a local (or Cloud) Weaviate instance. +1. **[Connect to Weaviate](../../connections/index.mdx)**: Establish a connection to a local (or Cloud) Weaviate instance. 1. **[Create a collection](../../manage-collections/index.mdx)**: Define the data schema for a `Question` collection, using an Ollama model to vectorize the data. 1. **[Import data](../../manage-objects/import.mdx)**: Fetch sample Jeopardy questions and use Weaviate's batch import for efficient ingestion and automatic vector embedding generation. 1. **[Search/query the database](../../search/index.mdx)**: Execute a vector search to find questions semantically similar to the query `biology`. diff --git a/docs/weaviate/concepts/interface.md b/docs/weaviate/concepts/interface.md index da45c9c4e..a0ca8b35b 100644 --- a/docs/weaviate/concepts/interface.md +++ b/docs/weaviate/concepts/interface.md @@ -6,7 +6,7 @@ image: og/docs/concepts.jpg # tags: ['architecture', 'interface', 'API design'] --- -You can manage and use Weaviate through its APIs. Weaviate has a RESTful API and a GraphQL API. The client libraries in all languages support all API functions. Some clients, e.g. the Python client, have additional functionality, such as full schema management and batching operations. This way, Weaviate is easy to use in custom projects. Additionally, the APIs are intuitive, so it is easy to integrate into your existing data landscape. +You can manage and use Weaviate through its APIs. Weaviate has a RESTful API and a GraphQL API. The client libraries broadly mirror this API surface, although feature coverage can vary by language; see the [client library pages](/weaviate/client-libraries/index.mdx) for what each one supports. Some clients, e.g. the Python client, have additional functionality, such as full schema management and batching operations. This way, Weaviate is easy to use in custom projects. Additionally, the APIs are intuitive, so it is easy to integrate into your existing data landscape. This page contains information on how Weaviate's APIs are designed, and how you can use Weaviate Console to search through your Weaviate instance with GraphQL. @@ -27,8 +27,8 @@ Weaviate has both a RESTful API and a GraphQL API. Currently, there is no featur - **Data search** -> GraphQL API - **Explorative data search** -> GraphQL API - **Data analysis (meta data)** -> GraphQL API -- **Near real time on very large datasets in production** -> Client libraries (Python, Go, Java, JavaScript) using both APIs under the hood -- **Easy to integrate in applications** -> Client libraries (Python, Go, Java, JavaScript) using both APIs under the hood +- **Near real time on very large datasets in production** -> Client libraries (Python, Go, Java, JavaScript, C#) using both APIs under the hood +- **Easy to integrate in applications** -> Client libraries (Python, Go, Java, JavaScript, C#) using both APIs under the hood ## GraphQL @@ -137,7 +137,7 @@ The [Weaviate Console](/go/console?utm_content=others) is a dashboard to manage ## Weaviate Clients -Weaviate has several client libraries: in [Go](/weaviate/client-libraries/go.md), [Java](/weaviate/client-libraries/java/index.mdx), [Python](/weaviate/client-libraries/python/index.mdx) and [TypeScript/JavaScript](/weaviate/client-libraries/typescript/index.mdx). The client libraries in all languages support all API functions. Some clients, e.g. the Python client, have additional functionality, such as full schema management and batching operations. This way, Weaviate is easy to use in custom projects. The APIs are intuitive to use, so it is easy to integrate Weaviate into your existing data landscape. +Weaviate has several client libraries: in [C#](/weaviate/client-libraries/csharp.mdx), [Go](/weaviate/client-libraries/go.md), [Java](/weaviate/client-libraries/java/index.mdx), [Python](/weaviate/client-libraries/python/index.mdx) and [TypeScript/JavaScript](/weaviate/client-libraries/typescript/index.mdx). The client libraries broadly mirror the server API surface, although feature coverage varies by language. See the [client library pages](/weaviate/client-libraries/index.mdx) for what each one supports. Some clients, e.g. the Python client, have additional functionality, such as full schema management and batching operations. This way, Weaviate is easy to use in custom projects. The APIs are intuitive to use, so it is easy to integrate Weaviate into your existing data landscape. ## Further resources diff --git a/docs/weaviate/concepts/vector-quantization.md b/docs/weaviate/concepts/vector-quantization.md index c1f949274..8ca7994fb 100644 --- a/docs/weaviate/concepts/vector-quantization.md +++ b/docs/weaviate/concepts/vector-quantization.md @@ -197,7 +197,7 @@ You might be also interested in our blog post [HNSW+PQ - Exploring ANN algorithm ### With a flat index -[RQ](#rotational-quantization) and [BQ](#binary-quantization) can be applied to a [flat index](./indexing/inverted-index.md). As a flat index search is a brute-force method, compression reduces the amount of data Weaviate has to read and increases speed. +[RQ](#rotational-quantization) and [BQ](#binary-quantization) can be applied to a [flat index](./indexing/vector-index.md#flat-index). As a flat index search is a brute-force method, compression reduces the amount of data Weaviate has to read and increases speed. ## Rescoring diff --git a/docs/weaviate/more-resources/example-datasets.md b/docs/weaviate/more-resources/example-datasets.md index aabf0fdbc..0d7a6d6bb 100644 --- a/docs/weaviate/more-resources/example-datasets.md +++ b/docs/weaviate/more-resources/example-datasets.md @@ -105,7 +105,7 @@ export CACHE_DIR= # Optionally you can set the batch size (if not specified by default 200) export BATCH_SIZE= # Make sure to replace WEAVIATE_ORIGIN with the Weaviate origin as mentioned in the basics above -docker run -it -e weaviate_host=$WEAVIATE_ORIGIN -e cache_dir-$CACHE_DIR -e batch_size=$BATCH_SIZE semitechnologies/weaviate-demo-newspublications:latest +docker run -it -e weaviate_host=$WEAVIATE_ORIGIN -e cache_dir=$CACHE_DIR -e batch_size=$BATCH_SIZE semitechnologies/weaviate-demo-newspublications:latest ``` @@ -125,7 +125,7 @@ export CACHE_DIR= # Optionally you can set the batch size (if not specified by default 200) export BATCH_SIZE= # Run docker -docker run -it --network=$WEAVIATE_NETWORK -e weaviate_host=$WEAVIATE_ORIGIN -e cache_dir-$CACHE_DIR -e batch_size=$BATCH_SIZE semitechnologies/weaviate-demo-newspublications:latest +docker run -it --network=$WEAVIATE_NETWORK -e weaviate_host=$WEAVIATE_ORIGIN -e cache_dir=$CACHE_DIR -e batch_size=$BATCH_SIZE semitechnologies/weaviate-demo-newspublications:latest ``` ## Questions and feedback diff --git a/docs/weaviate/more-resources/example-use-cases.md b/docs/weaviate/more-resources/example-use-cases.md index 2f449ebfd..35f046e32 100644 --- a/docs/weaviate/more-resources/example-use-cases.md +++ b/docs/weaviate/more-resources/example-use-cases.md @@ -53,7 +53,7 @@ Weaviate can leverage its vectorization capabilities to enable automatic, real-t |Title | Description | Modality | Code | | --- | --- | --- | --- | | Toxic Comment Classification | Classify whether a comment is toxic or non-toxic. | Text | [Python](https://github.com/weaviate-tutorials/DEMO-classification-toxic-comment) | -| Audio Genre Classification | Classify the music genre of an audio file. | Image | [Python](https://github.com/weaviate-tutorials/DEMO-classification-audio-genre/) | +| Audio Genre Classification | Classify the music genre of an audio file. | Audio | [Python](https://github.com/weaviate-tutorials/DEMO-classification-audio-genre/) | ## Other use cases @@ -61,7 +61,7 @@ Weaviate's [modular ecosystem](../modules/index.md) unlocks many other use cases |Title | Description | Code | | --- | --- | --- | -| Named Entity Recognition (NER)| tbd | [Python](https://github.com/weaviate/weaviate-examples/tree/main/example-with-NER-module) | +| Named Entity Recognition (NER)| Extract named entities, such as people, organizations and locations, from text stored in Weaviate. | [Python](https://github.com/weaviate/weaviate-examples/tree/main/example-with-NER-module) | ## Questions and feedback diff --git a/docs/weaviate/more-resources/faq.md b/docs/weaviate/more-resources/faq.md index 032f58deb..9e385c719 100644 --- a/docs/weaviate/more-resources/faq.md +++ b/docs/weaviate/more-resources/faq.md @@ -675,7 +675,7 @@ If you need resources from the previous version of Weaviate Academy, check out t
Answer -> The Weaviate Community Slack has been decommissioned. We've moved community discussions to the [Weaviate Community Forum](https://forum.weaviate.io/), which offers better long-term discoverability — conversations are indexed and searchable, so valuable answers don't get lost over time. +> The Weaviate Community Slack has been decommissioned. We've moved community discussions to the [Weaviate Community Forum](https://forum.weaviate.io/), which offers better long-term discoverability: conversations are indexed and searchable, so valuable answers don't get lost over time. > > Join us at [forum.weaviate.io](https://forum.weaviate.io/) to ask questions, share ideas, and connect with the community. For private support inquiries, you can reach us at [support@weaviate.io](mailto:support@weaviate.io). @@ -688,8 +688,8 @@ If you need resources from the previous version of Weaviate Academy, check out t > Yes, Weaviate provides two MCP (Model Context Protocol) servers: > -> - **[Weaviate MCP server](/weaviate/configuration/mcp-server.mdx)** — Built into Weaviate itself. Exposes tools for inspecting schemas, searching data (vector/hybrid), and modifying objects. Runs on the same port as the REST API at `/v1/mcp`. Disabled by default — enable with `MCP_SERVER_ENABLED=true`. -> - **[Weaviate Docs MCP server](/weaviate/mcp/docs-mcp-server.mdx)** — A standalone server that gives LLMs access to Weaviate's documentation. Useful for AI-assisted development with Weaviate. +> - **[Weaviate MCP server](/weaviate/configuration/mcp-server.mdx)**: Built into Weaviate itself. Exposes tools for inspecting schemas, searching data (vector/hybrid), and modifying objects. Runs on the same port as the REST API at `/v1/mcp`. Disabled by default. Enable it with `MCP_SERVER_ENABLED=true`. +> - **[Weaviate Docs MCP server](/weaviate/mcp/docs-mcp-server.mdx)**: A standalone server that gives LLMs access to Weaviate's documentation. Useful for AI-assisted development with Weaviate. > > Both servers use the Streamable HTTP transport and work with MCP clients like Claude Code, Claude Desktop, Cursor, and VS Code. diff --git a/docs/weaviate/more-resources/performance.md b/docs/weaviate/more-resources/performance.md index e7ba6e1d7..fa89d89ce 100644 --- a/docs/weaviate/more-resources/performance.md +++ b/docs/weaviate/more-resources/performance.md @@ -26,7 +26,7 @@ Inverted indexes are used often in document retrieval systems and search engines The inverted index currently does not do any weighing (e.g. tf-idf) for sorting, since the vector index is used for these features like sorting. The inverted index is thus, at the moment, rather a binary operation: including or excluding data objects from the query result list, which results in an 'allow list'. ## Vector index -Everything that has a vector, thus every data object in Weaviate, is also indexed in the vector index. Weaviate currently supports [HNSW](https://arxiv.org/abs/1603.09320) and flat vector indexes. +Everything that has a vector, thus every data object in Weaviate, is also indexed in the vector index. Weaviate supports several vector index types, which trade off search speed, recall and resource use in different ways. The default is [HNSW](https://arxiv.org/abs/1603.09320). See [Concepts: vector index](../concepts/indexing/vector-index.md) for more information about the vector index. @@ -54,7 +54,7 @@ A tip is to avoid deeply nested filters in the queries. Additionally, try to mak ## Profiling query performance -To diagnose slow queries, use [query profiling](/weaviate/search/query-profile.md) to get per-shard timing breakdowns. This shows exactly how long each phase takes — vector search, keyword scoring, filter evaluation, object retrieval — broken down by shard and cluster node. +To diagnose slow queries, use [query profiling](/weaviate/search/query-profile.md) to get per-shard timing breakdowns. This shows exactly how long each phase takes (vector search, keyword scoring, filter evaluation, and object retrieval), broken down by shard and cluster node. ## Questions and feedback diff --git a/docs/weaviate/starter-guides/custom-vectors.mdx b/docs/weaviate/starter-guides/custom-vectors.mdx index a1e5e11c9..49958d3c3 100644 --- a/docs/weaviate/starter-guides/custom-vectors.mdx +++ b/docs/weaviate/starter-guides/custom-vectors.mdx @@ -77,7 +77,7 @@ To install a client library, use the installer for the client language: -The v4 client requires Weaviate 1.23.7 or higher.

+The v4 client requires Weaviate `v1.23.7` and later.

```bash pip install -U weaviate-client diff --git a/docs/weaviate/starter-guides/managing-resources/index.md b/docs/weaviate/starter-guides/managing-resources/index.md index af24ddfbc..83689343f 100644 --- a/docs/weaviate/starter-guides/managing-resources/index.md +++ b/docs/weaviate/starter-guides/managing-resources/index.md @@ -145,7 +145,7 @@ Weaviate supports the following vector compression methods: | Product Quantization (PQ) | HNSW | Yes | Each vector becomes an array of integer-based centroids ([read more](../../concepts/vector-quantization.md#product-quantization)) | | Binary Quantization (BQ) | HNSW, Flat | No | Each vector dimension becomes a bit ([read more](../../concepts/vector-quantization.md#binary-quantization)) | | Scalar Quantization (SQ) | HNSW | Yes | Each vector dimension becomes an integer ([read more](../../concepts/vector-quantization.md#scalar-quantization)) | -| Rotational Quantization (RQ) | HNSW | No | Each vector is rotated then quantized to an integer ([read more](../../concepts/vector-quantization.md#rotational-quantization)) | +| Rotational Quantization (RQ) | All index types | No | Each vector is rotated then quantized to an integer ([read more](../../concepts/vector-quantization.md#rotational-quantization)) | As a starting point, use the following guidelines for selecting a compression method: diff --git a/docs/weaviate/starter-guides/managing-resources/indexing.mdx b/docs/weaviate/starter-guides/managing-resources/indexing.mdx index 450abef8b..8baa226a4 100644 --- a/docs/weaviate/starter-guides/managing-resources/indexing.mdx +++ b/docs/weaviate/starter-guides/managing-resources/indexing.mdx @@ -100,7 +100,7 @@ import HFreshStatus from '/_includes/feature-notes/hfresh_status.mdx'; HFresh indexes are well-suited when memory efficiency is a priority, especially with high-dimensional vectors. They use mandatory 1-bit rotational quantization (RQ) for postings and 8-bit RQ for centroids. Only the compressed centroid index is kept in memory. The posting lists live on disk, so memory usage stays low even as the collection grows. The trade-off is lower peak query throughput than HNSW, so HFresh is a good fit when you can tolerate higher query latency in exchange for smaller memory requirements. :::tip Tuning -Start with the default parameters. If recall is too low, increase `searchProbe` or the RQ `rescoreLimit` — both take effect at runtime. +Start with the default parameters. If recall is too low, increase `searchProbe` or the RQ `rescoreLimit`. Both take effect at runtime. ::: :::note From 8f29ef58bcfca0271e0a0b78f46409d53bf1bc11 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Thu, 6 Aug 2026 17:33:17 +0200 Subject: [PATCH 55/84] docs(search,api): fix snippets that do not parse, a mis-targeted anchor, and stale gRPC support Two snippets could not be copy-pasted. The IsNull example in the GraphQL filter reference was missing a closing paren and two braces, so it would not parse; all 14 code blocks on that page were checked for balance and it was the only one. The gRPC page's docker-compose block opened with a four-backtick fence and an invalid info string, so the page rendered a literal ```yaml line as content. gRPC client support was documented as Python and TypeScript only, with others "in the near future". Java and C# have first-class gRPC; the Go client uses it for batch imports and offers gRPC search through its experimental API only, so Go is described separately rather than claimed at parity. The hybrid search page linked to search-operators#variables-2, which lands on nearText's Variables section, not hybrid's. That page has six identically titled Variables headings, so the ordinal anchors are positional and shift whenever a heading moves. The link now targets the uniquely named fusion-algorithms section instead of a more accurate ordinal. The cross-references tutorial had a TypeScript source imported but never rendered, so the tab was simply absent; the import path was also extensionless. The Spark connector tutorial ended on a removed v3 client call. Em dashes removed across the search partition. --- _includes/feature-notes/boost.mdx | 2 +- docs/weaviate/api/graphql/filters.md | 7 +++- docs/weaviate/api/grpc.md | 8 ++-- docs/weaviate/search/bm25.md | 6 +-- docs/weaviate/search/boost.md | 40 ++++++++++---------- docs/weaviate/search/filters.md | 8 ++-- docs/weaviate/search/hybrid.md | 4 +- docs/weaviate/search/query-profile.md | 2 +- docs/weaviate/search/rerank.md | 2 +- docs/weaviate/search/similarity.md | 4 +- docs/weaviate/tutorials/cross-references.mdx | 12 +++++- docs/weaviate/tutorials/spark-connector.md | 16 ++++++-- 12 files changed, 64 insertions(+), 47 deletions(-) diff --git a/_includes/feature-notes/boost.mdx b/_includes/feature-notes/boost.mdx index 68167df1d..449fd66d6 100644 --- a/_includes/feature-notes/boost.mdx +++ b/_includes/feature-notes/boost.mdx @@ -1,3 +1,3 @@ -:::caution Preview — added in `v1.38` +:::caution Preview: added in `v1.38` This is a preview feature. The API may change in future releases. ::: diff --git a/docs/weaviate/api/graphql/filters.md b/docs/weaviate/api/graphql/filters.md index e4a150a43..cc274b75b 100644 --- a/docs/weaviate/api/graphql/filters.md +++ b/docs/weaviate/api/graphql/filters.md @@ -243,7 +243,7 @@ The `ContainsAny`, `ContainsAll` and `ContainsNone` operators filter objects usi These operators expect an array of values and return objects that match based on the input values. -They are not limited to text. They work on `text`/`string`, `int`, `number`, `boolean`, `date`, and `uuid` properties — and on the array variants of each (`int[]`, `number[]`, etc.). A scalar property is treated as a single-element set: the object matches if its value satisfies the operator against the candidate list. +They are not limited to text. They work on `text`/`string`, `int`, `number`, `boolean`, `date`, and `uuid` properties, and on the array variants of each (`int[]`, `number[]`, etc.). A scalar property is treated as a single-element set: the object matches if its value satisfies the operator against the candidate list. Pass the candidate values using the argument that matches the property's data type: `valueText` for `text`/`string`, `valueInt` for `int`, `valueNumber` for `number`, `valueBoolean` for `boolean`, and `valueDate` for `date`. For `uuid`/`uuid[]` properties, pass the UUIDs as strings using `valueText` (there is no `valueUuid` argument). For example, a `ContainsAny` query on an `int` property with a value of `[10, 20, 30]` returns objects whose property holds at least one of those integers. @@ -588,8 +588,11 @@ Using the `IsNull` operator allows you to do filter for objects where given prop Get { (where: { operator: IsNull, - valueBoolean: + valueBoolean: , path: [] + }) { + + } } } ``` diff --git a/docs/weaviate/api/grpc.md b/docs/weaviate/api/grpc.md index 4decc0bda..57b20cd39 100644 --- a/docs/weaviate/api/grpc.md +++ b/docs/weaviate/api/grpc.md @@ -7,7 +7,7 @@ image: og/docs/api.jpg Starting with Weaviate `v1.19.0`, a gRPC interface has been progressively added to Weaviate. gRPC is a high-performance, open-source universal RPC framework that is contract-based and can be used in any environment. It is based on HTTP/2 and Protocol Buffers, and is therefore very fast and efficient. -As of Weaviate `v1.23.7`, the gRPC interface is considered stable. The [Python (`v4` version)](../client-libraries/python/index.mdx) and [TypeScript (`v3` version)](../client-libraries/typescript/index.mdx) client libraries support gRPC, and the other client libraries will follow. +As of Weaviate `v1.23.7`, the gRPC interface is considered stable. The [Python](../client-libraries/python/index.mdx), [TypeScript](../client-libraries/typescript/index.mdx), [Java](../client-libraries/java/index.mdx), and [C#](../client-libraries/csharp.mdx) client libraries use gRPC. The [Go](../client-libraries/go.md) client uses gRPC for batch imports, and offers gRPC search through its experimental API. ## Protocol Buffer (Protobuf) definitions @@ -33,8 +33,6 @@ We suggest using the default port `50051` for gRPC calls. It can be modified thr Note that [Weaviate Cloud](/go/console?utm_content=api) uses port `443` for gRPC. ::: -````yaml: - ```yaml --- services: @@ -44,11 +42,11 @@ services: - "8080:8080" # REST calls - "50051:50051" # gRPC calls # ... Other settings -```` +``` ### Client-side -You can use the gRPC interface through the [Python (`v4` version)](../client-libraries/python/index.mdx) and [TypeScript (`v3` version)](../client-libraries/typescript/index.mdx) client libraries. Other client libraries will also introduce gRPC support in the near future. +You can use the gRPC interface through the [Python](../client-libraries/python/index.mdx), [TypeScript](../client-libraries/typescript/index.mdx), [Java](../client-libraries/java/index.mdx), and [C#](../client-libraries/csharp.mdx) client libraries. The [Go](../client-libraries/go.md) client sends batch imports over gRPC. Its gRPC search API is still experimental, and is reached through `Experimental().Search()` rather than the regular query builder. Alternatively, you can use other tools, such as the `grpcurl` command-line tool, to interact with the gRPC API. Some options include: diff --git a/docs/weaviate/search/bm25.md b/docs/weaviate/search/bm25.md index 414e6f856..061990ce0 100644 --- a/docs/weaviate/search/bm25.md +++ b/docs/weaviate/search/bm25.md @@ -454,8 +454,8 @@ See [Inverted index: Accent folding](../concepts/indexing/inverted-index.md#acce By default, Weaviate filters out common English stopwords (like "a", "the", "is") from BM25 scoring. You can customize this behavior: -- **Custom presets**: Define named stopword lists per collection via `invertedIndexConfig.stopwordPresets` — useful for non-English languages or domain-specific terms. -- **Per-property overrides**: Assign different stopword presets to individual properties via `textAnalyzer.stopwordPreset` — useful for multilingual collections where each property contains text in a different language. +- **Custom presets**: Define named stopword lists per collection via `invertedIndexConfig.stopwordPresets`, useful for non-English languages or domain-specific terms. +- **Per-property overrides**: Assign different stopword presets to individual properties via `textAnalyzer.stopwordPreset`, useful for multilingual collections where each property contains text in a different language. Stopwords are still indexed and only filtered at query time, so changing the configuration does not require reindexing. @@ -769,7 +769,7 @@ Set the tokenization method to `trigram` at the property level when creating you -Keyword (BM25) queries accept an optional `boost` argument that promotes or demotes matching documents without removing them — useful for biasing results by recency, popularity, a soft filter, or another property. Matching documents move up. Everything else stays in the results but ranks lower. +Keyword (BM25) queries accept an optional `boost` argument that promotes or demotes matching documents without removing them. This is useful for biasing results by recency, popularity, a soft filter, or another property. Matching documents move up. Everything else stays in the results but ranks lower. See [Boost](./boost.md) for the supported condition types (filter, property value, time decay, numeric decay), curve choices, blending semantics, and depth tuning. diff --git a/docs/weaviate/search/boost.md b/docs/weaviate/search/boost.md index 7fe9c60c7..f9012bd0e 100644 --- a/docs/weaviate/search/boost.md +++ b/docs/weaviate/search/boost.md @@ -2,7 +2,7 @@ title: Boost sidebar_position: 76 image: og/docs/howto.jpg -description: Soft-rank vector, hybrid, and BM25 results — promote or demote matching documents without filtering them out. Worked Python examples for filter, property, time-decay, numeric-decay, and blended boosts. +description: Soft-rank vector, hybrid, and BM25 results by promoting or demoting matching documents without filtering them out. Worked Python examples for filter, property, time-decay, numeric-decay, and blended boosts. # tags: ['boost', 'search', 'ranking'] --- @@ -14,7 +14,7 @@ import BoostPreview from '/_includes/feature-notes/boost.mdx'; -**Boost** soft-ranks search results — promote or demote matching documents without removing them from the result set. Matching documents move up. Non-matching documents stay in the results but rank lower. +**Boost** soft-ranks search results: it promotes or demotes matching documents without removing them from the result set. Matching documents move up. Non-matching documents stay in the results but rank lower. Apply boost to vector, hybrid, BM25, near-text, near-vector, near-object, near-image, and near-media queries. @@ -23,7 +23,7 @@ Apply boost to vector, hybrid, BM25, near-text, near-vector, near-object, near-i A boost is a **post-retrieval rescorer**: 1. The primary search (vector, hybrid, BM25, ...) fetches `depth` candidate results. Set `depth` higher than `offset + limit` if you want boost to consider candidates beyond the first page. -2. The boost scorer rescores those candidates in memory by evaluating each condition per candidate, normalizing per result set, and blending with the primary score. There are no new index queries — the cost is per-candidate in-memory scoring, not extra shard fan-out. Both primary and boost scores are min-max normalized into `[0, 1]` before blending, and the final score is renormalized to `[0, 1]`. +2. The boost scorer rescores those candidates in memory by evaluating each condition per candidate, normalizing per result set, and blending with the primary score. There are no new index queries. The cost is per-candidate in-memory scoring, not extra shard fan-out. Both primary and boost scores are min-max normalized into `[0, 1]` before blending, and the final score is renormalized to `[0, 1]`. 3. The user's original `offset` and `limit` are applied **after** the re-sort. ## Condition types @@ -96,9 +96,9 @@ Continuous `[0, 1]` score that **decays with distance from an origin time**. The ### Numeric decay {#numeric-decay} -Like time decay but for numeric (`int`, `number`) properties. Use this when "closer to X is better" — prices near a target, distances near a coordinate, ages near a band. Same `scale` / `offset` / `decay` / `curve` semantics as time decay, with all values expressed as numbers. +Like time decay but for numeric (`int`, `number`) properties. Use this when "closer to X is better": prices near a target, distances near a coordinate, ages near a band. Same `scale` / `offset` / `decay` / `curve` semantics as time decay, with all values expressed as numbers. -`scale` must be `> 0` and `decay` (if set) must be in `(0, 1]` — same as time decay. +`scale` must be `> 0` and `decay` (if set) must be in `(0, 1]`, same as time decay. @@ -117,11 +117,11 @@ The three decay curves shape how score falls off with distance. At `distance == | Curve | Shape | When to use | |---|---|---| -| `EXPONENTIAL` (default) | Heavy tail — score halves geometrically every `scale` past the origin. | "Recency matters, but don't aggressively flatten older items to zero." | -| `GAUSSIAN` | Bell curve — sharp falloff past `scale`. | "Items close to the origin are great, items far away are nearly worthless." | -| `LINEAR` | Straight line — score reaches zero at a finite distance past `scale`. | "Predictable falloff with a clear cutoff." | +| `EXPONENTIAL` (default) | Heavy tail: score halves geometrically every `scale` past the origin. | "Recency matters, but don't aggressively flatten older items to zero." | +| `GAUSSIAN` | Bell curve: sharp falloff past `scale`. | "Items close to the origin are great, items far away are nearly worthless." | +| `LINEAR` | Straight line: score reaches zero at a finite distance past `scale`. | "Predictable falloff with a clear cutoff." | -Only these three values are accepted — anything else is rejected at request time. +Only these three values are accepted. Anything else is rejected at request time. ## Blending and weights @@ -131,10 +131,10 @@ A boost must carry **at least one** and **at most 20** conditions. Use `Boost.bl final_score = (1 − weight) · primary_norm + weight · boost_norm ``` -- **`weight`** — the outer blending weight, in `[0, 1]`. Defaults to `0.5`. +- **`weight`**: the outer blending weight, in `[0, 1]`. Defaults to `0.5`. - **`weight: 0`** is a no-op: the boost short-circuits and primary results are returned unchanged. -- **Per-condition `weight`** — a `float` defaulting to `1.0`. Use it to balance multiple boosts ("recency twice as important as popularity"). -- **Negative per-condition `weight`** — *demotes* matching documents. They stay in the result set but rank lower than non-matching ones. +- **Per-condition `weight`**: a `float` defaulting to `1.0`. Use it to balance multiple boosts ("recency twice as important as popularity"). +- **Negative per-condition `weight`**: *demotes* matching documents. They stay in the result set but rank lower than non-matching ones. @@ -149,7 +149,7 @@ final_score = (1 − weight) · primary_norm + weight · boost_norm ### Negative weights demote -A condition with `weight: -1.0` (or `-2.0`, etc.) reverses the effect: documents that match the condition rank below non-matching ones instead of above them. They are not removed. This is useful for deprioritizing — for example, surfacing drafts last without filtering them out. +A condition with `weight: -1.0` (or `-2.0`, etc.) reverses the effect: documents that match the condition rank below non-matching ones instead of above them. They are not removed. This is useful for deprioritizing (for example, surfacing drafts last without filtering them out). @@ -171,12 +171,12 @@ A condition with `weight: -1.0` (or `-2.0`, etc.) reverses the effect: documents | Default | `100` | | Operator override | [`QUERY_BOOST_DEFAULT_DEPTH`](/deploy/configuration/env-vars#QUERY_BOOST_DEFAULT_DEPTH) env var | | Hard cap | `QUERY_MAXIMUM_RESULTS` (cluster-wide limit) | -| Lower bound | At least `offset + limit` — boost always sees enough to fill the page | -| Accepted range | `≥ 0` — `0` means "use the default" | +| Lower bound | At least `offset + limit`, so boost always sees enough to fill the page | +| Accepted range | `≥ 0`, where `0` means "use the default" | :::tip Raise `depth` to reorder beyond the top page -Boost can only reorder what the primary search already retrieved. If your boost should reorder past the default top-100 — for example, to pull a popular older article back to page 1 — pass a higher `depth` on the query. +Boost can only reorder what the primary search already retrieved. If your boost should reorder past the default top-100 (for example, to pull a popular older article back to page 1), pass a higher `depth` on the query. Higher `depth` increases the primary search cost (BM25 / vector index work) and per-candidate scoring cost. Set it as tight as your use case allows. @@ -184,10 +184,10 @@ Higher `depth` increases the primary search cost (BM25 / vector index work) and ## Further resources -- [Rerank](./rerank.md) — second-stage reranking with an external model. -- [Hybrid search](./hybrid.md) — the BM25 / vector `alpha` blend. -- [Filters](./filters.md) — hard filters (remove non-matching docs). -- [BM25](./bm25.md) — keyword search. +- [Rerank](./rerank.md): second-stage reranking with an external model. +- [Hybrid search](./hybrid.md): the BM25 / vector `alpha` blend. +- [Filters](./filters.md): hard filters (remove non-matching docs). +- [BM25](./bm25.md): keyword search. ## Questions and feedback diff --git a/docs/weaviate/search/filters.md b/docs/weaviate/search/filters.md index 29ba28f5e..2c2b7c6c1 100644 --- a/docs/weaviate/search/filters.md +++ b/docs/weaviate/search/filters.md @@ -1069,7 +1069,7 @@ This filter requires the [property null state](../config-refs/indexing/inverted- :::caution Preview feature -Available from Weaviate `v1.38` as a preview, gated by the `WEAVIATE_PREVIEW_NESTED_FILTERING=on` environment variable on the server. The path syntax and operator semantics are stable, but the on-disk encoding may change before GA — don't rely on persistent state from preview clusters carrying over to the GA release. The env var is removed at GA and the feature is enabled unconditionally. +Available from Weaviate `v1.38` as a preview, gated by the `WEAVIATE_PREVIEW_NESTED_FILTERING=on` environment variable on the server. The path syntax and operator semantics are stable, but the on-disk encoding may change before GA. Don't rely on persistent state from preview clusters carrying over to the GA release. The env var is removed at GA and the feature is enabled unconditionally. ::: @@ -1094,7 +1094,7 @@ The filter property is a single dotted path. The dot is the only separator. An o | `cars.tires.width` | Any tire on any car (recursive across two `object[]` levels) | | `cars[1].tires[2].brand` | The second car's third tire's `brand` (positional through nesting) | -`[N]` on a segment requires that segment to be an `object[]` (array). Every intermediate segment must be `object` or `object[]` — you cannot pivot through a scalar. The leaf may be any supported scalar type. +`[N]` on a segment requires that segment to be an `object[]` (array). Every intermediate segment must be `object` or `object[]`. You cannot pivot through a scalar. The leaf may be any supported scalar type. ### Match any element (default) @@ -1128,7 +1128,7 @@ Use `[N]` to pin a path segment to a specific array index. Indices are 0-based. ### Same-element correlation across leaves -Combining two leaf filters with `And` matches when **the same element** in the parent array satisfies both. A document with one car `(Toyota, blue)` and another `(Honda, red)` would not match `cars.make = "Toyota" AND cars.color = "red"` — both conditions must hold on the **same** car. +Combining two leaf filters with `And` matches when **the same element** in the parent array satisfies both. A document with one car `(Toyota, blue)` and another `(Honda, red)` would not match `cars.make = "Toyota" AND cars.color = "red"`. Both conditions must hold on the **same** car. @@ -1176,7 +1176,7 @@ Pointing a path at an `object` or `object[]` segment (rather than a scalar leaf) :::note - **Allowed leaf data types**: `text`, `int`, `number`, `boolean`, `date`, `uuid`, and their array variants. `blob`, `blobHash`, `geoCoordinates`, `phoneNumber`, and cross-references (`cref`) are not allowed inside nested objects for nested filtering. -- **`IndexFilterable` is required**: nested filtering uses the filterable inverted index on each leaf. `IndexRangeFilters` and `IndexSearchable` flags exist on nested-property definitions but are not yet exercised by the nested searcher — range filters on nested numeric leaves currently use the filterable bucket. +- **`IndexFilterable` is required**: nested filtering uses the filterable inverted index on each leaf. `IndexRangeFilters` and `IndexSearchable` flags exist on nested-property definitions but are not yet exercised by the nested searcher. Range filters on nested numeric leaves currently use the filterable bucket. - **Tokenization matters**: nested `text` leaves use the same tokenization options as flat properties. For exact-match filters on names, codes, or identifiers, set `tokenization: field` on the leaf so the value is stored as a single token. - **Reference-path vs nested-path**: a reference-path filter is a multi-element `Path` (`["inCity", "City", "name"]`) traversing cross-references; a nested-path filter is a **single-element** path with dots inside it (`["cars.make"]`). diff --git a/docs/weaviate/search/hybrid.md b/docs/weaviate/search/hybrid.md index 6fee913e0..bbf729067 100644 --- a/docs/weaviate/search/hybrid.md +++ b/docs/weaviate/search/hybrid.md @@ -376,7 +376,7 @@ The output is like this: Additional information -For a discussion of fusion methods, see [this blog post](https://weaviate.io/blog/hybrid-search-fusion-algorithms) and [this reference page](../api/graphql/search-operators.md#variables-2) +For a discussion of fusion methods, see [this blog post](https://weaviate.io/blog/hybrid-search-fusion-algorithms) and [this reference page](../api/graphql/search-operators.md#fusion-algorithms).
@@ -1045,7 +1045,7 @@ import TokenizationNote from '/\_includes/tokenization.mdx' -Hybrid queries accept an optional `boost` argument that promotes or demotes matching documents without removing them — useful for biasing results by recency, popularity, a soft filter, or another property. +Hybrid queries accept an optional `boost` argument that promotes or demotes matching documents without removing them. This is useful for biasing results by recency, popularity, a soft filter, or another property. The boost runs once over the **fused** hybrid result. The BM25 and vector sub-search legs do not see the boost themselves. Hybrid's own `alpha` blend runs first, and the boost rescores the fused candidate pool on top. diff --git a/docs/weaviate/search/query-profile.md b/docs/weaviate/search/query-profile.md index 4e14bab48..b5fd13c9f 100644 --- a/docs/weaviate/search/query-profile.md +++ b/docs/weaviate/search/query-profile.md @@ -16,7 +16,7 @@ import QueryProfileNote from '/_includes/feature-notes/query-profile.mdx'; -Query profiling provides per-shard timing breakdowns for search queries. Enable it on any search request to see how long each phase takes — vector search, keyword scoring, filter evaluation, object retrieval — broken down by shard and cluster node. +Query profiling provides per-shard timing breakdowns for search queries. Enable it on any search request to see how long each phase takes (vector search, keyword scoring, filter evaluation, object retrieval), broken down by shard and cluster node. Profiling uses the same instrumentation as [slow query logging](/deploy/configuration/logging.md#slow-query-logging). It adds minimal overhead when enabled and zero overhead when disabled. diff --git a/docs/weaviate/search/rerank.md b/docs/weaviate/search/rerank.md index 2dac8f571..7ff1139cc 100644 --- a/docs/weaviate/search/rerank.md +++ b/docs/weaviate/search/rerank.md @@ -201,7 +201,7 @@ The response should look like this: -For lightweight result reordering based on filters, property values, or time / numeric decay — without calling an external rerank model — use [Boost](./boost.md). Rerank and Boost can be used independently. Pick rerank when you need a smarter model to re-rank the top-N, and Boost when you want to bias by simple signals already on the objects. +For lightweight result reordering based on filters, property values, or time / numeric decay (without calling an external rerank model), use [Boost](./boost.md). Rerank and Boost can be used independently. Pick rerank when you need a smarter model to re-rank the top-N, and Boost when you want to bias by simple signals already on the objects. ## Related pages diff --git a/docs/weaviate/search/similarity.md b/docs/weaviate/search/similarity.md index 4a5cbac5d..86bc718ad 100644 --- a/docs/weaviate/search/similarity.md +++ b/docs/weaviate/search/similarity.md @@ -673,7 +673,7 @@ import V137Preview from '/\_includes/feature-notes/v137-preview.mdx'; -Standard vector search returns the closest matches to the query, which often means a cluster of near-duplicate results. **Maximum Marginal Relevance (MMR)** reranks results to balance relevance with diversity — each selected result must add something new to the result set. +Standard vector search returns the closest matches to the query, which often means a cluster of near-duplicate results. **Maximum Marginal Relevance (MMR)** reranks results to balance relevance with diversity: each selected result must add something new to the result set. Add the `diversity_selection` parameter to any vector search query: @@ -721,7 +721,7 @@ A larger candidate set (higher top-level `limit`) gives MMR more results to choo -Vector search queries accept an optional `boost` argument that promotes or demotes matching documents without removing them — useful for biasing results by recency, popularity, a soft filter, or another property. Matching documents move up. Everything else stays in the results but ranks lower. +Vector search queries accept an optional `boost` argument that promotes or demotes matching documents without removing them. This is useful for biasing results by recency, popularity, a soft filter, or another property. Matching documents move up. Everything else stays in the results but ranks lower. See [Boost](./boost.md) for the supported condition types (filter, property value, time decay, numeric decay), curve choices, blending semantics, and depth tuning. diff --git a/docs/weaviate/tutorials/cross-references.mdx b/docs/weaviate/tutorials/cross-references.mdx index d17ab920c..de2ad6150 100644 --- a/docs/weaviate/tutorials/cross-references.mdx +++ b/docs/weaviate/tutorials/cross-references.mdx @@ -18,7 +18,7 @@ import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; import XRefCrudPythonCode from '!!raw-loader!/_includes/code/howto/manage-data.cross-refs.py'; -import XRefCrudTSCode from '!!raw-loader!/_includes/code/howto/manage-data.cross-refs'; +import XRefCrudTSCode from '!!raw-loader!/_includes/code/howto/manage-data.cross-refs.ts'; import XRefCrudGoCode from '!!raw-loader!/_includes/code/howto/go/docs/manage-data.cross-refs_test.go'; import SearchBasicsPythonCode from '!!raw-loader!/_includes/code/howto/search.basics.py'; @@ -37,7 +37,7 @@ We will refer to the originating object as the **source** object, and the object ### Prerequisites -This tutorial assumes that you have completed the [QuickStart tutorial](docs/weaviate/quickstart/index.md) and have access to a Weaviate instance with write access. +This tutorial assumes that you have completed the [QuickStart tutorial](../quickstart/index.md) and have access to a Weaviate instance with write access. ## When to use cross-references @@ -112,6 +112,14 @@ An example syntax is shown below: + + + Date: Thu, 6 Aug 2026 19:38:55 +0200 Subject: [PATCH 56/84] docs(model-providers): fix structure, model lists, and a wrong published token limit The ColModernVBERT query token limit read 8,092, a transposition. The model's own tokenizer_config.json gives model_max_length 8192. It renders on two pages through a shared include. The AWS Bedrock page listed 21 model IDs that had gone stale. Core detects model families by substring, so newer models already work; the list is replaced with that explanation and a pointer to the live AWS list, so it cannot rot again. Also: a duplicated 'Vectorizer parameters' heading merged, default markers added to three model lists that had none, a Reranker section added to two provider index pages whose reranker page existed but was unreachable, and the v1.33+ opt-out variable for API-based modules documented alongside the older opt-in. --- _includes/wcs/restart-warning.mdx | 1 - .../weaviate-embeddings-multimodal-models.mdx | 2 +- .../client-libraries/_includes/feedback.mdx | 7 ----- .../model-providers/aws/generative.md | 30 ++++--------------- .../google/embeddings-multimodal.md | 6 ++-- docs/weaviate/model-providers/index.md | 6 +++- .../jinaai/embeddings-colbert.md | 2 +- .../jinaai/embeddings-multimodal.md | 14 ++++----- docs/weaviate/model-providers/jinaai/index.md | 12 +++++++- .../model-providers/jinaai/reranker.md | 2 +- .../model-providers/transformers/index.md | 11 +++++++ 11 files changed, 43 insertions(+), 50 deletions(-) delete mode 100644 _includes/wcs/restart-warning.mdx delete mode 100644 docs/weaviate/client-libraries/_includes/feedback.mdx diff --git a/_includes/wcs/restart-warning.mdx b/_includes/wcs/restart-warning.mdx deleted file mode 100644 index 9dcdb3522..000000000 --- a/_includes/wcs/restart-warning.mdx +++ /dev/null @@ -1 +0,0 @@ -This action restarts the cluster. If you have a stand-alone cluster, there is a short downtime while the cluster restarts. There is no downtime if you have a high availability cluster. \ No newline at end of file diff --git a/_includes/weaviate-embeddings-multimodal-models.mdx b/_includes/weaviate-embeddings-multimodal-models.mdx index e16485aa9..f7420929a 100644 --- a/_includes/weaviate-embeddings-multimodal-models.mdx +++ b/_includes/weaviate-embeddings-multimodal-models.mdx @@ -4,7 +4,7 @@ - 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,092 tokens +- 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/model-providers/weaviate/embeddings-multimodal) diff --git a/docs/weaviate/client-libraries/_includes/feedback.mdx b/docs/weaviate/client-libraries/_includes/feedback.mdx deleted file mode 100644 index 864943be8..000000000 --- a/docs/weaviate/client-libraries/_includes/feedback.mdx +++ /dev/null @@ -1,7 +0,0 @@ -:::note Questions -Please answer in relation to this section of the API. - -- Any specific features that you liked or disliked? -- Did you encounter any errors or difficulties? If yes, what were they? -- Any other notes or suggestions for improvement? -::: \ No newline at end of file diff --git a/docs/weaviate/model-providers/aws/generative.md b/docs/weaviate/model-providers/aws/generative.md index df4d028e2..515bdea8c 100644 --- a/docs/weaviate/model-providers/aws/generative.md +++ b/docs/weaviate/model-providers/aws/generative.md @@ -147,7 +147,7 @@ For SageMaker, you must provide the endpoint address in the generative AI config
-You can [specify](#generative-parameters) one of the [available models](#available-models) for Weaviate to use. The [default model](#available-models) is used if no model is specified. +You can [specify](#generative-parameters) which [model](#available-models) Weaviate uses. ### Generative parameters @@ -272,31 +272,11 @@ You can also supply images as a part of the input when performing retrieval augm #### Bedrock -- `ai21.j2-ultra-v1` -- `ai21.j2-mid-v1` -- `amazon.titan-text-lite-v1` -- `amazon.titan-text-express-v1` -- `amazon.titan-text-premier-v1:0` -- `anthropic.claude-v2` -- `anthropic.claude-v2:1` -- `anthropic.claude-instant-v1` -- `anthropic.claude-3-sonnet-20240229-v1:0` -- `anthropic.claude-3-haiku-20240307-v1:0` -- `cohere.command-text-v14` -- `cohere.command-light-text-v14` -- `cohere.command-r-v1:0` -- `cohere.command-r-plus-v1:0` -- `meta.llama3-8b-instruct-v1:0` -- `meta.llama3-70b-instruct-v1:0` -- `meta.llama2-13b-chat-v1` -- `meta.llama2-70b-chat-v1` -- `mistral.mistral-7b-instruct-v0:2` -- `mistral.mixtral-8x7b-instruct-v0:1` -- `mistral.mistral-large-2402-v1:0` - -Refer to the [this document](https://docs.aws.amazon.com/bedrock/latest/userguide/model-usage.html) to find out how request access to a model. +Weaviate passes the `model` value through to Amazon Bedrock, so any Bedrock text generation model that your AWS account and region has access to can be used. Weaviate recognizes the model families offered by AI21 Labs, Amazon (Titan and Nova), Anthropic, Cohere, Meta, and Mistral AI, including their cross-region inference profile IDs. -### SageMaker +For the current model IDs, see the [Amazon Bedrock supported foundation models](https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html) documentation. Refer to [this document](https://docs.aws.amazon.com/bedrock/latest/userguide/model-usage.html) to find out how to request access to a model. + +#### SageMaker Any custom SageMaker URL can be used as an endpoint. diff --git a/docs/weaviate/model-providers/google/embeddings-multimodal.md b/docs/weaviate/model-providers/google/embeddings-multimodal.md index 469dbc0a3..efff5c8d9 100644 --- a/docs/weaviate/model-providers/google/embeddings-multimodal.md +++ b/docs/weaviate/model-providers/google/embeddings-multimodal.md @@ -144,9 +144,7 @@ import ApiKeyNote from '../_includes/google-api-key-note.md'; -You can [specify](#vectorizer-parameters) one of the [available models](#available-models) for the vectorizer to use. - - +You can [specify](#vectorizer-parameters) one of the [available models](#available-models) for the vectorizer to use. The [default model](#available-models) is used if no model is specified. import VectorizationBehavior from '/_includes/vectorization.behavior.mdx'; @@ -327,7 +325,7 @@ The query below returns the `n` most similar objects to the input image from the ### Available models - `gemini-embedding-2` (Vertex AI and Gemini API, added in 1.36.13). Supports text, images, PDFs, and audio (Gemini API only, up to 180 seconds); `3072` dimensions -- `multimodalembedding@001` (Vertex AI only). Supports text, images, and video; dimensions: `128`, `256`, `512`, `1408` +- `multimodalembedding@001` (default, Vertex AI only). Supports text, images, and video; dimensions: `128`, `256`, `512`, `1408` ## Further resources diff --git a/docs/weaviate/model-providers/index.md b/docs/weaviate/model-providers/index.md index d6c85263b..20c49da2b 100644 --- a/docs/weaviate/model-providers/index.md +++ b/docs/weaviate/model-providers/index.md @@ -40,7 +40,11 @@ This enables an enhanced developed experience, such as the ability to: #### Enable all API-based modules -All API-based model integrations are available by default starting with Weaviate `v1.33`. For older versions, you can enable them all by setting the [`ENABLE_API_BASED_MODULES` environment variable](/deploy/configuration/env-vars#ENABLE_API_BASED_MODULES) to `true`. +All API-based model integrations are available by default starting with Weaviate `v1.33`. + +To opt out, for example in an air-gapped or otherwise restricted deployment, set the [`API_BASED_MODULES_DISABLED` environment variable](/deploy/configuration/env-vars#API_BASED_MODULES_DISABLED) to `true`. Weaviate then loads only the modules that you list in [`ENABLE_MODULES`](/deploy/configuration/env-vars#ENABLE_MODULES). This variable was added in `v1.33`. + +For releases before `v1.33`, enable all API-based modules by setting the [`ENABLE_API_BASED_MODULES` environment variable](/deploy/configuration/env-vars#ENABLE_API_BASED_MODULES) to `true`. Weaviate stopped reading that variable in `v1.33`. ### Locally hosted diff --git a/docs/weaviate/model-providers/jinaai/embeddings-colbert.md b/docs/weaviate/model-providers/jinaai/embeddings-colbert.md index 9481fda96..e9af8d70f 100644 --- a/docs/weaviate/model-providers/jinaai/embeddings-colbert.md +++ b/docs/weaviate/model-providers/jinaai/embeddings-colbert.md @@ -328,7 +328,7 @@ The query below returns the `n` best scoring objects from the database, set by ` ### Available models -- `jina-colbert-v2` +- `jina-colbert-v2` (server default) - By default, Weaviate uses `128` dimensions - `jina-colbert-v1` diff --git a/docs/weaviate/model-providers/jinaai/embeddings-multimodal.md b/docs/weaviate/model-providers/jinaai/embeddings-multimodal.md index b254f6c61..a9850dec3 100644 --- a/docs/weaviate/model-providers/jinaai/embeddings-multimodal.md +++ b/docs/weaviate/model-providers/jinaai/embeddings-multimodal.md @@ -125,7 +125,7 @@ You can specify one of the [available models](#available-models) for the vectori -You can [specify](#vectorizer-parameters) one of the [available models](#available-models) for Weaviate to use. The [default model](#available-models) is used if no model is specified. +The [default model](#available-models) is used if you do not specify one. import VectorizationBehavior from '/_includes/vectorization.behavior.mdx'; @@ -140,6 +140,10 @@ import VectorizationBehavior from '/_includes/vectorization.behavior.mdx'; The following examples show how to configure Jina AI-specific options. +- `model`: The model name. +- `dimensions`: The number of dimensions for the model. + - Note that [not all models](#available-models) support this parameter. + -### Vectorizer parameters - -- `model`: The model name. -- `dimensions`: The number of dimensions for the model. - - Note that [not all models](#available-models) support this parameter. - ## Data import After configuring the vectorizer, [import data](../../manage-objects/import.mdx) into Weaviate. Weaviate generates embeddings for text objects using the specified model. @@ -297,7 +295,7 @@ The query below returns the `n` most similar objects to the input image from the ### Available models -- `jina-clip-v2` +- `jina-clip-v2` (server default) - This model is a multilingual, multimodal model using [Matryoshka Representation Learning](https://arxiv.org/abs/2205.13147). - It will accept a `dimensions` parameter, which can be any integer between (and including) 64 and 1024. The default value is 1024. - `jina-clip-v1` diff --git a/docs/weaviate/model-providers/jinaai/index.md b/docs/weaviate/model-providers/jinaai/index.md index bf78e3e72..9d1b6144b 100644 --- a/docs/weaviate/model-providers/jinaai/index.md +++ b/docs/weaviate/model-providers/jinaai/index.md @@ -25,6 +25,16 @@ Jina AI's embedding models transform text data into vector embeddings, capturing [Jina AI ColBERT embedding integration page](./embeddings-colbert.md) [Jina AI multimodal embedding integration page](./embeddings-multimodal.md) +### Reranker models + +![Reranker integration illustration](../_includes/integration_jinaai_reranker.png) + +Jina AI's reranker models are designed to improve the relevance and ranking of search results. + +[The Weaviate reranker integration](./reranker.md) allows users to easily refine their search results by leveraging Jina AI's reranker models. + +[Jina AI reranker integration page](./reranker.md) + ## Summary These integrations enable developers to leverage Jina AI's powerful models directly within Weaviate. @@ -40,7 +50,7 @@ Then, go to the relevant integration page to learn how to configure Weaviate wit - [Text Embeddings](./embeddings.md) - [ColBERT embeddings](./embeddings-colbert.md) - [Multimodal embeddings](./embeddings-multimodal.md) -- [Rerankers](./reranker.md) +- [Reranker](./reranker.md) ## Questions and feedback diff --git a/docs/weaviate/model-providers/jinaai/reranker.md b/docs/weaviate/model-providers/jinaai/reranker.md index 11c830df0..a1f78b60f 100644 --- a/docs/weaviate/model-providers/jinaai/reranker.md +++ b/docs/weaviate/model-providers/jinaai/reranker.md @@ -167,7 +167,7 @@ Any search in Weaviate can be combined with a reranker to perform reranking oper ### Available models -- `jina-reranker-v2-base-multilingual` (default) +- `jina-reranker-v2-base-multilingual` (server default) - `jina-reranker-v1-base-en` - `jina-reranker-v1-turbo-en` - `jina-reranker-v1-tiny-en` diff --git a/docs/weaviate/model-providers/transformers/index.md b/docs/weaviate/model-providers/transformers/index.md index bf3be8a5c..efaeadf2c 100644 --- a/docs/weaviate/model-providers/transformers/index.md +++ b/docs/weaviate/model-providers/transformers/index.md @@ -25,6 +25,16 @@ Transformers-compatible embedding models transform text data into vector embeddi [Hugging Face Transformers embedding integration page](./embeddings.md) +### Reranker models + +![Reranker integration illustration](../_includes/integration_transformers_reranker.png) + +Transformers-compatible reranker models are designed to improve the relevance and ranking of search results. + +[The Weaviate reranker integration](./reranker.md) allows users to easily refine their search results with a locally hosted Hugging Face Transformers reranker model. + +[Hugging Face Transformers reranker integration page](./reranker.md) + ## Summary These integrations enable developers to leverage powerful Hugging Face Transformers models from directly within Weaviate. @@ -41,6 +51,7 @@ Go to the relevant integration page to learn how to configure Weaviate with the - [Text Embeddings (custom image)](./embeddings-custom-image.md) - [Multimodal Embeddings](./embeddings-multimodal.md) - [Multimodal Embeddings (custom image)](./embeddings-multimodal-custom-image.md) +- [Reranker](./reranker.md) ## Questions and feedback From 556cda3690fa4ebd30c29809bc4814907a44b233 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Thu, 6 Aug 2026 19:38:55 +0200 Subject: [PATCH 57/84] docs(model-providers): copy-editing across provider pages A duplicated-word footer ('multimodal embedding embeddings models') appears in eight provider pages, a duplicated verb, a repeated 'Dataricks' typo, and 'Chose' for 'Choose' across three Transformers pages. The Databricks pages told readers to provide an API key in several places. Databricks uses a personal access token, which the pages' own header tables already say. The custom-image page also named a folder the Dockerfile beside it does not use. --- .../model-providers/cohere/embeddings-multimodal.md | 2 +- docs/weaviate/model-providers/cohere/embeddings.md | 4 ++-- docs/weaviate/model-providers/cohere/generative.md | 2 +- docs/weaviate/model-providers/cohere/reranker.md | 4 ++-- docs/weaviate/model-providers/databricks/embeddings.md | 6 +++--- docs/weaviate/model-providers/databricks/generative.md | 6 +++--- docs/weaviate/model-providers/google/index.md | 7 ++++--- docs/weaviate/model-providers/kubeai/index.md | 2 +- docs/weaviate/model-providers/nvidia/embeddings.md | 2 +- docs/weaviate/model-providers/nvidia/generative.md | 2 +- docs/weaviate/model-providers/nvidia/reranker.md | 2 +- .../transformers/embeddings-custom-image.md | 2 +- .../transformers/embeddings-multimodal-custom-image.md | 6 +++--- .../model-providers/transformers/embeddings-multimodal.md | 4 ++-- docs/weaviate/model-providers/transformers/embeddings.md | 4 ++-- docs/weaviate/model-providers/transformers/reranker.md | 4 ++-- docs/weaviate/model-providers/voyageai/embeddings.md | 2 +- docs/weaviate/model-providers/voyageai/reranker.md | 2 +- 18 files changed, 32 insertions(+), 31 deletions(-) diff --git a/docs/weaviate/model-providers/cohere/embeddings-multimodal.md b/docs/weaviate/model-providers/cohere/embeddings-multimodal.md index aaeffa4ce..e7126e2d0 100644 --- a/docs/weaviate/model-providers/cohere/embeddings-multimodal.md +++ b/docs/weaviate/model-providers/cohere/embeddings-multimodal.md @@ -295,7 +295,7 @@ The query below returns the `n` most similar objects to the input image from the ### Available models - `embed-v4.0` -- `embed-multilingual-v3.0` (Default) +- `embed-multilingual-v3.0` (server default) - `embed-multilingual-light-v3.0` - `embed-english-v3.0` - `embed-english-light-v3.0` diff --git a/docs/weaviate/model-providers/cohere/embeddings.md b/docs/weaviate/model-providers/cohere/embeddings.md index 3250e0b7a..6464cb67f 100644 --- a/docs/weaviate/model-providers/cohere/embeddings.md +++ b/docs/weaviate/model-providers/cohere/embeddings.md @@ -356,7 +356,7 @@ The query below returns the `n` best scoring objects from the database, set by ` ### Available models - `embed-v4.0` -- `embed-multilingual-v3.0` (Default) +- `embed-multilingual-v3.0` (server default) - `embed-multilingual-light-v3.0` - `embed-multilingual-v2.0` (previously `embed-multilingual-22-12`) - `embed-english-v3.0` @@ -379,7 +379,7 @@ The following models are available, but deprecated: ### Other integrations -- [Cohere multimodal embedding embeddings models + Weaviate](./embeddings-multimodal.md) +- [Cohere multimodal embedding models + Weaviate](./embeddings-multimodal.md) - [Cohere generative models + Weaviate](./generative.md) - [Cohere reranker models + Weaviate](./reranker.md) diff --git a/docs/weaviate/model-providers/cohere/generative.md b/docs/weaviate/model-providers/cohere/generative.md index 6bc94c00c..15ba44867 100644 --- a/docs/weaviate/model-providers/cohere/generative.md +++ b/docs/weaviate/model-providers/cohere/generative.md @@ -288,7 +288,7 @@ The following models are commonly used: ### Other integrations - [Cohere text embedding models + Weaviate](./embeddings.md). -- [Cohere multimodal embedding embeddings models + Weaviate](./embeddings-multimodal.md) +- [Cohere multimodal embedding models + Weaviate](./embeddings-multimodal.md). - [Cohere reranker models + Weaviate](./reranker.md). ### Code examples diff --git a/docs/weaviate/model-providers/cohere/reranker.md b/docs/weaviate/model-providers/cohere/reranker.md index e04e7c035..5f3565b52 100644 --- a/docs/weaviate/model-providers/cohere/reranker.md +++ b/docs/weaviate/model-providers/cohere/reranker.md @@ -180,7 +180,7 @@ Any search in Weaviate can be combined with a reranker to perform reranking oper ### Available models -- `rerank-v3.5` (default) +- `rerank-v3.5` (server default) - `rerank-english-v3.0` - `rerank-multilingual-v3.0` - `rerank-english-v2.0` @@ -199,7 +199,7 @@ For further details on model parameters, see the [Cohere API documentation](http ### Other integrations - [Cohere text embedding models + Weaviate](./embeddings.md). -- [Cohere multimodal embedding embeddings models + Weaviate](./embeddings-multimodal.md) +- [Cohere multimodal embedding models + Weaviate](./embeddings-multimodal.md). - [Cohere generative models + Weaviate](./generative.md). ### Code examples diff --git a/docs/weaviate/model-providers/databricks/embeddings.md b/docs/weaviate/model-providers/databricks/embeddings.md index 6207c2041..7060f1b45 100644 --- a/docs/weaviate/model-providers/databricks/embeddings.md +++ b/docs/weaviate/model-providers/databricks/embeddings.md @@ -50,7 +50,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) instances. You must provide a valid Databricks Personal Access Token (PAT) to Weaviate for this integration. Refer to the [Databricks documentation](https://docs.databricks.com/en/dev-tools/auth/pat.html) for instructions on generating your PAT in your workspace. -Provide the Dataricks token to Weaviate using one of the following methods: +Provide the Databricks token to Weaviate using one of the following methods: - Set the `DATABRICKS_TOKEN` environment variable that is available to Weaviate. - Provide the token at runtime, as shown in the examples below. @@ -125,13 +125,13 @@ This will configure Weaviate to use the vectorizer served through the endpoint y ### Vectorizer parameters - `endpoint`: The URL of the embedding model hosted on Databricks. -- `instruction`:An optional instruction to pass to the embedding model. +- `instruction`: An optional instruction to pass to the embedding model. For further details on model parameters, see the [Databricks documentation](https://docs.databricks.com/en/machine-learning/foundation-models/api-reference.html#embedding-request). ## 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: +You can provide the token as well as some optional parameters at runtime through additional headers in the request. The following headers are available: - `X-Databricks-Token`: The Databricks API token. - `X-Databricks-Endpoint`: The endpoint to use for the Databricks model. diff --git a/docs/weaviate/model-providers/databricks/generative.md b/docs/weaviate/model-providers/databricks/generative.md index 8f9a52780..22c953e60 100644 --- a/docs/weaviate/model-providers/databricks/generative.md +++ b/docs/weaviate/model-providers/databricks/generative.md @@ -48,10 +48,10 @@ This integration is enabled by default on Weaviate Cloud (WCD) instances. You must provide a valid Databricks Personal Access Token (PAT) to Weaviate for this integration. Refer to the [Databricks documentation](https://docs.databricks.com/en/dev-tools/auth/pat.html) for instructions on generating your PAT in your workspace. -Provide the Dataricks token to Weaviate using one of the following methods: +Provide the Databricks token to Weaviate using one of the following methods: - Set the `DATABRICKS_TOKEN` environment variable that is available to Weaviate. -- Provide the API key at runtime, as shown in the examples below. +- Provide the token at runtime, as shown in the examples below. @@ -156,7 +156,7 @@ Aside from setting the default model provider when creating the collection, you ## 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: +You can provide the token as well as some optional parameters at runtime through additional headers in the request. The following headers are available: - `X-Databricks-Token`: The Databricks API token. - `X-Databricks-Endpoint`: The endpoint to use for the Databricks model. diff --git a/docs/weaviate/model-providers/google/index.md b/docs/weaviate/model-providers/google/index.md index 5e11e7c96..7b0d72ff7 100644 --- a/docs/weaviate/model-providers/google/index.md +++ b/docs/weaviate/model-providers/google/index.md @@ -22,6 +22,7 @@ Google's embedding models transform text data into vector embeddings, capturing [Weaviate integrates with Google's embedding models](./embeddings.md) to enable seamless vectorization of data. This integration allows users to perform semantic and hybrid search operations without the need for additional preprocessing or data transformation steps. [Google embedding integration page](./embeddings.md) + [Google multimodal embedding integration page](./embeddings-multimodal.md) ### Generative AI models for RAG @@ -42,11 +43,11 @@ In turn, they simplify the process of building AI-driven applications to speed u ## Credentials -You must provide a valid Googles API credentials to Weaviate for these integrations. +You must provide valid Google API credentials to Weaviate for these integrations. ### Vertex AI -##### Automatic token generation +#### Automatic token generation import UseGoogleAuthInstructions from './_includes/use_google_auth_instructions.mdx'; @@ -54,7 +55,7 @@ import UseGoogleAuthInstructions from './_includes/use_google_auth_instructions. ## Get started -Weaviate integrates with both [Google Gemini API](https://aistudio.google.com/app/apikey/?utm_source=weaviate&utm_medium=referral&utm_campaign=partnerships&utm_content=) or [Google Vertex AI](https://cloud.google.com/vertex-ai). +Weaviate integrates with both the [Google Gemini API](https://aistudio.google.com/app/apikey/?utm_source=weaviate&utm_medium=referral&utm_campaign=partnerships&utm_content=) and [Google Vertex AI](https://cloud.google.com/vertex-ai). Go to the relevant integration page to learn how to configure Weaviate with the Google models and start using them in your applications. diff --git a/docs/weaviate/model-providers/kubeai/index.md b/docs/weaviate/model-providers/kubeai/index.md index 8f8200197..e1d500803 100644 --- a/docs/weaviate/model-providers/kubeai/index.md +++ b/docs/weaviate/model-providers/kubeai/index.md @@ -7,7 +7,7 @@ image: og/docs/integrations/provider_integrations_kubeai.jpg -[KubeAI](https://github.com/substratusai/kubeai) provides offers a wide range of models for natural language processing and generation through OpenAI-style API endpoints. Weaviate seamlessly integrates with KubeAI's APIs, allowing users to leverage any KubeAI models directly from the Weaviate Database. +[KubeAI](https://github.com/substratusai/kubeai) offers a wide range of models for natural language processing and generation through OpenAI-style API endpoints. Weaviate seamlessly integrates with KubeAI's APIs, allowing users to leverage any KubeAI models directly from the Weaviate Database. These integrations empower developers to build sophisticated AI-driven applications with ease. diff --git a/docs/weaviate/model-providers/nvidia/embeddings.md b/docs/weaviate/model-providers/nvidia/embeddings.md index 82ef56644..377ecdafc 100644 --- a/docs/weaviate/model-providers/nvidia/embeddings.md +++ b/docs/weaviate/model-providers/nvidia/embeddings.md @@ -342,7 +342,7 @@ The default model is `nvidia/nv-embed-v1`. ### Other integrations -- [NVIDIA multimodal embedding embeddings models + Weaviate](./embeddings-multimodal.md) +- [NVIDIA multimodal embedding models + Weaviate](./embeddings-multimodal.md) - [NVIDIA generative models + Weaviate](./generative.md) - [NVIDIA reranker models + Weaviate](./reranker.md) diff --git a/docs/weaviate/model-providers/nvidia/generative.md b/docs/weaviate/model-providers/nvidia/generative.md index 6e49a16c1..59473b3fe 100644 --- a/docs/weaviate/model-providers/nvidia/generative.md +++ b/docs/weaviate/model-providers/nvidia/generative.md @@ -260,7 +260,7 @@ The default model is `nvidia/llama-3.1-nemotron-51b-instruct`. ### Other integrations - [NVIDIA text embedding models + Weaviate](./embeddings.md). -- [NVIDIA multimodal embedding embeddings models + Weaviate](./embeddings-multimodal.md) +- [NVIDIA multimodal embedding models + Weaviate](./embeddings-multimodal.md). - [NVIDIA reranker models + Weaviate](./reranker.md). ### Code examples diff --git a/docs/weaviate/model-providers/nvidia/reranker.md b/docs/weaviate/model-providers/nvidia/reranker.md index 57a29e85a..497b6dfa6 100644 --- a/docs/weaviate/model-providers/nvidia/reranker.md +++ b/docs/weaviate/model-providers/nvidia/reranker.md @@ -177,7 +177,7 @@ The default model is `nvidia/rerank-qa-mistral-4b`. ### Other integrations - [NVIDIA text embedding models + Weaviate](./embeddings.md). -- [NVIDIA multimodal embedding embeddings models + Weaviate](./embeddings-multimodal.md) +- [NVIDIA multimodal embedding models + Weaviate](./embeddings-multimodal.md). - [NVIDIA generative models + Weaviate](./generative.md). ### Code examples diff --git a/docs/weaviate/model-providers/transformers/embeddings-custom-image.md b/docs/weaviate/model-providers/transformers/embeddings-custom-image.md index 7c2be7f1b..424eaa188 100644 --- a/docs/weaviate/model-providers/transformers/embeddings-custom-image.md +++ b/docs/weaviate/model-providers/transformers/embeddings-custom-image.md @@ -70,7 +70,7 @@ To build an image with a local, custom model, create a new `Dockerfile` similar Save the `Dockerfile` as `my-inference-image.Dockerfile`. (You can name it anything you like.)
-This will creates a custom image for a model stored in a local folder `my-model` on your machine. +This will create a custom image for a model stored in a local folder `my-model` on your machine.
```yaml diff --git a/docs/weaviate/model-providers/transformers/embeddings-multimodal-custom-image.md b/docs/weaviate/model-providers/transformers/embeddings-multimodal-custom-image.md index 0773b08bd..4c21846bf 100644 --- a/docs/weaviate/model-providers/transformers/embeddings-multimodal-custom-image.md +++ b/docs/weaviate/model-providers/transformers/embeddings-multimodal-custom-image.md @@ -61,16 +61,16 @@ RUN CLIP_MODEL_NAME=clip-ViT-B-32 TEXT_MODEL_NAME=clip-ViT-B-32 ./download.py
-You can also build a custom image with any model that is compatible with the Transformer library's `SentenceTransformers` and `ClIPModel` classes. To ensure that text embeddings will output compatible vectors to image embeddings, you must only use models that have been specifically trained for use with CLIP models. (Note that a CLIP model is in reality two models: one for text and one for images.) +You can also build a custom image with any model that is compatible with the Transformer library's `SentenceTransformers` and `CLIPModel` classes. To ensure that text embeddings will output compatible vectors to image embeddings, you must only use models that have been specifically trained for use with CLIP models. (Note that a CLIP model is in reality two models: one for text and one for images.)
-To build an image with a local, custom model, create a new `Dockerfile` similar to the following, replacing `./my-test-model` and `./my-clip-model` with the path to your model folder. +To build an image with a local, custom model, create a new `Dockerfile` similar to the following, replacing `./my-text-model` and `./my-clip-model` with the paths to your model folders.
Save the `Dockerfile` as `my-inference-image.Dockerfile`. (You can name it anything you like.)
-This will creates a custom image for a model stored in a local folder `my-model` on your machine. +This will create a custom image for the models stored in the local folders `my-text-model` and `my-clip-model` on your machine.
```yaml diff --git a/docs/weaviate/model-providers/transformers/embeddings-multimodal.md b/docs/weaviate/model-providers/transformers/embeddings-multimodal.md index cc14c4ebe..5c1640c31 100644 --- a/docs/weaviate/model-providers/transformers/embeddings-multimodal.md +++ b/docs/weaviate/model-providers/transformers/embeddings-multimodal.md @@ -156,8 +156,8 @@ As this integration runs a local container with the CLIP model, no additional cr
-:::note Chose a container image to select a model -To chose a model, select the [container image](#configure-the-integration) that hosts it. +:::note Choose a container image to select a model +To choose a model, select the [container image](#configure-the-integration) that hosts it. ::: import VectorizationBehavior from '/_includes/vectorization.behavior.mdx'; diff --git a/docs/weaviate/model-providers/transformers/embeddings.md b/docs/weaviate/model-providers/transformers/embeddings.md index 28ebd31ae..a0fd1ebf7 100644 --- a/docs/weaviate/model-providers/transformers/embeddings.md +++ b/docs/weaviate/model-providers/transformers/embeddings.md @@ -159,8 +159,8 @@ As this integration runs a local container with the Transformers model, no addit -:::note Chose a container image to select a model -To chose a model, select the [container image](#configure-the-integration) that hosts it. +:::note Choose a container image to select a model +To choose a model, select the [container image](#configure-the-integration) that hosts it. ::: import VectorizationBehavior from '/_includes/vectorization.behavior.mdx'; diff --git a/docs/weaviate/model-providers/transformers/reranker.md b/docs/weaviate/model-providers/transformers/reranker.md index cff1fba80..b47029ee0 100644 --- a/docs/weaviate/model-providers/transformers/reranker.md +++ b/docs/weaviate/model-providers/transformers/reranker.md @@ -160,8 +160,8 @@ Configure a Weaviate collection to use a Transformer reranker model as follows: -:::note Chose a container image to select a model -To chose a model, select the [container image](#configure-the-integration) that hosts it. +:::note Choose a container image to select a model +To choose a model, select the [container image](#configure-the-integration) that hosts it. ::: ## Reranking query diff --git a/docs/weaviate/model-providers/voyageai/embeddings.md b/docs/weaviate/model-providers/voyageai/embeddings.md index 7e727befd..d45101c6a 100644 --- a/docs/weaviate/model-providers/voyageai/embeddings.md +++ b/docs/weaviate/model-providers/voyageai/embeddings.md @@ -387,7 +387,7 @@ The `voyage-context-3` model uses Voyage AI's [contextual embeddings API](https: ### Other integrations -- [Voyage AI multimodal embedding embeddings models + Weaviate](./embeddings-multimodal.md) +- [Voyage AI multimodal embedding models + Weaviate](./embeddings-multimodal.md). - [Voyage AI reranker models + Weaviate](./reranker.md). ### Code examples diff --git a/docs/weaviate/model-providers/voyageai/reranker.md b/docs/weaviate/model-providers/voyageai/reranker.md index 452eee945..d85b75e5b 100644 --- a/docs/weaviate/model-providers/voyageai/reranker.md +++ b/docs/weaviate/model-providers/voyageai/reranker.md @@ -184,7 +184,7 @@ Any search in Weaviate can be combined with a reranker to perform reranking oper ### Other integrations - [Voyage AI embedding models + Weaviate](./embeddings.md). -- [Voyage AI multimodal embedding embeddings models + Weaviate](./embeddings-multimodal.md) +- [Voyage AI multimodal embedding models + Weaviate](./embeddings-multimodal.md). ### Code examples From 04ccd6ff01af3d777b4180e283bde650081a3f79 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Thu, 6 Aug 2026 19:38:55 +0200 Subject: [PATCH 58/84] docs: house-style sweep across reference and concepts pages 33 em dashes replaced, each with the punctuation the sentence wants rather than a mechanical substitution. Eight of these were never filed by the review, which is the argument for the CI lint tracked separately. Client library version numbers removed from prose in five places. Where a version was load-bearing the sentence was rewritten to say the same thing without a number that rots. Also: the keyword-search page wrote the tokenizer as GSE, but the config value is lowercase gse and the uppercase form is a validation error; and a link to an env-var anchor was miscased, which fixes one of only two broken anchors in the build. --- docs/deploy/configuration/backups.md | 2 +- docs/deploy/configuration/replication.md | 2 +- docs/weaviate/api/index.mdx | 2 +- docs/weaviate/client-libraries/index.mdx | 4 ++-- docs/weaviate/concepts/indexing/inverted-index.md | 4 ++-- docs/weaviate/concepts/search/keyword-search.md | 8 ++++---- docs/weaviate/concepts/search/vector-search.md | 6 +++--- docs/weaviate/concepts/storage.md | 4 ++-- docs/weaviate/config-refs/datatypes.md | 4 ++-- .../config-refs/indexing/inverted-index.mdx | 14 +++++++------- .../weaviate/config-refs/indexing/vector-index.mdx | 12 ++++++------ docs/weaviate/connections/connect-custom.mdx | 12 ++++++------ docs/weaviate/connections/connect-query.mdx | 4 ++-- docs/weaviate/manage-objects/create.mdx | 2 +- docs/weaviate/manage-objects/import.mdx | 2 +- docs/weaviate/manage-objects/read-all-objects.mdx | 2 +- 16 files changed, 42 insertions(+), 42 deletions(-) diff --git a/docs/deploy/configuration/backups.md b/docs/deploy/configuration/backups.md index 22a4d57ea..47f7beb9c 100644 --- a/docs/deploy/configuration/backups.md +++ b/docs/deploy/configuration/backups.md @@ -29,7 +29,7 @@ Weaviate's Backup feature is designed to work natively with cloud technology. Mo :::caution Important backup considerations - **Version Requirements**: If you are running Weaviate `v1.23.12` or older, you must [update](/deploy/migration/index.md) to `v1.23.13` or higher before restoring a backup to prevent data corruption. -- **[Multi-tenancy](/weaviate/concepts/data.md#multi-tenancy) limitations**: Starting in `v1.37`, backups include both `active` (HOT) and `inactive` (COLD) tenants — inactive tenants are backed up directly from disk without activation. `Offloaded` (FROZEN) tenants are still skipped since they have no local data. In versions prior to `v1.37`, only active tenants are included, so be sure to [activate](/weaviate/manage-collections/multi-tenancy.mdx#manage-tenant-states) any required tenants before creating a backup. +- **[Multi-tenancy](/weaviate/concepts/data.md#multi-tenancy) limitations**: Starting in `v1.37`, backups include both `active` (HOT) and `inactive` (COLD) tenants. Inactive tenants are backed up directly from disk without activation. `Offloaded` (FROZEN) tenants are still skipped since they have no local data. In versions prior to `v1.37`, only active tenants are included, so be sure to [activate](/weaviate/manage-collections/multi-tenancy.mdx#manage-tenant-states) any required tenants before creating a backup. ::: ## Backup Quickstart diff --git a/docs/deploy/configuration/replication.md b/docs/deploy/configuration/replication.md index 989a1ed99..2d8c81e88 100644 --- a/docs/deploy/configuration/replication.md +++ b/docs/deploy/configuration/replication.md @@ -48,7 +48,7 @@ When Weaviate detects inconsistent data across nodes, it attempts to repair the Weaviate offers [async replication](/weaviate/concepts/replication-architecture/consistency.md#async-replication) to proactively detect inconsistencies. In earlier versions, Weaviate uses a [repair-on-read](/weaviate/concepts/replication-architecture/consistency.md#repair-on-read) strategy to repair inconsistencies at read time. -Repair-on-read is automatic. As of Weaviate `v1.38`, async replication is also **enabled by default** for any collection with a replication factor greater than `1` — there is no longer a per-collection flag to switch it on. To turn it off cluster-wide, set the [`ASYNC_REPLICATION_DISABLED`](/deploy/configuration/env-vars/index.md#async-replication) environment variable to `true`. The `replicationConfig` section is used to set the replication factor and to fine-tune async replication via `asyncConfig`: +Repair-on-read is automatic. As of Weaviate `v1.38`, async replication is also **enabled by default** for any collection with a replication factor greater than `1`. There is no longer a per-collection flag to switch it on. To turn it off cluster-wide, set the [`ASYNC_REPLICATION_DISABLED`](/deploy/configuration/env-vars/index.md#async-replication) environment variable to `true`. The `replicationConfig` section is used to set the replication factor and to fine-tune async replication via `asyncConfig`: import ReplicationConfigWithAsyncRepair from '/\_includes/code/configuration/replication-consistency.mdx'; diff --git a/docs/weaviate/api/index.mdx b/docs/weaviate/api/index.mdx index fbfd98a89..e77712b7f 100644 --- a/docs/weaviate/api/index.mdx +++ b/docs/weaviate/api/index.mdx @@ -32,7 +32,7 @@ Weaviate offers official client libraries for these programming languages: The client libraries abstract away the complexities of making direct REST, GraphQL, or gRPC calls. You interact with Weaviate using idiomatic methods and objects in your preferred language. -Modern versions of the client libraries (e.g., Python v4+, TypeScript v3+) are designed to **automatically utilize the more performant gRPC interface** for search and query operations whenever possible and supported by the Weaviate instance you are connected to. They handle the negotiation and use the optimal protocol under the hood, typically requiring only the standard connection details (like the REST endpoint URL and authentication keys) for setup. +Modern versions of the client libraries are designed to **automatically utilize the more performant gRPC interface** for search and query operations whenever possible and supported by the Weaviate instance you are connected to. They handle the negotiation and use the optimal protocol under the hood, typically requiring only the standard connection details (like the REST endpoint URL and authentication keys) for setup. ::: diff --git a/docs/weaviate/client-libraries/index.mdx b/docs/weaviate/client-libraries/index.mdx index f4eebd3fb..e56a6a528 100644 --- a/docs/weaviate/client-libraries/index.mdx +++ b/docs/weaviate/client-libraries/index.mdx @@ -15,13 +15,13 @@ export const clientLibrariesData = [ { title: "Python Client", description: - "Install and use the official Python client (v4) to interact with Weaviate.", + "Install and use the official Python client to interact with Weaviate.", link: "/weaviate/client-libraries/python/", icon: "fab fa-python", }, { title: "TypeScript / JavaScript Client", - description: "Use the official client (v3) with Node.js.", + description: "Use the official client with Node.js.", link: "/weaviate/client-libraries/typescript/", icon: "fab fa-js", }, diff --git a/docs/weaviate/concepts/indexing/inverted-index.md b/docs/weaviate/concepts/indexing/inverted-index.md index b10375e51..c2eedb878 100644 --- a/docs/weaviate/concepts/indexing/inverted-index.md +++ b/docs/weaviate/concepts/indexing/inverted-index.md @@ -312,7 +312,7 @@ Beyond the built-in `en` and `none` presets, you can declare custom stopword pre #### Per-property stopword overrides -Each text property can override the collection-level stopword behavior via `textAnalyzer.stopwordPreset`. This is useful for multilingual collections where different properties contain text in different languages. The override is only supported on properties with `tokenization: "word"` — schema validation rejects it on other tokenizers. +Each text property can override the collection-level stopword behavior via `textAnalyzer.stopwordPreset`. This is useful for multilingual collections where different properties contain text in different languages. The override is only supported on properties with `tokenization: "word"`. Schema validation rejects it on other tokenizers. ```json "properties": [ @@ -331,7 +331,7 @@ Each text property can override the collection-level stopword behavior via `text ] ``` -Stopwords are still **indexed** — they are only filtered at query time. Changing the stopword configuration does **not** require reindexing your data. +Stopwords are still **indexed**: they are only filtered at query time. Changing the stopword configuration does **not** require reindexing your data. See the [custom stopwords tutorial](../../tutorials/tokenization.md#example-5-custom-and-per-property-stopword-presets) for a worked example and the [stopwordPresets configuration reference](../../config-refs/indexing/inverted-index.mdx#stopwordpresets) for all options. diff --git a/docs/weaviate/concepts/search/keyword-search.md b/docs/weaviate/concepts/search/keyword-search.md index ef6b5ecd9..86c3a0ef9 100644 --- a/docs/weaviate/concepts/search/keyword-search.md +++ b/docs/weaviate/concepts/search/keyword-search.md @@ -47,7 +47,7 @@ Tokenization for keyword searches refers to how each source text is split up int The default tokenization method is `word`. -Other tokenization methods such as `whitespace`, `lowercase`, and `field` are available, as well as specialized ones such as `GSE` or `kagome_kr` for other languages ([more details](../../config-refs/collections.mdx#tokenization)). +Other tokenization methods such as `whitespace`, `lowercase`, and `field` are available, as well as specialized ones such as `gse` or `kagome_kr` for other languages ([more details](../../config-refs/collections.mdx#tokenization)). Set the tokenization option [in the inverted index configuration](../../search/bm25.md#set-tokenization) for a collection. @@ -67,7 +67,7 @@ Weaviate uses configurable stopwords in calculating the BM25 score. Any tokens t See the [reference page](../../config-refs/indexing/inverted-index.mdx#stopwords) for more details. -Stopword lists are also configurable per collection **and** per property. You can define custom presets on `invertedIndexConfig.stopwordPresets` and assign them to individual text properties via `textAnalyzer.stopwordPreset`. This is useful for multilingual collections — for example, English and French properties using different stopword lists. Stopwords are still indexed and only filtered at query time, so changing your stopword configuration does not require reindexing. See [Inverted index: Custom stopword presets](../indexing/inverted-index.md#custom-stopword-presets) for details. +Stopword lists are also configurable per collection **and** per property. You can define custom presets on `invertedIndexConfig.stopwordPresets` and assign them to individual text properties via `textAnalyzer.stopwordPreset`. This is useful for multilingual collections. For example, English and French properties can use different stopword lists. Stopwords are still indexed and only filtered at query time, so changing your stopword configuration does not require reindexing. See [Inverted index: Custom stopword presets](../indexing/inverted-index.md#custom-stopword-presets) for details. ### BM25 parameters @@ -142,7 +142,7 @@ Conceptually, it works as though a filter is applied to the results of the BM25 - `and`: All tokens must be present within a single searched property - `or`: At least one token must be present within a single searched property, with the minimum number of tokens being configurable (`minimumOrTokensMatch`) -As an example, a BM25 query of `computer networking guide` with the `and` operator would only return objects where all of the tokens `computer`, `networking`, and `guide` appear together within a single searched property. If the tokens are spread across different properties — for example, `computer` in `title` and `networking` in `description` — the object does not match under `and`. In contrast, the same query with the `or` operator would return objects where at least one of those tokens appears in a searched property. If the `or` operator is used with a `minimumOrTokensMatch` of `2`, then at least two of the tokens must be present within a single searched property. +As an example, a BM25 query of `computer networking guide` with the `and` operator would only return objects where all of the tokens `computer`, `networking`, and `guide` appear together within a single searched property. If the tokens are spread across different properties (for example, `computer` in `title` and `networking` in `description`), the object does not match under `and`. In contrast, the same query with the `or` operator would return objects where at least one of those tokens appears in a searched property. If the `or` operator is used with a `minimumOrTokensMatch` of `2`, then at least two of the tokens must be present within a single searched property. If not specified, the default operator is `or`, with a `minimumOrTokensMatch` of `1`. This means that at least one token must be present in a searched property for the object to be returned. @@ -194,7 +194,7 @@ Here are some key considerations when using keyword search: 1. **Tokenization Choice** - Choose based on your data and search requirements. For example, use `word` tokenization for natural language text, but consider `field` for URLs or email addresses that need exact matching as a whole. - - For multilingual content, consider specialized tokenizers like `GSE` for Chinese/Japanese or `kagome_kr` for Korean + - For multilingual content, consider specialized tokenizers like `gse` for Chinese/Japanese or `kagome_kr` for Korean - Consider special characters and case sensitivity needs - Test your tokenization choice with subsets of your data and queries to ensure it handles special characters and case sensitivity as expected. You could perform these experiments with vectorization disabled to save resources/costs, as the two processes are independent. diff --git a/docs/weaviate/concepts/search/vector-search.md b/docs/weaviate/concepts/search/vector-search.md index 1a4888c93..7300b4f35 100644 --- a/docs/weaviate/concepts/search/vector-search.md +++ b/docs/weaviate/concepts/search/vector-search.md @@ -262,9 +262,9 @@ Standard vector search returns the closest matches to a query, which often means - **Diversity**: how different is the item from the results already selected? The algorithm works iteratively. It selects the most relevant item first, then for each subsequent pick it scores candidates by weighing their query similarity against their maximum similarity to any already-selected result. The `balance` parameter (λ) controls the trade-off: -- **λ = 0.0**: Pure diversity — maximizes difference from already-selected items -- **λ = 0.5**: Balanced — each result must be both relevant and distinct -- **λ = 1.0**: Pure relevance — equivalent to standard vector search +- **λ = 0.0**: Pure diversity (maximizes difference from already-selected items) +- **λ = 0.5**: Balanced (each result must be both relevant and distinct) +- **λ = 1.0**: Pure relevance (equivalent to standard vector search) MMR is applied at query time as a reranking step on top of standard search. No reindexing is needed. The typical pattern is to retrieve a larger candidate set via regular vector search, then rerank a subset using MMR. diff --git a/docs/weaviate/concepts/storage.md b/docs/weaviate/concepts/storage.md index 607330f5a..7c7607416 100644 --- a/docs/weaviate/concepts/storage.md +++ b/docs/weaviate/concepts/storage.md @@ -79,9 +79,9 @@ This change improves reliability during rolling restarts and upgrades. Eager loa #### Vector cache prefill behavior -The [`HNSW_STARTUP_WAIT_FOR_VECTOR_CACHE`](/deploy/configuration/env-vars#hnsw_startup_wait_for_vector_cache) environment variable controls whether vector cache prefill is synchronous (blocking) or asynchronous (background) at startup. Its default changed to `true` in v1.36.6. +The [`HNSW_STARTUP_WAIT_FOR_VECTOR_CACHE`](/deploy/configuration/env-vars#HNSW_STARTUP_WAIT_FOR_VECTOR_CACHE) environment variable controls whether vector cache prefill is synchronous (blocking) or asynchronous (background) at startup. Its default changed to `true` in v1.36.6. -For collections where lazy shard loading is active, vector cache prefill is always **asynchronous** — the `HNSW_STARTUP_WAIT_FOR_VECTOR_CACHE` value is overridden to `false` regardless of the configured value. For eagerly-loaded collections, the configured value applies (default: `true`, meaning synchronous prefill). +For collections where lazy shard loading is active, vector cache prefill is always **asynchronous**: the `HNSW_STARTUP_WAIT_FOR_VECTOR_CACHE` value is overridden to `false` regardless of the configured value. For eagerly-loaded collections, the configured value applies (default: `true`, meaning synchronous prefill). :::note Behavior change from v1.36.6 Prior to v1.36.6, lazy shard loading was enabled by default for all collections. From v1.36.6 onward, shards are **eagerly loaded by default** until a multi-tenant collection crosses the count or size threshold. This may increase startup time for smaller deployments but provides better reliability during rollouts. diff --git a/docs/weaviate/config-refs/datatypes.md b/docs/weaviate/config-refs/datatypes.md index eafcf0828..f0a1cd6b3 100644 --- a/docs/weaviate/config-refs/datatypes.md +++ b/docs/weaviate/config-refs/datatypes.md @@ -526,7 +526,7 @@ The `blobHash` data type accepts base64-encoded data (same as [`blob`](#blob)) b } ``` -Use `blobHash` when you need a vectorizer to see the raw media at import time but don't need to retrieve the original bytes afterwards — only the hash is stored. +Use `blobHash` when you need a vectorizer to see the raw media at import time but don't need to retrieve the original bytes afterwards: only the hash is stored. ## `object` @@ -536,7 +536,7 @@ For example, a `Person` collection could have an `address` property as an object :::note Indexing and filtering -`object` and `object[]` properties are not vectorized — only their leaf scalars are stored in the inverted index. From Weaviate `v1.38` (preview), you can filter on nested-object leaves using a dotted path syntax. See [Filter on nested object properties](../search/filters.md#filter-on-nested-object-properties). +`object` and `object[]` properties are not vectorized: only their leaf scalars are stored in the inverted index. From Weaviate `v1.38` (preview), you can filter on nested-object leaves using a dotted path syntax. See [Filter on nested object properties](../search/filters.md#filter-on-nested-object-properties). ::: diff --git a/docs/weaviate/config-refs/indexing/inverted-index.mdx b/docs/weaviate/config-refs/indexing/inverted-index.mdx index a9da3d3a3..e82d4bbfc 100644 --- a/docs/weaviate/config-refs/indexing/inverted-index.mdx +++ b/docs/weaviate/config-refs/indexing/inverted-index.mdx @@ -191,19 +191,19 @@ A preset name that matches a built-in (`"en"`, `"none"`) fully replaces the buil
-The existing [`stopwords`](#stopwords) configuration remains as the default for properties that do not specify a `textAnalyzer.stopwordPreset` override. For extending a built-in preset with `additions`/`removals`, use [`stopwords`](#stopwords) instead — it is the only stopword config that accepts that object form. +The existing [`stopwords`](#stopwords) configuration remains as the default for properties that do not specify a `textAnalyzer.stopwordPreset` override. For extending a built-in preset with `additions`/`removals`, use [`stopwords`](#stopwords) instead. It is the only stopword config that accepts that object form. #### `textAnalyzer` {#textanalyzer} -Part of a **property definition** (not `invertedIndexConfig`). Configures text analysis behavior for individual `text` properties. The accent-folding options (`asciiFold`, `asciiFoldIgnore`) are supported on properties with tokenization `word`, `lowercase`, `whitespace`, `field`, or `trigram` — not on the language-specific tokenizers (`gse`, `gse_ch`, `kagome_ja`, `kagome_kr`). The `stopwordPreset` option is only supported on properties with `tokenization: "word"`. +Part of a **property definition** (not `invertedIndexConfig`). Configures text analysis behavior for individual `text` properties. The accent-folding options (`asciiFold`, `asciiFoldIgnore`) are supported on properties with tokenization `word`, `lowercase`, `whitespace`, `field`, or `trigram`. They are not supported on the language-specific tokenizers (`gse`, `gse_ch`, `kagome_ja`, and `kagome_kr`). The `stopwordPreset` option is only supported on properties with `tokenization: "word"`. | Parameter | Type | Default | Details | | :---------------- | :--------- | :------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `asciiFold` | `boolean` | `false` | Normalizes accented Latin characters to ASCII equivalents during indexing and querying. Uses Unicode NFD decomposition. **Immutable** after the property is created. | | `asciiFoldIgnore` | `string[]` | `[]` | Characters exempt from ASCII folding. Each entry must be a single character. **Immutable** after the property is created. | -| `stopwordPreset` | `string` | (none) | Name of a built-in (`en`, `none`) or collection-level stopword preset to use for this property, overriding the default `stopwords` config. **Only supported on properties with `tokenization: "word"`** — schema validation rejects it on other tokenizers. | +| `stopwordPreset` | `string` | (none) | Name of a built-in (`en`, `none`) or collection-level stopword preset to use for this property, overriding the default `stopwords` config. **Only supported on properties with `tokenization: "word"`**. Schema validation rejects it on other tokenizers. |
Example textAnalyzer configuration - JSON object @@ -225,7 +225,7 @@ Part of a **property definition** (not `invertedIndexConfig`). Configures text a :::note -`asciiFoldIgnore` changes which tokens are written to disk. It cannot be modified after the property is created — schema updates that change the ignore list are rejected. To change it, create a new property and reindex. +`asciiFoldIgnore` changes which tokens are written to disk. It cannot be modified after the property is created. Schema updates that change the ignore list are rejected. To change it, create a new property and reindex. ::: @@ -253,7 +253,7 @@ Using these features requires more resources, as the additional inverted indexes ## Drop an inverted index -You can drop (delete) an inverted index from a property. This is a destructive operation — the index data is removed from disk. To use the index again, it must be regenerated. +You can drop (delete) an inverted index from a property. This is a destructive operation: the index data is removed from disk. To use the index again, it must be regenerated. The following index types can be dropped: `searchable`, `filterable`, `rangeFilters`. @@ -306,7 +306,7 @@ Two REST endpoints let you test tokenization without modifying your schema. :::note -`stopwords` and `stopwordPresets` are mutually exclusive — pass one or the other, not both. Use `stopwords` for a single preset optionally tweaked with additions/removals; use `stopwordPresets` to define named presets and select one via `analyzerConfig.stopwordPreset`. +`stopwords` and `stopwordPresets` are mutually exclusive. Pass one or the other, not both. Use `stopwords` for a single preset optionally tweaked with additions/removals; use `stopwordPresets` to define named presets and select one via `analyzerConfig.stopwordPreset`. ::: @@ -386,7 +386,7 @@ curl -X POST http://localhost:8080/v1/tokenize -d '{ ### Property-based tokenization -`POST /v1/schema/{className}/properties/{propertyName}/tokenize` resolves the full analyzer config from an existing property. The property's tokenization method, `textAnalyzer` settings, and the collection's stopword configuration are applied automatically — nothing else needs to be passed. +`POST /v1/schema/{className}/properties/{propertyName}/tokenize` resolves the full analyzer config from an existing property. The property's tokenization method, `textAnalyzer` settings, and the collection's stopword configuration are applied automatically. Nothing else needs to be passed. **Request body:** diff --git a/docs/weaviate/config-refs/indexing/vector-index.mdx b/docs/weaviate/config-refs/indexing/vector-index.mdx index 0589b6e95..195d27716 100644 --- a/docs/weaviate/config-refs/indexing/vector-index.mdx +++ b/docs/weaviate/config-refs/indexing/vector-index.mdx @@ -156,7 +156,7 @@ Using the `dynamic` index will initially create a flat index and once the number This is only a one-way switch that converts a flat index to a HNSW, the index does not support changing back to a flat index even if the object count goes below the threshold due to deletion. -The goal of `dynamic` indexing is to shorten latencies during query time at the cost of a larger memory footprint. If your priority is the opposite — keeping memory low — consider the [HFresh index](#hfresh-index) instead. +The goal of `dynamic` indexing is to shorten latencies during query time at the cost of a larger memory footprint. If your priority is the opposite (keeping memory low), consider the [HFresh index](#hfresh-index) instead. ### Dynamic index parameters @@ -184,10 +184,10 @@ HFresh only supports `cosine` and `l2-squared` distance metrics. Dot product is | Parameter | Type | Default | Mutable | Details | | :----------------- | :------ | :------- | :------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `distance` | string | `cosine` | No | Distance metric. Only `cosine` and `l2-squared` are supported. | -| `maxPostingSizeKB` | integer | `48` | Yes | Maximum size in KB for a posting list. Weaviate uses this value along with the vector dimensions to calculate the maximum number of vectors per posting. Min: `8`, Max: `1024`. Best set when you create the collection: an update is accepted but only affects newly-indexed data — data that is already indexed is not re-partitioned. | +| `maxPostingSizeKB` | integer | `48` | Yes | Maximum size in KB for a posting list. Weaviate uses this value along with the vector dimensions to calculate the maximum number of vectors per posting. Min: `8`, Max: `1024`. Best set when you create the collection: an update is accepted but only affects newly-indexed data. Data that is already indexed is not re-partitioned. | | `replicas` | integer | `4` | No | Number of posting lists in which a vector is added. Min: `1`, Max: `10`. | | `searchProbe` | integer | `256` | Yes | Number of posting lists to search during a query. The default is `256` in `v1.36.20`, `v1.37.10`, `v1.38.2` and later. Earlier releases on each of those lines default to `64`. | -| `rq` | object | -- | Partial | Rotational quantization (RQ) compression configuration. RQ is mandatory for HFresh and cannot be turned off. Its `rescoreLimit` (default `350`) — the number of candidates rescored against uncompressed vectors — is mutable at runtime. | +| `rq` | object | -- | Partial | Rotational quantization (RQ) compression configuration. RQ is mandatory for HFresh and cannot be turned off. Its `rescoreLimit` (default `350`), the number of candidates rescored against uncompressed vectors, is mutable at runtime. | :::tip Tuning HFresh recall Start with the defaults. If recall is too low, increase `searchProbe` (search more posting lists per query) or the RQ `rescoreLimit` (rescore more candidates with full-precision vectors). Both are mutable at runtime and take effect **without reindexing**. @@ -245,7 +245,7 @@ For instance, text embedding integrations (e.g. `text2vec-cohere` for Cohere, or Unless specified otherwise in the collection definition, the default behavior is to: -- Only vectorize properties with a string value — `text`, `text[]`, and `blob` (a base64-encoded string) — unless [skipped](../../manage-collections/vector-config.mdx#property-level-settings). Other data types (such as `number`, `int`, `boolean`, `date`, and `object`) are not vectorized unless they are listed in `source_properties` (see [below](#specify-which-properties-to-vectorize)). +- Only vectorize properties with a string value (`text`, `text[]`, and `blob`, which is a base64-encoded string) unless [skipped](../../manage-collections/vector-config.mdx#property-level-settings). Other data types (such as `number`, `int`, `boolean`, `date`, and `object`) are not vectorized unless they are listed in `source_properties` (see [below](#specify-which-properties-to-vectorize)). - Sort properties in alphabetical (a-z) order before concatenating values - If `vectorizePropertyName` is `true` (`false` by default) prepend the property name to each property value - Join the (prepended) property values with spaces @@ -277,10 +277,10 @@ To configure vectorization on a per-property basis, use `skip` and `vectorizePro To vectorize only a specific set of properties, set `source_properties` (the `properties` field of the vector configuration). Only the listed properties are then vectorized, in the order given. -When `source_properties` is set, listed properties that are **not** text are also vectorized: `number`, `int`, `boolean`, `date`, `object`, and their array variants are converted to a string and concatenated into the input text. (Without `source_properties`, only string-valued properties — `text`, `text[]`, and `blob` — are vectorized; `uuid`, geo-coordinates, and phone-number properties are never vectorized.) +When `source_properties` is set, listed properties that are **not** text are also vectorized: `number`, `int`, `boolean`, `date`, `object`, and their array variants are converted to a string and concatenated into the input text. (Without `source_properties`, only `text`, `text[]`, and `blob` properties are vectorized. `uuid`, geo-coordinates, and phone-number properties are never vectorized.) :::caution `blob` properties are vectorized as text -A `blob` value is a base64-encoded string, so an indexed `blob` property is vectorized like text — even without `source_properties`. To avoid sending a blob's base64 data to a text vectorizer, exclude it with `source_properties` or [`skip`](../../manage-collections/vector-config.mdx#property-level-settings). +A `blob` value is a base64-encoded string, so an indexed `blob` property is vectorized like text, even without `source_properties`. To avoid sending a blob's base64 data to a text vectorizer, exclude it with `source_properties` or [`skip`](../../manage-collections/vector-config.mdx#property-level-settings). ::: ## Asynchronous indexing diff --git a/docs/weaviate/connections/connect-custom.mdx b/docs/weaviate/connections/connect-custom.mdx index 31058ba43..6a75f6998 100644 --- a/docs/weaviate/connections/connect-custom.mdx +++ b/docs/weaviate/connections/connect-custom.mdx @@ -15,7 +15,7 @@ import TsCodeV3 from "!!raw-loader!/_includes/code/connections/connect-ts-v3.ts" import JavaV6Code from "!!raw-loader!/_includes/code/java-v6/src/test/java/ConnectionTest.java"; import CSharpCode from "!!raw-loader!/_includes/code/csharp/ConnectionTest.cs"; -The [Python Client v4](/weaviate/client-libraries/python) and the [TypeScript Client v3](../client-libraries/typescript/index.mdx) provide helper methods for common connection types. They also provide custom methods for when you need additional connection configuration. +The [Python client](/weaviate/client-libraries/python) and the [TypeScript client](../client-libraries/typescript/index.mdx) provide helper methods for common connection types. They also provide custom methods for when you need additional connection configuration. If you are using one of the other clients, the standard connection methods are configurable for all connections. @@ -121,11 +121,11 @@ import WCDOIDCWarning from "/_includes/wcd-oidc.mdx"; The examples below assume you already have a bearer access token. Set the following environment variables before running them: -- `WEAVIATE_HTTP_HOST` — host:port of the Weaviate REST endpoint (e.g., `localhost:8080`) -- `WEAVIATE_GRPC_HOST` — host:port of the Weaviate gRPC endpoint (e.g., `localhost:50051`) -- `WEAVIATE_OIDC_ACCESS_TOKEN` — the access token from your IdP -- `WEAVIATE_OIDC_REFRESH_TOKEN` — *(optional)* refresh token for automatic renewal -- `WEAVIATE_OIDC_EXPIRES_IN` — *(optional)* token lifetime in seconds +- `WEAVIATE_HTTP_HOST`: host:port of the Weaviate REST endpoint (e.g., `localhost:8080`) +- `WEAVIATE_GRPC_HOST`: host:port of the Weaviate gRPC endpoint (e.g., `localhost:50051`) +- `WEAVIATE_OIDC_ACCESS_TOKEN`: the access token from your IdP +- `WEAVIATE_OIDC_REFRESH_TOKEN`: *(optional)* refresh token for automatic renewal +- `WEAVIATE_OIDC_EXPIRES_IN`: *(optional)* token lifetime in seconds import OIDCExamples from "/_includes/code/connections/oidc-connect.mdx"; diff --git a/docs/weaviate/connections/connect-query.mdx b/docs/weaviate/connections/connect-query.mdx index 7e7852f0f..ef5e7d34f 100644 --- a/docs/weaviate/connections/connect-query.mdx +++ b/docs/weaviate/connections/connect-query.mdx @@ -9,7 +9,7 @@ import WCDQueryConsoleLocation from "/docs/cloud/img/wcs-query-console-location. -The fastest way to query data in [Weaviate Cloud (WCD)](/cloud) without writing code is the [Query Agent](/docs/cloud/tools/query-agent.mdx) — a natural-language interface that translates a prompt into a multi-step search against your collections and returns a grounded answer. +The fastest way to query data in [Weaviate Cloud (WCD)](/cloud) without writing code is the [Query Agent](/docs/cloud/tools/query-agent.mdx), a natural-language interface that translates a prompt into a multi-step search against your collections and returns a grounded answer. If you'd rather write GraphQL by hand, the [Query tool](#query-tool) is still available further down on this page. @@ -53,7 +53,7 @@ Beyond picking collections, you can also provide API keys for external model pro ### Generate client code -After running a query in the console, you can copy a Python or TypeScript snippet that reproduces the same call through the [`weaviate-agents`](/query-agent/index.md) client libraries — useful for moving from exploration into application code. +After running a query in the console, you can copy a Python or TypeScript snippet that reproduces the same call through the [`weaviate-agents`](/query-agent/index.md) client libraries. This makes it easy to move from exploration into application code. ### Limitations diff --git a/docs/weaviate/manage-objects/create.mdx b/docs/weaviate/manage-objects/create.mdx index ac9e4864e..445cf69b0 100644 --- a/docs/weaviate/manage-objects/create.mdx +++ b/docs/weaviate/manage-objects/create.mdx @@ -288,7 +288,7 @@ import CrossReferencePerformanceNote from "/_includes/cross-reference-performanc import XrefPyCode from "!!raw-loader!/_includes/code/howto/manage-data.cross-refs.py"; -import XrefTSCode from "!!raw-loader!/_includes/code/howto/manage-data.cross-refs"; +import XrefTSCode from "!!raw-loader!/_includes/code/howto/manage-data.cross-refs.ts"; import XrefJavaV6Code from "!!raw-loader!/_includes/code/java-v6/src/test/java/ManageCollectionsCrossReferencesTest.java"; You can create an object with cross-references to other objects. diff --git a/docs/weaviate/manage-objects/import.mdx b/docs/weaviate/manage-objects/import.mdx index b3656d0a8..84944569a 100644 --- a/docs/weaviate/manage-objects/import.mdx +++ b/docs/weaviate/manage-objects/import.mdx @@ -15,7 +15,7 @@ import CSharpCode from '!!raw-loader!/_includes/code/csharp/ManageObjectsImportT import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/manage-data.import_test.go'; import SkipLink from '/src/components/SkipValidationLink' -[Batch imports](../tutorials/import.mdx) are an efficient way to add multiple data objects and cross-references. For most use cases, we recommend **server-side batching** as the starting point: the server tells the client how much data to send next, so you don't have to tune batch parameters yourself. When you need manual control over the batch size and concurrency — or you are using a client that does not yet support server-side batching — use [manual batching](#manual-batching) instead. +[Batch imports](../tutorials/import.mdx) are an efficient way to add multiple data objects and cross-references. For most use cases, we recommend **server-side batching** as the starting point: the server tells the client how much data to send next, so you don't have to tune batch parameters yourself. When you need manual control over the batch size and concurrency, or you are using a client that does not yet support server-side batching, use [manual batching](#manual-batching) instead. ## Server-side batching diff --git a/docs/weaviate/manage-objects/read-all-objects.mdx b/docs/weaviate/manage-objects/read-all-objects.mdx index 198d812a5..94c01d270 100644 --- a/docs/weaviate/manage-objects/read-all-objects.mdx +++ b/docs/weaviate/manage-objects/read-all-objects.mdx @@ -20,7 +20,7 @@ Weaviate provides the necessary APIs to iterate through all your data. This is u This is done with the help of the `after` operator, also called the [cursor API](../api/graphql/additional-operators.md#cursor-with-after). :::info Iterator -The new API clients (currently supported by the Python Client v4), encapsulate this functionality as an `Iterator`. +Some clients, such as the Python client, encapsulate this functionality as an `Iterator`. ::: ## Read object properties and ids From 32892f6a91628ffb5deb7f7150a06dec8b560bb1 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Thu, 6 Aug 2026 19:39:19 +0200 Subject: [PATCH 59/84] docs(tutorials): fix invalid JSON, a duplicate card icon, and em dashes An 'Example full response' block was wrapped so that it was not valid JSON. The sample code prints each object separately, so an array would show output the code never produces; the block keeps the two objects and the label now matches, following the form the sibling quickstarts already use. Also: a card reused the icon of the card above it, another carried a literal tab in its icon string, and six em dashes are replaced. --- docs/weaviate/tutorials/index.mdx | 8 ++++---- .../tutorials/quick-tour-of-weaviate.mdx | 20 +++++++++---------- docs/weaviate/tutorials/rbac.mdx | 2 +- docs/weaviate/tutorials/tls-ssl.mdx | 4 ++-- docs/weaviate/tutorials/tokenization.md | 6 +++--- 5 files changed, 19 insertions(+), 21 deletions(-) diff --git a/docs/weaviate/tutorials/index.mdx b/docs/weaviate/tutorials/index.mdx index f5165f873..73b8a99b8 100644 --- a/docs/weaviate/tutorials/index.mdx +++ b/docs/weaviate/tutorials/index.mdx @@ -21,7 +21,7 @@ export const advancedFeaturesData = [ title: "Quick tour of Weaviate", description: ( <> - End-to-end guide that cover important topics like configuring + End-to-end guide that covers important topics like configuring collections, compression, etc. ), @@ -38,9 +38,9 @@ export const advancedFeaturesData = [ { title: "Zero-downtime collection migration with aliases", description: - "Learn how to migrate Weaviate collections without service interruption using collections aliases.", + "Learn how to migrate Weaviate collections without service interruption using collection aliases.", link: "/weaviate/tutorials/collection-aliases", - icon: "fas fa-share ", + icon: "fas fa-share", }, { title: "Import data in bulk", @@ -82,7 +82,7 @@ export const advancedFeaturesData = [ description: "Learn how to update the embedding model in order to improve performance.", link: "/weaviate/tutorials/vectorizer-migration", - icon: "fas fa-lock", + icon: "fas fa-right-left", }, ]; diff --git a/docs/weaviate/tutorials/quick-tour-of-weaviate.mdx b/docs/weaviate/tutorials/quick-tour-of-weaviate.mdx index b160b8e36..e2d5b057b 100644 --- a/docs/weaviate/tutorials/quick-tour-of-weaviate.mdx +++ b/docs/weaviate/tutorials/quick-tour-of-weaviate.mdx @@ -245,20 +245,18 @@ import QueryNearText from "/_includes/code/quickstart/quickstart.query.neartext. Run this code to perform the query. Our query found entries for `DNA` and `species`.
- Example full response in JSON format + Example response ```json { - { - "answer": "DNA", - "question": "In 1953 Watson & Crick built a model of the molecular structure of this, the gene-carrying substance", - "category": "SCIENCE" - }, - { - "answer": "species", - "question": "2000 news: the Gunnison sage grouse isn't just another northern sage grouse, but a new one of this classification", - "category": "SCIENCE" - } + "answer": "DNA", + "question": "In 1953 Watson & Crick built a model of the molecular structure of this, the gene-carrying substance", + "category": "SCIENCE" +} +{ + "answer": "species", + "question": "2000 news: the Gunnison sage grouse isn't just another northern sage grouse, but a new one of this classification", + "category": "SCIENCE" } ``` diff --git a/docs/weaviate/tutorials/rbac.mdx b/docs/weaviate/tutorials/rbac.mdx index db84ea65f..859bdc5dc 100644 --- a/docs/weaviate/tutorials/rbac.mdx +++ b/docs/weaviate/tutorials/rbac.mdx @@ -15,7 +15,7 @@ import RolePyCode from '!!raw-loader!/_includes/code/python/howto.configure.rbac import UserPyCode from '!!raw-loader!/_includes/code/python/howto.configure.rbac.users.py'; import RoleTSCode from '!!raw-loader!/_includes/code/typescript/howto.configure.rbac.roles.ts'; -**Role-Based Access Control (RBAC)** is a powerful security mechanism that allows you to manage who can access and modify your Weaviate instance. In this tutorial, you'll learn how to set up RBAC in Weaviate by defining roles with tailored permissions and assigning them to users. This enables granular control over operations—from reading and writing data to managing collections and tenants—ensuring that only authorized users can perform specific actions. +**Role-Based Access Control (RBAC)** is a powerful security mechanism that allows you to manage who can access and modify your Weaviate instance. In this tutorial, you'll learn how to set up RBAC in Weaviate by defining roles with tailored permissions and assigning them to users. This enables granular control over operations, from reading and writing data to managing collections and tenants, ensuring that only authorized users can perform specific actions. In the steps that follow, we’ll cover: diff --git a/docs/weaviate/tutorials/tls-ssl.mdx b/docs/weaviate/tutorials/tls-ssl.mdx index 0ff91d3be..58c40ccc1 100644 --- a/docs/weaviate/tutorials/tls-ssl.mdx +++ b/docs/weaviate/tutorials/tls-ssl.mdx @@ -12,7 +12,7 @@ When your Weaviate database is exposed to the internet, unencrypted connections - **Authentication credentials** if transmitted without encryption - **API keys and tokens** that could grant unauthorized access to your systems -That's exactly why it's important to secure your database using **SSL/TLS (Secure Sockets Layer/Transport Layer Security)** — encryption protocols that create a secure, encrypted connection between your clients and your database. SSL/TLS ensures that even if network traffic is intercepted, the data remains unreadable to unauthorized parties. +That's exactly why it's important to secure your database using **SSL/TLS (Secure Sockets Layer/Transport Layer Security)**, encryption protocols that create a secure, encrypted connection between your clients and your database. SSL/TLS ensures that even if network traffic is intercepted, the data remains unreadable to unauthorized parties. :::info Managed Weaviate deployments @@ -20,7 +20,7 @@ If you're using **Weaviate Cloud** or other managed Weaviate services, SSL/TLS i ::: -This guide will take you through three different options for securing your self-hosted database. Whether you're a small startup or an enterprise giant - there's a solution for you! +This guide will take you through three different options for securing your self-hosted database. Whether you're a small startup or an enterprise giant, there's a solution for you! ### When is SSL/TLS required? diff --git a/docs/weaviate/tutorials/tokenization.md b/docs/weaviate/tutorials/tokenization.md index 0af1c9a81..d4041da13 100644 --- a/docs/weaviate/tutorials/tokenization.md +++ b/docs/weaviate/tutorials/tokenization.md @@ -348,14 +348,14 @@ We create three properties: one without folding (`text_default`), one with full **Key observations:** - Without folding, only exact accented forms match - With `asciiFold: true`, both accented and unaccented queries match -- `asciiFoldIgnore` lets you preserve specific characters — `"cafe"` no longer matches `"Café"` when `é` is ignored +- `asciiFoldIgnore` lets you preserve specific characters: `"cafe"` no longer matches `"Café"` when `é` is ignored - `asciiFoldIgnore` is immutable after property creation ## Example 5: Custom and per-property stopword presets -The default stopword presets are `en` and `none`. For a French property, neither is appropriate — `la`, `le`, and `et` should be filtered, but they are not in the English list. Define a custom preset on the collection and assign it to specific properties. +The default stopword presets are `en` and `none`. For a French property, neither is appropriate: `la`, `le`, and `et` should be filtered, but they are not in the English list. Define a custom preset on the collection and assign it to specific properties. ### Create a collection with custom stopwords @@ -483,7 +483,7 @@ The default stopword presets are `en` and `none`. For a French property, neither **Key observations:** - The `fr` preset filters out `la`, `le`, and `et` from BM25 scoring on the French property - The same words are not filtered on the English property (they are not English stopwords) -- Stopwords are still indexed — only filtered at query time — so changing presets does not require reindexing +- Stopwords are still indexed (they are only filtered at query time), so changing presets does not require reindexing - A preset name that matches a built-in (`en`, `none`) replaces the built-in for this collection. To tweak a built-in with `additions`/`removals`, use the collection-level `invertedIndexConfig.stopwords` field instead ## Example 6: Inspecting tokenization with the tokenize endpoint From 35f01f139777e1b37769c13cfe6db29befeb8683 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Thu, 6 Aug 2026 19:39:19 +0200 Subject: [PATCH 60/84] docs(modules,connections): fix Go tab rendering, a stale image tag, and unreachable pages Two Go tabs were tagged as Python, so Go rendered with Python highlighting. They are now goraw rather than go: the go formatter strips tabs and flattens a full package-main program to column 0, which would have traded a highlighting bug for an indentation one. Three module pages pinned a contextionary image tag that appears in no live source. The tag used by weaviate core's compose files and by docs CI is used instead. Four module pages existed in the sidebar but were unreachable from the index body, and a bullet pointed at an anchor that was never defined. --- .../code/java-v6/src/test/java/ConnectionTest.java | 2 +- docs/weaviate/connections/connect-cloud.mdx | 4 ++-- docs/weaviate/modules/index.md | 13 +++++++++++-- docs/weaviate/modules/ner-transformers.md | 2 +- docs/weaviate/modules/spellcheck.md | 2 +- docs/weaviate/modules/sum-transformers.md | 2 +- 6 files changed, 17 insertions(+), 8 deletions(-) diff --git a/_includes/code/java-v6/src/test/java/ConnectionTest.java b/_includes/code/java-v6/src/test/java/ConnectionTest.java index c44ee6e37..987b62b3d 100644 --- a/_includes/code/java-v6/src/test/java/ConnectionTest.java +++ b/_includes/code/java-v6/src/test/java/ConnectionTest.java @@ -151,7 +151,7 @@ void testCustomApiKeyConnection() throws Exception { System.out.println(client.isReady()); // Should print: `True` client.close(); // Free up resources - // // END ConnectWithApiKeyExample + // END ConnectWithApiKeyExample } @Test diff --git a/docs/weaviate/connections/connect-cloud.mdx b/docs/weaviate/connections/connect-cloud.mdx index 41b14e48c..5c65bbd5c 100644 --- a/docs/weaviate/connections/connect-cloud.mdx +++ b/docs/weaviate/connections/connect-cloud.mdx @@ -83,7 +83,7 @@ import HostnameWarning from "/_includes/wcs/hostname-warning.mdx"; text={GoCode} startMarker="// START APIKeyWCD" endMarker="// END APIKeyWCD" - language="py" + language="goraw" /> @@ -139,7 +139,7 @@ If you use API-based models for vectorization or RAG, you must provide an API ke text={GoCode} startMarker="// START ThirdPartyAPIKeys" endMarker="// END ThirdPartyAPIKeys" - language="py" + language="goraw" /> diff --git a/docs/weaviate/modules/index.md b/docs/weaviate/modules/index.md index 7e42eb79d..48734d7dd 100644 --- a/docs/weaviate/modules/index.md +++ b/docs/weaviate/modules/index.md @@ -9,7 +9,7 @@ image: og/docs/modules/_title.jpg This section describes Weaviate's individual modules, including their capabilities and how to use them. :::tip Looking for vectorizer, generative AI, or reranker integration docs? -They have moved to our [model provider integrations](../model-providers/index.md) section, for a more focussed, user-centric look at these integrations. +They have moved to our [model provider integrations](../model-providers/index.md) section, for a more focused, user-centric look at these integrations. ::: ## General @@ -25,7 +25,7 @@ Weaviate modules can be divided into the following categories: - [Generative AI](#vectorizer-reranker-and-generative-ai-integrations): Integrate generative AI models for retrieval augmented generation (RAG). - [Backup](#backup-modules): Facilitate backup and restore operations in Weaviate. - [Offloading](#offloading-modules): Facilitate offloading of tenant data to external storage. -- [Others]: Modules that provide additional functionalities. +- [Others](#other-modules): Modules that provide additional functionalities. #### Vectorizer, reranker, and generative AI integrations @@ -116,6 +116,15 @@ In addition to the above, there are other modules such as: - [text-spellcheck](./spellcheck.md): Spell checking capability for GraphQL queries. - [sum-transformers](./sum-transformers.md): Summarize text using transformer models. - [usage-modules](./usage-modules.md): Collect and upload usage analytics to GCS or S3 for the purposes of billing. +- [custom-modules](./custom-modules.md): Attach your own machine learning model to Weaviate as a module. + +### Other vectorizer modules + +The following vectorizer modules are not covered by the [model provider integration](../model-providers/index.md) pages: + +- [text2vec-contextionary](./text2vec-contextionary.md) (deprecated): Vectorize text locally with the lightweight Contextionary model. +- [img2vec-neural](./img2vec-neural.md): Vectorize images locally with a `resnet50` model. +- [ref2vec-centroid](./ref2vec-centroid.md): Calculate an object's vector from the centroid of its referenced objects' vectors. ## Related pages diff --git a/docs/weaviate/modules/ner-transformers.md b/docs/weaviate/modules/ner-transformers.md index a215172ce..aa185fe04 100644 --- a/docs/weaviate/modules/ner-transformers.md +++ b/docs/weaviate/modules/ner-transformers.md @@ -57,7 +57,7 @@ services: EXTENSIONS_STORAGE_ORIGIN: http://weaviate:8080 NEIGHBOR_OCCURRENCE_IGNORE_PERCENTILE: 5 ENABLE_COMPOUND_SPLITTING: 'false' - image: cr.weaviate.io/semitechnologies/contextionary:en0.16.0-v1.0.2 + image: cr.weaviate.io/semitechnologies/contextionary:en0.16.0-v1.2.1 ports: - 9999:9999 ner-transformers: diff --git a/docs/weaviate/modules/spellcheck.md b/docs/weaviate/modules/spellcheck.md index 36fbf5cff..ba00222ea 100644 --- a/docs/weaviate/modules/spellcheck.md +++ b/docs/weaviate/modules/spellcheck.md @@ -55,7 +55,7 @@ services: EXTENSIONS_STORAGE_ORIGIN: http://weaviate:8080 NEIGHBOR_OCCURRENCE_IGNORE_PERCENTILE: 5 ENABLE_COMPOUND_SPLITTING: 'false' - image: cr.weaviate.io/semitechnologies/contextionary:en0.16.0-v1.0.2 + image: cr.weaviate.io/semitechnologies/contextionary:en0.16.0-v1.2.1 ports: - 9999:9999 text-spellcheck: diff --git a/docs/weaviate/modules/sum-transformers.md b/docs/weaviate/modules/sum-transformers.md index 62bdbf407..7b9f587b8 100644 --- a/docs/weaviate/modules/sum-transformers.md +++ b/docs/weaviate/modules/sum-transformers.md @@ -76,7 +76,7 @@ services: EXTENSIONS_STORAGE_ORIGIN: http://weaviate:8080 NEIGHBOR_OCCURRENCE_IGNORE_PERCENTILE: 5 ENABLE_COMPOUND_SPLITTING: 'false' - image: cr.weaviate.io/semitechnologies/contextionary:en0.16.0-v1.0.2 + image: cr.weaviate.io/semitechnologies/contextionary:en0.16.0-v1.2.1 ports: - 9999:9999 sum-transformers: From f95a0688b1e4a6e31ab7165a918e1faf8d5722fa Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Thu, 6 Aug 2026 19:39:19 +0200 Subject: [PATCH 61/84] docs: assorted one-line defects, plus a stale gRPC section and a silently wrong tab The concepts page described gRPC as a 'very small scale' addition 'as of May 2023'. It is default-on and carries most search and batch traffic. Rewritten without a new dated snapshot, and stating client coverage non-uniformly, since Go reaches gRPC search only through its experimental API. The custom-vectors install section had no C# tab while the query section below it does. Tab sets sharing a group id fall back to the first tab, so a reader who had selected C# was silently shown Python. Also: a malformed table row, a placeholder fence with no opening, a Go placeholder fenced as TypeScript, a link fragment pointing nowhere, an undocumented constructor parameter, two empty headings, an orphaned include, and a note that the boost page is Python-only. --- docs/deploy/configuration/env-vars/index.md | 4 ++-- docs/deploy/installation-guides/embedded.md | 5 +++-- docs/deploy/production/aws/network-security.md | 8 ++------ docs/weaviate/api/graphql/get.md | 4 ++-- docs/weaviate/concepts/interface.md | 10 ++++++---- docs/weaviate/configuration/rbac/manage-groups.mdx | 1 - docs/weaviate/recipes.mdx | 2 +- docs/weaviate/search/boost.md | 2 ++ docs/weaviate/search/generative.md | 10 +++++----- docs/weaviate/starter-guides/custom-vectors.mdx | 11 +++++++++-- 10 files changed, 32 insertions(+), 25 deletions(-) diff --git a/docs/deploy/configuration/env-vars/index.md b/docs/deploy/configuration/env-vars/index.md index 52d7f153b..8040201ed 100644 --- a/docs/deploy/configuration/env-vars/index.md +++ b/docs/deploy/configuration/env-vars/index.md @@ -42,7 +42,7 @@ import APITable from '@site/src/components/APITable'; | `DEFAULT_SHARDING_COUNT` | Default `desiredCount` for new single-tenant collections, used when the collection definition does not specify one. An explicit `desiredCount` in the class creation request still takes precedence. A value of `0` (default) uses the cluster node count. Multi-tenant collections are unaffected. Must be `<= 512`. Runtime-configurable. Default: `0`
Added in `v1.37` | `string - number` | `12` | | `DEFAULT_VECTOR_INDEX` | Default vector index type for new collections (and named vectors), used when the collection definition does not specify one. An explicit `vectorIndexType` in the collection definition still takes precedence. Available values: `hnsw`, `flat`, `dynamic`, and `hfresh`. Runtime-configurable. Default: `hnsw`
Added in `v1.37.3` | `string` | `flat` | | `DEFAULT_VECTORIZER_MODULE` | Default vectorizer module - can be overridden by the vectorizer in the collection definition. | `string` | `text2vec-contextionary` | -| `API_BASED_MODULES_DISABLED` | Weaviate automatically enables the usage of all [API based modules](../../../weaviate/model-providers/index.md#api-based). Set this variable to `true` in order to limit access and only allow specific modules through the [`ENABLE_MODULES`](#ENABLE_MODULES) variable. Default: `false`
Added in `v1.33` | `boolean` | `true` | +| `API_BASED_MODULES_DISABLED` | Weaviate automatically enables the usage of all [API-based modules](../../../weaviate/model-providers/index.md#api-based). Set this variable to `true` in order to limit access and only allow specific modules through the [`ENABLE_MODULES`](#ENABLE_MODULES) variable. Default: `false`
Added in `v1.33` | `boolean` | `true` | | `DISABLE_LAZY_LOAD_SHARDS` | When `false`, enable lazy shard loading to improve mean time to recovery in multi-tenant deployments. **Deprecated in `v1.36.6`.** Use `LAZY_LOAD_SHARD_COUNT_THRESHOLD` and `LAZY_LOAD_SHARD_SIZE_THRESHOLD_GB` instead. Weaviate now auto-detects when lazy loading is needed per collection. | `string` | `false` | | `DISABLE_TELEMETRY` | Disable [telemetry](/deploy/configuration/telemetry.md) data collection | boolean | `false` | | `DISK_USE_READONLY_PERCENTAGE` | If disk usage is higher than the given percentage all shards on the affected node will be marked as `READONLY`, meaning all future write requests will fail. See [Disk Pressure Warnings and Limits for details](/deploy/configuration/persistence.md#disk-pressure-warnings-and-limits). | `string - number` | `90` | @@ -51,7 +51,7 @@ import APITable from '@site/src/components/APITable'; | `ENABLE_MODULES` | Specify which modules are enabled and can be used. | `string - comma separated names` | `text2vec-openai,generative-openai` | | `ENABLE_TOKENIZER_GSE` | Enable the [`GSE` tokenizer](/weaviate/config-refs/collections.mdx) for use | `boolean` | `true` | | `ENABLE_TOKENIZER_KAGOME_JA` | Enable the [`Kagome` tokenizer for Japanese](/weaviate/config-refs/collections.mdx) for use | `boolean` | `true` | -| `ENABLE_TOKENIZER_KAGOME_KR` | Enable the [`Kagome` tokenizer for Korean](/weaviate/config-refs/collections.mdx#) for use | `boolean` | `true` | +| `ENABLE_TOKENIZER_KAGOME_KR` | Enable the [`Kagome` tokenizer for Korean](/weaviate/config-refs/collections.mdx) for use | `boolean` | `true` | | `EXPORT_DEFAULT_BUCKET` | Storage bucket name for [collection exports](/docs/deploy/configuration/export.md). Required for S3, GCS, and Azure backends.
Added in `v1.37` | `string` | `my-export-bucket` | | `EXPORT_DEFAULT_PATH` | Optional base path prefix for exported files within the bucket for [collection exports](/docs/deploy/configuration/export.md). Defaults to `""` (no prefix). _Changed in `v1.37.1`: previously required to be explicitly set._
Added in `v1.37` | `string` | `exports/my-cluster` | | `EXPORT_ENABLED` | Enable the [collection export](/docs/deploy/configuration/export.md) API. Default: `false`
Added in `v1.37` | `boolean` | `true` | diff --git a/docs/deploy/installation-guides/embedded.md b/docs/deploy/installation-guides/embedded.md index 2c77b3a83..ab8f86486 100644 --- a/docs/deploy/installation-guides/embedded.md +++ b/docs/deploy/installation-guides/embedded.md @@ -44,6 +44,7 @@ To configure Embedded Weaviate, set these variables in your instantiation code o | :-- | :-- | :-- | :-- | | `additional_env_vars` | string | None. | Pass additional environment variables, such as API keys, to the server. | | `binary_path` | string | varies | Binary download directory. If the binary is not present, the client downloads the binary.

If `XDG_CACHE_HOME` is set, its value is used verbatim as the default. No subdirectory is appended, so `XDG_CACHE_HOME=/foo` makes the default exactly `/foo`.

If `XDG_CACHE_HOME` is not set, the default is: `~/.cache/weaviate-embedded/` | +| `grpc_port` | integer | 50060 | The Weaviate server gRPC port. The client passes this value to the server as `GRPC_PORT`. | | `hostname` | string | 127.0.0.1 | Hostname or IP address | | `persistence_data_path` | string | varies | Data storage directory.

If `XDG_DATA_HOME` is set, its value is used verbatim as the default. No subdirectory is appended, so `XDG_DATA_HOME=/foo` makes the default exactly `/foo`.

If `XDG_DATA_HOME` is not set, the default is: `~/.local/share/weaviate` | | `port` | integer | 8079 | The Weaviate server request port. | @@ -71,7 +72,7 @@ The following modules are enabled by default: - `text2vec-huggingface` - `text2vec-openai` -To enabled additional modules, add them to your instantiation code. +To enable additional modules, add them to your instantiation code. For example, to add the `backup-s3` module, instantiate your client like this: @@ -130,7 +131,7 @@ Embedded Weaviate is supported for Python and TypeScript clients. ### Python clients -[Python](docs/weaviate/client-libraries/python/index.mdx) v3 client support is new in `v3.15.4` for Linux and `v3.21.0` for macOS. The Python client v4 requires server version v1.23.7 or higher. +[Python](docs/weaviate/client-libraries/python/index.mdx) v3 client support is new in `v3.15.4` for Linux and `v3.21.0` for macOS. The Python client requires Weaviate `v1.23.7` or later. ### TypeScript clients diff --git a/docs/deploy/production/aws/network-security.md b/docs/deploy/production/aws/network-security.md index 6be3645f5..29b4f9e88 100644 --- a/docs/deploy/production/aws/network-security.md +++ b/docs/deploy/production/aws/network-security.md @@ -28,7 +28,7 @@ Access control is the cornerstone of this network security strategy. It implemen #### Private subnet strategy -Network isolation is the foundation of our this strategy. Critical infrastructure should reside in private subnets with no direct internet connectivity. This eliminates internet-based attacks and forces all access through controlled entry points. +Network isolation is the foundation of this strategy. Critical infrastructure should reside in private subnets with no direct internet connectivity. This eliminates internet-based attacks and forces all access through controlled entry points. #### Core components @@ -124,8 +124,6 @@ Data transfer for backups and application data can be secured, this is what is n ### Scaling and performance strategies -#### Application load balancer (ALB) configuration - #### SSL/TLS management - Automated certificate provisioning through AWS Certificate Manager. @@ -166,8 +164,6 @@ Secure scaling policies maintains security posture during capacity changes. ### High availability and disaster recovery -#### Multi-AZ architecture - #### Weaviate configuration - **Minimum** 3 replicas distributed across AZs. @@ -185,7 +181,7 @@ Secure scaling policies maintains security posture during capacity changes. #### Network visibility - VPC flow logs to capture traffic metadata for security analysis. -- Real0time streaming to SIEMs. +- Real-time streaming to SIEMs. - Baseline establishment and anomaly detection. #### Security monitoring diff --git a/docs/weaviate/api/graphql/get.md b/docs/weaviate/api/graphql/get.md index d00de5559..0616c021a 100644 --- a/docs/weaviate/api/graphql/get.md +++ b/docs/weaviate/api/graphql/get.md @@ -229,8 +229,8 @@ The following search operators are available. | --- | --- | --- | --- | | `nearObject` | Vector search using a Weaviate object | *none* | [Learn more](./search-operators.md#nearobject) | | `nearVector` | Vector search using a raw vector | *none* | [Learn more](./search-operators.md#nearvector) | -| `nearText` | Vector search using a text query | Text embedding model | | -| `nearImage` | Vector search using an image | Multi-modal embedding model | +| `nearText` | Vector search using a text query | Text embedding model | [Learn more](./search-operators.md#neartext) | +| `nearImage` | Vector search using an image | Multi-modal embedding model | [Learn more](./search-operators.md#multimodal-search) | | `hybrid` | Combine vector and BM25 search results | *none* | [Learn more](../graphql/search-operators.md#hybrid) | | `bm25` | Keyword search with BM25F ranking | *none* | [Learn more](../graphql/search-operators.md#bm25) | diff --git a/docs/weaviate/concepts/interface.md b/docs/weaviate/concepts/interface.md index a0ca8b35b..19e682187 100644 --- a/docs/weaviate/concepts/interface.md +++ b/docs/weaviate/concepts/interface.md @@ -6,7 +6,7 @@ image: og/docs/concepts.jpg # tags: ['architecture', 'interface', 'API design'] --- -You can manage and use Weaviate through its APIs. Weaviate has a RESTful API and a GraphQL API. The client libraries broadly mirror this API surface, although feature coverage can vary by language; see the [client library pages](/weaviate/client-libraries/index.mdx) for what each one supports. Some clients, e.g. the Python client, have additional functionality, such as full schema management and batching operations. This way, Weaviate is easy to use in custom projects. Additionally, the APIs are intuitive, so it is easy to integrate into your existing data landscape. +You can manage and use Weaviate through its APIs. Weaviate has RESTful, GraphQL, and gRPC APIs. The client libraries broadly mirror this API surface, although feature coverage can vary by language; see the [client library pages](/weaviate/client-libraries/index.mdx) for what each one supports. Some clients, e.g. the Python client, have additional functionality, such as full schema management and batching operations. This way, Weaviate is easy to use in custom projects. Additionally, the APIs are intuitive, so it is easy to integrate into your existing data landscape. This page contains information on how Weaviate's APIs are designed, and how you can use Weaviate Console to search through your Weaviate instance with GraphQL. @@ -125,9 +125,11 @@ There are currently three main functions in a GraphQL request: "Get{}", "Explore ## gRPC API support -Starting with version `1.19`, Weaviate is introducing support for the gRPC (gRPC Remote Procedure Calls) API, with the aim of making Weaviate even faster over time. +Alongside the RESTful and GraphQL APIs, Weaviate serves a gRPC API. gRPC is built on HTTP/2 and Protocol Buffers, which makes it faster and more efficient than sending the equivalent request as JSON over HTTP. It was introduced in Weaviate `v1.19.0` and has been considered stable since `v1.23.7`. -This will not result in any user-facing API changes. As of May 2023, gRPC has been added at a very small scale, with the goal of rolling it out further over time to the core library as well as the clients. +gRPC carries most of the search and batch import traffic that the client libraries generate, so a Weaviate deployment usually exposes a gRPC port (`50051` by default, configurable with the `GRPC_PORT` [environment variable](/deploy/configuration/env-vars/index.md)) in addition to the REST port. Client coverage is not uniform: the [Python](/weaviate/client-libraries/python/index.mdx), [TypeScript](/weaviate/client-libraries/typescript/index.mdx), [Java](/weaviate/client-libraries/java/index.mdx), and [C#](/weaviate/client-libraries/csharp.mdx) clients use gRPC for queries and batch operations, while the [Go](/weaviate/client-libraries/go.md) client uses it for batch imports and reaches gRPC search through its experimental API. + +For the Protobuf definitions and for ways to call the API without a client library, see the [gRPC API reference](../api/grpc.md). ## Weaviate Console @@ -137,7 +139,7 @@ The [Weaviate Console](/go/console?utm_content=others) is a dashboard to manage ## Weaviate Clients -Weaviate has several client libraries: in [C#](/weaviate/client-libraries/csharp.mdx), [Go](/weaviate/client-libraries/go.md), [Java](/weaviate/client-libraries/java/index.mdx), [Python](/weaviate/client-libraries/python/index.mdx) and [TypeScript/JavaScript](/weaviate/client-libraries/typescript/index.mdx). The client libraries broadly mirror the server API surface, although feature coverage varies by language. See the [client library pages](/weaviate/client-libraries/index.mdx) for what each one supports. Some clients, e.g. the Python client, have additional functionality, such as full schema management and batching operations. This way, Weaviate is easy to use in custom projects. The APIs are intuitive to use, so it is easy to integrate Weaviate into your existing data landscape. +Weaviate has several client libraries: in [C#](/weaviate/client-libraries/csharp.mdx), [Go](/weaviate/client-libraries/go.md), [Java](/weaviate/client-libraries/java/index.mdx), [Python](/weaviate/client-libraries/python/index.mdx), and [TypeScript/JavaScript](/weaviate/client-libraries/typescript/index.mdx). The client libraries broadly mirror the server API surface, although feature coverage varies by language. See the [client library pages](/weaviate/client-libraries/index.mdx) for what each one supports. Some clients, e.g. the Python client, have additional functionality, such as full schema management and batching operations. This way, Weaviate is easy to use in custom projects. The APIs are intuitive to use, so it is easy to integrate Weaviate into your existing data landscape. ## Further resources diff --git a/docs/weaviate/configuration/rbac/manage-groups.mdx b/docs/weaviate/configuration/rbac/manage-groups.mdx index f2400971f..2a66b8ee0 100644 --- a/docs/weaviate/configuration/rbac/manage-groups.mdx +++ b/docs/weaviate/configuration/rbac/manage-groups.mdx @@ -303,4 +303,3 @@ Groups assigned to role 'testRole': import DocsFeedback from "/_includes/docs-feedback.mdx"; -```` diff --git a/docs/weaviate/recipes.mdx b/docs/weaviate/recipes.mdx index c5c4bdcd6..bc206ff1f 100644 --- a/docs/weaviate/recipes.mdx +++ b/docs/weaviate/recipes.mdx @@ -3,7 +3,7 @@ title: Weaviate Recipes (code examples) hide_table_of_contents: true --- -This page contains recipes for common Weaviate operations. You can also check out the original [Jupyter Notebooks](https://github.com/weaviate/recipes) the recipes where created from. +This page contains recipes for common Weaviate operations. You can also check out the original [Jupyter Notebooks](https://github.com/weaviate/recipes) the recipes were created from. import RecipesCards from "@site/src/components/RecipesCards"; diff --git a/docs/weaviate/search/boost.md b/docs/weaviate/search/boost.md index f9012bd0e..b0db2da40 100644 --- a/docs/weaviate/search/boost.md +++ b/docs/weaviate/search/boost.md @@ -18,6 +18,8 @@ import BoostPreview from '/_includes/feature-notes/boost.mdx'; Apply boost to vector, hybrid, BM25, near-text, near-vector, near-object, near-image, and near-media queries. +The examples on this page are Python only, because `boost` is currently available in the Python client and not yet in the TypeScript, Go, Java, or C# clients. + ## How it works A boost is a **post-retrieval rescorer**: diff --git a/docs/weaviate/search/generative.md b/docs/weaviate/search/generative.md index bf79ab346..0cae723c4 100644 --- a/docs/weaviate/search/generative.md +++ b/docs/weaviate/search/generative.md @@ -52,7 +52,7 @@ To use RAG with a [generative model integration](../model-providers/index.md):
-```ts +```go // Go support coming soon ``` @@ -96,7 +96,7 @@ The second review is for the Stadt Krems 2009 Steinterrassen Riesling from Austr :::tip -For more information on the available modeld and their additional options, see the [model providers section](../model-providers/index.md). +For more information on the available models and their additional options, see the [model providers section](../model-providers/index.md). ::: ## Named vectors @@ -168,7 +168,7 @@ The second review is for the Stadt Krems 2009 Steinterrassen Riesling from Austr ## Single prompt search Single prompt search returns a generated response for each object in the query results.
-Define object `properties` – using `{prop-name}` syntax – to interpolate retrieved content in the prompt.
+Define object `properties` with the `{prop-name}` syntax to interpolate retrieved content in the prompt.
The properties you use in the prompt do not have to be among the properties you retrieve in the query. @@ -268,8 +268,8 @@ You can use *generative parameters* to specify additional options when performin diff --git a/docs/weaviate/starter-guides/custom-vectors.mdx b/docs/weaviate/starter-guides/custom-vectors.mdx index 49958d3c3..6ba7925cd 100644 --- a/docs/weaviate/starter-guides/custom-vectors.mdx +++ b/docs/weaviate/starter-guides/custom-vectors.mdx @@ -71,13 +71,13 @@ Weaviate is open source. You can [run Weaviate](/deploy/index.mdx) locally, in t ### Client library -[Client libraries](/weaviate/client-libraries) simplify working with Weaviate. Clients are available for multiple programming languages. This guide provides examples in Python, Typescript, and cURL. +[Client libraries](/weaviate/client-libraries) simplify working with Weaviate. Clients are available for multiple programming languages. This guide provides examples in Python, TypeScript, Java, C#, and cURL. To install a client library, use the installer for the client language: -The v4 client requires Weaviate `v1.23.7` and later.

+The Python client requires Weaviate `v1.23.7` or later.

```bash pip install -U weaviate-client @@ -101,6 +101,13 @@ npm install weaviate-client ``` +
+ + +```bash +dotnet add package Weaviate.Client --version ||site.csharp_client_version|| +``` +
From fecde1316cf3d3f481c736aadbe8547b8f1b025b Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Thu, 6 Aug 2026 19:39:45 +0200 Subject: [PATCH 62/84] docs(cloud): remove dead imports, add the missing default-index row, fix typos Seventeen imports left over from a migration that replaced screenshots with iframes were referencing assets no page rendered. One of them was a downtime warning. It was never rendered on this page, and it is no longer true for RBAC-enabled clusters, which manage users at runtime, so rendering it would have told readers that routine key rotation costs downtime. The import is removed and the now-unreferenced include deleted. The database settings table omitted DEFAULT_VECTOR_INDEX even though the Optimization profile section is entirely about which index becomes the default. The new row deliberately states no single value, because for Cloud there isn't one: it points at the profile and the note explains the mapping. Also an invalid JSON response block, and 'Select you' for 'your' twice. --- docs/cloud/manage-clusters/authentication.mdx | 5 ---- docs/cloud/manage-clusters/authorization.mdx | 8 ------- docs/cloud/manage-clusters/connect.mdx | 6 ++--- .../manage-clusters/default-settings.mdx | 9 ++++++++ docs/cloud/platform/create-account.mdx | 4 +--- docs/cloud/platform/multi-factor-auth.mdx | 5 +--- .../platform/users-and-organizations.mdx | 2 +- docs/cloud/quickstart.mdx | 23 ++++++++----------- docs/cloud/tools/collections-tool.mdx | 4 ++-- 9 files changed, 25 insertions(+), 41 deletions(-) diff --git a/docs/cloud/manage-clusters/authentication.mdx b/docs/cloud/manage-clusters/authentication.mdx index 5a88fc1ad..134938234 100644 --- a/docs/cloud/manage-clusters/authentication.mdx +++ b/docs/cloud/manage-clusters/authentication.mdx @@ -5,11 +5,6 @@ description: "Configure authentication options for Weaviate Cloud clusters by ad image: og/wcd/user_guides.jpg --- -import WCDAPIKeys from "/docs/cloud/img/wcs-api-keys.jpg"; -import WCDAddAPIKeys from "/docs/cloud/img/wcs-add-key-details.jpg"; -import WCDDelAPIKeys from "/docs/cloud/img/wcs-delete-api-key.jpg"; -import RestartTheCluster from "/_includes/wcs/restart-warning.mdx"; - [Weaviate Cloud (WCD)](/go/console?utm_content=cloud) uses [RBAC (Role-Based Access Control)](/weaviate/configuration/rbac/index.mdx) to manage authentication. Below, you can find guides on how to create, edit, rotate and delete API keys for accessing Weaviate Cloud. ### Create an API key diff --git a/docs/cloud/manage-clusters/authorization.mdx b/docs/cloud/manage-clusters/authorization.mdx index 2c77ed8fb..da3aa1dea 100644 --- a/docs/cloud/manage-clusters/authorization.mdx +++ b/docs/cloud/manage-clusters/authorization.mdx @@ -5,14 +5,6 @@ description: "Role-Based Access Control (RBAC) configuration guide for Weaviate image: og/wcd/user_guides.jpg --- -import Link from "@docusaurus/Link"; -import WCDCreateRole from "/docs/cloud/img/weaviate-cloud-roles-create.png"; -import WCDCreateRoleForm from "/docs/cloud/img/weaviate-cloud-roles-create-form.png"; -import WCDEditRole from "/docs/cloud/img/weaviate-cloud-roles-edit.png"; -import WCDEditRoleForm from "/docs/cloud/img/weaviate-cloud-roles-edit-form.png"; -import WCDDeleteRole from "/docs/cloud/img/weaviate-cloud-roles-delete.png"; -import WCDDeleteRoleForm from "/docs/cloud/img/weaviate-cloud-roles-delete-form.png"; - [Weaviate Cloud (WCD)](/go/console?utm_content=cloud) uses [RBAC (Role-Based Access Control)](/weaviate/configuration/rbac/index.mdx) to manage authorization. Below, you can find guides on how to create, edit and delete user roles and manage their permissions. ## Create a role diff --git a/docs/cloud/manage-clusters/connect.mdx b/docs/cloud/manage-clusters/connect.mdx index 3af28250b..9dccf634e 100644 --- a/docs/cloud/manage-clusters/connect.mdx +++ b/docs/cloud/manage-clusters/connect.mdx @@ -6,8 +6,6 @@ description: "Multiple connection options and methods for accessing your Weaviat image: og/wcd/user_guides.jpg --- -import CompareURLs from "/docs/cloud/img/wcs-console-url-check.jpg"; - [Weaviate Cloud (WCD)](/go/console?utm_content=cloud) offers multiple options on how to connect to your cluster: - **[Connect with APIs](#connect-with-an-api-programmatically)**: @@ -147,7 +145,7 @@ This section has solutions for some common problems. For additional help, [conta To reset your Weaviate Cloud password, follow these steps: 1. Go to the Weaviate Cloud [login page](/go/console?utm_content=cloud). -1. Click on click the login button. +1. Click the login button. 1. Click `Forgot Password`. 1. Check your email account for a password reset email from Weaviate Cloud. 1. Click the link and follow the instructions to reset your password. The link is only valid for five minutes. @@ -195,7 +193,7 @@ weaviate.exceptions.WeaviateGRPCUnavailableError: gRPC health check could not be **Solution**: Verify the cluster URL is correct and update the URL if needed. -When a Shared Cloud cluster is updated, the cluster URL may change slightly. Weaviate Cloud still routes the old URL, so some connections work, however the new gRPC and the old HTTP URLS are different so connections that require gRCP fail. +When a Shared Cloud cluster is updated, the cluster URL may change slightly. Weaviate Cloud still routes the old URL, so some connections work, however the new gRPC and the old HTTP URLs are different so connections that require gRPC fail. To check the URLs, open the Weaviate Cloud Console and check the details panel for your cluster. If you prefix Cluster URL with `grpc-`, the Cluster URL and the Cluster gRPC URL should match. Compare the Cluster URL with the connection URL in your application. The old URL and the new URL are similar, but the new one may have an extra subdomain such as `.c0.region`. If the URLs are different, update your application's connection code to use the new Cluster URL. diff --git a/docs/cloud/manage-clusters/default-settings.mdx b/docs/cloud/manage-clusters/default-settings.mdx index 7d269b151..7e8dd9a40 100644 --- a/docs/cloud/manage-clusters/default-settings.mdx +++ b/docs/cloud/manage-clusters/default-settings.mdx @@ -22,6 +22,7 @@ import AdvancedOptions from "/docs/cloud/img/weaviate-cloud-cluster-advanced-set | [`ASYNC_REPLICATION_DISABLED`](/deploy/configuration/env-vars/index.md#ASYNC_REPLICATION_DISABLED) | No | false | No | | [`ASYNC_INDEXING`](/deploy/configuration/env-vars/index.md#ASYNC_INDEXING) | Yes | true | No | | [`DEFAULT_QUANTIZATION`](/deploy/configuration/env-vars/index.md#DEFAULT_QUANTIZATION) | No | [RQ-8](/weaviate/configuration/compression/rq-compression.md) | Yes (1) | +| [`DEFAULT_VECTOR_INDEX`](/deploy/configuration/env-vars/index.md#DEFAULT_VECTOR_INDEX) | No | Set by the cluster's [optimization profile](/cloud/manage-clusters/create#optimization-profile) | Yes (via the optimization profile) | | `CORS_ALLOW_ORIGIN` | Yes | https://console.weaviate.cloud | Yes (to allow any) (3) | | [`REPLICATION_MINIMUM_FACTOR`](/deploy/configuration/env-vars/index.md#REPLICATION_MINIMUM_FACTOR) | Yes | 3 (for HA clusters) | No | @@ -37,6 +38,14 @@ import AdvancedOptions from "/docs/cloud/img/weaviate-cloud-cluster-advanced-set

+:::note Default vector index and the optimization profile + +`DEFAULT_VECTOR_INDEX` is not set directly. It is determined by the [optimization profile](/cloud/manage-clusters/create#optimization-profile) you pick when you create the cluster: the `Cost Optimized` profile makes HFresh the default vector index, and the `Performance Optimized` profile makes HNSW the default. Free clusters support the `Cost Optimized` profile only. + +The profile only sets the default for new collections. An explicit vector index in a [collection definition](/weaviate/manage-collections/vector-config) always takes precedence. + +::: + ## User management & permissions These settings control authentication and authorization for your cluster. These settings are not user configurable. diff --git a/docs/cloud/platform/create-account.mdx b/docs/cloud/platform/create-account.mdx index 73489f8e3..9ffc572b1 100644 --- a/docs/cloud/platform/create-account.mdx +++ b/docs/cloud/platform/create-account.mdx @@ -5,8 +5,6 @@ description: "How to create and delete user accounts in the Weaviate Cloud conso image: og/wcd/user_guides.jpg --- -import LandingRegister from "/docs/cloud/img/wcs-landing-page-register.jpg"; - Weaviate Cloud (WCD) offers an interactive console. Create a user account, then login to manage WCD clusters, run queries, and configure your organization details. ## Create a new user account and sign in {#create-a-new-user-account} @@ -57,7 +55,7 @@ To delete your account from Weaviate Cloud (WCD): 1. Remove organization members: If you own an organization, you must remove all other members from it first. 2. Navigate to the [Account Page](https://console.weaviate.cloud/account). -4. In the **Danger Zone** section, click **Delete Account** to permanently remove your account. +3. In the **Danger Zone** section, click **Delete Account** to permanently remove your account. If you encounter any issues, please contact our [Weaviate Support](https://support.weaviate.io). diff --git a/docs/cloud/platform/multi-factor-auth.mdx b/docs/cloud/platform/multi-factor-auth.mdx index 9a61a531d..e5103ed6d 100644 --- a/docs/cloud/platform/multi-factor-auth.mdx +++ b/docs/cloud/platform/multi-factor-auth.mdx @@ -5,9 +5,6 @@ description: "Enhanced security setup with multi-factor authentication for Weavi image: og/wcd/user_guides.jpg --- -import MFAOneTime from "/docs/cloud/img/mfa-one-time-code.jpg"; -import MFAEnableIcon from "/docs/cloud/img/mfa-enable-icon.jpg"; - Multi-factor authentication (MFA) increases the security of browser logins. MFA is not enabled by default. ## Enable multi-factor authentication @@ -85,7 +82,7 @@ To disable MFA, [contact support](https://support.weaviate.io). If you use a JavaScript/TypeScript client to connect a browser hosted application to Weaviate, do not enable MFA for that client's account. -There is no way to pass the the one-time authentication code to the application, so the application cannot connect to Weaviate Cloud. +There is no way to pass the one-time authentication code to the application, so the application cannot connect to Weaviate Cloud. Use API keys to connect browser based client applications to Weaviate Cloud. diff --git a/docs/cloud/platform/users-and-organizations.mdx b/docs/cloud/platform/users-and-organizations.mdx index 11cda7894..70891e6ea 100644 --- a/docs/cloud/platform/users-and-organizations.mdx +++ b/docs/cloud/platform/users-and-organizations.mdx @@ -22,7 +22,7 @@ Organizations group user accounts together. An organization owns its clusters an - Organization management - Billing configuration -Be cautious when granting elevated roles (`Owner`, `Admin`) in production — those users can modify the organization, its clusters, and its billing. +Be cautious when granting elevated roles (`Owner`, `Admin`) in production. Those users can modify the organization, its clusters, and its billing. ## Manage organizations {#manage-organizations} diff --git a/docs/cloud/quickstart.mdx b/docs/cloud/quickstart.mdx index dd4548c27..0897533c7 100644 --- a/docs/cloud/quickstart.mdx +++ b/docs/cloud/quickstart.mdx @@ -7,9 +7,6 @@ image: og/docs/quickstart-tutorial.jpg # tags: ['getting started'] --- -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - Expected time: 30 minutes

@@ -254,20 +251,18 @@ import QueryNearText from "/_includes/code/quickstart/quickstart.query.neartext. Run this code to perform the query. Our query found entries for `DNA` and `species`.
- Example full response in JSON format + Example response ```json { - { - "answer": "DNA", - "question": "In 1953 Watson & Crick built a model of the molecular structure of this, the gene-carrying substance", - "category": "SCIENCE" - }, - { - "answer": "species", - "question": "2000 news: the Gunnison sage grouse isn't just another northern sage grouse, but a new one of this classification", - "category": "SCIENCE" - } + "answer": "DNA", + "question": "In 1953 Watson & Crick built a model of the molecular structure of this, the gene-carrying substance", + "category": "SCIENCE" +} +{ + "answer": "species", + "question": "2000 news: the Gunnison sage grouse isn't just another northern sage grouse, but a new one of this classification", + "category": "SCIENCE" } ``` diff --git a/docs/cloud/tools/collections-tool.mdx b/docs/cloud/tools/collections-tool.mdx index 546e26afd..60be49aac 100644 --- a/docs/cloud/tools/collections-tool.mdx +++ b/docs/cloud/tools/collections-tool.mdx @@ -292,10 +292,10 @@ Some collection settings that are not available in the console can be updated pr Enable TTL step by step 1. Open the [Weaviate Cloud console](/go/console?utm_content=cloud). -2. Select you organization and cluster in the left sidebar. +2. Select your organization and cluster in the left sidebar. 3. Open the `Collections` tool from the left sidebar and select the collection you want to modify. 4. Click the pencil icon next to the Time to live (TTL) field. -5. Select you desired [TTL settings](/weaviate/manage-collections/time-to-live.mdx) and save them. +5. Select your desired [TTL settings](/weaviate/manage-collections/time-to-live.mdx) and save them.
From a723306109aed001cd512b5aa72f90476d8d261b Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Fri, 7 Aug 2026 12:28:09 +0200 Subject: [PATCH 63/84] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- docs/cloud/tools/collections-tool.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cloud/tools/collections-tool.mdx b/docs/cloud/tools/collections-tool.mdx index 546e26afd..b6f7acf1d 100644 --- a/docs/cloud/tools/collections-tool.mdx +++ b/docs/cloud/tools/collections-tool.mdx @@ -295,7 +295,7 @@ Some collection settings that are not available in the console can be updated pr 2. Select you organization and cluster in the left sidebar. 3. Open the `Collections` tool from the left sidebar and select the collection you want to modify. 4. Click the pencil icon next to the Time to live (TTL) field. -5. Select you desired [TTL settings](/weaviate/manage-collections/time-to-live.mdx) and save them. +5. Select your desired [TTL settings](/weaviate/manage-collections/time-to-live.mdx) and save them. From 508887b4dd559d1cded08889b33329028025946b Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Fri, 7 Aug 2026 12:48:11 +0200 Subject: [PATCH 64/84] Revert the migration guide changes Ivan asked for these two files to be left as they were. Restores docs/deploy/migration/weaviate-1-30.md and weaviate-1-25.md to their pre-review state. The findings behind them stay tracked: the removed REST endpoints (deploy-rest-004, deploy-rest-005) and the observation that the REINDEX_MAP_TO_BLOCKMAX workflow is inert on v1.38.0+ (board df1f6185). --- docs/deploy/migration/weaviate-1-25.md | 21 +---- docs/deploy/migration/weaviate-1-30.md | 124 ++++--------------------- 2 files changed, 25 insertions(+), 120 deletions(-) diff --git a/docs/deploy/migration/weaviate-1-25.md b/docs/deploy/migration/weaviate-1-25.md index 9a943f5af..f93ae9165 100644 --- a/docs/deploy/migration/weaviate-1-25.md +++ b/docs/deploy/migration/weaviate-1-25.md @@ -32,9 +32,7 @@ As a result, to migrate from a pre-`1.25` version of Weaviate to `1.25` on kuber For more details, refer to the [upgrade instructions](#upgrade-instructions) below. -Downgrading from `1.25` to a pre-`1.25` version required a matching metadata step, performed with a `POST` request to the `v1/cluster/schema-v1` endpoint, followed by deleting the deployed `StatefulSet` and downgrading Weaviate to the desired version. - -That endpoint only exists in `v1.25.0` through `v1.34.20`. It was removed in `v1.35.0`, and there is no supported way to downgrade a `v1.35.0` or later instance to a pre-`1.25` version. +To downgrade from `1.25` to a pre-`1.25` version, you must perform a `POST` request to the `v1/cluster/schema-v1` endpoint to downgrade the metadata. Then, you must similarly delete the deployed `StatefulSet` and downgrade Weaviate to the desired version. For more details, refer to the [downgrade instructions](#downgrade-instructions) below. @@ -103,7 +101,7 @@ Here, the image tag is overridden to `1.25.0`. You can also modify this value di helm upgrade weaviate weaviate/weaviate \ --namespace weaviate \ --values ./values.yaml \ - --set image.tag="1.25.0" + --set image.tag="1.25.0" \ ``` ### 4. Verify update @@ -162,26 +160,17 @@ If the number of objects under `statistics` matches the number of replicas you h ## Downgrade instructions -:::caution Applies to `v1.25.0` through `v1.34.20` only - -The procedure below depends on the `v1/cluster/schema-v1` endpoint, which converted the Raft cluster metadata back into the pre-`1.25` format. - -- On `v1.25.0` through `v1.34.20`, follow the steps below. -- On `v1.35.0` and later, the endpoint no longer exists. A `POST` request to it returns `404`, and the code that writes the pre-`1.25` metadata store was removed at the same time. Weaviate provides no supported path to downgrade a `v1.35.0` or later instance to a pre-`1.25` version. If you need to run a pre-`1.25` version again, deploy it separately and restore a [backup](/deploy/configuration/backups.md) that was created before the upgrade. - -::: - -If you need to downgrade from `1.25` to a pre-`1.25` version, and your cluster runs `v1.25.0` through `v1.34.20`, you must perform a `POST` request to the `v1/cluster/schema-v1` endpoint (a payload is not required) to downgrade the cluster metadata. +If you need to downgrade from `1.25` to a pre-`1.25` version, you must perform a `POST` request to the `v1/cluster/schema-v1` (a payload is not required) to downgrade the cluster metadata. ### 1. Downgrade cluster metadata Perform the following request to downgrade the cluster metadata. This will prepare the cluster for a downgrade to a pre-`1.25` version. (Remember to replace `localhost:8080` with the correct URL & port.) ```bash -curl -X POST -s -o /dev/null -w "%{http_code}\n" localhost:8080/v1/cluster/schema-v1 +curl -X POST -s -o /dev/null -w "%{http_code}" localhost:8080/v1/cluster/schema-v1 ``` -This should return a `200` status code. A `404` status code means the endpoint is not present, which is the case on `v1.35.0` and later. Do not continue with the downgrade in that case, because the cluster metadata has not been converted. +This should return a `200` status code. ### 2. Delete StatefulSet diff --git a/docs/deploy/migration/weaviate-1-30.md b/docs/deploy/migration/weaviate-1-30.md index bcee132d0..56045215f 100644 --- a/docs/deploy/migration/weaviate-1-30.md +++ b/docs/deploy/migration/weaviate-1-30.md @@ -28,27 +28,6 @@ Before starting the migration process, be aware of the following: - If possible, schedule migration to avoid large data imports/updates/deletes, especially during the re-indexing stage - BlockMax WAND may return slightly different scores than WAND if you search on multiple properties or have a delete-heavy workflow, as it computes term statistics differently -## Debug endpoints used in this guide - -Several steps below call Weaviate's debug endpoints under `/debug/index/rebuild/inverted/`. These endpoints have two requirements that differ from the regular REST API: - -- They are served by the debug HTTP listener on the Go profiling port, which defaults to `6060` and is set with [`GO_PROFILING_PORT`](/deploy/configuration/env-vars/index.md). They are **not** available on the main API port, which defaults to `8080`. A request to a debug route on the main port returns `404`. -- In `v1.36.18`, `v1.37.9`, `v1.38.1` and later, every debug route returns `404` unless [`DEBUG_ENDPOINTS_ENABLED`](/deploy/configuration/env-vars/index.md) is set to `true`. In earlier releases on each of those lines, the routes are served whenever profiling is not switched off with `GO_PROFILING_DISABLE`. - -To open the debug listener, restart the node with: - -```bash -DEBUG_ENDPOINTS_ENABLED=true -``` - -:::warning The debug listener is unauthenticated - -Anything that can reach the profiling port can call these endpoints, including the ones that change migration state. Keep the port reachable only from inside your cluster network, and set `DEBUG_ENDPOINTS_ENABLED` back to `false` when the migration is finished. - -::: - -In the examples below, replace `` with the address of the Weaviate node you are targeting, `` with the collection you are migrating, and `6060` with your `GO_PROFILING_PORT` if you changed it. - ## Migration process The migration involves three main stages: @@ -71,7 +50,7 @@ During this stage: 1. Restart your Weaviate instance with the following configuration: -```bash +``` REINDEX_MAP_TO_BLOCKMAX_AT_STARTUP=weaviate ``` @@ -81,15 +60,18 @@ If your node has a different name than "weaviate", replace it with your actual n ::: -2. Monitor the migration progress by checking the status endpoint: +2. Monitor the migration progress by checking: - ```bash - curl -s "http://:6060/debug/index/rebuild/inverted/status?collection=" + ``` + http://:</debug/index/rebuild/inverted/status?collection= ``` :::note -This endpoint is served on the debug listener, not on the main API port. See [Debug endpoints used in this guide](#debug-endpoints-used-in-this-guide) for the port and the flag that enables it. +Replace: +- `` with the name of your Weaviate node +- `` with the actual port (default is `6060`) +- `` with the name of the collection being migrated. ::: @@ -300,92 +282,26 @@ The migration process progresses through several stages, which can be monitored ### Aborting migration and rolling back -:::caution The `abort` endpoint was removed - -Earlier versions of this guide called `/debug/index/rebuild/inverted/abort`. That endpoint was removed in `v1.30.11`, `v1.31.5` and `v1.32.0`, so it returns `404` on every release covered by this guide. Use `cancelReindexContext` below instead. - -::: - -All of the endpoints in this section are served on the debug listener, not on the main API port. See [Debug endpoints used in this guide](#debug-endpoints-used-in-this-guide) for the port and the flag that enables them. - -#### Stop the reindexing work - -To cancel the node-wide reindex context, which stops the reindexing work on that node: - -```bash -curl -s -o /dev/null -w "%{http_code}\n" -X POST \ - "http://:6060/debug/index/rebuild/inverted/cancelReindexContext" -``` - -This returns `202`. It is the direct replacement for the removed `abort` endpoint: it takes no parameters and applies to the whole node. - -To pause one collection instead, so that the task stops cleanly at its next checkpoint and can be resumed later: - -```bash -curl -s "http://:6060/debug/index/rebuild/inverted/suspend?collection=" -``` - -Add `&shards=,` to pause only specific shards. Omit `shards` to pause every shard in the collection. To resume: - -```bash -curl -s "http://:6060/debug/index/rebuild/inverted/resume?collection=" -``` - -:::note Read the response body, not only the status code - -`suspend`, `resume`, `rollback` and `unrollback` return `200` even when they do nothing. Failures are reported in the body, for example `{"error":"shard not found or not ready"}`, which is what you get when no migration has been started for that collection. - -::: +If you have issues with the reindexing process and want to stop it: -#### Roll back to the old format +1. Call the abort endpoint: -To roll a collection back to the `mapcollection` format: - -```bash -curl -s "http://:6060/debug/index/rebuild/inverted/rollback?collection=" -``` - -This marks the collection for rollback. The rollback itself is applied the next time each shard is loaded, which means on the next node restart, or on tenant reactivation for multi-tenant collections. When it runs, Weaviate unswaps the ingest and backup buckets if they were already swapped, removes the reindex bucket directories, and clears the migration files. - -To cancel a rollback that you requested but that has not been applied yet: - -```bash -curl -s "http://:6060/debug/index/rebuild/inverted/unrollback?collection=" -``` - -:::caution Cleanup is the point of no return + ``` + http://:</debug/index/rebuild/inverted/abort + ``` -Rollback restores the old format from the `mapcollection` buckets that Stage 3 deletes. Once a shard has been tidied, there is nothing left to restore, and the rollback fails when the shard is loaded. The node logs an error: +2. To fully stop and rollback data to the initial stage, restart the server with: + ``` + REINDEX_MAP_TO_BLOCKMAX_AT_STARTUP=true + REINDEX_MAP_TO_BLOCKMAX_ROLLBACK=true + ``` -- `rollback: backup buckets are deleted, can not restore` in `v1.38.0` and later -- `rollback: searchable map buckets are deleted, can not restore` in earlier releases +:::caution -After cleanup, the only way back to the old format is to restore a [backup](/deploy/configuration/backups.md) that was created before the migration. Validate your BM25 and hybrid search results and performance before you run Stage 3. +Rolling back is only possible before cleanup! ::: -#### Endpoint availability - -These endpoints are not all present in every release covered by this guide. Check the release you run before you depend on one. - -| Endpoint | Purpose | Available in | -| :-- | :-- | :-- | -| `status?collection=` | Report the migration status per shard | All releases in this guide | -| `cancelReindexContext` | Cancel the node-wide reindex context | `v1.30.11`, `v1.31.5`, `v1.32.0` and later | -| `suspend`, `resume` | Pause and resume a collection | `v1.30.11`, `v1.31.5`, `v1.32.0` and later | -| `rollback`, `unrollback` | Request and cancel a rollback | `v1.30.11`, `v1.31.5`, `v1.32.0` and later | -| `start`, `unstart` | Set and clear the start trigger | `v1.30.11`, `v1.31.5`, `v1.32.0` and later | -| `overrides`, `set_overrides` | Read and write per-shard overrides | `v1.30.11`, `v1.31.5`, `v1.32.0` and later | -| `reset`, `unreset` | Set and clear the reset trigger | `v1.30.18`, `v1.31.11`, `v1.32.4` and later | -| `setProperties?properties=
,` | Choose which properties to migrate | `v1.30.18`, `v1.31.11`, `v1.32.4` and later | -| `reload` | Reinitialize the selected shards without restarting the node | `v1.30.11`, `v1.31.5`, `v1.32.0` and later, up to `v1.37`. Removed in `v1.38.0` | - -Where a row lists several versions, the endpoint is present from that patch onwards on each of those release lines. A release earlier than the listed patch on its own line does not have it, even if it is numerically higher than a patch listed for an older line. - -`suspend`, `resume`, `rollback`, `unrollback`, `start`, `unstart`, `reset` and `unreset` work by creating or deleting a marker file in the migration directory of each selected shard, at `///lsm/.migrations/searchable_map_to_blockmax/`. `setProperties` writes the property list into a file in the same directory. Newer releases append a generation suffix to the directory name, for example `searchable_map_to_blockmax_1`. - -The migration task reads these files at its checkpoints, which is why a pause takes effect at the next checkpoint and a rollback at the next shard load, rather than immediately. - ## Environment variable reference - `REINDEX_MAP_TO_BLOCKMAX_AT_STARTUP=`: Enables and starts the migration process that converts the `property__searchable` from mapcollection to the inverted blockmax format (double writes are done). Required for other `REINDEX_MAP_TO_BLOCKMAX_*` variables to work From c13a0ce75bce91977b56fa0e989f8e2394eb8053 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Fri, 7 Aug 2026 12:48:11 +0200 Subject: [PATCH 65/84] Revert the migration guide changes Ivan asked for these two files to be left as they were. Restores docs/deploy/migration/weaviate-1-30.md and weaviate-1-25.md to their pre-review state. The findings behind them stay tracked: the removed REST endpoints (deploy-rest-004, deploy-rest-005) and the observation that the REINDEX_MAP_TO_BLOCKMAX workflow is inert on v1.38.0+ (board df1f6185). --- docs/deploy/migration/weaviate-1-25.md | 21 +---- docs/deploy/migration/weaviate-1-30.md | 124 ++++--------------------- 2 files changed, 25 insertions(+), 120 deletions(-) diff --git a/docs/deploy/migration/weaviate-1-25.md b/docs/deploy/migration/weaviate-1-25.md index 9a943f5af..f93ae9165 100644 --- a/docs/deploy/migration/weaviate-1-25.md +++ b/docs/deploy/migration/weaviate-1-25.md @@ -32,9 +32,7 @@ As a result, to migrate from a pre-`1.25` version of Weaviate to `1.25` on kuber For more details, refer to the [upgrade instructions](#upgrade-instructions) below. -Downgrading from `1.25` to a pre-`1.25` version required a matching metadata step, performed with a `POST` request to the `v1/cluster/schema-v1` endpoint, followed by deleting the deployed `StatefulSet` and downgrading Weaviate to the desired version. - -That endpoint only exists in `v1.25.0` through `v1.34.20`. It was removed in `v1.35.0`, and there is no supported way to downgrade a `v1.35.0` or later instance to a pre-`1.25` version. +To downgrade from `1.25` to a pre-`1.25` version, you must perform a `POST` request to the `v1/cluster/schema-v1` endpoint to downgrade the metadata. Then, you must similarly delete the deployed `StatefulSet` and downgrade Weaviate to the desired version. For more details, refer to the [downgrade instructions](#downgrade-instructions) below. @@ -103,7 +101,7 @@ Here, the image tag is overridden to `1.25.0`. You can also modify this value di helm upgrade weaviate weaviate/weaviate \ --namespace weaviate \ --values ./values.yaml \ - --set image.tag="1.25.0" + --set image.tag="1.25.0" \ ``` ### 4. Verify update @@ -162,26 +160,17 @@ If the number of objects under `statistics` matches the number of replicas you h ## Downgrade instructions -:::caution Applies to `v1.25.0` through `v1.34.20` only - -The procedure below depends on the `v1/cluster/schema-v1` endpoint, which converted the Raft cluster metadata back into the pre-`1.25` format. - -- On `v1.25.0` through `v1.34.20`, follow the steps below. -- On `v1.35.0` and later, the endpoint no longer exists. A `POST` request to it returns `404`, and the code that writes the pre-`1.25` metadata store was removed at the same time. Weaviate provides no supported path to downgrade a `v1.35.0` or later instance to a pre-`1.25` version. If you need to run a pre-`1.25` version again, deploy it separately and restore a [backup](/deploy/configuration/backups.md) that was created before the upgrade. - -::: - -If you need to downgrade from `1.25` to a pre-`1.25` version, and your cluster runs `v1.25.0` through `v1.34.20`, you must perform a `POST` request to the `v1/cluster/schema-v1` endpoint (a payload is not required) to downgrade the cluster metadata. +If you need to downgrade from `1.25` to a pre-`1.25` version, you must perform a `POST` request to the `v1/cluster/schema-v1` (a payload is not required) to downgrade the cluster metadata. ### 1. Downgrade cluster metadata Perform the following request to downgrade the cluster metadata. This will prepare the cluster for a downgrade to a pre-`1.25` version. (Remember to replace `localhost:8080` with the correct URL & port.) ```bash -curl -X POST -s -o /dev/null -w "%{http_code}\n" localhost:8080/v1/cluster/schema-v1 +curl -X POST -s -o /dev/null -w "%{http_code}" localhost:8080/v1/cluster/schema-v1 ``` -This should return a `200` status code. A `404` status code means the endpoint is not present, which is the case on `v1.35.0` and later. Do not continue with the downgrade in that case, because the cluster metadata has not been converted. +This should return a `200` status code. ### 2. Delete StatefulSet diff --git a/docs/deploy/migration/weaviate-1-30.md b/docs/deploy/migration/weaviate-1-30.md index bcee132d0..56045215f 100644 --- a/docs/deploy/migration/weaviate-1-30.md +++ b/docs/deploy/migration/weaviate-1-30.md @@ -28,27 +28,6 @@ Before starting the migration process, be aware of the following: - If possible, schedule migration to avoid large data imports/updates/deletes, especially during the re-indexing stage - BlockMax WAND may return slightly different scores than WAND if you search on multiple properties or have a delete-heavy workflow, as it computes term statistics differently -## Debug endpoints used in this guide - -Several steps below call Weaviate's debug endpoints under `/debug/index/rebuild/inverted/`. These endpoints have two requirements that differ from the regular REST API: - -- They are served by the debug HTTP listener on the Go profiling port, which defaults to `6060` and is set with [`GO_PROFILING_PORT`](/deploy/configuration/env-vars/index.md). They are **not** available on the main API port, which defaults to `8080`. A request to a debug route on the main port returns `404`. -- In `v1.36.18`, `v1.37.9`, `v1.38.1` and later, every debug route returns `404` unless [`DEBUG_ENDPOINTS_ENABLED`](/deploy/configuration/env-vars/index.md) is set to `true`. In earlier releases on each of those lines, the routes are served whenever profiling is not switched off with `GO_PROFILING_DISABLE`. - -To open the debug listener, restart the node with: - -```bash -DEBUG_ENDPOINTS_ENABLED=true -``` - -:::warning The debug listener is unauthenticated - -Anything that can reach the profiling port can call these endpoints, including the ones that change migration state. Keep the port reachable only from inside your cluster network, and set `DEBUG_ENDPOINTS_ENABLED` back to `false` when the migration is finished. - -::: - -In the examples below, replace `` with the address of the Weaviate node you are targeting, `` with the collection you are migrating, and `6060` with your `GO_PROFILING_PORT` if you changed it. - ## Migration process The migration involves three main stages: @@ -71,7 +50,7 @@ During this stage: 1. Restart your Weaviate instance with the following configuration: -```bash +``` REINDEX_MAP_TO_BLOCKMAX_AT_STARTUP=weaviate ``` @@ -81,15 +60,18 @@ If your node has a different name than "weaviate", replace it with your actual n ::: -2. Monitor the migration progress by checking the status endpoint: +2. Monitor the migration progress by checking: - ```bash - curl -s "http://:6060/debug/index/rebuild/inverted/status?collection=" + ``` + http://:</debug/index/rebuild/inverted/status?collection= ``` :::note -This endpoint is served on the debug listener, not on the main API port. See [Debug endpoints used in this guide](#debug-endpoints-used-in-this-guide) for the port and the flag that enables it. +Replace: +- `` with the name of your Weaviate node +- `` with the actual port (default is `6060`) +- `` with the name of the collection being migrated. ::: @@ -300,92 +282,26 @@ The migration process progresses through several stages, which can be monitored ### Aborting migration and rolling back -:::caution The `abort` endpoint was removed - -Earlier versions of this guide called `/debug/index/rebuild/inverted/abort`. That endpoint was removed in `v1.30.11`, `v1.31.5` and `v1.32.0`, so it returns `404` on every release covered by this guide. Use `cancelReindexContext` below instead. - -::: - -All of the endpoints in this section are served on the debug listener, not on the main API port. See [Debug endpoints used in this guide](#debug-endpoints-used-in-this-guide) for the port and the flag that enables them. - -#### Stop the reindexing work - -To cancel the node-wide reindex context, which stops the reindexing work on that node: - -```bash -curl -s -o /dev/null -w "%{http_code}\n" -X POST \ - "http://:6060/debug/index/rebuild/inverted/cancelReindexContext" -``` - -This returns `202`. It is the direct replacement for the removed `abort` endpoint: it takes no parameters and applies to the whole node. - -To pause one collection instead, so that the task stops cleanly at its next checkpoint and can be resumed later: - -```bash -curl -s "http://:6060/debug/index/rebuild/inverted/suspend?collection=" -``` - -Add `&shards=,` to pause only specific shards. Omit `shards` to pause every shard in the collection. To resume: - -```bash -curl -s "http://:6060/debug/index/rebuild/inverted/resume?collection=" -``` - -:::note Read the response body, not only the status code - -`suspend`, `resume`, `rollback` and `unrollback` return `200` even when they do nothing. Failures are reported in the body, for example `{"error":"shard not found or not ready"}`, which is what you get when no migration has been started for that collection. - -::: +If you have issues with the reindexing process and want to stop it: -#### Roll back to the old format +1. Call the abort endpoint: -To roll a collection back to the `mapcollection` format: - -```bash -curl -s "http://:6060/debug/index/rebuild/inverted/rollback?collection=" -``` - -This marks the collection for rollback. The rollback itself is applied the next time each shard is loaded, which means on the next node restart, or on tenant reactivation for multi-tenant collections. When it runs, Weaviate unswaps the ingest and backup buckets if they were already swapped, removes the reindex bucket directories, and clears the migration files. - -To cancel a rollback that you requested but that has not been applied yet: - -```bash -curl -s "http://:6060/debug/index/rebuild/inverted/unrollback?collection=" -``` - -:::caution Cleanup is the point of no return + ``` + http://:</debug/index/rebuild/inverted/abort + ``` -Rollback restores the old format from the `mapcollection` buckets that Stage 3 deletes. Once a shard has been tidied, there is nothing left to restore, and the rollback fails when the shard is loaded. The node logs an error: +2. To fully stop and rollback data to the initial stage, restart the server with: + ``` + REINDEX_MAP_TO_BLOCKMAX_AT_STARTUP=true + REINDEX_MAP_TO_BLOCKMAX_ROLLBACK=true + ``` -- `rollback: backup buckets are deleted, can not restore` in `v1.38.0` and later -- `rollback: searchable map buckets are deleted, can not restore` in earlier releases +:::caution -After cleanup, the only way back to the old format is to restore a [backup](/deploy/configuration/backups.md) that was created before the migration. Validate your BM25 and hybrid search results and performance before you run Stage 3. +Rolling back is only possible before cleanup! ::: -#### Endpoint availability - -These endpoints are not all present in every release covered by this guide. Check the release you run before you depend on one. - -| Endpoint | Purpose | Available in | -| :-- | :-- | :-- | -| `status?collection=` | Report the migration status per shard | All releases in this guide | -| `cancelReindexContext` | Cancel the node-wide reindex context | `v1.30.11`, `v1.31.5`, `v1.32.0` and later | -| `suspend`, `resume` | Pause and resume a collection | `v1.30.11`, `v1.31.5`, `v1.32.0` and later | -| `rollback`, `unrollback` | Request and cancel a rollback | `v1.30.11`, `v1.31.5`, `v1.32.0` and later | -| `start`, `unstart` | Set and clear the start trigger | `v1.30.11`, `v1.31.5`, `v1.32.0` and later | -| `overrides`, `set_overrides` | Read and write per-shard overrides | `v1.30.11`, `v1.31.5`, `v1.32.0` and later | -| `reset`, `unreset` | Set and clear the reset trigger | `v1.30.18`, `v1.31.11`, `v1.32.4` and later | -| `setProperties?properties=,` | Choose which properties to migrate | `v1.30.18`, `v1.31.11`, `v1.32.4` and later | -| `reload` | Reinitialize the selected shards without restarting the node | `v1.30.11`, `v1.31.5`, `v1.32.0` and later, up to `v1.37`. Removed in `v1.38.0` | - -Where a row lists several versions, the endpoint is present from that patch onwards on each of those release lines. A release earlier than the listed patch on its own line does not have it, even if it is numerically higher than a patch listed for an older line. - -`suspend`, `resume`, `rollback`, `unrollback`, `start`, `unstart`, `reset` and `unreset` work by creating or deleting a marker file in the migration directory of each selected shard, at `///lsm/.migrations/searchable_map_to_blockmax/`. `setProperties` writes the property list into a file in the same directory. Newer releases append a generation suffix to the directory name, for example `searchable_map_to_blockmax_1`. - -The migration task reads these files at its checkpoints, which is why a pause takes effect at the next checkpoint and a rollback at the next shard load, rather than immediately. - ## Environment variable reference - `REINDEX_MAP_TO_BLOCKMAX_AT_STARTUP=`: Enables and starts the migration process that converts the `property__searchable` from mapcollection to the inverted blockmax format (double writes are done). Required for other `REINDEX_MAP_TO_BLOCKMAX_*` variables to work From b3f2ee67293acf02b9eac7598b99db80ab0f55af Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Fri, 7 Aug 2026 12:50:09 +0200 Subject: [PATCH 66/84] Revert the migration guide changes Ivan asked for these two files to be left as they were. Restores docs/deploy/migration/weaviate-1-30.md and weaviate-1-25.md to their pre-review state. The findings behind them stay tracked: the removed REST endpoints (deploy-rest-004, deploy-rest-005) and the observation that the REINDEX_MAP_TO_BLOCKMAX workflow is inert on v1.38.0+ (board df1f6185). --- docs/deploy/migration/weaviate-1-25.md | 19 +--- docs/deploy/migration/weaviate-1-30.md | 124 ++++--------------------- 2 files changed, 24 insertions(+), 119 deletions(-) diff --git a/docs/deploy/migration/weaviate-1-25.md b/docs/deploy/migration/weaviate-1-25.md index f35223ece..f93ae9165 100644 --- a/docs/deploy/migration/weaviate-1-25.md +++ b/docs/deploy/migration/weaviate-1-25.md @@ -32,9 +32,7 @@ As a result, to migrate from a pre-`1.25` version of Weaviate to `1.25` on kuber For more details, refer to the [upgrade instructions](#upgrade-instructions) below. -Downgrading from `1.25` to a pre-`1.25` version required a matching metadata step, performed with a `POST` request to the `v1/cluster/schema-v1` endpoint, followed by deleting the deployed `StatefulSet` and downgrading Weaviate to the desired version. - -That endpoint only exists in `v1.25.0` through `v1.34.20`. It was removed in `v1.35.0`, and there is no supported way to downgrade a `v1.35.0` or later instance to a pre-`1.25` version. +To downgrade from `1.25` to a pre-`1.25` version, you must perform a `POST` request to the `v1/cluster/schema-v1` endpoint to downgrade the metadata. Then, you must similarly delete the deployed `StatefulSet` and downgrade Weaviate to the desired version. For more details, refer to the [downgrade instructions](#downgrade-instructions) below. @@ -162,26 +160,17 @@ If the number of objects under `statistics` matches the number of replicas you h ## Downgrade instructions -:::caution Applies to `v1.25.0` through `v1.34.20` only - -The procedure below depends on the `v1/cluster/schema-v1` endpoint, which converted the Raft cluster metadata back into the pre-`1.25` format. - -- On `v1.25.0` through `v1.34.20`, follow the steps below. -- On `v1.35.0` and later, the endpoint no longer exists. A `POST` request to it returns `404`, and the code that writes the pre-`1.25` metadata store was removed at the same time. Weaviate provides no supported path to downgrade a `v1.35.0` or later instance to a pre-`1.25` version. If you need to run a pre-`1.25` version again, deploy it separately and restore a [backup](/deploy/configuration/backups.md) that was created before the upgrade. - -::: - -If you need to downgrade from `1.25` to a pre-`1.25` version, and your cluster runs `v1.25.0` through `v1.34.20`, you must perform a `POST` request to the `v1/cluster/schema-v1` endpoint (a payload is not required) to downgrade the cluster metadata. +If you need to downgrade from `1.25` to a pre-`1.25` version, you must perform a `POST` request to the `v1/cluster/schema-v1` (a payload is not required) to downgrade the cluster metadata. ### 1. Downgrade cluster metadata Perform the following request to downgrade the cluster metadata. This will prepare the cluster for a downgrade to a pre-`1.25` version. (Remember to replace `localhost:8080` with the correct URL & port.) ```bash -curl -X POST -s -o /dev/null -w "%{http_code}\n" localhost:8080/v1/cluster/schema-v1 +curl -X POST -s -o /dev/null -w "%{http_code}" localhost:8080/v1/cluster/schema-v1 ``` -This should return a `200` status code. A `404` status code means the endpoint is not present, which is the case on `v1.35.0` and later. Do not continue with the downgrade in that case, because the cluster metadata has not been converted. +This should return a `200` status code. ### 2. Delete StatefulSet diff --git a/docs/deploy/migration/weaviate-1-30.md b/docs/deploy/migration/weaviate-1-30.md index bcee132d0..56045215f 100644 --- a/docs/deploy/migration/weaviate-1-30.md +++ b/docs/deploy/migration/weaviate-1-30.md @@ -28,27 +28,6 @@ Before starting the migration process, be aware of the following: - If possible, schedule migration to avoid large data imports/updates/deletes, especially during the re-indexing stage - BlockMax WAND may return slightly different scores than WAND if you search on multiple properties or have a delete-heavy workflow, as it computes term statistics differently -## Debug endpoints used in this guide - -Several steps below call Weaviate's debug endpoints under `/debug/index/rebuild/inverted/`. These endpoints have two requirements that differ from the regular REST API: - -- They are served by the debug HTTP listener on the Go profiling port, which defaults to `6060` and is set with [`GO_PROFILING_PORT`](/deploy/configuration/env-vars/index.md). They are **not** available on the main API port, which defaults to `8080`. A request to a debug route on the main port returns `404`. -- In `v1.36.18`, `v1.37.9`, `v1.38.1` and later, every debug route returns `404` unless [`DEBUG_ENDPOINTS_ENABLED`](/deploy/configuration/env-vars/index.md) is set to `true`. In earlier releases on each of those lines, the routes are served whenever profiling is not switched off with `GO_PROFILING_DISABLE`. - -To open the debug listener, restart the node with: - -```bash -DEBUG_ENDPOINTS_ENABLED=true -``` - -:::warning The debug listener is unauthenticated - -Anything that can reach the profiling port can call these endpoints, including the ones that change migration state. Keep the port reachable only from inside your cluster network, and set `DEBUG_ENDPOINTS_ENABLED` back to `false` when the migration is finished. - -::: - -In the examples below, replace `` with the address of the Weaviate node you are targeting, `` with the collection you are migrating, and `6060` with your `GO_PROFILING_PORT` if you changed it. - ## Migration process The migration involves three main stages: @@ -71,7 +50,7 @@ During this stage: 1. Restart your Weaviate instance with the following configuration: -```bash +``` REINDEX_MAP_TO_BLOCKMAX_AT_STARTUP=weaviate ``` @@ -81,15 +60,18 @@ If your node has a different name than "weaviate", replace it with your actual n ::: -2. Monitor the migration progress by checking the status endpoint: +2. Monitor the migration progress by checking: - ```bash - curl -s "http://:6060/debug/index/rebuild/inverted/status?collection=" + ``` + http://:</debug/index/rebuild/inverted/status?collection= ``` :::note -This endpoint is served on the debug listener, not on the main API port. See [Debug endpoints used in this guide](#debug-endpoints-used-in-this-guide) for the port and the flag that enables it. +Replace: +- `` with the name of your Weaviate node +- `` with the actual port (default is `6060`) +- `` with the name of the collection being migrated. ::: @@ -300,92 +282,26 @@ The migration process progresses through several stages, which can be monitored ### Aborting migration and rolling back -:::caution The `abort` endpoint was removed - -Earlier versions of this guide called `/debug/index/rebuild/inverted/abort`. That endpoint was removed in `v1.30.11`, `v1.31.5` and `v1.32.0`, so it returns `404` on every release covered by this guide. Use `cancelReindexContext` below instead. - -::: - -All of the endpoints in this section are served on the debug listener, not on the main API port. See [Debug endpoints used in this guide](#debug-endpoints-used-in-this-guide) for the port and the flag that enables them. - -#### Stop the reindexing work - -To cancel the node-wide reindex context, which stops the reindexing work on that node: - -```bash -curl -s -o /dev/null -w "%{http_code}\n" -X POST \ - "http://:6060/debug/index/rebuild/inverted/cancelReindexContext" -``` - -This returns `202`. It is the direct replacement for the removed `abort` endpoint: it takes no parameters and applies to the whole node. - -To pause one collection instead, so that the task stops cleanly at its next checkpoint and can be resumed later: - -```bash -curl -s "http://:6060/debug/index/rebuild/inverted/suspend?collection=" -``` - -Add `&shards=,` to pause only specific shards. Omit `shards` to pause every shard in the collection. To resume: - -```bash -curl -s "http://:6060/debug/index/rebuild/inverted/resume?collection=" -``` - -:::note Read the response body, not only the status code - -`suspend`, `resume`, `rollback` and `unrollback` return `200` even when they do nothing. Failures are reported in the body, for example `{"error":"shard not found or not ready"}`, which is what you get when no migration has been started for that collection. - -::: +If you have issues with the reindexing process and want to stop it: -#### Roll back to the old format +1. Call the abort endpoint: -To roll a collection back to the `mapcollection` format: - -```bash -curl -s "http://:6060/debug/index/rebuild/inverted/rollback?collection=" -``` - -This marks the collection for rollback. The rollback itself is applied the next time each shard is loaded, which means on the next node restart, or on tenant reactivation for multi-tenant collections. When it runs, Weaviate unswaps the ingest and backup buckets if they were already swapped, removes the reindex bucket directories, and clears the migration files. - -To cancel a rollback that you requested but that has not been applied yet: - -```bash -curl -s "http://:6060/debug/index/rebuild/inverted/unrollback?collection=" -``` - -:::caution Cleanup is the point of no return + ``` + http://:</debug/index/rebuild/inverted/abort + ``` -Rollback restores the old format from the `mapcollection` buckets that Stage 3 deletes. Once a shard has been tidied, there is nothing left to restore, and the rollback fails when the shard is loaded. The node logs an error: +2. To fully stop and rollback data to the initial stage, restart the server with: + ``` + REINDEX_MAP_TO_BLOCKMAX_AT_STARTUP=true + REINDEX_MAP_TO_BLOCKMAX_ROLLBACK=true + ``` -- `rollback: backup buckets are deleted, can not restore` in `v1.38.0` and later -- `rollback: searchable map buckets are deleted, can not restore` in earlier releases +:::caution -After cleanup, the only way back to the old format is to restore a [backup](/deploy/configuration/backups.md) that was created before the migration. Validate your BM25 and hybrid search results and performance before you run Stage 3. +Rolling back is only possible before cleanup! ::: -#### Endpoint availability - -These endpoints are not all present in every release covered by this guide. Check the release you run before you depend on one. - -| Endpoint | Purpose | Available in | -| :-- | :-- | :-- | -| `status?collection=` | Report the migration status per shard | All releases in this guide | -| `cancelReindexContext` | Cancel the node-wide reindex context | `v1.30.11`, `v1.31.5`, `v1.32.0` and later | -| `suspend`, `resume` | Pause and resume a collection | `v1.30.11`, `v1.31.5`, `v1.32.0` and later | -| `rollback`, `unrollback` | Request and cancel a rollback | `v1.30.11`, `v1.31.5`, `v1.32.0` and later | -| `start`, `unstart` | Set and clear the start trigger | `v1.30.11`, `v1.31.5`, `v1.32.0` and later | -| `overrides`, `set_overrides` | Read and write per-shard overrides | `v1.30.11`, `v1.31.5`, `v1.32.0` and later | -| `reset`, `unreset` | Set and clear the reset trigger | `v1.30.18`, `v1.31.11`, `v1.32.4` and later | -| `setProperties?properties=,` | Choose which properties to migrate | `v1.30.18`, `v1.31.11`, `v1.32.4` and later | -| `reload` | Reinitialize the selected shards without restarting the node | `v1.30.11`, `v1.31.5`, `v1.32.0` and later, up to `v1.37`. Removed in `v1.38.0` | - -Where a row lists several versions, the endpoint is present from that patch onwards on each of those release lines. A release earlier than the listed patch on its own line does not have it, even if it is numerically higher than a patch listed for an older line. - -`suspend`, `resume`, `rollback`, `unrollback`, `start`, `unstart`, `reset` and `unreset` work by creating or deleting a marker file in the migration directory of each selected shard, at `///lsm/.migrations/searchable_map_to_blockmax/`. `setProperties` writes the property list into a file in the same directory. Newer releases append a generation suffix to the directory name, for example `searchable_map_to_blockmax_1`. - -The migration task reads these files at its checkpoints, which is why a pause takes effect at the next checkpoint and a rollback at the next shard load, rather than immediately. - ## Environment variable reference - `REINDEX_MAP_TO_BLOCKMAX_AT_STARTUP=`: Enables and starts the migration process that converts the `property__searchable` from mapcollection to the inverted blockmax format (double writes are done). Required for other `REINDEX_MAP_TO_BLOCKMAX_*` variables to work From 294d7ef6dfdb207bc5ea29faf14d3bb4e50fdd8b Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Fri, 7 Aug 2026 12:50:13 +0200 Subject: [PATCH 67/84] Leave the migration guides untouched in this PR Restores the two migration guides to the base branch's state so this PR does not touch them. They are reverted to their pre-review state on the base branch instead. --- docs/deploy/migration/weaviate-1-25.md | 19 +++- docs/deploy/migration/weaviate-1-30.md | 124 +++++++++++++++++++++---- 2 files changed, 119 insertions(+), 24 deletions(-) diff --git a/docs/deploy/migration/weaviate-1-25.md b/docs/deploy/migration/weaviate-1-25.md index f93ae9165..f35223ece 100644 --- a/docs/deploy/migration/weaviate-1-25.md +++ b/docs/deploy/migration/weaviate-1-25.md @@ -32,7 +32,9 @@ As a result, to migrate from a pre-`1.25` version of Weaviate to `1.25` on kuber For more details, refer to the [upgrade instructions](#upgrade-instructions) below. -To downgrade from `1.25` to a pre-`1.25` version, you must perform a `POST` request to the `v1/cluster/schema-v1` endpoint to downgrade the metadata. Then, you must similarly delete the deployed `StatefulSet` and downgrade Weaviate to the desired version. +Downgrading from `1.25` to a pre-`1.25` version required a matching metadata step, performed with a `POST` request to the `v1/cluster/schema-v1` endpoint, followed by deleting the deployed `StatefulSet` and downgrading Weaviate to the desired version. + +That endpoint only exists in `v1.25.0` through `v1.34.20`. It was removed in `v1.35.0`, and there is no supported way to downgrade a `v1.35.0` or later instance to a pre-`1.25` version. For more details, refer to the [downgrade instructions](#downgrade-instructions) below. @@ -160,17 +162,26 @@ If the number of objects under `statistics` matches the number of replicas you h ## Downgrade instructions -If you need to downgrade from `1.25` to a pre-`1.25` version, you must perform a `POST` request to the `v1/cluster/schema-v1` (a payload is not required) to downgrade the cluster metadata. +:::caution Applies to `v1.25.0` through `v1.34.20` only + +The procedure below depends on the `v1/cluster/schema-v1` endpoint, which converted the Raft cluster metadata back into the pre-`1.25` format. + +- On `v1.25.0` through `v1.34.20`, follow the steps below. +- On `v1.35.0` and later, the endpoint no longer exists. A `POST` request to it returns `404`, and the code that writes the pre-`1.25` metadata store was removed at the same time. Weaviate provides no supported path to downgrade a `v1.35.0` or later instance to a pre-`1.25` version. If you need to run a pre-`1.25` version again, deploy it separately and restore a [backup](/deploy/configuration/backups.md) that was created before the upgrade. + +::: + +If you need to downgrade from `1.25` to a pre-`1.25` version, and your cluster runs `v1.25.0` through `v1.34.20`, you must perform a `POST` request to the `v1/cluster/schema-v1` endpoint (a payload is not required) to downgrade the cluster metadata. ### 1. Downgrade cluster metadata Perform the following request to downgrade the cluster metadata. This will prepare the cluster for a downgrade to a pre-`1.25` version. (Remember to replace `localhost:8080` with the correct URL & port.) ```bash -curl -X POST -s -o /dev/null -w "%{http_code}" localhost:8080/v1/cluster/schema-v1 +curl -X POST -s -o /dev/null -w "%{http_code}\n" localhost:8080/v1/cluster/schema-v1 ``` -This should return a `200` status code. +This should return a `200` status code. A `404` status code means the endpoint is not present, which is the case on `v1.35.0` and later. Do not continue with the downgrade in that case, because the cluster metadata has not been converted. ### 2. Delete StatefulSet diff --git a/docs/deploy/migration/weaviate-1-30.md b/docs/deploy/migration/weaviate-1-30.md index 56045215f..bcee132d0 100644 --- a/docs/deploy/migration/weaviate-1-30.md +++ b/docs/deploy/migration/weaviate-1-30.md @@ -28,6 +28,27 @@ Before starting the migration process, be aware of the following: - If possible, schedule migration to avoid large data imports/updates/deletes, especially during the re-indexing stage - BlockMax WAND may return slightly different scores than WAND if you search on multiple properties or have a delete-heavy workflow, as it computes term statistics differently +## Debug endpoints used in this guide + +Several steps below call Weaviate's debug endpoints under `/debug/index/rebuild/inverted/`. These endpoints have two requirements that differ from the regular REST API: + +- They are served by the debug HTTP listener on the Go profiling port, which defaults to `6060` and is set with [`GO_PROFILING_PORT`](/deploy/configuration/env-vars/index.md). They are **not** available on the main API port, which defaults to `8080`. A request to a debug route on the main port returns `404`. +- In `v1.36.18`, `v1.37.9`, `v1.38.1` and later, every debug route returns `404` unless [`DEBUG_ENDPOINTS_ENABLED`](/deploy/configuration/env-vars/index.md) is set to `true`. In earlier releases on each of those lines, the routes are served whenever profiling is not switched off with `GO_PROFILING_DISABLE`. + +To open the debug listener, restart the node with: + +```bash +DEBUG_ENDPOINTS_ENABLED=true +``` + +:::warning The debug listener is unauthenticated + +Anything that can reach the profiling port can call these endpoints, including the ones that change migration state. Keep the port reachable only from inside your cluster network, and set `DEBUG_ENDPOINTS_ENABLED` back to `false` when the migration is finished. + +::: + +In the examples below, replace `` with the address of the Weaviate node you are targeting, `` with the collection you are migrating, and `6060` with your `GO_PROFILING_PORT` if you changed it. + ## Migration process The migration involves three main stages: @@ -50,7 +71,7 @@ During this stage: 1. Restart your Weaviate instance with the following configuration: -``` +```bash REINDEX_MAP_TO_BLOCKMAX_AT_STARTUP=weaviate ``` @@ -60,18 +81,15 @@ If your node has a different name than "weaviate", replace it with your actual n ::: -2. Monitor the migration progress by checking: +2. Monitor the migration progress by checking the status endpoint: - ``` - http://:</debug/index/rebuild/inverted/status?collection= + ```bash + curl -s "http://:6060/debug/index/rebuild/inverted/status?collection=" ``` :::note -Replace: -- `` with the name of your Weaviate node -- `` with the actual port (default is `6060`) -- `` with the name of the collection being migrated. +This endpoint is served on the debug listener, not on the main API port. See [Debug endpoints used in this guide](#debug-endpoints-used-in-this-guide) for the port and the flag that enables it. ::: @@ -282,26 +300,92 @@ The migration process progresses through several stages, which can be monitored ### Aborting migration and rolling back -If you have issues with the reindexing process and want to stop it: +:::caution The `abort` endpoint was removed -1. Call the abort endpoint: +Earlier versions of this guide called `/debug/index/rebuild/inverted/abort`. That endpoint was removed in `v1.30.11`, `v1.31.5` and `v1.32.0`, so it returns `404` on every release covered by this guide. Use `cancelReindexContext` below instead. - ``` - http://:</debug/index/rebuild/inverted/abort - ``` +::: -2. To fully stop and rollback data to the initial stage, restart the server with: - ``` - REINDEX_MAP_TO_BLOCKMAX_AT_STARTUP=true - REINDEX_MAP_TO_BLOCKMAX_ROLLBACK=true - ``` +All of the endpoints in this section are served on the debug listener, not on the main API port. See [Debug endpoints used in this guide](#debug-endpoints-used-in-this-guide) for the port and the flag that enables them. -:::caution +#### Stop the reindexing work + +To cancel the node-wide reindex context, which stops the reindexing work on that node: + +```bash +curl -s -o /dev/null -w "%{http_code}\n" -X POST \ + "http://:6060/debug/index/rebuild/inverted/cancelReindexContext" +``` + +This returns `202`. It is the direct replacement for the removed `abort` endpoint: it takes no parameters and applies to the whole node. + +To pause one collection instead, so that the task stops cleanly at its next checkpoint and can be resumed later: + +```bash +curl -s "http://:6060/debug/index/rebuild/inverted/suspend?collection=" +``` + +Add `&shards=,` to pause only specific shards. Omit `shards` to pause every shard in the collection. To resume: + +```bash +curl -s "http://:6060/debug/index/rebuild/inverted/resume?collection=" +``` -Rolling back is only possible before cleanup! +:::note Read the response body, not only the status code + +`suspend`, `resume`, `rollback` and `unrollback` return `200` even when they do nothing. Failures are reported in the body, for example `{"error":"shard not found or not ready"}`, which is what you get when no migration has been started for that collection. ::: +#### Roll back to the old format + +To roll a collection back to the `mapcollection` format: + +```bash +curl -s "http://:6060/debug/index/rebuild/inverted/rollback?collection=" +``` + +This marks the collection for rollback. The rollback itself is applied the next time each shard is loaded, which means on the next node restart, or on tenant reactivation for multi-tenant collections. When it runs, Weaviate unswaps the ingest and backup buckets if they were already swapped, removes the reindex bucket directories, and clears the migration files. + +To cancel a rollback that you requested but that has not been applied yet: + +```bash +curl -s "http://:6060/debug/index/rebuild/inverted/unrollback?collection=" +``` + +:::caution Cleanup is the point of no return + +Rollback restores the old format from the `mapcollection` buckets that Stage 3 deletes. Once a shard has been tidied, there is nothing left to restore, and the rollback fails when the shard is loaded. The node logs an error: + +- `rollback: backup buckets are deleted, can not restore` in `v1.38.0` and later +- `rollback: searchable map buckets are deleted, can not restore` in earlier releases + +After cleanup, the only way back to the old format is to restore a [backup](/deploy/configuration/backups.md) that was created before the migration. Validate your BM25 and hybrid search results and performance before you run Stage 3. + +::: + +#### Endpoint availability + +These endpoints are not all present in every release covered by this guide. Check the release you run before you depend on one. + +| Endpoint | Purpose | Available in | +| :-- | :-- | :-- | +| `status?collection=` | Report the migration status per shard | All releases in this guide | +| `cancelReindexContext` | Cancel the node-wide reindex context | `v1.30.11`, `v1.31.5`, `v1.32.0` and later | +| `suspend`, `resume` | Pause and resume a collection | `v1.30.11`, `v1.31.5`, `v1.32.0` and later | +| `rollback`, `unrollback` | Request and cancel a rollback | `v1.30.11`, `v1.31.5`, `v1.32.0` and later | +| `start`, `unstart` | Set and clear the start trigger | `v1.30.11`, `v1.31.5`, `v1.32.0` and later | +| `overrides`, `set_overrides` | Read and write per-shard overrides | `v1.30.11`, `v1.31.5`, `v1.32.0` and later | +| `reset`, `unreset` | Set and clear the reset trigger | `v1.30.18`, `v1.31.11`, `v1.32.4` and later | +| `setProperties?properties=,` | Choose which properties to migrate | `v1.30.18`, `v1.31.11`, `v1.32.4` and later | +| `reload` | Reinitialize the selected shards without restarting the node | `v1.30.11`, `v1.31.5`, `v1.32.0` and later, up to `v1.37`. Removed in `v1.38.0` | + +Where a row lists several versions, the endpoint is present from that patch onwards on each of those release lines. A release earlier than the listed patch on its own line does not have it, even if it is numerically higher than a patch listed for an older line. + +`suspend`, `resume`, `rollback`, `unrollback`, `start`, `unstart`, `reset` and `unreset` work by creating or deleting a marker file in the migration directory of each selected shard, at `///lsm/.migrations/searchable_map_to_blockmax/`. `setProperties` writes the property list into a file in the same directory. Newer releases append a generation suffix to the directory name, for example `searchable_map_to_blockmax_1`. + +The migration task reads these files at its checkpoints, which is why a pause takes effect at the next checkpoint and a rollback at the next shard load, rather than immediately. + ## Environment variable reference - `REINDEX_MAP_TO_BLOCKMAX_AT_STARTUP=`: Enables and starts the migration process that converts the `property__searchable` from mapcollection to the inverted blockmax format (double writes are done). Required for other `REINDEX_MAP_TO_BLOCKMAX_*` variables to work From 7d3fd3582f4b45a9c78d78d8b988c9fe919d0bf1 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Fri, 7 Aug 2026 13:10:23 +0200 Subject: [PATCH 68/84] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- docs/weaviate/model-providers/_includes/provider.vectorizer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/weaviate/model-providers/_includes/provider.vectorizer.py b/docs/weaviate/model-providers/_includes/provider.vectorizer.py index 1cf7cf74b..1acbf121d 100644 --- a/docs/weaviate/model-providers/_includes/provider.vectorizer.py +++ b/docs/weaviate/model-providers/_includes/provider.vectorizer.py @@ -690,7 +690,7 @@ name="title_vector", source_properties=["title"], model="mistral-embed", - # # Further options + # Further options # base_url="", ) ], From 02b8d477efd532047af0808be34525b905093e03 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Fri, 7 Aug 2026 13:16:36 +0200 Subject: [PATCH 69/84] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- docs/weaviate/client-libraries/go.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/weaviate/client-libraries/go.md b/docs/weaviate/client-libraries/go.md index 217340086..f7d553846 100644 --- a/docs/weaviate/client-libraries/go.md +++ b/docs/weaviate/client-libraries/go.md @@ -24,7 +24,7 @@ The latest Go client is version `v||site.go_client_version||`. ::: -The Weaviate Go client requires Go `1.25` and later, as declared by the `go` directive in `go.mod` for client `v||site.go_client_version||`. Newer client releases can raise this requirement, so check `go.mod` for the release you install. +For the minimum supported Go version, see the [`go` directive in `go.mod`](https://github.com/weaviate/weaviate-go-client/blob/v||site.go_client_version||/go.mod) for client `v||site.go_client_version||`. ## Installation The client doesn't support the old Go modules system. Create a repository for your code before you import the Weaviate client. From 0b43240d5263cd26bc9c638c43d5e00ec65a5627 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Fri, 7 Aug 2026 14:53:14 +0200 Subject: [PATCH 70/84] Drop backup chunking env vars and simplify the Embeddings quickstart requirements Remove the backup chunking work from this PR. The BACKUP_CHUNK_TARGET_SIZE, BACKUP_MIN_CHUNK_SIZE and BACKUP_SPLIT_FILE_SIZE rows are deleted from the environment variables page, and the ChunkSize cell in backups.md is restored to its original text, since the cross-link it gained pointed at those now removed rows. backups.md therefore drops out of this PR entirely. The other additions to the environment variables page (QUERY_HYBRID_MAXIMUM_RESULTS, the three CORS_ALLOW_* rows and the HNSW_STARTUP_WAIT_FOR_VECTOR_CACHE deprecation note) are unchanged. Rewrite the Requirements section of the Weaviate Embeddings quickstart so it lists requirements only. Weaviate Cloud no longer runs anything below 1.32, so the version qualifier on the free cluster bullet is dead weight and is dropped. The hand rolled client install tabs are replaced with the shared clients.install.new.mdx include that the official quickstart uses, which also removes two pinned client version numbers from prose. The page already imported CodeClientInstall for step 1.2, so that duplicate import is removed and both sections now render the same shared include. The Go tab being deleted carried a caveat that appears nowhere else in the docs, so it is kept as a sentence below the install tabs: the Go client does not support Weaviate Embeddings directly and needs the headers passed manually. The old wording promised the headers were shown below, which they never were, so that false pointer is gone. --- docs/cloud/embeddings/quickstart.mdx | 38 +++------------------ docs/deploy/configuration/backups.md | 2 +- docs/deploy/configuration/env-vars/index.md | 3 -- 3 files changed, 6 insertions(+), 37 deletions(-) diff --git a/docs/cloud/embeddings/quickstart.mdx b/docs/cloud/embeddings/quickstart.mdx index 8538cbb7c..18380d339 100644 --- a/docs/cloud/embeddings/quickstart.mdx +++ b/docs/cloud/embeddings/quickstart.mdx @@ -80,40 +80,14 @@ import PromptStarter from "/src/components/PromptStarter"; To use Weaviate Embeddings, you will need: -- A Weaviate Cloud free cluster running Weaviate `v1.28.5` and later -- A Weaviate client library that supports Weaviate Embeddings. Install a supported release: +- A Weaviate Cloud free cluster +- A Weaviate client library that supports Weaviate Embeddings - - - -```bash -pip install -U "weaviate-client>=4.9.5" -``` - - - - -```bash -npm install weaviate-client@^3.2.5 -``` - - - +import CodeClientInstall from "/\_includes/code/quickstart/clients.install.new.mdx"; -The Java client supports Weaviate Embeddings. Install it as shown in the [client library page](/weaviate/client-libraries/java). - - - - -The C# client supports Weaviate Embeddings. Install it as shown in the [client library page](/weaviate/client-libraries/csharp). - - - - -The Go client does not support Weaviate Embeddings directly. Install it as shown in the [client library page](/weaviate/client-libraries/go), then pass the `X-Weaviate-Api-Key` and `X-Weaviate-Cluster-Url` headers manually upon instantiation, as shown below. + - - +The Go client does not support Weaviate Embeddings directly. Pass the `X-Weaviate-Api-Key` and `X-Weaviate-Cluster-Url` headers manually when you instantiate the client. ## Step 1: Set up Weaviate @@ -129,8 +103,6 @@ import LatestWeaviateVersion from "/_includes/latest-weaviate-version.mdx"; We recommend using a [client library](/weaviate/client-libraries) to work with Weaviate. Follow the instructions below to install one of the official client libraries, available in [Python](/weaviate/client-libraries/python), [JavaScript/TypeScript](/weaviate/client-libraries/typescript), [Go](/weaviate/client-libraries/go), and [Java](/weaviate/client-libraries/java). -import CodeClientInstall from "/_includes/code/quickstart/clients.install.mdx"; - ### 1.3 Connect to Weaviate Cloud diff --git a/docs/deploy/configuration/backups.md b/docs/deploy/configuration/backups.md index 22a4d57ea..de8ac6b11 100644 --- a/docs/deploy/configuration/backups.md +++ b/docs/deploy/configuration/backups.md @@ -316,7 +316,7 @@ The `*` character matches any sequence of characters. For example, `Article*` ma | name | type | required | default | description | | ---- | ---- | ---- | ---- |---- | | `CPUPercentage` | number | no | `50%` | An optional integer to set the desired CPU core utilization ranging from 1%-80%. | -| `ChunkSize` | number | no | `128MB` | An optional integer represents the desired size for chunks. Weaviate will attempt to come close the specified size, with a minimum of 2MB, default of 128MB, and a maximum of 512MB. This is a per-request setting. The operator-level chunking defaults are set separately with the [`BACKUP_MIN_CHUNK_SIZE`, `BACKUP_CHUNK_TARGET_SIZE` and `BACKUP_SPLIT_FILE_SIZE`](/deploy/configuration/env-vars/index.md#general) environment variables.| +| `ChunkSize` | number | no | `128MB` | An optional integer represents the desired size for chunks. Weaviate will attempt to come close the specified size, with a minimum of 2MB, default of 128MB, and a maximum of 512MB.| | `CompressionLevel`| string | no | `DefaultCompression` | An optional [compression level](#compression-levels) to be used. | | `Path` | string | no | `""` | An optional string to manually set the backup location. If not provided, the backup will be stored in the default location. Introduced in Weaviate `v1.27.2`. | | `incremental_base_backup_id` | string | no | `None` | The ID of a previous backup to use as the base for an [incremental backup](#incremental-backups). Files unchanged since the base backup are stored as references rather than copied. Introduced in Weaviate `v1.37`. | diff --git a/docs/deploy/configuration/env-vars/index.md b/docs/deploy/configuration/env-vars/index.md index 52d7f153b..ae70feb69 100644 --- a/docs/deploy/configuration/env-vars/index.md +++ b/docs/deploy/configuration/env-vars/index.md @@ -32,9 +32,6 @@ import APITable from '@site/src/components/APITable'; | --- | --- | --- | --- | | `ASYNC_INDEXING` | If set, Weaviate creates vector indexes asynchronously to the object creation process. This can be useful for importing large amounts of data. (default: `false`) | `boolean` | `false` | | `AUTOSCHEMA_ENABLED` | Whether to infer the schema where necessary with the autoschema (default: `true`) | `boolean` | `true` | -| `BACKUP_CHUNK_TARGET_SIZE` | Target size of a backup chunk when Weaviate packs several small shard files into one chunk. Weaviate raises the effective value to at least the big-file threshold derived from `BACKUP_MIN_CHUNK_SIZE`. This is a server-level setting and is separate from the per-request [`ChunkSize`](/deploy/configuration/backups.md#available-config-object-properties) option. Accepts a plain byte count or a value with a unit (`B`, `KiB`, `MiB`, `GiB`, `TiB`, `KB`, `MB`, `GB`, `TB`). Default: `10MiB`
Added in `v1.36`, and backported to `v1.33.14`, `v1.34.11`, and `v1.35.4` | `string` | `32MiB` | -| `BACKUP_MIN_CHUNK_SIZE` | Lower bound for the big-file threshold used when chunking a backup. A shard file at or above the threshold is written to its own chunk, which lets an incremental backup skip it when it has not changed; smaller files are packed together. This is a server-level setting and is separate from the per-request [`ChunkSize`](/deploy/configuration/backups.md#available-config-object-properties) option. Accepts a plain byte count or a value with a unit (`B`, `KiB`, `MiB`, `GiB`, `TiB`, `KB`, `MB`, `GB`, `TB`). Default: `1MiB`
Added in `v1.37`, and backported to `v1.34.18`, `v1.35.13`, and `v1.36.3` | `string` | `4MiB` | -| `BACKUP_SPLIT_FILE_SIZE` | Size at which a single large shard file is split across several backup chunks. This is a server-level setting and is separate from the per-request [`ChunkSize`](/deploy/configuration/backups.md#available-config-object-properties) option. Accepts a plain byte count or a value with a unit (`B`, `KiB`, `MiB`, `GiB`, `TiB`, `KB`, `MB`, `GB`, `TB`). Default: `50GiB`
Added in `v1.37`, and backported to `v1.35.15` and `v1.36.5` | `string` | `10GiB` | | `CORS_ALLOW_HEADERS` | Value of the `Access-Control-Allow-Headers` response header on the REST API, which controls the request headers a browser may send cross-origin. The default is the long list of headers Weaviate itself reads, including `Content-Type`, `Authorization` and the per-provider API-key headers. Default: the built-in header list | `string - comma separated names` | `Content-Type, Authorization` | | `CORS_ALLOW_METHODS` | Value of the `Access-Control-Allow-Methods` response header on the REST API, which controls the HTTP methods a browser may use cross-origin. Default: `*` | `string - comma separated names` | `GET, POST, OPTIONS` | | `CORS_ALLOW_ORIGIN` | Value of the `Access-Control-Allow-Origin` response header on the REST API, which controls the origins a browser may call Weaviate from. Set this to reach Weaviate directly from browser code on a specific site. Default: `*` | `string` | `https://example.com` | From 593df2b044257a2020783f71183336c820f8cfdd Mon Sep 17 00:00:00 2001 From: Connor Shorten Date: Fri, 7 Aug 2026 09:44:31 -0400 Subject: [PATCH 71/84] rename effort tiers --- docs/query-agent/_includes/code/search_mode.mts | 2 +- docs/query-agent/_includes/code/search_mode.py | 2 +- docs/query-agent/guides/search_mode.md | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/query-agent/_includes/code/search_mode.mts b/docs/query-agent/_includes/code/search_mode.mts index af2bbefbe..5b386734b 100644 --- a/docs/query-agent/_includes/code/search_mode.mts +++ b/docs/query-agent/_includes/code/search_mode.mts @@ -105,7 +105,7 @@ for (const obj of filteringResponse.searchResults.objects) { // START EffortExample const effortResponse = await qa.search("What are Setwise Rerankers?", { limit: 10, - effort: "high", + effort: "ultrahigh", }); for (const obj of effortResponse.searchResults.objects) { diff --git a/docs/query-agent/_includes/code/search_mode.py b/docs/query-agent/_includes/code/search_mode.py index c85766615..69d95c89f 100644 --- a/docs/query-agent/_includes/code/search_mode.py +++ b/docs/query-agent/_includes/code/search_mode.py @@ -111,7 +111,7 @@ search_response = qa.search( "What are Setwise Rerankers?", limit=10, - effort="high", + effort="ultrahigh", ) for obj in search_response.search_results.objects: diff --git a/docs/query-agent/guides/search_mode.md b/docs/query-agent/guides/search_mode.md index 005af0831..94bb5edd7 100644 --- a/docs/query-agent/guides/search_mode.md +++ b/docs/query-agent/guides/search_mode.md @@ -77,7 +77,7 @@ The `.search()` method accepts several arguments: | `limit` | `int` | The maximum number of results returned in this page of results. Defaults to `20`. Use [`.next()`](#pagination) to fetch additional pages. | | `filtering` | `Literal["recall", "precision"]` | Either `"recall"` or `"precision"` to control filter generation. `"recall"` favors more results across filter interpretations; `"precision"` favors strict intent match. See [Customized filtering](#customized-filtering) below. | | `diversity_weight` | `float \| None` | A value between `0.0` and `1.0` that biases the result ranking towards diversity using Maximal Marginal Relevance (MMR). See [Diversity ranking](#diversity-ranking) below. | -| `effort` | `Literal["low", "medium", "high"] \| None` | The amount of effort the agent puts into the search. Higher effort may improve result quality at the expense of increased latency and cost. See [Effort](#effort) below. | +| `effort` | `Literal["medium", "high", "ultrahigh"] \| None` | The amount of effort the agent puts into the search. Higher effort may improve result quality at the expense of increased latency and cost. See [Effort](#effort) below. |
@@ -88,7 +88,7 @@ The `.search()` method accepts several arguments: | `limit` | `number` | The maximum number of results returned in this page of results. Defaults to `20`. Use [`.next()`](#pagination) to fetch additional pages. | | `filtering` | `"recall" \| "precision"` | Either `"recall"` or `"precision"` to control filter generation. `"recall"` favors more results across filter interpretations; `"precision"` favors strict intent match. See [Customized filtering](#customized-filtering) below. | | `diversityWeight` | `number` | A value between `0.0` and `1.0` that biases the result ranking towards diversity using Maximal Marginal Relevance (MMR). See [Diversity ranking](#diversity-ranking) below. | -| `effort` | `"low" \| "medium" \| "high"` | The amount of effort the agent puts into the search. Higher effort may improve result quality at the expense of increased latency and cost. See [Effort](#effort) below. | +| `effort` | `"medium" \| "high" \| "ultrahigh"` | The amount of effort the agent puts into the search. Higher effort may improve result quality at the expense of increased latency and cost. See [Effort](#effort) below. |
@@ -97,7 +97,7 @@ For more advanced searches, you can also specify _additional filters_ within the ### Effort -The optional `effort` parameter controls the amount of effort the agent puts into the search. It accepts one of `"low"`, `"medium"`, or `"high"`. Higher effort may improve result quality at the expense of increased latency and cost. +The optional `effort` parameter controls the amount of effort the agent puts into the search. It accepts one of `"medium"`, `"high"`, or `"ultrahigh"`. Higher effort may improve result quality at the expense of increased latency and cost. From ef5e57b169275661b8385a02d275c64fd2a9d5b0 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Sat, 8 Aug 2026 15:39:51 +0200 Subject: [PATCH 72/84] Remove unused imports --- docs/cloud/manage-clusters/authentication.mdx | 5 ----- 1 file changed, 5 deletions(-) diff --git a/docs/cloud/manage-clusters/authentication.mdx b/docs/cloud/manage-clusters/authentication.mdx index 5a88fc1ad..134938234 100644 --- a/docs/cloud/manage-clusters/authentication.mdx +++ b/docs/cloud/manage-clusters/authentication.mdx @@ -5,11 +5,6 @@ description: "Configure authentication options for Weaviate Cloud clusters by ad image: og/wcd/user_guides.jpg --- -import WCDAPIKeys from "/docs/cloud/img/wcs-api-keys.jpg"; -import WCDAddAPIKeys from "/docs/cloud/img/wcs-add-key-details.jpg"; -import WCDDelAPIKeys from "/docs/cloud/img/wcs-delete-api-key.jpg"; -import RestartTheCluster from "/_includes/wcs/restart-warning.mdx"; - [Weaviate Cloud (WCD)](/go/console?utm_content=cloud) uses [RBAC (Role-Based Access Control)](/weaviate/configuration/rbac/index.mdx) to manage authentication. Below, you can find guides on how to create, edit, rotate and delete API keys for accessing Weaviate Cloud. ### Create an API key From 30653cae7eabbd5e716418699d5a46866c1b5560 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Sat, 8 Aug 2026 15:49:31 +0200 Subject: [PATCH 73/84] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../transformers/embeddings-multimodal-custom-image.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/weaviate/model-providers/transformers/embeddings-multimodal-custom-image.md b/docs/weaviate/model-providers/transformers/embeddings-multimodal-custom-image.md index 4c21846bf..e2e6ec499 100644 --- a/docs/weaviate/model-providers/transformers/embeddings-multimodal-custom-image.md +++ b/docs/weaviate/model-providers/transformers/embeddings-multimodal-custom-image.md @@ -61,7 +61,7 @@ RUN CLIP_MODEL_NAME=clip-ViT-B-32 TEXT_MODEL_NAME=clip-ViT-B-32 ./download.py -You can also build a custom image with any model that is compatible with the Transformer library's `SentenceTransformers` and `CLIPModel` classes. To ensure that text embeddings will output compatible vectors to image embeddings, you must only use models that have been specifically trained for use with CLIP models. (Note that a CLIP model is in reality two models: one for text and one for images.) +You can also build a custom image with models compatible with the `SentenceTransformer` class from the Sentence Transformers library and the `CLIPModel` class from the Transformers library. To ensure that text embeddings will output compatible vectors to image embeddings, you must only use models that have been specifically trained for use with CLIP models. (Note that a CLIP model is in reality two models: one for text and one for images.)
To build an image with a local, custom model, create a new `Dockerfile` similar to the following, replacing `./my-text-model` and `./my-clip-model` with the paths to your model folders. From 6ef1e0c8605bbf60fe236e8bf782f7dcef7400aa Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Sat, 8 Aug 2026 15:48:39 +0200 Subject: [PATCH 74/84] docs(sq-compression): add the missing TypeScript example for enabling SQ on an existing collection The "Enable compression for existing collection" section carried a note saying a TypeScript example was not available for this operation. That is not true: the client exposes the reconfigure quantizer on the HNSW update type, so the operation is fully supported. - Add an `UpdateSchema` block to the SQ TypeScript include that enables SQ on an existing collection via `collection.config.update()` with `reconfigure.vectors.update()`, mirroring the Python `UpdateSchema` block on the same page (same collection, same rescore limit). - Wire a `ts` tab into the section, matching the ordering, labels and `groupId` of the other two tab sets on the page. - Drop the note. Verified: the rendered tab type-checks against the installed client (`tsc --noEmit`, exit 0) and runs against a local Weaviate, turning an uncompressed HNSW index into an SQ-compressed one. `yarn build-dev` exits 0 with no change to the broken link or anchor counts. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01DzkwXqkMC6agu8oGNswh2b --- .../howto/configure-sq/sq-compression-v3.ts | 45 +++++++++++++++++++ .../compression/sq-compression.md | 12 +++-- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/_includes/code/howto/configure-sq/sq-compression-v3.ts b/_includes/code/howto/configure-sq/sq-compression-v3.ts index fd6e290c2..0656559f2 100644 --- a/_includes/code/howto/configure-sq/sq-compression-v3.ts +++ b/_includes/code/howto/configure-sq/sq-compression-v3.ts @@ -64,3 +64,48 @@ assert.equal(collectionConfig.vectorizers.default.indexConfig.quantizer.type, "s await client.collections.delete(collectionName); client.close(); + + +// UPDATE SCHEMA +{ +const client = await weaviate.connectToLocal(); + +const collectionName = 'MyCollection'; + +// Prep +await client.collections.delete(collectionName); +await client.collections.create({ + name: collectionName, + vectorizers: weaviate.configure.vectors.selfProvided({ + vectorIndexConfig: weaviate.configure.vectorIndex.hnsw({ + quantizer: weaviate.configure.vectorIndex.quantizer.none(), + }) + }) +}) + +// START UpdateSchema +const collection = client.collections.use('MyCollection'); + +await collection.config.update({ + vectorizers: [ + weaviate.reconfigure.vectors.update({ + name: 'default', + vectorIndexConfig: weaviate.reconfigure.vectorIndex.hnsw({ + quantizer: weaviate.reconfigure.vectorIndex.quantizer.sq({ + rescoreLimit: 20, + }), + }), + }), + ], +}) +// END UpdateSchema + +let collectionConfig = await collection.config.get(); + +assert.equal(collectionConfig.vectorizers.default.indexConfig.quantizer.type, "sq") + +// Clean-up +await client.collections.delete(collectionName); + +client.close(); +} diff --git a/docs/weaviate/configuration/compression/sq-compression.md b/docs/weaviate/configuration/compression/sq-compression.md index ce3ae4cdf..bdeb0cfd6 100644 --- a/docs/weaviate/configuration/compression/sq-compression.md +++ b/docs/weaviate/configuration/compression/sq-compression.md @@ -77,10 +77,6 @@ import SqPostCreation from '/_includes/feature-notes/sq-post-creation.mdx'; SQ can also be enabled for an existing collection by updating the collection definition: -:::note -A TypeScript example is not available for this operation yet. Use `collections.update()` in the [TypeScript client](/weaviate/client-libraries/typescript/index.mdx). -::: - + + + Date: Sat, 8 Aug 2026 16:15:57 +0200 Subject: [PATCH 75/84] fix(datatypes): object properties are vectorized when listed in the vector config The note on the `object` data type claimed absolutely that `object` and `object[]` properties are not vectorized. That conflicts with config-refs/indexing/vector-index.mdx, which documents that non-text types, including `object`, are vectorized when explicitly listed as source properties. Core confirms the docs page was wrong. In usecases/modulecomponents/vectorizer/object_texts.go the default switch handles only `string` and `[]string`; everything else falls through to a no-op. A second switch, guarded by `hasSourceProperties`, adds `map[string]any` and `[]map[string]any`, which are passed through `marshalValue` (json.Marshal, with a fmt.Sprintf fallback) and inserted into the vectorized corpus. So a listed object property is vectorized as its JSON representation. The sentence also conflated two independent mechanisms behind a single clause: vectorization and inverted-index storage. The inverted-index half was correct. Split them so each can be stated accurately, and align the wording and vocabulary with vector-index.mdx, which owns this topic. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01DzkwXqkMC6agu8oGNswh2b --- docs/weaviate/config-refs/datatypes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/weaviate/config-refs/datatypes.md b/docs/weaviate/config-refs/datatypes.md index f0a1cd6b3..90cbd82f2 100644 --- a/docs/weaviate/config-refs/datatypes.md +++ b/docs/weaviate/config-refs/datatypes.md @@ -536,7 +536,7 @@ For example, a `Person` collection could have an `address` property as an object :::note Indexing and filtering -`object` and `object[]` properties are not vectorized: only their leaf scalars are stored in the inverted index. From Weaviate `v1.38` (preview), you can filter on nested-object leaves using a dotted path syntax. See [Filter on nested object properties](../search/filters.md#filter-on-nested-object-properties). +`object` and `object[]` properties are not vectorized by default, and only their leaf scalars are stored in the inverted index. If you list an object property in the vector configuration's [`properties` field](indexing/vector-index.mdx#specify-which-properties-to-vectorize), it is converted to a string (its JSON representation) and concatenated into the vectorizer's input text. From Weaviate `v1.38` (preview), you can filter on nested-object leaves using a dotted path syntax. See [Filter on nested object properties](../search/filters.md#filter-on-nested-object-properties). ::: From b8bf146b671da8ef810f5af9aeb3d7758720a778 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Mon, 10 Aug 2026 10:58:13 +0200 Subject: [PATCH 76/84] Implement feedback --- docs/deploy/configuration/backups.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/deploy/configuration/backups.md b/docs/deploy/configuration/backups.md index 016555915..5224d0604 100644 --- a/docs/deploy/configuration/backups.md +++ b/docs/deploy/configuration/backups.md @@ -468,6 +468,8 @@ This can result in dramatically smaller backups and much faster backup times. When creating a backup, Weaviate packs a shard's files into chunks. During an incremental backup, Weaviate compares each file against the base backup. Files that haven't changed are stored as pointers to the base backup rather than being copied again. On restore, Weaviate automatically fetches the referenced files from the base backup. +The base backup can itself be an incremental backup, so you can build a [chain of incremental backups](#chained-incremental-backups) that ends at a full backup. Weaviate walks the whole chain to find unchanged files, so every backup in the chain must remain available. + Only a file large enough to get a chunk of its own can be referenced individually, so the way Weaviate groups files into chunks determines how much an incremental backup can reuse. For how Weaviate decides which files get their own chunk, and the environment variables that control chunking, see [Chunking and file splitting](#chunking-and-file-splitting). #### Create a full (base) backup @@ -789,8 +791,8 @@ Chunking and `BACKUP_CHUNK_TARGET_SIZE` were backported to `v1.33.14`, `v1.34.11 On every backup, full or incremental, Weaviate packs each [shard's](/weaviate/concepts/storage.md#logical-storage-units-indexes-shards-stores) files into chunks: - Each of the shard's biggest files gets a **chunk of its own**. -- The remaining smaller files are packed together into **shared chunks** of roughly `BACKUP_CHUNK_TARGET_SIZE`. - A file larger than `BACKUP_SPLIT_FILE_SIZE` is **split into parts**, and each part gets a chunk of its own that holds nothing else. +- The remaining smaller files are packed together into **shared chunks** of roughly `BACKUP_CHUNK_TARGET_SIZE`. Chunking matters because it determines how much a later [incremental backup](#incremental-backups) can reuse: From 6be7b1fc019327add8caf0dbfe73e872d2193a67 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Mon, 10 Aug 2026 11:06:40 +0200 Subject: [PATCH 77/84] Remove unused files --- _includes/wcs/restart-warning.mdx | 1 - docs/cloud/img/mfa-enable-icon.jpg | Bin 97949 -> 0 bytes docs/cloud/img/mfa-one-time-code.jpg | Bin 26210 -> 0 bytes docs/cloud/img/wcs-add-key-details.jpg | Bin 45374 -> 0 bytes docs/cloud/img/wcs-api-keys.jpg | Bin 41891 -> 0 bytes docs/cloud/img/wcs-console-url-check.jpg | Bin 29279 -> 0 bytes docs/cloud/img/wcs-delete-api-key.jpg | Bin 50223 -> 0 bytes docs/cloud/img/wcs-landing-page-register.jpg | Bin 43551 -> 0 bytes .../img/weaviate-cloud-roles-create-form.png | Bin 186292 -> 0 bytes docs/cloud/img/weaviate-cloud-roles-create.png | Bin 150605 -> 0 bytes .../img/weaviate-cloud-roles-delete-form.png | Bin 167527 -> 0 bytes docs/cloud/img/weaviate-cloud-roles-delete.png | Bin 168592 -> 0 bytes .../img/weaviate-cloud-roles-edit-form.png | Bin 148031 -> 0 bytes docs/cloud/img/weaviate-cloud-roles-edit.png | Bin 168707 -> 0 bytes 14 files changed, 1 deletion(-) delete mode 100644 _includes/wcs/restart-warning.mdx delete mode 100644 docs/cloud/img/mfa-enable-icon.jpg delete mode 100644 docs/cloud/img/mfa-one-time-code.jpg delete mode 100644 docs/cloud/img/wcs-add-key-details.jpg delete mode 100644 docs/cloud/img/wcs-api-keys.jpg delete mode 100644 docs/cloud/img/wcs-console-url-check.jpg delete mode 100644 docs/cloud/img/wcs-delete-api-key.jpg delete mode 100644 docs/cloud/img/wcs-landing-page-register.jpg delete mode 100644 docs/cloud/img/weaviate-cloud-roles-create-form.png delete mode 100644 docs/cloud/img/weaviate-cloud-roles-create.png delete mode 100644 docs/cloud/img/weaviate-cloud-roles-delete-form.png delete mode 100644 docs/cloud/img/weaviate-cloud-roles-delete.png delete mode 100644 docs/cloud/img/weaviate-cloud-roles-edit-form.png delete mode 100644 docs/cloud/img/weaviate-cloud-roles-edit.png diff --git a/_includes/wcs/restart-warning.mdx b/_includes/wcs/restart-warning.mdx deleted file mode 100644 index 9dcdb3522..000000000 --- a/_includes/wcs/restart-warning.mdx +++ /dev/null @@ -1 +0,0 @@ -This action restarts the cluster. If you have a stand-alone cluster, there is a short downtime while the cluster restarts. There is no downtime if you have a high availability cluster. \ No newline at end of file diff --git a/docs/cloud/img/mfa-enable-icon.jpg b/docs/cloud/img/mfa-enable-icon.jpg deleted file mode 100644 index 7fa724dab75259228aa584a95d334be507ebfad8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97949 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 Q`rl9W|K|xT_V@gM0G3ff&j0`b diff --git a/docs/cloud/img/wcs-delete-api-key.jpg b/docs/cloud/img/wcs-delete-api-key.jpg deleted file mode 100644 index cd38bdb914d47ba1a55dc6e1ec7d84e2559a3651..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50223 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%0DU;H`b!U-y(VQKoi9B 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 diff --git a/docs/cloud/img/weaviate-cloud-roles-create-form.png b/docs/cloud/img/weaviate-cloud-roles-create-form.png deleted file mode 100644 index 1bbc726f4c82e4837ea0b88fda1e09e861439178..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 186292 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%0ALD~JRGZ%@ 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 z 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⪼PMqx*biyTF_u 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 diff --git a/docs/cloud/img/weaviate-cloud-roles-delete-form.png b/docs/cloud/img/weaviate-cloud-roles-delete-form.png deleted file mode 100644 index d9937603209d5ef8f0ab83217d38cbbc413f06bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167527 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 z 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⁡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ì{RjstLTKXX)w{gzBwFM0P0|nnnS1tG_3my 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 z¬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 AG5`Po diff --git a/docs/cloud/img/weaviate-cloud-roles-edit-form.png b/docs/cloud/img/weaviate-cloud-roles-edit-form.png deleted file mode 100644 index 2fa868d1e7cd5b6e9896fe3a5500367e8a770955..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148031 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 z

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 z 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�%af(hWr-U&Q9; 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ì{RjstLTKXX)w{gzBwFM0P0|nnnS1tG_3my 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
    $d&(<&385A-`wZZO}PI5H_6mLfBwwz*|Qmx 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 Date: Mon, 10 Aug 2026 11:07:02 +0200 Subject: [PATCH 78/84] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- docs/cloud/manage-clusters/connect.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cloud/manage-clusters/connect.mdx b/docs/cloud/manage-clusters/connect.mdx index 9dccf634e..4d0f81c46 100644 --- a/docs/cloud/manage-clusters/connect.mdx +++ b/docs/cloud/manage-clusters/connect.mdx @@ -193,7 +193,7 @@ weaviate.exceptions.WeaviateGRPCUnavailableError: gRPC health check could not be **Solution**: Verify the cluster URL is correct and update the URL if needed. -When a Shared Cloud cluster is updated, the cluster URL may change slightly. Weaviate Cloud still routes the old URL, so some connections work, however the new gRPC and the old HTTP URLs are different so connections that require gRPC fail. +When a Shared Cloud cluster is updated, the cluster URL may change slightly. Weaviate Cloud still routes the old URL, so some connections continue to work. However, the new gRPC URL and the old HTTP URL are different, so connections that require gRPC fail. To check the URLs, open the Weaviate Cloud Console and check the details panel for your cluster. If you prefix Cluster URL with `grpc-`, the Cluster URL and the Cluster gRPC URL should match. Compare the Cluster URL with the connection URL in your application. The old URL and the new URL are similar, but the new one may have an extra subdomain such as `.c0.region`. If the URLs are different, update your application's connection code to use the new Cluster URL. From bae222d9bfc557e80fe6e02e85e2aab46f98deee Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Mon, 10 Aug 2026 12:11:52 +0200 Subject: [PATCH 79/84] Fix naming --- .../code/java-v6/src/test/java/SearchGenerativeTest.java | 4 ++-- docs/weaviate/search/generative.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/_includes/code/java-v6/src/test/java/SearchGenerativeTest.java b/_includes/code/java-v6/src/test/java/SearchGenerativeTest.java index 0efef7e3c..23086acb7 100644 --- a/_includes/code/java-v6/src/test/java/SearchGenerativeTest.java +++ b/_includes/code/java-v6/src/test/java/SearchGenerativeTest.java @@ -136,7 +136,7 @@ void testSingleGenerativeProperties() { @Test void testSingleGenerativeParameters() { - // START SingleGenerativeParametersPython + // START SingleGenerativeParameters CollectionHandle> jeopardy = client.collections.use("JeopardyQuestion"); var response = jeopardy.generate.nearText("World history", q -> q.limit(2), @@ -158,7 +158,7 @@ void testSingleGenerativeParameters() { System.out.printf("Debug: %s\n", o.generative().debug()); System.out.printf("Metadata: %s\n", o.generative().metadata()); } - // END SingleGenerativeParametersPython + // END SingleGenerativeParameters } @Test diff --git a/docs/weaviate/search/generative.md b/docs/weaviate/search/generative.md index 0cae723c4..703674388 100644 --- a/docs/weaviate/search/generative.md +++ b/docs/weaviate/search/generative.md @@ -268,8 +268,8 @@ You can use *generative parameters* to specify additional options when performin From 50f68d5894fc54dd34a347826de29f2138a0baff Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Mon, 10 Aug 2026 12:17:51 +0200 Subject: [PATCH 80/84] docs(embedded): drop removed Python v3 client from the embedded page The "Python clients" section stated when embedded support landed in the Python v3 client (v3.15.4 on Linux, v3.21.0 on macOS). That client has been removed, so the fact describes software that no longer exists, and the client version numbers violate the house rule against client library versions in prose. Replace it with the current story: embedded support ships inside the Python client, with no separate package, which is the counterpart to the TypeScript section immediately below where the embedded client IS a separate package. The Weaviate server requirement (v1.23.7 or later) is kept. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01DzkwXqkMC6agu8oGNswh2b --- docs/deploy/installation-guides/embedded.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/deploy/installation-guides/embedded.md b/docs/deploy/installation-guides/embedded.md index ab8f86486..e00be92cc 100644 --- a/docs/deploy/installation-guides/embedded.md +++ b/docs/deploy/installation-guides/embedded.md @@ -131,7 +131,7 @@ Embedded Weaviate is supported for Python and TypeScript clients. ### Python clients -[Python](docs/weaviate/client-libraries/python/index.mdx) v3 client support is new in `v3.15.4` for Linux and `v3.21.0` for macOS. The Python client requires Weaviate `v1.23.7` or later. +Embedded Weaviate is built into the [Python client](docs/weaviate/client-libraries/python/index.mdx), so there is no separate package to install. The Python client requires Weaviate `v1.23.7` or later. ### TypeScript clients From 17c3cd0a79fe3d7d8ac017843f2bfdaf41c791f6 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Mon, 10 Aug 2026 12:58:00 +0200 Subject: [PATCH 81/84] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- docs/weaviate/recipes.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/weaviate/recipes.mdx b/docs/weaviate/recipes.mdx index bc206ff1f..75e4345f9 100644 --- a/docs/weaviate/recipes.mdx +++ b/docs/weaviate/recipes.mdx @@ -3,7 +3,7 @@ title: Weaviate Recipes (code examples) hide_table_of_contents: true --- -This page contains recipes for common Weaviate operations. You can also check out the original [Jupyter Notebooks](https://github.com/weaviate/recipes) the recipes were created from. +This page contains recipes for common Weaviate operations. You can also check out the original [Jupyter Notebooks](https://github.com/weaviate/recipes) from which the recipes were created. import RecipesCards from "@site/src/components/RecipesCards"; From a4a8b8bd7ba34e7a2d0633369878549eb61c5a5d Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Tue, 11 Aug 2026 08:17:36 +0200 Subject: [PATCH 82/84] docs: fix five review findings that were never dispatched A verification pass over all 205 deep-review findings found these five still present in main. Each was parked behind a blocker that has since cleared. Two Helm examples that do not work when pasted. The RBAC values block did not parse at all; PyYAML rejected it with "mapping values are not allowed here" because rbac: sat as a sibling of authorization: and root_users: carried a stray indent. The CLUSTER_HOSTNAME example used list syntax where the chart ranges over a map, so it parsed as a one-element list containing a map. Both corrected against the chart itself, and both parse results checked before and after rather than eyeballed. The generative starter guide documented two wrong model defaults and six JSON keys that do not exist. The *Property names it used are Go variable identifiers, not wire keys, and one parameter it showed has been removed from the module entirely. Rather than correct numbers that will rot again, the legacy raw-JSON moduleConfig examples are replaced with the current Configure.Generative pattern and the defaults now point at the model provider pages. The returned collection definition on the managing-collections guide was several years stale: it showed the pre-named-vector flat shape and invented description fields the snippet never sets. It is now a real response captured from a running instance, with only the collection name changed. The Java tab of the quickstart RAG example rendered "// Coming soon" while four other languages rendered working code. It now has a real test. --- .../java-v6/src/test/java/QuickstartTest.java | 91 +++++--- .../installation-guides/k8s-installation.md | 2 +- .../kubernetes/get-to-production.md | 8 +- docs/weaviate/starter-guides/generative.md | 67 +++--- .../managing-collections/index.mdx | 212 +++++++++++------- 5 files changed, 243 insertions(+), 137 deletions(-) diff --git a/_includes/code/java-v6/src/test/java/QuickstartTest.java b/_includes/code/java-v6/src/test/java/QuickstartTest.java index 2ac9be8bb..6732689b3 100644 --- a/_includes/code/java-v6/src/test/java/QuickstartTest.java +++ b/_includes/code/java-v6/src/test/java/QuickstartTest.java @@ -5,6 +5,7 @@ import io.weaviate.client6.v1.api.collections.VectorConfig; import io.weaviate.client6.v1.api.collections.WeaviateObject; import io.weaviate.client6.v1.api.collections.batch.BatchContext; +import io.weaviate.client6.v1.api.collections.generate.GenerativeProvider; import org.json.JSONArray; import org.json.JSONObject; @@ -170,31 +171,67 @@ void testNearTextQuery() throws Exception { // END NearText } - // @Test - // void testRagQuery() { - // // 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 - // ); - - // var questions = client.collections.use("Question"); - - // // highlight-start - // var response = questions.generate.nearText( - // q -> q - // .query("biology") - // .limit(2), - // g -> g.groupedTask("Write a tweet with emojis about these facts.")); - // // highlight-end - - // System.out.println(response.generative().text()); // Inspect the generated - // text - // } - // START RAG - // Coming soon - // END RAG + @Test + void testRagQuery() throws Exception { + // Setup, not shown in the docs: build the `Question` collection this example + // queries, so the test does not depend on the order the other tests run in. + // The collection is deliberately left in place: `testCreateCollection` and + // `testImportDataWorkflow` both delete it before they recreate it. + WeaviateClient setupClient = WeaviateClient.connectToWeaviateCloud( + System.getenv("WEAVIATE_URL"), + System.getenv("WEAVIATE_API_KEY")); + String setupCollectionName = "Question"; + if (setupClient.collections.exists(setupCollectionName)) { + setupClient.collections.delete(setupCollectionName); + } + setupClient.collections.create(setupCollectionName, col -> col + .properties( + Property.text("answer"), + Property.text("question"), + Property.text("category")) + .vectorConfig(VectorConfig.text2vecWeaviate())); + setupClient.collections.use(setupCollectionName).data.insertMany( + Map.of("answer", "DNA", + "question", "In 1953 Watson & Crick built a model of the molecular structure of this, the gene-carrying substance", + "category", "SCIENCE"), + Map.of("answer", "Liver", + "question", "This organ removes excess glucose from the blood & stores it as glycogen", + "category", "SCIENCE")); + Thread.sleep(3000); // Give the vectorizer time to index the new objects + setupClient.close(); + + // START RAG + // Best practice: store your credentials in environment variables + String weaviateUrl = System.getenv("WEAVIATE_URL"); + String weaviateApiKey = System.getenv("WEAVIATE_API_KEY"); + String openaiApiKey = System.getenv("OPENAI_API_KEY"); + + // highlight-start + WeaviateClient client = WeaviateClient.connectToWeaviateCloud( + weaviateUrl, // Replace with your Weaviate Cloud URL + weaviateApiKey, // Replace with your Weaviate Cloud key + config -> config.setHeaders( + Map.of("X-OpenAI-Api-Key", openaiApiKey)) // Replace with your OpenAI API key + ); + // highlight-end + + CollectionHandle> questions = client.collections.use("Question"); + + // highlight-start + var response = questions.generate.nearText( + "biology", + // Query configuration (nearText and limit) + q -> q.limit(2), + // Generative configuration (the RAG task) + g -> g.groupedTask( + "Write a tweet with emojis about these facts.", + c -> c.generativeProvider(GenerativeProvider.openai(o -> o)))); + // highlight-end + + // Use `.generative()` to access the generated text + System.out.println(response.generative().text()); + + client.close(); // Free up resources + // END RAG + } } \ No newline at end of file diff --git a/docs/deploy/installation-guides/k8s-installation.md b/docs/deploy/installation-guides/k8s-installation.md index fd7386d87..f7dec4114 100644 --- a/docs/deploy/installation-guides/k8s-installation.md +++ b/docs/deploy/installation-guides/k8s-installation.md @@ -261,7 +261,7 @@ In some systems, the cluster hostname may change over time. This is known to cre ```yaml env: - - CLUSTER_HOSTNAME: "node-1" + CLUSTER_HOSTNAME: "node-1" ``` ## Questions and feedback diff --git a/docs/deploy/production/kubernetes/get-to-production.md b/docs/deploy/production/kubernetes/get-to-production.md index 5bd68a0d7..21c772487 100644 --- a/docs/deploy/production/kubernetes/get-to-production.md +++ b/docs/deploy/production/kubernetes/get-to-production.md @@ -53,12 +53,12 @@ Check out the Academy course [“Run Weaviate on Kubernetes”](https://docs.wea An example of RBAC enabled on your Helm chart ```yaml - authorization: +authorization: rbac: enabled: true - root_users: - - admin_user1 - - admin_user2 + root_users: + - admin_user1 + - admin_user2 ``` diff --git a/docs/weaviate/starter-guides/generative.md b/docs/weaviate/starter-guides/generative.md index e51ca5c45..f75d97a3a 100644 --- a/docs/weaviate/starter-guides/generative.md +++ b/docs/weaviate/starter-guides/generative.md @@ -359,38 +359,49 @@ Check the specific documentation for your deployment method ([Docker](/deploy/in
    How to configure the language model -Model properties are exposed through the Weaviate module configuration. Accordingly, you can customize them through the `moduleConfig` parameter in the collection definition. - -For example, the `generative-cohere` module has the following properties: - -```json - "moduleConfig": { - "generative-cohere": { - "model": "command-xlarge-nightly", // Optional - Defaults to `command-xlarge-nightly`. Can also use`command-xlarge-beta` and `command-xlarge` - "temperatureProperty": , // Optional - "maxTokensProperty": , // Optional - "kProperty": , // Optional - "stopSequencesProperty": , // Optional - "returnLikelihoodsProperty": , // Optional - } - } +Model parameters are exposed through the generative model provider configuration. You can set them when you create the collection, alongside the generative integration itself. + +For example, the `generative-cohere` integration can be configured as follows: + +```python +from weaviate.classes.config import Configure + +client.collections.create( + "DemoCollection", + generative_config=Configure.Generative.cohere( + # # These parameters are optional + # model="command-a-03-2025", + # temperature=0.7, + # max_tokens=500, + # k=5, + # stop_sequences=["\n\n"], + ) + # Additional parameters not shown +) ``` -And the `generative-openai` module may be configured as follows: - -```json - "moduleConfig": { - "generative-openai": { - "model": "gpt-3.5-turbo", // Optional - Defaults to `gpt-3.5-turbo` - "temperatureProperty": , // Optional, applicable to both OpenAI and Azure OpenAI - "maxTokensProperty": , // Optional, applicable to both OpenAI and Azure OpenAI - "frequencyPenaltyProperty": , // Optional, applicable to both OpenAI and Azure OpenAI - "presencePenaltyProperty": , // Optional, applicable to both OpenAI and Azure OpenAI - "topPProperty": , // Optional, applicable to both OpenAI and Azure OpenAI - }, - } +And the `generative-openai` integration can be configured as follows: + +```python +from weaviate.classes.config import Configure + +client.collections.create( + "DemoCollection", + generative_config=Configure.Generative.openai( + # # These parameters are optional + # model="gpt-5-mini", + # temperature=0.7, + # max_tokens=500, + # frequency_penalty=0, + # presence_penalty=0, + # top_p=0.7, + ) + # Additional parameters not shown +) ``` +Each parameter is optional. If you do not set a parameter, Weaviate applies the server-defined default. For the available models, the default model and the full parameter list, see the model provider pages for [Cohere](../model-providers/cohere/generative.md) and [OpenAI](../model-providers/openai/generative.md). + See the [documentation](../model-providers/index.md) for various model provider integrations.
    diff --git a/docs/weaviate/starter-guides/managing-collections/index.mdx b/docs/weaviate/starter-guides/managing-collections/index.mdx index 2c488756f..9346b3f3e 100644 --- a/docs/weaviate/starter-guides/managing-collections/index.mdx +++ b/docs/weaviate/starter-guides/managing-collections/index.mdx @@ -39,104 +39,162 @@ The returned configuration looks similar to this: ```json { - "classes": [ + "class": "Question", + "invertedIndexConfig": { + "bm25": { + "b": 0.75, + "k1": 1.2 + }, + "cleanupIntervalSeconds": 60, + "stopwords": { + "additions": null, + "preset": "en", + "removals": null + }, + "usingBlockMaxWAND": true + }, + "moduleConfig": { + "generative-cohere": {} + }, + "multiTenancyConfig": { + "autoTenantActivation": false, + "autoTenantCreation": false, + "enabled": false + }, + "properties": [ { - "class": "Question", - "description": "Information from a Jeopardy! question", - "invertedIndexConfig": { - "bm25": { - "b": 0.75, - "k1": 1.2 - }, - "cleanupIntervalSeconds": 60, - "stopwords": { - "additions": null, - "preset": "en", - "removals": null + "dataType": [ + "text" + ], + "indexFilterable": true, + "indexRangeFilters": false, + "indexSearchable": true, + "moduleConfig": { + "text2vec-openai": { + "skip": false, + "vectorizePropertyName": false } }, + "name": "question", + "tokenization": "word" + }, + { + "dataType": [ + "text" + ], + "indexFilterable": true, + "indexRangeFilters": false, + "indexSearchable": true, "moduleConfig": { "text2vec-openai": { - "model": "ada", - "modelVersion": "002", - "type": "text", - "vectorizeClassName": true + "skip": false, + "vectorizePropertyName": false } }, - "properties": [ - { - "dataType": ["text"], - "description": "The question", - "moduleConfig": { - "text2vec-openai": { - "skip": false, - "vectorizePropertyName": false - } - }, - "name": "question", - "tokenization": "word" - }, - { - "dataType": ["text"], - "description": "The answer", - "moduleConfig": { - "text2vec-openai": { - "skip": false, - "vectorizePropertyName": false - } - }, - "name": "answer", - "tokenization": "word" - }, - { - "dataType": ["text"], - "description": "The category", - "moduleConfig": { - "text2vec-openai": { - "skip": false, - "vectorizePropertyName": false - } - }, - "name": "category", - "tokenization": "word" - } + "name": "answer", + "tokenization": "word" + }, + { + "dataType": [ + "text" ], - "replicationConfig": { - "factor": 1 - }, - "shardingConfig": { - "virtualPerPhysical": 128, - "desiredCount": 1, - "actualCount": 1, - "desiredVirtualCount": 128, - "actualVirtualCount": 128, - "key": "_id", - "strategy": "hash", - "function": "murmur3" + "indexFilterable": true, + "indexRangeFilters": false, + "indexSearchable": true, + "moduleConfig": { + "text2vec-openai": { + "skip": false, + "vectorizePropertyName": false + } }, + "name": "category", + "tokenization": "word" + } + ], + "shardingConfig": { + "actualCount": 1, + "actualVirtualCount": 128, + "desiredCount": 1, + "desiredVirtualCount": 128, + "function": "murmur3", + "key": "_id", + "strategy": "hash", + "virtualPerPhysical": 128 + }, + "vectorConfig": { + "default": { "vectorIndexConfig": { - "skip": false, + "bq": { + "enabled": false + }, "cleanupIntervalSeconds": 300, - "maxConnections": 32, - "efConstruction": 128, - "ef": -1, - "dynamicEfMin": 100, - "dynamicEfMax": 500, + "distance": "cosine", "dynamicEfFactor": 8, - "vectorCacheMaxObjects": 1000000000000, + "dynamicEfMax": 500, + "dynamicEfMin": 100, + "ef": -1, + "efConstruction": 128, + "filterStrategy": "acorn", "flatSearchCutoff": 40000, - "distance": "cosine" + "maxConnections": 32, + "multivector": { + "aggregation": "maxSim", + "enabled": false, + "muvera": { + "dprojections": 16, + "enabled": false, + "ksim": 4, + "repetitions": 10 + } + }, + "pq": { + "bitCompression": false, + "centroids": 256, + "enabled": false, + "encoder": { + "distribution": "log-normal", + "type": "kmeans" + }, + "segments": 0, + "trainingLimit": 100000 + }, + "rq": { + "bits": 8, + "enabled": false, + "rescoreLimit": 20 + }, + "skip": false, + "skipDefaultQuantization": false, + "sq": { + "enabled": false, + "rescoreLimit": 20, + "trainingLimit": 100000 + }, + "trackDefaultQuantization": false, + "vectorCacheMaxObjects": 1000000000000 }, "vectorIndexType": "hnsw", - "vectorizer": "text2vec-openai" + "vectorizer": { + "text2vec-openai": { + "baseURL": "https://api.openai.com", + "isAzure": false, + "model": "text-embedding-3-small", + "vectorizeClassName": true + } + } } - ] + }, + "replicationConfig": { + "deletionStrategy": "TimeBasedResolution", + "factor": 1, + "asyncEnabled": false + } } ``` -Although we only specified the collection name and properties, the returned definition includes much more information. +Although we only specified the collection name, its properties, the vectorizer and the generative module, the returned definition includes much more information. This is because Weaviate infers the definition based on the data schema and default settings. Each of these options can be specified manually at collection creation time. From d01fd78125102a9ca65783c793843ed70d68a5c1 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Tue, 11 Aug 2026 15:41:49 +0200 Subject: [PATCH 83/84] docs(model-providers): document how OpenAI request URLs are built The OpenAI embeddings page documented `baseURL` but not the `endpoint` parameter that sets the path appended to it. The generative page listed the `X-OpenAI-Baseurl` header with no explanation of the path at all, and appends a different one. - embeddings: document the `endpoint` parameter and how the request URL is composed, and cross-link the two sections - generative: add the equivalent note, covering the legacy `/v1/completions` path and the absence of an `endpoint` override - both: note that the Azure integration builds its own path - drop the third-party gateway named in the old proxy example --- docs/weaviate/model-providers/openai/embeddings.md | 11 +++++++++-- docs/weaviate/model-providers/openai/generative.md | 10 ++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/docs/weaviate/model-providers/openai/embeddings.md b/docs/weaviate/model-providers/openai/embeddings.md index 087da19d7..51f6cc470 100644 --- a/docs/weaviate/model-providers/openai/embeddings.md +++ b/docs/weaviate/model-providers/openai/embeddings.md @@ -217,6 +217,9 @@ import VectorizationBehavior from '/_includes/vectorization.behavior.mdx'; - `modelVersion`: The version string for the model. - `type`: The model type, either `text` or `code`. - `baseURL`: The URL to use (e.g. a proxy) instead of the default OpenAI URL. +- `endpoint`: The API path that Weaviate appends to the base URL. Defaults to `/v1/embeddings`. Set it if an OpenAI-compatible service uses a different path. + +For how Weaviate combines `baseURL` and `endpoint` into a request URL, see [Header parameters](#header-parameters). #### (`model` & `dimensions`) or (`model` & `modelVersion`) @@ -272,9 +275,13 @@ Any additional headers provided at runtime will override the existing Weaviate c Provide the headers as shown in the [API credentials examples](#api-credentials) above. -:::note +:::note How Weaviate builds the request URL + +Use the `X-OpenAI-Baseurl` header, or the `baseURL` parameter, to target an OpenAI-compatible service. Weaviate builds the request URL by appending the `endpoint` path (`/v1/embeddings` by default) to the base URL. + +If your provider uses a different path, set [`endpoint`](#vectorizer-parameters) to that path, or rewrite the path with a proxy. -By passing the `X-OpenAI-Baseurl`, you can use an endpoint compatible with the OpenAI API. Weaviate appends `/v1/embeddings` to this base URL. If this doesn't match your endpoint, you can rewrite the path with a proxy (e.g., `your.domain.com/v1/embeddings` -> `api.deepinfra.com/v1/openai/embeddings`). +The [Azure OpenAI integration](../openai-azure/embeddings.md) builds a deployment-specific path and ignores `endpoint`. ::: diff --git a/docs/weaviate/model-providers/openai/generative.md b/docs/weaviate/model-providers/openai/generative.md index 92d773409..b305241c9 100644 --- a/docs/weaviate/model-providers/openai/generative.md +++ b/docs/weaviate/model-providers/openai/generative.md @@ -207,6 +207,16 @@ Any additional headers provided at runtime will override the existing Weaviate c Provide the headers as shown in the [API credentials examples](#api-credentials) above. +:::note How Weaviate builds the request URL + +Use the `X-OpenAI-Baseurl` header, or the `baseURL` parameter, to target an OpenAI-compatible service. Weaviate builds the request URL by appending `/v1/chat/completions` to the base URL, or `/v1/completions` for the legacy `text-davinci-002` and `text-davinci-003` models. + +The generative integration has no `endpoint` parameter to override this path, unlike the [OpenAI embeddings integration](./embeddings.md#header-parameters). If your provider expects a different path, point the base URL at a proxy that rewrites `/v1/chat/completions` to your provider's path. + +The [Azure OpenAI integration](../openai-azure/generative.md) builds a deployment-specific path and ignores the paths 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. From cbeebc1718f4528745c58478606ceb45c85cd8c3 Mon Sep 17 00:00:00 2001 From: Ivan Despot <66276597+g-despot@users.noreply.github.com> Date: Wed, 12 Aug 2026 10:25:59 +0200 Subject: [PATCH 84/84] docs: 1.39 Python client surfaces, corrections, and pin bump Documents the user-facing surfaces that weaviate-client 4.23.0 adds for Weaviate 1.39, and corrects several published statements that the 1.38 patch line had already made false. Corrections: - similarity.md said diversity selection was 'Not supported' for hybrid search. That has been false since v1.38.6. Multi-vector remains correctly unsupported. - bm25.md and search-operators.md published exhaustive operator lists that omitted AndCross. - replica-movement.mdx and consistency.md published exhaustive replication-state lists that omitted INTEGRATING (added in v1.38.0). - The MMR feature note still carried a preview label and a multi-node caveat that no longer applies, MMR now being a single coordinator pass. - aws/embeddings.md described 'service' as required while also giving it a default. It is optional; core defaults it to bedrock. - A Bedrock snippet used titan-embed-text-v2:0 without the amazon. prefix. Core dispatches on that prefix, so the collection was created and then failed later at import time. New coverage: - Cross-property AND (and_cross), Python and GraphQL, with the tokenization and analyzer constraint that makes it fail. - Diversity selection on hybrid search, including the pagination contract: offset advances by the query limit, not the page size, and nothing validates it. - list_backups() and the list-side incremental_base_backup_id, which is distinct from the create-side parameter of the same name. - dimensions on text2vec-aws, and a location example for text2vec-google. Version markers cite the release a capability actually became available in, not 1.39: v1.37.3 and v1.38.6 for MMR, v1.38.6 for hybrid diversity, v1.38.8 for and_cross, v1.38.0 for INTEGRATING. The client pin moves to 4.23.0 and the test servers to 1.39.0. 4.23.0 is not on PyPI yet, so uv.lock cannot be regenerated and the Python CI lanes will fail at dependency install until it publishes. --- _includes/code/howto/configure.backups.py | 18 +++++ _includes/code/howto/search.bm25.gql.py | 25 ++++++ _includes/code/howto/search.bm25.py | 30 ++++++++ _includes/code/howto/search.similarity.mmr.py | 77 +++++++++++++++++++ _includes/feature-notes/v137-preview.mdx | 7 +- _includes/release-history.md | 3 +- docs/deploy/configuration/backups.md | 71 +++++++++++++++++ .../deploy/configuration/replica-movement.mdx | 3 + docs/weaviate/api/graphql/search-operators.md | 43 +++++++++-- .../python/notes-best-practices.mdx | 2 +- .../replication-architecture/consistency.md | 2 + .../_includes/provider.vectorizer.py | 36 +++++++-- .../model-providers/aws/embeddings.md | 30 +++++++- docs/weaviate/release-notes/index.md | 10 +-- docs/weaviate/search/bm25.md | 44 ++++++++++- docs/weaviate/search/hybrid.md | 37 ++++++++- docs/weaviate/search/similarity.md | 33 +++++++- pyproject.toml | 2 +- tests/docker-compose-anon-2.yml | 2 +- tests/docker-compose-anon-bind.yml | 2 +- tests/docker-compose-anon-clip.yml | 2 +- tests/docker-compose-anon-offload.yml | 2 +- tests/docker-compose-anon.yml | 2 +- tests/docker-compose-rbac.yml | 2 +- tests/docker-compose-three-nodes.yml | 6 +- tests/docker-compose.yml | 2 +- 26 files changed, 451 insertions(+), 42 deletions(-) diff --git a/_includes/code/howto/configure.backups.py b/_includes/code/howto/configure.backups.py index f143c91d7..e416fb5ba 100644 --- a/_includes/code/howto/configure.backups.py +++ b/_includes/code/howto/configure.backups.py @@ -191,6 +191,24 @@ assert client.collections.exists("Article") assert client.collections.exists("Publication") +# START ListBackups +backups = client.backup.list_backups( + backend="filesystem", + sort_by_starting_time_asc=True, +) + +for backup in backups: + print(backup.backup_id, backup.status, backup.incremental_base_backup_id) +# END ListBackups + +# Test +backup_ids = [backup.backup_id for backup in backups] +assert {"base-backup", "incremental-backup-1", "incremental-backup-2"}.issubset(backup_ids) +bases = {backup.backup_id: backup.incremental_base_backup_id for backup in backups} +assert bases["base-backup"] is None +assert bases["incremental-backup-1"] == "base-backup" +assert bases["incremental-backup-2"] == "incremental-backup-1" + # Clean up client.collections.delete(["Article", "Publication"]) diff --git a/_includes/code/howto/search.bm25.gql.py b/_includes/code/howto/search.bm25.gql.py index 18a69fd0a..328170f0b 100644 --- a/_includes/code/howto/search.bm25.gql.py +++ b/_includes/code/howto/search.bm25.gql.py @@ -72,4 +72,29 @@ gqlresponse = client.graphql_raw_query(gql_query) +gql_query = """ +# START BM25OperatorCrossPropertyAnd +{ + Get { + JeopardyQuestion( + limit: 3 + bm25: { + query: "Australian mammal cute" + # highlight-start + searchOperator: { + operator: AndCross, + } + # highlight-end + } + ) { + question + answer + } + } +} +# END BM25OperatorCrossPropertyAnd +""" + +gqlresponse = client.graphql_raw_query(gql_query) + client.close() diff --git a/_includes/code/howto/search.bm25.py b/_includes/code/howto/search.bm25.py index 696fae0b3..36ad62f4d 100644 --- a/_includes/code/howto/search.bm25.py +++ b/_includes/code/howto/search.bm25.py @@ -107,6 +107,36 @@ # End test +# ============================ +# ===== BM25 w/ AND_CROSS ===== +# ============================ + +# START BM25OperatorCrossPropertyAnd +# highlight-start +from weaviate.classes.query import BM25Operator +# highlight-end + +jeopardy = client.collections.use("JeopardyQuestion") +response = jeopardy.query.bm25( + # highlight-start + query="African desert wind", + # Each token must be matched by at least one searched property, + # but not necessarily all by the same property + operator=BM25Operator.and_cross(), + # highlight-end + limit=3, +) + +for o in response.objects: + print(o.properties) +# END BM25OperatorCrossPropertyAnd + + +# Tests +assert response.objects[0].collection == "JeopardyQuestion" +# End test + + # ================================================ # ===== BM25 Query with score / explainScore ===== # ================================================ diff --git a/_includes/code/howto/search.similarity.mmr.py b/_includes/code/howto/search.similarity.mmr.py index 30811ab89..feb486f2b 100644 --- a/_includes/code/howto/search.similarity.mmr.py +++ b/_includes/code/howto/search.similarity.mmr.py @@ -126,6 +126,83 @@ relevant_questions = [o.properties["question"] for o in response_relevant.objects] assert diverse_questions != relevant_questions, "Pure diversity and pure relevance should differ" +# START MMRHybridExample +from weaviate.classes.query import Diversity + +collection = client.collections.get("MMRDemo") + +# Fuse the keyword and vector results into 20 candidates, then select 5 diverse results +response = collection.query.hybrid( + query="Question", + vector=base_vec, + limit=20, + # highlight-start + diversity_selection=Diversity.mmr( + limit=5, + balance=0.5, + ), + # highlight-end +) + +for o in response.objects: + print(o.properties["question"]) +# END MMRHybridExample + +# Test +assert len(response.objects) == 5 +hybrid_mmr_questions = [o.properties["question"] for o in response.objects] + +hybrid_standard = collection.query.hybrid( + query="Question", + vector=base_vec, + limit=5, +) +hybrid_standard_questions = [o.properties["question"] for o in hybrid_standard.objects] +assert set(hybrid_standard_questions) != set( + hybrid_mmr_questions +), "MMR should select different items than standard hybrid search" + +# START MMRPagination +from weaviate.classes.query import Diversity + +collection = client.collections.get("MMRDemo") + +# The query limit is the size of the window that gets diversified. +# The diversity limit is the page size. +query_limit = 10 +page_size = 3 + +# Advance offset by the query limit, NOT by the number of returned objects +for offset in range(0, 30, query_limit): + page = collection.query.near_vector( + near_vector=base_vec, + limit=query_limit, + # highlight-start + offset=offset, + diversity_selection=Diversity.mmr(limit=page_size, balance=0.5), + # highlight-end + ) + + for o in page.objects: + print(offset, o.properties["question"]) +# END MMRPagination + +# Test +paged_questions = [] +for offset in range(0, 30, query_limit): + page = collection.query.near_vector( + near_vector=base_vec, + limit=query_limit, + offset=offset, + diversity_selection=Diversity.mmr(limit=page_size, balance=0.5), + ) + paged_questions += [o.properties["question"] for o in page.objects] + +assert len(paged_questions) == 9 +assert len(set(paged_questions)) == len( + paged_questions +), "Advancing offset by the query limit must not repeat objects across pages" + # Cleanup client.collections.delete("MMRDemo") client.close() diff --git a/_includes/feature-notes/v137-preview.mdx b/_includes/feature-notes/v137-preview.mdx index 156891a60..eeafa5aa2 100644 --- a/_includes/feature-notes/v137-preview.mdx +++ b/_includes/feature-notes/v137-preview.mdx @@ -1,7 +1,6 @@ -:::caution Preview — added in `v1.37` +:::info Added in `v1.37.3` and `v1.38.6` -This is a preview feature. The API may change in future releases. - -- **Multi-node clusters**: MMR reranking may produce suboptimal results for collections whose shards are distributed across multiple nodes, since each shard returns its own candidate set before the coordinator reranks them. We are actively working on improving this. +**Diversity selection (MMR)** for vector search was added in **`v1.37.3`**.
    +**Diversity selection (MMR)** for hybrid search was added in **`v1.38.6`**. ::: diff --git a/_includes/release-history.md b/_includes/release-history.md index c830af81a..a06518986 100644 --- a/_includes/release-history.md +++ b/_includes/release-history.md @@ -2,17 +2,18 @@ This table lists recent Weaviate Database versions and corresponding client libr | Weaviate Database
    ([GitHub][cWeaviate]) | First
    release date | Python
    ([GitHub][cPython]) | TypeScript/
    JavaScript
    ([GitHub][cTypeScript]) | Go
    ([GitHub][cGo]) | Java
    ([GitHub][cJava]) | C#
    ([GitHub][cCSharp]) | | :------------------------------------------------------------------ | :---------------------- | :-------------------------------------------------------------------------------: | :--------------------------------------------------------------------------: | :-------------------------------------------------------------------------: | :-----------------------------------------------------------------: | :-----------------------------------------------------------------------------: | +| [1.39.x](https://github.com/weaviate/weaviate/releases/tag/v1.39.0) | 2026-08-04 | [4.23.x](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.23.0) | - | - | - | - | | [1.38.x](https://github.com/weaviate/weaviate/releases/tag/v1.38.0) | 2026-06-05 | [4.22.x](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.22.0) | [3.14.x](https://github.com/weaviate/typescript-client/releases/tag/v3.14.0) | - | [6.3.0](https://github.com/weaviate/java-client/releases/tag/6.3.0) | - | | [1.37.x](https://github.com/weaviate/weaviate/releases/tag/v1.37.0) | 2026-04-16 | [4.21.x](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.21.0) | [3.13.x](https://github.com/weaviate/typescript-client/releases/tag/v3.13.0) | [5.7.3](https://github.com/weaviate/weaviate-go-client/releases/tag/v5.7.3) | [6.2.0](https://github.com/weaviate/java-client/releases/tag/6.2.0) | N/A | | [1.36.x](https://github.com/weaviate/weaviate/releases/tag/v1.36.0) | 2026-02-24 | [4.20.x](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.20.0) | [3.12.x](https://github.com/weaviate/typescript-client/releases/tag/v3.12.0) | [5.7.x](https://github.com/weaviate/weaviate-go-client/releases/tag/v5.7.0) | [6.1.0](https://github.com/weaviate/java-client/releases/tag/6.1.0) | [1.0.1](https://github.com/weaviate/weaviate-dotnet-client/releases/tag/v1.0.1) | | [1.35.x](https://github.com/weaviate/weaviate/releases/tag/v1.35.0) | 2025-12-17 | [4.19.x](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.19.0) | [3.11.x](https://github.com/weaviate/typescript-client/releases/tag/v3.11.0) | [5.6.x](https://github.com/weaviate/weaviate-go-client/releases/tag/v5.6.0) | [6.0.0](https://github.com/weaviate/java-client/releases/tag/6.0.0) | [1.0.0](https://github.com/weaviate/weaviate-dotnet-client/releases/tag/v1.0.0) | -| [1.34.x](https://github.com/weaviate/weaviate/releases/tag/v1.34.0) | 2025-11-05 | [4.18.x](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.18.0) | [3.10.x](https://github.com/weaviate/typescript-client/releases/tag/v3.10.0) | [5.6.x](https://github.com/weaviate/weaviate-go-client/releases/tag/v5.6.0) | [6.0.0](https://github.com/weaviate/java-client/releases/tag/6.0.0) | - |
    Older releases | Weaviate Database
    ([GitHub][cWeaviate]) | First
    release date | Python
    ([GitHub][cPython]) | TypeScript/
    JavaScript
    ([GitHub][cTypeScript]) | Go
    ([GitHub][cGo]) | Java
    ([GitHub][cJava]) | | :------------------------------------------------------------------ | :---------------------- | :-------------------------------------------------------------------------------: | :------------------------------------------------------------------------: | :---------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | +| [1.34.x](https://github.com/weaviate/weaviate/releases/tag/v1.34.0) | 2025-11-05 | [4.18.x](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.18.0) | [3.10.x](https://github.com/weaviate/typescript-client/releases/tag/v3.10.0) | [5.6.x](https://github.com/weaviate/weaviate-go-client/releases/tag/v5.6.0) | [6.0.0](https://github.com/weaviate/java-client/releases/tag/6.0.0) | | [1.33.x](https://github.com/weaviate/weaviate/releases/tag/v1.33.0) | 2025-09-25 | [4.17.x](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.17.0) | [3.9.x](https://github.com/weaviate/typescript-client/releases/tag/v3.9.0) | [5.5.x](https://github.com/weaviate/weaviate-go-client/releases/tag/v5.5.0) | [5.5.x](https://github.com/weaviate/java-client/releases/tag/5.5.0) | | [1.32.x](https://github.com/weaviate/weaviate/releases/tag/v1.32.0) | 2025-07-14 | [4.16.x](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.16.0) | [3.8.x](https://github.com/weaviate/typescript-client/releases/tag/v3.8.0) | [5.3.x](https://github.com/weaviate/weaviate-go-client/releases/tag/v5.3.0) | [5.4.x](https://github.com/weaviate/java-client/releases/tag/5.4.0) | | [1.31.x](https://github.com/weaviate/weaviate/releases/tag/v1.31.0) | 2025-05-30 | [4.15.x](https://github.com/weaviate/weaviate-python-client/releases/tag/v4.15.0) | [3.6.x](https://github.com/weaviate/typescript-client/releases/tag/v3.6.0) | [5.2.x](https://github.com/weaviate/weaviate-go-client/releases/tag/v5.2.0) | [5.3.x](https://github.com/weaviate/java-client/releases/tag/5.3.0) | diff --git a/docs/deploy/configuration/backups.md b/docs/deploy/configuration/backups.md index 784983d5f..419bacbe2 100644 --- a/docs/deploy/configuration/backups.md +++ b/docs/deploy/configuration/backups.md @@ -522,6 +522,77 @@ Base backups (and any intermediate incremental backups in a chain) must remain a ::: +### List Backups + +You can list the backups that are stored in a backup backend. The listing reports the status of each backup, the collections it holds, its size, and, for an incremental backup, the backup it was built on. This is how you inspect an existing [chain of incremental backups](#chained-incremental-backups) and confirm that every backup the chain depends on is still present. + +```js +GET /v1/backups/{backend} +``` + +#### Parameters + +##### URL Parameters + +| Name | Type | Required | Description | +| ---- | ---- | ---- | ---- | +| `backend` | string | yes | The name of the backup provider module without the `backup-` prefix, for example `s3`, `gcs`, or `filesystem`. | + +##### Query Parameters + +| Name | Type | Required | Default | Description | +| ---- | ---- | ---- | ---- | ---- | +| `order` | string | no | `desc` | Sort the returned backups by start time, either `asc` (oldest first) or `desc` (newest first). | + +##### Response fields + +| name | type | description | +| ---- | ---- | ---- | +| `id` | string | The identifier of the backup. | +| `classes` | array | The collections the backup contains. | +| `status` | string | The status of the backup, such as `SUCCESS` or `FAILED`. | +| `startedAt` | date | When the backup started. | +| `completedAt` | date | When the backup finished, successfully or not. | +| `size` | number | The size of the backup in GiB, measured before compression. | +| `incremental_base_backup_id` | string | The identifier of the backup that this [incremental backup](#incremental-backups) was built on. Empty when the backup is a full backup. Only returned to root users, see below. Introduced in Weaviate `v1.37.6`. | + +The listing only includes backups whose collections you are authorized to read. Backups you have no read access to are left out rather than causing an error. + +:::caution One name, two different things + +`incremental_base_backup_id` appears on both sides of the backup API, and the two are not interchangeable: + +- On the **create** side it is an input that you supply. It names the backup that the new backup should build on, as described under [Create an incremental backup](#create-an-incremental-backup). +- On the **list** side it is a read-only output. It reports the backup that an already-created backup was built on, which is what lets you walk a chain back to its full base backup. + +You cannot choose a base backup through the list API. The value it returns reflects a decision that was made when that backup was created. + +::: + +:::info The base backup identifier is only returned to root users + +The list-side `incremental_base_backup_id` is treated as sensitive. Weaviate only fills it in when it has confirmed that the caller is a [root user](/docs/deploy/configuration/configuring-rbac.md). Any other caller receives an empty value for this field, even one with full backup permissions and even when the backup really is incremental. If you are auditing a backup chain and every entry comes back empty, check the identity you are connecting with before concluding that no incremental backups exist. + +::: + + + +
    + Code output + +``` +base-backup BackupStatus.SUCCESS None +incremental-backup-1 BackupStatus.SUCCESS base-backup +incremental-backup-2 BackupStatus.SUCCESS incremental-backup-1 +``` + +
    + ### Cancel Backup An ongoing backup can be cancelled at any time. The backup process will be stopped, and the backup will be marked as `CANCELLED`. diff --git a/docs/deploy/configuration/replica-movement.mdx b/docs/deploy/configuration/replica-movement.mdx index 87f874e69..86899d478 100644 --- a/docs/deploy/configuration/replica-movement.mdx +++ b/docs/deploy/configuration/replica-movement.mdx @@ -146,10 +146,13 @@ The movement operation can have one of the following states: - `REGISTERED` - `HYDRATING` - `FINALIZING` +- `INTEGRATING` - `DEHYDRATING` - `READY` - `CANCELLED` +`INTEGRATING` was added in `v1.38.0`. On earlier versions the operation goes straight from `FINALIZING` to `DEHYDRATING` for a move, or to `READY` for a copy. + To learn more about the replication states, check out [Concepts: Replication architecture](/docs/weaviate/concepts/replication-architecture/consistency.md#replica-movement). ::: diff --git a/docs/weaviate/api/graphql/search-operators.md b/docs/weaviate/api/graphql/search-operators.md index 7cd5023a7..b2474aad4 100644 --- a/docs/weaviate/api/graphql/search-operators.md +++ b/docs/weaviate/api/graphql/search-operators.md @@ -435,9 +435,15 @@ To mitigate this effect, Weaviate automatically performs a search with a higher -Use `bm25SearchOperator` to set how many of the query tokens must be present within a single searched property for an object to be considered a match in the keyword (bm25) search portion of the hybrid search. This is useful when you want to ensure that only objects with a certain number of relevant keywords are returned. +Use `bm25SearchOperator` to set how the query tokens must match for an object to be considered a match in the keyword (bm25) search portion of the hybrid search. This is useful when you want to ensure that only objects with a certain number of relevant keywords are returned. -The available options are `And`, or `Or`. With `And`, all of the query tokens must appear together within a single searched property; tokens spread across different properties do not match. If `Or` is set, an additional parameter `minimumOrTokensMatch` must be specified, which defines how many of the query tokens must be present within a single searched property for the object to be considered a match. +The available options are `And`, `Or`, and `AndCross`: + +| Option | Description | +| ------ | ----------- | +| `And` | All of the query tokens must appear together within a single searched property. Tokens spread across different properties do not match. | +| `Or` | An additional parameter `minimumOrTokensMatch` must be specified, which defines how many of the query tokens must be present within a single searched property for the object to be considered a match. | +| `AndCross` | Every query token must be matched by at least one of the searched properties, so the tokens can be spread across different properties. All searched properties must share the same tokenization and analyzer settings, otherwise the query fails with an error. (available from `v1.38.8`) | If not set, the keyword search behaves as if `Or` was set with a `minimumOrTokensMatch` of `1`. @@ -458,7 +464,7 @@ The `bm25` operator supports the following variables: | --------- | -------- | ----------- | | `query` | yes | The keyword search query. | | `properties` | no | Array of properties (fields) to search in, defaulting to all properties in the collection. | -| `searchOperator` | no | set how many of the query tokens must be present within a single searched property for an object to be considered a match. (available from `v1.31.0`) | +| `searchOperator` | no | Set how the query tokens must match for an object to be considered a match. See [Search operator](#search-operator) for the available options. (available from `v1.31.0`) | :::info Boosting properties Specific properties can be boosted by a factor specified as a number after the caret sign, for example `properties: ["title^3", "summary"]`. @@ -537,12 +543,39 @@ import GraphQLFiltersBM25FilterExample from '/_includes/code/graphql.filters.bm2 -Use `searchOperator` to set how many of the query tokens must be present within a single searched property for an object to be considered a match. This is useful when you want to ensure that only objects with a certain number of relevant keywords are returned. +Use `searchOperator` to set how the query tokens must match for an object to be considered a match. This is useful when you want to ensure that only objects with a certain number of relevant keywords are returned. + +The available options are `And`, `Or`, and `AndCross`: -The available options are `And`, or `Or`. With `And`, all of the query tokens must appear together within a single searched property; tokens spread across different properties do not match. If `Or` is set, an additional parameter `minimumOrTokensMatch` must be specified, which defines how many of the query tokens must be present within a single searched property for the object to be considered a match. +| Option | Description | +| ------ | ----------- | +| `And` | All of the query tokens must appear together within a single searched property. Tokens spread across different properties do not match. | +| `Or` | An additional parameter `minimumOrTokensMatch` must be specified, which defines how many of the query tokens must be present within a single searched property for the object to be considered a match. | +| `AndCross` | Every query token must be matched by at least one of the searched properties, so the tokens can be spread across different properties. All searched properties must share the same tokenization and analyzer settings, otherwise the query fails with an error. (available from `v1.38.8`) | If not set, the keyword search behaves as if `Or` was set with a `minimumOrTokensMatch` of `1`. +An `AndCross` query example: + +```graphql +{ + Get { + JeopardyQuestion( + limit: 3 + bm25: { + query: "African desert wind" + searchOperator: { + operator: AndCross + } + } + ) { + question + answer + } + } +} +``` + ## ask Enabled by the module: [Question Answering](/weaviate/modules/qna-transformers.md). diff --git a/docs/weaviate/client-libraries/python/notes-best-practices.mdx b/docs/weaviate/client-libraries/python/notes-best-practices.mdx index e70a2a025..d54190bd3 100644 --- a/docs/weaviate/client-libraries/python/notes-best-practices.mdx +++ b/docs/weaviate/client-libraries/python/notes-best-practices.mdx @@ -275,7 +275,7 @@ Note that these lists are reset when a batching process is initialized. So make language="py" /> -`collection.data.ingest()` does not use a batching context, so it reports failures through its return value instead. Check `result.errors`, a dictionary that holds one entry per failed object, keyed by the position of the object in the input. The [one-shot ingest](#one-shot-ingest) example above shows this pattern. +`collection.data.ingest()` does not use a batching context, so it reports failures through its return value instead. Check `result.has_errors` for a quick summary flag that tells you whether anything failed. For the detail, check `result.errors`, a dictionary that holds one entry per failed object, keyed by the position of the object in the input. The [one-shot ingest](#one-shot-ingest) example above shows this pattern. ### Batch vectorization diff --git a/docs/weaviate/concepts/replication-architecture/consistency.md b/docs/weaviate/concepts/replication-architecture/consistency.md index 7f28f9be0..122e21103 100644 --- a/docs/weaviate/concepts/replication-architecture/consistency.md +++ b/docs/weaviate/concepts/replication-architecture/consistency.md @@ -355,6 +355,8 @@ Each replica movement operation progresses through a workflow designed to mainta - **FINALIZING**: The bulk data transfer is complete, and the new replica is catching up on any writes that occurred during the transfer. This ensures the replica is fully synchronized with the latest data. You can use the [`REPLICA_MOVEMENT_MINIMUM_ASYNC_WAIT` environment variable](/docs/deploy/configuration/env-vars/index.md#REPLICA_MOVEMENT_MINIMUM_ASYNC_WAIT) to adjust the wait time which ensures that any in progress writes have been completed and replicated to the target node. +- **INTEGRATING** (added in `v1.38.0`): The new replica has joined the shard's replica set and is being brought into the write path on every node. The operation waits until all nodes agree that the new replica is a write target, so that no node can acknowledge a write that skips it. Each node reports that it reached this state only after its own in-flight writes to the shard have drained, which prevents a write that was already accepted from being lost. Once the cluster agrees, the last writes recorded on the source during the transition are applied to the new replica, and the source stops recording further changes for this operation. For copy operations, the next state is **READY**. For move operations, the next state is **DEHYDRATING**. + - **DEHYDRATING**: For move operations, after the new replica is ready, the original replica on the source node is being removed. - **READY**: The operation has completed successfully. The new replica is fully synchronized and ready to serve traffic. For move operations, the source replica has been removed. diff --git a/docs/weaviate/model-providers/_includes/provider.vectorizer.py b/docs/weaviate/model-providers/_includes/provider.vectorizer.py index 1acbf121d..bc0b2400d 100644 --- a/docs/weaviate/model-providers/_includes/provider.vectorizer.py +++ b/docs/weaviate/model-providers/_includes/provider.vectorizer.py @@ -25,7 +25,7 @@ region="us-east-1", source_properties=["title"], service="bedrock", - model="titan-embed-text-v2:0", + model="amazon.titan-embed-text-v2:0", ) ], # highlight-end @@ -62,17 +62,40 @@ # START FullVectorizerAWS from weaviate.classes.config import Configure +# For Bedrock client.collections.create( "DemoCollection", # highlight-start vector_config=[ - Configure.Vectors.text2vec_aws( + Configure.Vectors.text2vec_aws_bedrock( + name="title_vector", + region="us-east-1", + source_properties=["title"], + model="amazon.titan-embed-text-v2:0", # Required + # Further options + # dimensions=512, # Amazon models only + ) + ], + # highlight-end + # Additional parameters not shown +) + +# clean up +client.collections.delete("DemoCollection") + +# For SageMaker +client.collections.create( + "DemoCollection", + # highlight-start + vector_config=[ + Configure.Vectors.text2vec_aws_sagemaker( name="title_vector", region="us-east-1", source_properties=["title"], - service="bedrock", # `bedrock` or `sagemaker` - model="titan-embed-text-v2:0", # If using `bedrock`, this is required - # endpoint="", # If using `sagemaker`, this is required + endpoint="", # Required + # Further options + # target_model="", + # target_variant="", ) ], # highlight-end @@ -294,12 +317,13 @@ client.collections.create( "DemoCollection", # highlight-start - vector_config=Configure.Vectors.text2vec_google( + vector_config=Configure.Vectors.text2vec_google_vertex( name="title_vector", source_properties=["title"], project_id="", # Required for Vertex AI # Further options # model="", + # location="", # api_endpoint="", ), # highlight-end diff --git a/docs/weaviate/model-providers/aws/embeddings.md b/docs/weaviate/model-providers/aws/embeddings.md index 3fafe5b4d..49fec0529 100644 --- a/docs/weaviate/model-providers/aws/embeddings.md +++ b/docs/weaviate/model-providers/aws/embeddings.md @@ -185,12 +185,34 @@ import VectorizationBehavior from '/_includes/vectorization.behavior.mdx'; ### Vectorizer parameters -The following examples show how to configure AWS-specific options. +**Common parameters:** +- `service` (Optional): The AWS service to use, either `bedrock` or `sagemaker`. Defaults to `bedrock`. +- `region` (Required): The AWS region to send requests to, e.g. `us-east-1`. -The AWS region setting is required for all AWS integrations. +**Bedrock parameters:** +- `model` (Required): The full Bedrock model identifier, e.g. `amazon.titan-embed-text-v2:0`. +- `dimensions` (Optional): The size of the embedding to request from the model, e.g. `512`. -- Bedrock users must set `service` to `bedrock` and provide the `model` name. -- SageMaker users must set `service` to `sagemaker` and provide the `endpoint` address. +**SageMaker parameters:** +- `endpoint` (Required): The name of the SageMaker endpoint to invoke, e.g. `tei-xxx`. +- `targetModel` (Optional): The model to target on a multi-model endpoint. +- `targetVariant` (Optional): The production variant to target on the endpoint. + +#### `service` + +Weaviate falls back to `bedrock` when `service` is not set, so a SageMaker configuration has to set it to `sagemaker`. Any value other than `bedrock` or `sagemaker` is rejected when the collection is created. + +Some clients offer service-specific constructors, such as `text2vec_aws_bedrock` and `text2vec_aws_sagemaker`, which select the service for you. Examples built on those constructors do not pass `service` at all. Every other example on this page sets it explicitly, as does any configuration written directly against the collection definition. + +#### `dimensions` + +`dimensions` was added in `v1.36.19`, and is also available from `v1.37.10`, `v1.38.2`, and `v1.39.0` onward. + +Weaviate only forwards `dimensions` to Amazon models on Bedrock, such as the Titan and Nova embedding families. Cohere models on Bedrock, and SageMaker endpoints, accept the setting in the collection configuration but ignore it when embeddings are generated, so their vectors keep the model's default size. Check the model's documentation for the sizes it supports. + +#### Example configuration + +The following examples show how to configure AWS-specific options for each service. diff --git a/docs/weaviate/release-notes/index.md b/docs/weaviate/release-notes/index.md index ca97aaac2..1bbd63dd4 100644 --- a/docs/weaviate/release-notes/index.md +++ b/docs/weaviate/release-notes/index.md @@ -17,6 +17,11 @@ import QuickLinks from "/src/components/QuickLinks"; export const pythonCardsData = [ { +title: "v1.39", +link: "https://github.com/weaviate/weaviate/releases/tag/v1.39.0", +icon: "fa fa-tags", +}, +{ title: "v1.38", link: "https://github.com/weaviate/weaviate/releases/tag/v1.38.0", icon: "fa fa-tags", @@ -36,11 +41,6 @@ title: "v1.35", link: "https://weaviate.io/blog/weaviate-1-35-release", icon: "fa fa-tags", }, -{ -title: "v1.34", -link: "https://weaviate.io/blog/weaviate-1-34-release", -icon: "fa fa-tags", -}, ]; diff --git a/docs/weaviate/search/bm25.md b/docs/weaviate/search/bm25.md index 92106894e..0f24fd76d 100644 --- a/docs/weaviate/search/bm25.md +++ b/docs/weaviate/search/bm25.md @@ -99,7 +99,7 @@ import SearchOperators from '/_includes/feature-notes/search-operators.mdx'; -Search operators define the minimum number of query [tokens](#set-tokenization) that must be present within a single searched property for an object to be returned. The options are `and`, or `or` (default). +Search operators define how many of the query [tokens](#set-tokenization) must match, and whether they must all match within a single searched property. The options are `or` (default), `and`, and `and_cross`. ### `or` @@ -179,6 +179,48 @@ With the `and` operator, the search returns objects where all tokens in the sear +### `and_cross` + +:::info Added in `v1.38.8` +::: + +With the `and_cross` operator, every token in the search string must be matched by at least one of the searched properties, but the tokens do not all have to occur in the same property. An object whose title matches one token and whose body matches the rest is a match for `and_cross`, and is not a match for `and`. + +Because it relaxes the single-property requirement, `and_cross` returns every object that `and` returns, and usually more. + +:::caution All searched properties must be configured alike + +`and_cross` requires every searched property to share the same tokenization and the same analyzer settings, which means the tokenizer, accent folding and its exceptions, and the stopword preset. If they differ, the query fails with an error instead of returning fewer results: + +``` +OPERATOR_AND_CROSS requires all searched properties to share the same tokenization and analyzer settings +``` + +If a collection mixes tokenizations, restrict the search to a compatible set of properties. See [Search on selected properties only](#search-on-selected-properties-only). + +::: + +The examples below use Python and GraphQL, because `and_cross` is currently available in the Python client and not yet in the TypeScript, Go, Java, or C# clients. + + + + + + + + + + ## Retrieve BM25F scores You can retrieve the BM25F `score` values for each returned object. diff --git a/docs/weaviate/search/hybrid.md b/docs/weaviate/search/hybrid.md index 46d3839e0..7f0f13176 100644 --- a/docs/weaviate/search/hybrid.md +++ b/docs/weaviate/search/hybrid.md @@ -16,6 +16,7 @@ import GoCode from '!!raw-loader!/\_includes/code/howto/go/docs/mainpkg/search-h import JavaV6Code from "!!raw-loader!/\_includes/code/java-v6/src/test/java/SearchHybridTest.java"; import CSharpCode from "!!raw-loader!/\_includes/code/csharp/SearchHybridTest.cs"; import GQLCode from '!!raw-loader!/\_includes/code/howto/search.hybrid.gql.py'; +import MMRPyCode from '!!raw-loader!/\_includes/code/howto/search.similarity.mmr.py'; import BoostNote from '/_includes/feature-notes/boost.mdx'; `Hybrid` search combines the results of a vector search and a keyword (BM25F) search by fusing the two result sets. @@ -386,7 +387,9 @@ import SearchOperators from '/_includes/feature-notes/search-operators.mdx'; -Keyword (BM25) search operators define the minimum number of query [tokens](#tokenization) that must be present within a single searched property for an object to be returned. The options are `and`, or `or` (default). +Keyword (BM25) search operators define how many of the query [tokens](#tokenization) must match, and whether they must all match within a single searched property. The options are `or` (default), `and`, and `and_cross`. + +The keyword leg of a hybrid query accepts the same operators as a standalone keyword search. For `and_cross`, which matches every token across the searched properties combined, see [BM25 search: `and_cross`](./bm25.md#and_cross). ### `or` @@ -1051,6 +1054,38 @@ The boost runs once over the **fused** hybrid result. The BM25 and vector sub-se See [Boost](./boost.md) for the supported condition types (filter, property value, time decay, numeric decay), curve choices, blending semantics, and depth tuning. +## Diversity selection (MMR) + +:::info Added in `v1.38.6` +::: + +Hybrid search fuses a keyword result set and a vector result set, which often means the top of the fused list is a cluster of near-duplicates. **Maximum Marginal Relevance (MMR)** reranks that list to balance relevance with diversity, so that each selected object adds something new to the result set. + +Diversity selection runs after fusion. Both search legs run first, their results are fused with the configured `alpha` and fusion method, and the diversity pass then picks a diverse subset of the fused candidates. + +The examples in this section are Python only, because diversity selection is currently available in the Python client and not yet in the TypeScript, Go, Java, or C# clients. There is no GraphQL equivalent. + + + + + + + +Important notes: + +- **Top-level only**: set diversity selection on the hybrid query itself. Setting it on a sub-search is rejected with an error. +- **Two limits**: the query's top-level `limit` is the candidate window that gets diversified, and the diversity `limit` is the number of results returned. The diversity `limit` must be at least `1` and no larger than the query `limit`. +- **Ordering**: results come back in MMR order, not fused-score order. +- **Pagination**: `offset` moves the candidate window, so it must advance by the query `limit`, not by the number of returned objects. Weaviate does not validate this, and getting it wrong silently repeats some objects across pages while skipping others. See [Pagination](./similarity.md#pagination). +- **Not supported**: multi-vector collections. Weaviate rejects these queries with an error. + +For the parameters, the relevance and diversity trade-off, and vector search examples, see [Diversity selection (MMR)](./similarity.md#diversity-selection-mmr). + ## Related pages - [Connect to Weaviate](/weaviate/connections/index.mdx) diff --git a/docs/weaviate/search/similarity.md b/docs/weaviate/search/similarity.md index 44408767e..ebabf4fcd 100644 --- a/docs/weaviate/search/similarity.md +++ b/docs/weaviate/search/similarity.md @@ -696,7 +696,7 @@ Add the `diversity_selection` parameter to any vector search query: | Parameter | Type | Description | | :-------- | :---- | :------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `limit` | int | Number of results to return after MMR reranking. Must be less than or equal to the query's top-level `limit` (the candidate set size). | +| `limit` | int | Number of results to return after MMR reranking. Must be at least `1` and no larger than the query's top-level `limit` (the candidate set size). Weaviate returns an error if it is omitted or out of range. | | `balance` | float | Controls the relevance-diversity trade-off (0.0–1.0). `0.0` = pure diversity, `0.5` = balanced, `1.0` = pure relevance (equivalent to standard search). | + Candidate window, worked example, and deep pages + +A diversified query works with two limits: + +- the query's top-level `limit` is the **candidate window** that gets diversified, and +- the diversity `limit` is the **page size**, or how many objects come back. + +Each page is taken from the slice `[offset, offset + limit)` of the relevance-ranked results, so `offset` must advance by the query `limit`: + + + +The usual pagination idiom, adding the number of returned objects to `offset`, is the failing case here. The page size is always smaller than or equal to the candidate window, so consecutive windows overlap. With a query `limit` of `10` and a diversity `limit` of `3`, advancing `offset` by `3` reads the windows `[0:10]`, `[3:13]`, and `[6:16]`, which is how objects come back twice while others are skipped. + +When diversity selection is combined with a boost or with hybrid search, deep pages are also not stable slices of one fixed ranking. Both the boost pool and the two hybrid search legs fetch more candidates as `offset` grows, so which objects can reach a given page depends on how deep you have paged. + +
    + ## Soft-rank with Boost diff --git a/pyproject.toml b/pyproject.toml index 657b44ece..17b920ae8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,7 +18,7 @@ dependencies = [ "requests>=2.32.3", "tqdm>=4.67.1", "weaviate-agents>=1.7.0", - "weaviate-client==4.22.0", + "weaviate-client==4.23.0", "weaviate-demo-datasets>=0.8.1", "weaviate-engram>=0.3.0", "anthropic>=0.40.0", diff --git a/tests/docker-compose-anon-2.yml b/tests/docker-compose-anon-2.yml index 658c43a83..8567892c7 100644 --- a/tests/docker-compose-anon-2.yml +++ b/tests/docker-compose-anon-2.yml @@ -8,7 +8,7 @@ services: - '8080' - --scheme - http - image: cr.weaviate.io/semitechnologies/weaviate:1.38.0 + image: cr.weaviate.io/semitechnologies/weaviate:1.39.0 ports: - 8090:8080 - 50061:50051 diff --git a/tests/docker-compose-anon-bind.yml b/tests/docker-compose-anon-bind.yml index 094e83b74..0bc137c0b 100644 --- a/tests/docker-compose-anon-bind.yml +++ b/tests/docker-compose-anon-bind.yml @@ -8,7 +8,7 @@ services: - '8080' - --scheme - http - image: cr.weaviate.io/semitechnologies/weaviate:1.38.0 + image: cr.weaviate.io/semitechnologies/weaviate:1.39.0 ports: - 8380:8080 - 50351:50051 diff --git a/tests/docker-compose-anon-clip.yml b/tests/docker-compose-anon-clip.yml index 5349933c2..3968a8867 100644 --- a/tests/docker-compose-anon-clip.yml +++ b/tests/docker-compose-anon-clip.yml @@ -8,7 +8,7 @@ services: - '8080' - --scheme - http - image: cr.weaviate.io/semitechnologies/weaviate:1.38.0 + image: cr.weaviate.io/semitechnologies/weaviate:1.39.0 ports: - 8280:8080 - 50251:50051 diff --git a/tests/docker-compose-anon-offload.yml b/tests/docker-compose-anon-offload.yml index a4ef8c56b..fbc06efc9 100644 --- a/tests/docker-compose-anon-offload.yml +++ b/tests/docker-compose-anon-offload.yml @@ -8,7 +8,7 @@ services: - '8080' - --scheme - http - image: cr.weaviate.io/semitechnologies/weaviate:1.38.0 + image: cr.weaviate.io/semitechnologies/weaviate:1.39.0 ports: - 8080:8080 - 50051:50051 diff --git a/tests/docker-compose-anon.yml b/tests/docker-compose-anon.yml index 1ff802b26..06ca2b391 100644 --- a/tests/docker-compose-anon.yml +++ b/tests/docker-compose-anon.yml @@ -8,7 +8,7 @@ services: - '8080' - --scheme - http - image: cr.weaviate.io/semitechnologies/weaviate:1.38.0 + image: cr.weaviate.io/semitechnologies/weaviate:1.39.0 ports: - 8080:8080 - 50051:50051 diff --git a/tests/docker-compose-rbac.yml b/tests/docker-compose-rbac.yml index 5ea8add68..8e542e8b8 100644 --- a/tests/docker-compose-rbac.yml +++ b/tests/docker-compose-rbac.yml @@ -7,7 +7,7 @@ services: - '8080' - --scheme - http - image: cr.weaviate.io/semitechnologies/weaviate:1.38.0 + image: cr.weaviate.io/semitechnologies/weaviate:1.39.0 ports: - 8580:8080 - 50551:50051 diff --git a/tests/docker-compose-three-nodes.yml b/tests/docker-compose-three-nodes.yml index a9bf30068..1634de0d3 100644 --- a/tests/docker-compose-three-nodes.yml +++ b/tests/docker-compose-three-nodes.yml @@ -8,7 +8,7 @@ services: - '8080' - --scheme - http - image: cr.weaviate.io/semitechnologies/weaviate:1.38.0 + image: cr.weaviate.io/semitechnologies/weaviate:1.39.0 restart: on-failure:0 ports: - "8180:8080" @@ -36,7 +36,7 @@ services: - '8080' - --scheme - http - image: cr.weaviate.io/semitechnologies/weaviate:1.38.0 + image: cr.weaviate.io/semitechnologies/weaviate:1.39.0 restart: on-failure:0 ports: - "8181:8080" @@ -65,7 +65,7 @@ services: - '8080' - --scheme - http - image: cr.weaviate.io/semitechnologies/weaviate:1.38.0 + image: cr.weaviate.io/semitechnologies/weaviate:1.39.0 restart: on-failure:0 ports: - "8182:8080" diff --git a/tests/docker-compose.yml b/tests/docker-compose.yml index 5f56fcd80..487b02a5c 100644 --- a/tests/docker-compose.yml +++ b/tests/docker-compose.yml @@ -8,7 +8,7 @@ services: - '8080' - --scheme - http - image: cr.weaviate.io/semitechnologies/weaviate:1.38.0 + image: cr.weaviate.io/semitechnologies/weaviate:1.39.0 ports: - 8099:8080 - 50052:50051

C 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 YMT8plvv)S)j$A##EsWmzyp{9eZ<$VY!~g&Q diff --git a/docs/cloud/img/wcs-api-keys.jpg b/docs/cloud/img/wcs-api-keys.jpg deleted file mode 100644 index 21d310573a9824619a1ad634bb77af9c8cdfd1c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41891 zcmeFZ2UJr{_ct1vp!D8*6KT>rh)5Ta-a&d3B0WGL3euZ^fPfH@rqZNW2_2+L?xkbLoZ%k!?gzI*TYzw7(2yVhNI!<@4-*)wzY%BKfZYI4>1pX|0r2nu z03F;901F3XXo5W500096z#RYpKms7dV*wE1IGhMT6_54bycXVV0Ks4R_y9nhCxGyu zGLLZgKZL98uQLC*6J*2!h;cbIxCDBK|1W9$ymtiu;_<|A-vQK3G<0=wcN1rSS6ANv z4`3kn7$E-`cL(A=JmZoQy9 z=hD^CaCmHNsHOW*^Di~=sT`j@d-|uak8hyAvG#o~ODk(G;_oNd&m!UI9Pmv2 z@#BYo>ipOJuloOeIiLGWGr+XypSl(ksD5|~nq_&>vUGf;9sAQK|5tR&#WlbgCxFH! zS?6c|fw*px#_^9s0-yciU*dQ=f80ai_&0xe_kZw}e|V>V@Lhk&m>O%~WM*(Ym9vMV z3y$B$@gh$Dk?;N=ywB61KkfdZKVwPe>T70#yR+aD8^9c(4v+-M0b~FQ04{(Dz!l&R z@WfpMaQ*Z@FZbt}*#H^XM}Nn^ zs{3=nJ0}cqlal=FGalJ}0Dx!>i#-zn0EjaIfa_OS?A3cL_PQ8X{|W%m<%{hCP?O+^ z;pY+H@c{6t@d&8#uzdhdTs=g1f6>1x#=|EdB)UONa`P4`PN0zrfR9H&fKNz3MD%AO z;zi)T2M|&d(Qr$s-=H;eBlYEh0M8bQ&wwvB~62T|sYy3b#(PiOwG(KaOyd`xVpJ}czOi{1_g(JLc^k8#>B?OCnRQMzRt?d zd6S#>zPO~cto*~rPj&STjZMuht!+KMefaMyom_J7ce8mAXNAt3=F@gKeL@I!EkfSQnqTjB$QxVg!q3E z0X{wf5di@K(G4OT-5|N~he&Rb{6)9^No0Q!#UG;lH(_y=;Nj{ZBqSup{Zf(MB>< z6LuB1eB8k<0mumOaFdCE8lVP1i^sUOWI4vW=9dNq{}ye#efBlI{p`hW^N_e=^K8%X z4}eGoEa28b#rJ0oJX@m^s+Frp$tOnz%2>dNI64$Ika@*xhy@fnpw1vEoqhsVhzcT+3>ITIT#) z)caAQ%4;QJr5|n(=Y81O;6ESXZ&}Yt?Yg)pdl91(e>W=qAF@@7x6dCRv7NN$UZ<5| z0TY~m)J*$Z_8$)zU2q|#R{L}PatjMclS57Zhit?5;zf11!bpQWd@c+dwXqd(VME)@){yofs8dDRNYX7tZQDF=S z^2ZQrG{qe$cQnp3emG+RPdo)NmVdIPp@_77&a+-DfD?$U%Da6|g)!xrvKs}Ww11{u z!f~^)88!7sp7$T}GPRl^|J`c~u3JO?dZIMcTw#gnK8}!9c$r(npB56i&QmtSlk*lvZhbP;ZgI9@)P=vNvg5yV*Jqix-3B+ zb26v;JURp!>|M;=ygSz1GW>xQq8>eow?9!CY0?3V93ErFIO{N9uJrXczc(28E^A={ zFZB%>Pb1#TWsZ}#le8;FOlLsuT!xhz$WDEiEvTk5(tI41`16DV&4S8Dz%&u_@!;?x z{o;Mh-A1`Q(>i5?^EdcfJ5j~;0t}{n@+N12hiMWed0|BjbVl}9i170;r1k)i7_5mb zd-2h7VF@fdm2dtfb-#pWf@V-UpNk~9w3dMK&4;h{VXsR0vKIIw((vCW-g!x9u?(ws zKjK7MoWDhA6>qJRc(vJQmM^S*i6U3u(=PPb(q$^oqKo#RxxHd&n>x_JxiQhrNr(18 z^_GF@rpn^9=YxdAxmP3kbl@4oH{G*bNGdlr8Ek#77RD81piQZ5$E~($hEf9`YNoFP zFgLZ4KgN50L&!lny{bH4rY9GVL~8`}vt9OCLO+W*E+kV*d?T1iytL50&H)E~1Ot%J zV@>_mhy@JV~FKY5CH2IeGi$qoa z9=tyT_}`c;ra7ok)NtKMHqUk1NFmg0hp=OfuHwFVc39YfMUI5^*XWG^_Y}-g&WysM;;xNHzuz*)c%>&h>uU>ST{KR-!2;kmkz;TE{X<>h*P>c>#}mz)ei;h_Rb=DKJZ?;W8dhoL#Q9ANd(%5R|>1{4(0JFrd+ z_W6KTL%k?h&9C&VX`F1;rMmv=6q&}FY8FQr9z{G0BftV2VF@rQ4Ba85;YLLeXKaVu zJ1g6RVEq8vF9T&w5)ETJT*7q%B&K?O+t;&>nRYEt?H!CuxbKJxNmrNsZucx2aiC0k z$uDDmEP$b(-UUOEYVh59M8#lO^Yfs6$Cmb~0zlznQnw%3WaT$QTB@76PJ!wEc)euL zy`yT1a9t$@O)|>F0`9NBg#2QkuGmXN*3v~3=$dqn)wKM&ZMyf;ebp8_iPl8apua%6 z)Xu#QE7Jdi-~a5;qn&HB>FChpfY4V=wz0A_eAW)#^BprLX|9k4Rx7R2&vSvX18GTw-~+n1?>sPgsuzSzHuGJ>QKUt62RmIGd6h;{&9tA}_7LQq{>A<<0H-DzZ6$&7H zq3m;+ANQkfqhT4q`azMeglcVCX;0IejM9^CYds#hY`v1k%yLLw=VG`WK!d&6>0Wtm zO=Y5n`UOq>K@6K;6Yy)blWUi*42^HS(y4im;lTpB)uolvVmY`_?g(PIY8IkSjd8$n zw)$vIh%cMjD8pk*r|R8fy;{xmW_m53#AFR|5ya{4g@w0w?WYe_A8W51QM}zt#7B@T zc~qSGHxcPoL$hgT@8x!H%c8=arD0+LPa_Q-eV3htJpq_b=Ei!D#FZ0Bu6M8NH`BBL zDm*lZzx>>_=G6shgm092(#Vp_t$q#aS2vk=Vd5BC%z7aQV!k_qc4L0PA%-QSuifzG z*IiF3`$zG-B!;i+v_(4(+wT5&uQ^~s@)$iD9-f90LN`0GH>9OZgJm709wLs%qvnJw zUe(F;kA~dv6RKCbCvi-Dnc?V5aT8!SrjaTSngu6 zc%iJev3OGH6WPt8Epy6j_F$ghSfVBV0uVwkvKXv9zfU>fz#KUNLl|BvGa{TuHZZwc z6;=BB`eWW^Gw)wii#^FUPw4q7BALrvCzOq$B5J|jWrIL ziG5#}x>IY=%lp2O(W9g~M?bg6>$rYDZDGC-LX5USW^V1ps}iI9&w2`(+Yvv>q_4VJ zn5xy^80_@3%E!w3J_uhB8nUZsWZb1(rtIdR_@;*QvK9yX6e(UfmK}su=d;?cE?f7L zU5L#+R*=$5WVvr6C}OA}^8yY<-JVa7K1sw`P~;s@PIvaw+cm{$?x`mYjqO)-!3^hD zeJ-t0ZY_|vIc`h(?yMGGchG{@Fl7~ZP1J9}?wVxSE$Nel;6mEW(J8l%0xB&ksE|vl zP3U}}huazd z60e!DXKl*XOm|BjA?CL?o|wEO{B7|q15Ji9LwFk@=6ek(K}zsm zl;F|l>Snb>F(a@#NUkn7%YI5{M>uNZE0?*Gv(c>&UT9w=@o`NtXz$#2N|hLV59Q-p zak$1XZDQ~Zt<}t1k+&YWLznRv$`oASePe=kTTo69i;q?+A_< z+~hn~3l1db9VonkXv!+_&VDxh%FAtTwMzVlZ&gwDy`4wjhik^#Jq-HN^Uy;`!{e+? z(k}sXA2vL{d}ggx{bExhlte(77k@ydWpJebDM;yjx&<*? zGZ_D)gWAazwd(XV(X+0)z`GPuylNAdN))9o$EcJql6+K}o20-CA3iKrUv0f)8ZS$F zeZ7C3&>@Pb?}OG0Bmfc69t0=Lwf#U(^tH+f4*!`f3iJ}weyeZExCz++9K zl!}Nnz|4lJ=DfpvK$oL*;1!_K_P9z$f zhTc^3Jt0Cl!1toTv`A+-dtCBKB%7X?vdTyGXVRC)YjRe+YYdE+&3AI1`3cNQ@_rVH zjKqcg$HIO{{qx-B>mqaje4+Zds*#kn=)Hzo4y}#nm2!n!!B!@B6r~Ir_NLy^l#0P) z`mL949K4tM{*cz~fM`T6D^w9ZD+U%*3r%qol4n z=7$9karoHuV*$jS+^978m6xgj$^sY)RDsW)v)ddmh1M4oL=J$)X&L0UcSlu(c2#u7l>-sr(ZqFxSXr!GvL*& zee)?nxrF9U``zWiR7+5|DlXvaR)ly0IW>LGrIF%&LX9%dUxAB4!%H60@=h_ovu3{8slmFbmu?p`S8(}LYo^w>w38`^iNb>NwzMGHvd9EWSX zG&wg!)*Qk9_yS8X_}$s!S+&N_#rh+Rjg?%^Igr13?+CQITeH4@ie8SeDk(fM>`L=$ z)Lw=n^wVy@`hc;}24L^PkN#*BRD1eo?K6{6s{G}MM|j*1t2f%ul9RWX>1Q#sP|^+} zM7tSE{fY&wf-oq{DMf9b7&d=FMvRp<{4Q9BhP@h2w`*gtGRt+zVd`n{dta&T9T^ch z0crRN!;9nqTOveZarx#sn~|^Eoa{yS8+}x=Nn0Lt6G}4c$k{w!b(*cAaH2tEq7yuiHw5(bZgY%kdB^2XYIvs0rQnM ze>0jKbFZAkhO;q;lem)-McQ}nK>7sX-YX1@{bsGr@Lt9{i-RY_k@2gPNOr$ftQL!I z(r2aKk6krs$^;1gjhvL6^W^JSU~cCUue|E?6z?9zx=LERO1ZneiZ-I(&0qI>2kbmJ za&dFb%4$zUg48xjBT44mr_eq~-VO7#O~d#lnTBT?Rr&E-YeSSLvMQA+98)28;-1n3 z*BRpmU$p}dnYJl@Ot#)g949LMg}CRjS6DL3unk>9V~Sw&nf)B;1BKHWedc87YkIO# zt4E=;LIa{-m(gPi@0WCzQE3|vFQN6&qXa~Bml_RP$pdVN6f|p?X}lV!b2!$w<9AOy zIOcg>Q$SYR_s!-tnIw3HEYraa?Su+PoLQnwst+8x zr%aKr5;0p#Me3ro(pNd;bh$jRJ6OO|howj$2WDOkQHQ2gX(}y2-PoL))|7l#I2AO# zeP*v^o0XwZP4@CGZ=j6=(~U2kdzf2}a07`B%`FH3%u z*Tb$kDrKWJ{iawnTBh`Ca?F8Inj5Fwgv-o|M4-D&x#Xo+nuTNrC@euG)L}y7l=Qq9 z3&^PFyiT&G!UASO9@P{Ie}^okVf02J=b|7DEWl`0u@h8dBY_2gK4Jtf-@Xyw=$(wz z#!mg;$3&WR7DliBE7QQdu?$wd;Mr^~lUf`AbPQ8(X-;+5apNt2^E~Eh@Q_TVCIC0L z{@WA%g(O%Q=`g6acm^MZl8Qq66ysi20Rz97_l!Nf$gV3e{(UaQv37TwsWkCd@X!Yf zf5{AznpltOBN)qfgOM!hX#>@dzuDf5iZ?~298DXjNk`z&elou+J;j{SZ?&1qXRqM?jM&(FyG?kqI1lbQW*Wec9O>7_?m-i}Ir zy|Ef1l#Ov@ceQVHLf$7L4om|w-!{8fJh~-eWW$S{M(ZGYj;{>SxM19^y1ErgK^9Sr z!MpY@tNG9aA^!(rW@L9mU6bxH-v8?<1h?Y3Z^1Y!>p+Iu*}rc;n$HxXQ*S#y<99WV zcrg~ji5P>jz`omJ0bkn@V#o?zIWP7z7x50rk$wmb9?6(?<23J_^_^luslZGKoBYXd4 z0>fOtWpPaky_ECBfubLvQgL=5_mhd+HW;25o>iL3iNbkgCAhiSI)76Bo z9gE!R%y&kP^m0Gx~*@%qorsq#LKk4>YQ02Mq>eD1Vp)AD=& za!bwl9x3hxA?%d;-llmHF9XH%K4-Ddj}8j)D_!je`ZAlvJ!d5+kcY+lU4oMd3}7^NB5#{0aJ zo&pWKjuwQ^UToRt9G%dDO6yg$q&PD;`RME09MP1O^tWsl?pJp}8vWKBSqN6sNr%2Q z`AOe~?Url|yFa;9uOjCXf6hdMx4g5Yoo(N7?UdW~)+@T_w~DhxKdjc=H8lxVBky2G ztZxeT>53JhAaEaxz6qyK^Q2`~hGC8tYq>^ z_p>$65!g;ZzAgJEwsb6*`Ivw?O^VHkZdwFX*n;kmK&W-JL zF|UQeB}MYe9Ns6uUlSPt3{pEFR*~=Ch z)x%@9SHgzAGjvOWi&t}MO427$SO8N{M7S}cI%~r&?8167iuI5waO9&{6=Af0D5BDJ zYem7X%O$Yd218BBaGh`6f$8hKQj1;Xo#nfdZWrOuReo(#wj8goBYQidqV1nj zWnl3HGS1}sT_+hz@?gXsRaAkp>4q%ndP@s2lva6|3<^{}aWW(2T1sxc+K7%K*PgQu zc0SiHLR~r|4mT-21lE>;oK4#mSEN=JLS;?9p0|jGgr0UcQs$*U1xjRc2N(1`nH8r; zNeyri&fZAailDgaT}sl*B=xz!WMhRcAD=(nG4rX4j!tH|u0~M4>@Ywi4MOX+V}6yT zt~-2F=G@ZCbxapzxUdl`lVG?%WY3_)hJP=Jw=t3rl+=geM@D`WXx$vMKCzy01E`E0 zo!X9f1&(GgIHU6BvMdB~8*W6I@>U$v$eiX>80l7o#z!)D!{5Y|o}t=UDMe~D^AXs3wEh;nMReUl*xqNM8gQO$jNUROE) zZH>L@)JDrx`m4mI>^+S_MwxFOP-0avRJM=#a&IB=yo^HRoO>8oJaY-L_l=QKoTpxd_=+cta>$t~e)3t4v@iy&q~toRU1I^Sv-WoQoaV_SWo3QO?Cv z)VzUA2a4Hmvq|yDNj-PDm~_}KV>JXcYN$)BPG zkD?Ctbde9kWD{IJ+0@IHORuR3d-*aUdrimpgpYhT;hz| zMZMViD(WoB-yidOx>_2M5o7AH+2RqbLvQhX%VQrpSGxRr2Ii9XwF0IMk!NW^sKpxb#ZjtJx0}wP%O8UXLEA z0Owo~TYm18TD7xGIeo4996VlR^x_t!*Y9TQ7F1AZIA-A2>K0mLBS) zfAem8lxw-mxh zoXZ6I^Bv(xr9o9;gj?YR;sh?82aJC5<||EUN$_nSrv$psp$xjkx!syiZxDSZshU`T zD;rdxB~hyzIHaf<;)?oMx&K@3oGZ$;5mq>`b__L*o$?e&U(?-3&Zy%tI;q{XlumJx!4dyW98~GHN4Tw z8+tdTHT?-PC8A<9QHMO;2`@n@~b@K%x4u4-3E#TIKBFB<;|EU%DeHijk^wr{O-b zQfSEK81_fRG=0+|Md)5Wishz@G@)6r;JmUV4%dw9F^p5Z@xGHD)w*R!>OF^p zRp~ZD&8Je#Miw=>6{5U%R%ylof$}8!bszovzOZ1LSM)N}IMAesGh-yMA3_PfJ^QeY z9@AL0;L?%n$8DD{i zn`Hy=hRKZhN3y44mA(ONBa=xWZEOS>1EsA|<`qmkR_3lWgoCnjf0<7IVCgnv^``Zw z>cjust<<8-;W-Dp6?xkMTr^>t>ISkMpTN`^znfgImt?u+GgRxz} zpa+xT1e6Jc0aAilu3tBh2bi`uBiM&JTjqYEcKv`s9(jwjr16=gcd2gxB;UGhkPk|b zJuIF6J@e66|05#%BhEDlj)R9oSP$)~=A^Lz3cL7G#exB-AN}k1MsJ2~6-gH4uUdS= zEesJF8y0<(OT+`-8_>A(Lf4*dmA-k&L50R99j8!jC?B<+$(Yd2U{Tj7?a9;^$oCiBa(;DF>gfU{@_10boaM*k*X=i_ z^>jJqJs~8jB8QROGhqJrC_x+8ymT7s`g8NNuWNhb1o}LNS5g~i8u%>{+6FU$;a4fb z7LC~hzsI!_L4sO|mL(do+FE#7ual|nam^oyM=R4`X|6|(+jF735si&XYDtQ6sRr{& zBJVmGey=oTSZOr{D0e#P^4EQB-&yMoJyY~oCOAKy5j{~A_Xy6Jf90hrKGh-qegRc| zusWrg-^YN+Y8T~$2)CugZwKD7h`K9AUn6GhN-7MMT>$f=Dn6l%9XLEA$>wU5W$<SbhpJ?V!m1k2-@cKvevZy6GqP6} zerGNT%qFB?SG3uF)~rJobGjo1ry8Nr(>Ragrdldk!4ED^mbcxuBHPJ44bPj>yrQ$V zm52^J*m2_VcO`F}piY4?gE;S_uC^Q&4>umJ*ELnBq}0Uz_+^G-*2$;I=h*}{-R*d^mpT7s$wuE!)0l!HJjGzsDr;H(z^C<1NZ4t*R&gCZ=gdtf3+tGF_Iaf3bz9(iLYQ1PWN}Lu)eV|o6K|MqT&UU3aP+&A)%IMIZYpZI zG*L8tNLMhdNmoJIq)&DeR#id5vxpUOGu73vt1EVNKTsRcXhrNJUop zY^G)NP`wXb;&=Emx0GVAdjnj4}Jy{U%tn*kvq zrK{aQ0vfuT{26!S{qJ@2W)O#sfBT~e(lG8vhZP)3;?2?-=L|b$JP(WL@2^y~T*0_Z z7V{jlHR*J1&mYC5Dnqt>oX>Yq>xgBud7y8HkX+O+CFfFIKVB;l=LdPrJj{-m zkWN(#OU92{7#C;c%k-FDsDQ=@ZNQkm`nF%1ZV&H`g0TW`LfmL8q!O9 zG+PsJHi0`PLxS77yxGYQHnw|gE#BMmGfuY9@Qp7H;sdG<0W!lbBOTVRs@luhy|a?w zkiPa54Xvpsi0m5vi}(#jYrD1uTV~+#a5k+Cm%+4_DQznr6Z2Ta;uRSv6F&G-l?LsP z6z~5+j@E^Xs&sIR{)&2%YwA^^rB_SJQxaoW?A&y(lr>i7SNY387~KNe7S&tfZ5=b8 zCW8eegb@{7ypUlRH!|Reu()rNCV4Pz(C)G5vm47PqSE#O%*_Sp(KG3jZxuf*N2~pM z_pvM;)ek|`Y({2%IHSTQ8H*84_x1k$2%-wP!XA@4(Wg=o`R-VV9 z&m`;dFgQETqI<9IoLmtfL!My1o$_4?E}>y^N0>-unB2(ax$kQ8Tj#v%6l8gS1rE_v zqgBP*htQ#g{NM$W;dbs?v&X;2B30bYp!eqaQ*YQAbi{A#JaKY;VV8fWRBN?TxCiF3 z{&J0Hy743y@>#A&){xrUo+I_b6t*a0{{GB-rg@c8ZprR${WYmt4uI^0+X+0L+b?kBt<^Oe@B9b0&mD&G&IqVz>_! z_o8KlZs;bm8|`*Z@%fhWKaf-}Ol?_xo?dHT`TplpZ#m(Gnve@h97$=6ge9P9H`FK( zBJV_=KGMVtKYj-PbU$=@O=!8S$*_a*m3H9En|9lLnm#p!&|2@3tDLOi z?TI#B7BBJUnqrRg-~LpS0M)~xeQ9_$R`#I7p1kHbpI;*RRx-lO$21Y|Xm_NCiV!4% zzF}$B*F{q~gKcTYy$IG#*PZ^kA~<_U&zL}Z*jeszNo!JXJ?ocuwTs+fW&*%ys6uy5 zrYak%rXRutbFHDly|+P&b`FqlK)rzHG|vWE<(*tf)QnCV2DG_dCBAGIdIAF>GrZ+3 zvQI|NTopY~A+{(@q;oF|IV=&ZyHN$yodl9Oksf}L-6gepSS;}}PiK}DwDTWl#0(7U^^U%aB%T=;huu)9JpzPsT=gHZv+wWT+J$|2f8}P66NwF~Bz0z~u`cW}e z-rT8NqN(Gnp)JBltr{Z(*@AD=o~xX(fkv7T4d|phb{1_nHIHxD`+Kg@*^>rHlV$*$ zYx3SlKzjc=$Eis_FNkZJL$_j|gEOr+Eb|}_O||OT6gBSb7Y=+zswvuGBR9hKoF@5s zEMOz=du#g8%(ShoElJ;LLli$r{+ohNink~3sR&OtP)4mYp)EYgv49x#%^Gipd3T_IwnM@0LMEh1F9@s?Ebou9m2EYAW+F_@1r&O(cXDIK*Thhv8?e|l zt{JBepO8&jFWg~&$FGhej7k^d~>4%Y4t9!;n6Ifge#lJEh&+v)y%hUsvVu73wQ802lSLVz|9HsXHv#zclU~ z^wI^-c{nvTMlH!CGCjFJYDP^LqM#s{;qAVuc65O|%aqg4+(~t)NVIwp4<68eP}kU+ z6+~y(J6=agqpPg#?KmrO3e~WcZAR>EGRAi3`fRLIqnu5r8n1epq93)@6_S2^IM$@{ zN+(KdZAFZ38zE&v&w9q)bnKj-ZRMV|Td<_dmhI-GPZO45$T#1LdpU!>QJfsiINM2q za_IdXoV~{HV&{$vM3)MFHAsabZ5Tbt{Q6k&UV6wqCkUB%i|U1+q;+zvsylDtuvo81 zmew{6J_)bj0IQC83R0fYcuRs6ixL#@{3)t=b0WG8Hpot_S$Npnrqa{3spOrL=dyGx z+NZ?ru|yj2(t!IF$pmpH+uNtrd{B*^;%rOHjz>oE!dde2j#2VQ>fPsM6_R%Y`7QlP zHlpoj<9a3%mTF=IkZU<`a;LLi^F!W|Pa5Sbx=u;dJoo2s#d1+aw`6az%`3rA$WclC zOJmJ(V4>1gZ|f?!BT>O?$^bthO|fpCc&R3OeKrb!;Jb?5`?X1$J_{iCzP#$(kB4FQ zSs|h29!abYE4_pn8Xom(In0HcL{1b~z?~dk(XQP#b|Bon?}Q8$Hs9aLhls5$^{{AH zPP+P{x=E_r(f#^#HyvLVKGe&W`Z|ECwtFVZGh5(=-OEQBlH14p0a4lylix;oSH;2i z`bbm44G~qa*dT?VFZLuqo>rO<2e-9FnMw|d+>Xq;!l|F zX-_c+R92y*wNovnfco)gEHBrK)aA~SIr6$ZIc~pY8s$&UHY75>Zh|`gFoLjN-iV7+ zRx1aE>*Z~-ez8COrUwj4O7g+zwq@uth5DVW)P9PgJR=LNA=h<{mrohKd1J1d*MCo5 zwV3A%1is#*pbXjIj9*i*du*8&_dB8#*?jjB>V0K4W%HEs3;0WWv%9xDQ`fjQmntjz zf#mmRl%!r|4z%UDCFKk5s~^fQs&0&qcl=6w_Ax23O(R6U?bVo2!V|FpY5u6~W1`PD z3CbSbh|Kzq^Et49Bo#P-k$%ZO1 z+&i08cWsm@yj%S1^O82x;x|ybYTa*mo6|Jf<}&T_%(NJdZTo$FGGrsJ9_m$&GP;Gl z-FwI3UpdtMEz4Db@R>UO_cmbndQ#qCd?O`^CkM&Ac;hi2L3nw0*~-_Dr%W!P-$dMW zPAOSmyS3Qq<4_5o`+K@`qOP@__37^mZ%)3?7NUZuPd;~bRmPzbldOTn{>AM&{VUmS zd>M~)1zXGJi)_$*sEQD{Ao5pDw9Lm22{s>LuaD)njZp(}WV_qiJ4D8J9~}|QwWbjC z+Vdjqi>@=_K6g$mJ5RUskItXz`ibYzmKCw32wNiEfLJI>G+l<177l*9Xt@wR#z~$lIBS^gMmL zHS2dJL@H?SRrkno=c+5|+HRzOOV3RE_~CF7chL3iT6vmC$Fm?HIS%!hD(Pg<&}wZ> zFHe17C~)RG?GgtXok~ecFVrz#Mit}sdn&qM^iC)PxO6+RtU|TG5yIkmE-C#(+=sW# z#gbRD^|bd`gp$j*YaIVP@tjk5qYi$qsQB@AW6Qm* zJJv#GmiP+HY>B_Boc}Dh@4-w{k;?Yp>#=|yi3$Tg$LyuO(J1=Got5#2JbcY>hZvZZ zd)N>v%X#0--D7T+S>_Q1Q!9{-WHw}t-(;7R^!xSUu%i=Yg;aWoC{b0O>EN!k2D!nF zwr2UKfAH1@y?!3!%S`w{flG*dTub=VHB^=AD{^m(IIfdc^HU0S<9Uk_$nol4($V?p z3gpu|$I)eYBw`?7nNFc3pTeSctIRW5A1_#fTZB>2L-e^0yW}&epC1leklMYR397`? zM~y%hkfHfEks!8+?1=k4n{z^^a+E?lniiL#m%3Yd85eMezH6x-KhT8{ZsGNY=g!Hd zndKO^=rdY9qpIrVijU*-;ch+FmL!!*U}VHMdB*Q3>@ME&Ln)TR&|ZDFs6y7InfoN4##q$e%W8kqP5p<29g>^9#QVkC{&&)B~Zir~|!Jlgji;&Z)~ z+!xbzYw(@)bvRtR4@&&C6gO%7;666JkG*N`*cg1Yw6*42j^CA%vV z3{R(9$*!`9%h5!+=aEi$Cu7=(=5u!x4Cy_fxc)+#{MPQE1>(5!!UDN&z52jsRHD9; z=Fa^enFbA&w-4Hvlc&zp8-J);gmVxX^G$1|vH1>XJjd-%KcTqC3sasi!fm^DilTDN zXQeqQK)klIK`Io6!jBsprhVND$M5MKwWRQh(z@#OKKCa%wv6ONh^KVe)TqUPh2huQ zR&(#yI|qiRypu{#Q#tPrRBm~~>*Q6uT3=O;n#5lE zr7vt9lb2cA+KVW?;2p(*azn(-{ru9iy;(=ke&VYSRnPaTk$3W-=Dgb>H&8Za^QF_< zsjRO**B0)-%P{Vde)S;P=xs3(c~o$dBFhj`Jf_2NW6TLif$G)4tpzqdWj6X(p`z8i z6a-@5OU?YUaPhqQn5t_yQED-~JngA6(UuK_`LK}XGcvbn?a;mAvgYY@p|KT%oQA;M zo;OX^5Klc0%Etow*6EZ3s=yDBL4!*&1!4O?s@eVNqzb9=_&)JG|In&rinsK^4kSJx zE0?DV4KH$7UIoQ6iAfK+G-mO2#_lAl^VenFaLIaM>Ov^7LE~LK*+~JmL$YHkN>Slm zzjw>Si}b!7P+9NinCQFT$zT?v#tjKR$(;@A=zWtPYg_ZqW8bS5l*Ko_tK`h)d>WFz z243HMZ*YG{blcuKKlBud0)VfFB%dSS&f47?q-Cq?>EHBER=54w-AhJ2=tM!;C}Wi#U36y{ z=T$}tm(7B?Yfv`*ygjP&(?GDwhh9G60G|+VzK~}k!_}o#+a#9~EkPzJUCBXXVYnA< z+;RU~z#4sjzJnJ5yN{$yZaC)o_0+kIh3L4ncl_JsnrTyV3ZJA8#eG$#_c=?%cna_8 zmDvRgC3h8=A3m>mlHO|gI70nHMPoF)xz7g52Rh zb{{;rvp=Etb0QX2PdorgSf?pLnUte~&$Q-6-(~Oa2kGm#2iB*`+q=kdJBB2UFYffW z-aVE4pu8I=-T0KwYJ+IyU2^T6l2=k)g4M*GM6zGRb#XvVlKotx8ihwB;d~>zji#&3 zm6DI-fp?M?uuU+5SDaaXL!S8)3n$LcUK51P;2cAchUIKcV8YzeIjMo_W~h&QaFAu0 z&SajPTS}KXAfpnnF*({EliN4q=chQ3sW&AeTuUIqZK2RLp`P)GNGkm3w3+?+o-b&k zTDW{xnRLsCvhQ%C0NA^f3f&Y0ZQ99hPI=Tk%yb?x@;%@axn$K^Y0^@ht)WNb-h10n zy0Q}={3P=<`SifCH??AAbK|~dcXUKfy3b{ z4!wR3dq)!=7i_I6m+uLVNb$sV@#0OvgOFkY+j$^;Og97P??+iH z^W+E^Mz{PW?1&l%jF;@&jYZ-mW2CPgb|I?HYAI?Kmrz;svoChx=F?yTpGxiG5%R`? z>eG&qo02_cO43B}gwkUzX%Eoa_K||NUaB_`17G0npz2?0bYID{Z!CR zdEJ(&hLp$qhc_yNB5wENA5U*Po;{!qUgY72?p)p@PwkqY8DxH*#bPReAysNPT87CS zSEsJuZugqK&PwQM3*6U5%kCFYqy;s$y6}X z;HopoHE-sF_=J1;(`2sEki{FiOj*4TTg=p^Z)wsgUKv%cDHs~q4E?&AJ+AtA`F}9? z-a$=;Z@ednib@wL(jr~DQdLSs1Vltcr3;Z>BE1C(3B4Bq1pxsC0j0OlA<{ugq(i6) zO@TlHf{}!{=eK)zw$7cqJ9BsMADLmuBq#5jbKdim@Ava~#pFvDm=kG5cm*z?0MmnO zX&;7Vj@l_ka_T)A5%ZXMnRJ8B8}Xu1|Jle5^UclVsaL-%@A;M8#Z{Xxn*qPoGdO9E5wly~3qUg4?b8$&T z;=JvRJF|IVBR6WhrMU!)gMv<10!a&x9rMeF)FtKzqWXSV1U$4-?|?TX05iI|z#C0SszDHH;MRLV+3EuEg|4a~PK&AeD;?xuD zw@#61l-gt!VbDR~{Ad9o%njjI9=$|{PsRFtZ+Vp5*s^W=wj*jd% z`CiKXwp_$G=KI%-2xuCSEw*rqCIL&uGjlhYwK{|gz6~8I4ZFg#T(KS4jDMTSHM<${(Zs&p{ny38@$5gYQX?n@^myHDrDbGWx4O^#^;s zu=CpA4B}YA_3EFICpZ4hP;Do#9l%#Y(K9HhR=-m&LfzqHCOTA$jqG|T1Aip*M;({d z4dSETBM(#Ls6NC7b{jHJ4~^-^Z_4Qto4cY-=*hz77;Ce8cpZfgzj#fb9SR_s9EkmS zEseWF3m?`R-FKe)S}EG8gX%Z|Eo?R^Yd4WtHgN3Ijy8BnVvGMgVha^i`m>r%H+?DB&RUf1agyB?P6BpN(ZaY)M&OGcmmIP9?3h z_5J)MOlpI4qvP!tm%Wja8b+iLAfoHuKLeM|oRP5x(>K<5?1{K=zL2k%_5EIVm?V|T zK>|?>{UHREQu7=Z z`6KFdjJdAFjWES%WLsWO?sU5`Nv)>iua2B-2CWM z458VbW2y9S*DaN!JH5Hg8Mw${V|!QBxi8#kx&3X-8_fAQ$E`}-ZBMW`ZOrn0dhbbk zu(GUV(5cl@&jP3z*@%favSGuyLFoq7mpb6+RjK}~=1*O6O#_kGjP zedN=H4}0=K^f8Nz1K;+^7D6{p696%u(l?&0te_Ls%93q!Zq-@YlpK>7B&v0wB}lIi z2`gjWWsdAagbvHrgR_;gdBYS3BLx7 zyVRKR&TC!7{WV7rrP@_k23Hsf|Dy}ZcaO~dj}CvudF zP&6A=X>~uj^BTFdXc*6S>DP%~hRRWtdeEYX`^|Tcltk+Gv6hB(!*5>C&I)lfPOqMp zwL7fkIhZ1Ou~b8%S>X!H{_ft|M08&ZEa6v<|8DfFYB`)7`!_S4mc{dLbEr29<8f6B zojATm0}zm$b08GSS*u0^-v}-P2&O5xB31|;>Rr^!cLK%E9*Zy9&zeLR9*CyBOndR( zu;uS$bU${JCg;XM8_mB(R;Q@I<=Q4oJB)dU*4!XZKAc8aN_ME82>6X@J1)4eUw(7T zg|)N@G@Qynt~Ms3lPWY!@tT)r`(|dMu|{B%Un2>czh_{vmdthK^5gRcl49LG?lIdx5pQYO zPHvJ8oU@%YkZ2r7y%_QpR-v)XIg4@)$mK83U~b#{ogH>KEy}Fp+3RF+?&n8x)^0pc zFNmAUK|Uf5;G#Dc^QEUM{M89c#tp4Ej1}fpuBfHoQ~S6m+}*+`d%@QC9Q>Tvf2wJL zp$S~Re$j$-zlEmaMSF2;_DOfxz4h0uq`6b&h5}StC`bQQ!9LIbylg!sUnx zJrEYx*9!wU49E7eG-)gYC-~aJA!qn5I@2^oCSJs^0lxggmGa7(C?ex17W{^4Ua+D&2lG zv{c~2#EyRKpGsR%fV;OUYixOci6YpI{4&GPug&E`HC7(!KmQx=v4DhC( zm*wki3d%eb`rMfvAmIMk`*X$sB(~k0v^9X8-OUCB!lf}P<%Bboek9M;jS%bDn1K4+ zN5N}NhYrFK0~`107z^nq&^NDtjp4>N`Lvc27?TwCP=oC*_zp82zjAWoamaW8%e@Ws z%!{RwW13@~(C*w-t!}`-_QwdBfWAt-UF`P9sww%%>pWSKB0X$4m7zafRk4anKDtn` zZ)t6}u%QuGq$o{bXr^8&HgkIU-CO@!%EuqX9IsP1n$GdE{!e|vQW-Se0xm<`PlU?= z0s*fF6V<*dHlCVZ)*(`R4A%OH9cE)t=KUBh-vNiU4JSKm?DJ)DlKJlKRp>uDEs7;E zD*|rk+bP``v5}fqa=Xzr{XvuCz@gy#r)2{gevn*W1F;F^$(upGmf0x=l3&G+B+_iA zEluNCZ+sKFFcwUO>gp^R)(TCUVU~YeUNyoEx_vKVq<)Fn)&HztJ-*V zLwTEGj!k9MnR^jyBR8er-tCKAEx6%D1=QIQL2tmXQe*FbpqDQi`bSq2FbcPIdfQ)< zC7~i7u@z=b_eK+_&qow}O%WRR>D=xKP-Wx|?hU zNhsBx)UPS9A%5ha0ji_7B?(?%78m=f7v0i+a%}Vb@}GU(8`SBr=vLlAZBAzymFT-W zZpXMJjEE*x_Zi2VK~S*-qasUk(bGud9|(ST9;<*lo9{LAi`ot^Nk(Vw8V5v_>l9n* zy7E$djS%eZb%Pv^zTG!b+PASSV~ih%B#J6%<)Q!R6pRmKum#Np_0@4Im@B{)SL+h5 zVf5AL>-MBR>9Ul9my_EjjIfp`a@kN=c9@UYqQT0@wXSvThn5D6?Kps3GfJZ#a__)o|!#c2=f5Xy{S?FV6wOqPe$(%%5!SIvB<_whnU8Nr(Pc2+V|6?Di zIc^30U~Teq`$DchP9j!ED%(8k)lx(9SlB|`PR`e~3RU_P7DtGA2=w0;a{bgSw|V~q zb=#l|OA7{~O`aFD`Bre$-tIavD?y=Cz_>`|)9kaS9j$0Kz||PEhf9A z?n_svlL|TfN?n(<5ySiSdsi(Dm@oX)7KnT_G`4#<3&fu9mmH3VaT2*}92E7RKoX)M zhxcM9@An|CPsb+7`hzaZN0(`r87iJ;ZvKA1o{m?IzgN-LD5WRX^t`yzT}X`_jmKb9 z?~%2kjIlI1_Y9b)am~+@3Z+Gii(|Noa$Q@pM|{Qz_K$X8roDr3ZX~(0N$sM{V7c@V7{fj=(&WloqZp&E{NGSM)6#{EqFoutr`ysAE= zSO!!4^UA3+*Gt}VFUgv`O1WpCK3!)pRJl+86C_9trN~f4C(w=yJ710j8O>(UIH|}7 zoz_foM@)&uAxw#wWj$MPU0506?UQ1IHHL$!^vA|xlWUn4O~H?!!KA%?-f3zdmp|8> zsy=l$ZkXBHZR%qK>6BQ~uv&6tqe>=KXf?xKY)qPPnC9?g`Am+*}@Snc1(!iOzg8Y;IW5$+=j1kXt{Vyeh z=C|m57R??4C+IJX_jtW4C}1%3xxV_MaCU zSI(4{Fm`*9W}h{Xh5peoz|}swVZ~#<`ml^OeZ5qx?rnmxkbe{_&++et%EJxy`EQcDe%b&Mwa5N#?@7f6f>t<` zLo8kD->v2jd8my@i`~1b?K*o)BZcj30@bt-^;OrPbS`de@U*9PmL|MJwIXK4!PSe{ z_;$2p$ijuHP42BlZm*X=W+@_Q`2O89guphA_l`VIka6VUkk@j_Pj02db7AT9YK;LELimN=fk=W5kTUMj}1!0 z8t~TN6ifFt&@@oVntuHP{R+`d1JE+eh#PL;i*Q|`Ql2EL34Yj%_b*>ow7*B797|=D zZpEXl)^~@Zi|^iW)TU9Z-`-S@F-M<%YB#8cDVUz30;(^#bGo*Md&NGKmvwe6Hu1Y0 z-)JZ_BlOalSx@c!?QJOOoaf$naX@y@<4c1&0<9V8{8OB>Dz>rF?NuvBK)QbSxYgpc zhFB0^6|m0>=O;;2mP=A)Q!i6RryEvSx3N)0Bea!6Pm!9Se4B3%pAUvFWV&=MS~Dh* zRqRM>IAk9-Y+?ulgEP*^Xe8qejT2ZI(DxY(W=`p)uysG~j zn)dVbVcGr7M+DKA%(Y@TJ-V$Q%$Kw(CvXJgIR)%f2*?#w4~S&JfI5Q?Y9;%6tf}NQ zeZS9EKGE`nJI6zeSgYgtbF$SJ{ojpG2i_9(HfK1%0L4?Ut5ji9RT1$J&k{DNaw;=K zF>20{>JBD}k!T0p{Dh>IItrPFfa@$6SGbuWWm4lWLl~d5X^`P1jhtb)B%SSd~_1p|L$@Z*SGkM z1dAv3H{*J4I6b*SicH$7IR=y6z!B)*0CZu!cmz_L^Jz(5t8X)HSF#y0EvXE5g)c@1xtH8TS5bED7+8Ka6utw_#MCX`n zr!mg)^_?oq1U| zP45LB(Q6N_rJ#xhQm@{=UiQ>{FGugKudL&G;a3Alt6S*S=Ft@sNJ~K*=-({$36YX{ zc(~wlRFwi?5C9bO0F~in)(Bz}P2-Lf&~|kMP^(>B%f1 z^L1ePwKGiFg*{H@1-WjQ9vcfJZ^=lE;H!4wiMohdco1=xpaA$>0U`>dHcVkUWykLNV(VtQ|rY?l8VyL;vphzaawr7c}b>PFRj~AIa$Dq7;&K2sgKPDRBf*O;Z*yg8TBZ$%e1R_9* zdJ76xB6ONoQ$>58sIItCgfQg4{aVIK;E)dv8x^jIGl(Gs9bgVw=tc9PkUSC{q%+H_ z%6$5Bw##D{@>UG$f5*#%U#_j6n|m{$c@AV57ov*rHGzCx2JVjt_&jz8upY@Hu9cwi zl{{T1AFQ0-6-3*Gx!;M;7tfQF`1#l8e(fC|fe(%JYXzDA=%C2?&6Q&qiI(@-jScQ^ z%;83I54`D~5dURCUs#%G6Ne7k?BCXw>RRJ^(tGde#-qo%4|o5X{b!c|E~&8p`6csP zjdpPu2VD_>>y!ROD$hGa?7tuemOEWZU)M|Zc1Sk#IJ?R@MqmAm{0Rt1dpp@l=xBf` zk&kBba3(GnRAZp>Eme=-=i27zE>EV%=02da6VUEF$eUBa$O6Yye*U}VFIX4RM16P~ zN#lV*yIv0@DtCbUPvp?ydvXP4&9hJYc~xv~eHUrYdVHfISs>w}Kc^JG&zr~4KB_iF zn5@=?xIyj-z~>p70NowdG}fZeHa%ien$(>4&q_oe{AhRu@;Ou$*>da0iY7$P2}-15 z68`_bVc7m#(4Ds9L_>UPtQPMMHmOsQ7+R3rz~cGckZFNGT_oEfi@bprEhrEMFFvUd;KOh0XH~ z@O{|2Dn}S|r9L<_{L^j>HaQR$eQ+(fcsaj_-E+8V>2$QUc5r5F6i4Ss8~8tr z7#O}~(j>WgzA)g5>H7C1>v7O!69^Li^fXLM1P1NqrrjbxQo#t#C8pNdT4HdahPu<0 z>vkC(gwVqB=g%08SkZ#ZNtAY0b