Skip to content

docs: 1.39 Python client surfaces, corrections, and main reconciliation - #508

Merged
g-despot merged 113 commits into
v1-39/mainfrom
nakama/7b80ac75
Aug 12, 2026
Merged

docs: 1.39 Python client surfaces, corrections, and main reconciliation#508
g-despot merged 113 commits into
v1-39/mainfrom
nakama/7b80ac75

Conversation

@g-despot

@g-despot g-despot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Two commits: the merge of main into the release branch, then the 1.39 docs work. Merging this unblocks #479, which is conflicting because main ran 111 commits ahead of v1-39/main.

Python CI will fail, expected

pyproject.toml pins weaviate-client==4.23.0, which is not on PyPI yet, so uv sync cannot resolve it and the Python lanes die at dependency install. Clears itself when 4.23.0 publishes, along with uv.lock and the release-history link.

Corrections

Four pages published statements the 1.38 patch line had already made false:

  • search/similarity.md said diversity selection was "Not supported" for hybrid. It shipped in v1.38.6. Multi-vector is still correctly unsupported.
  • search/bm25.md and api/graphql/search-operators.md listed only and and or. AndCross shipped in v1.38.8, as a GraphQL enum too.
  • replica-movement.mdx and consistency.md listed six replication states, omitting INTEGRATING (v1.38.0).
  • aws/embeddings.md called service required while also giving it a default. It is optional.

Plus two snippet fixes: the MMR note dropped a stale preview label and a multi-node caveat that no longer applies, and a Bedrock example was missing the amazon. prefix, which fails at import rather than at collection creation.

New for client 4.23.0

BM25Operator.and_cross() (Python and GraphQL), diversity_selection on hybrid, list_backups() and the list-side incremental_base_backup_id, dimensions on text2vec-aws, a location example for text2vec-google, has_errors on data.ingest(), and the 1.39 compatibility row and version cards.

Version markers cite where each capability actually landed, not 1.39.

Known, not fixed here

  • provider.vectorizer.ts SageMaker block sets model: with no endpoint:; core rejects it at collection creation. Needs a placeholder decision.
  • Java or and and tabs on bm25.md render empty code blocks, missing // START markers. Pre-existing.
  • _includes/feature-notes/v137-preview.mdx is now a misleading filename.

CShorten and others added 30 commits May 26, 2026 08:49
…ries

# Conflicts:
#	docs/agents/_includes/query_agent.mts
#	docs/agents/query/usage.md
#	docs/query-agent/_includes/code/query_agent.py
…bles

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.
- 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
- 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
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.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Document server-side batching ingest and refactor the batch import page
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) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CxMtvQPuFNT2ERqHx7C49z
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CxMtvQPuFNT2ERqHx7C49z
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CxMtvQPuFNT2ERqHx7C49z
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) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CxMtvQPuFNT2ERqHx7C49z
…-fixes

[Agents] Structured outputs: review fixes
[Agents] Add structured output section
Add Docs for Follow-Up Queries in Suggest Queries Mode
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.
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.
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.
- 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.
- 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.
Add a Python generator example for data.ingest
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.
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.
…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.
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".
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()`.
g-despot and others added 25 commits August 8, 2026 15:55
docs(deploy,configuration): fix commands that fail on paste, wrong parameter names, and missing reference
docs(model-providers): fix structure, model lists, and a wrong published token limit
docs(model-providers): copy-editing across provider pages
docs(tutorials): fix invalid JSON, a duplicate card icon, and em dashes
docs(modules,connections): fix Go tab rendering, a stale image tag, and unreachable pages
…ector 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) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DzkwXqkMC6agu8oGNswh2b
…-location

docs: correct deprecated ChunkSize and document backup chunking variables
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
docs(cloud): remove dead imports, add the missing default-index row, fix typos
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) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DzkwXqkMC6agu8oGNswh2b
docs: assorted one-line defects, plus a stale gRPC section and a silently wrong tab
docs: house-style sweep across reference and concepts pages
# Conflicts:
#	docs/cloud/embeddings/quickstart.mdx
#	docs/deploy/configuration/backups.md
#	docs/deploy/configuration/env-vars/index.md
#	docs/deploy/installation-guides/embedded.md
#	docs/weaviate/client-libraries/go.md
#	docs/weaviate/concepts/interface.md
#	docs/weaviate/model-providers/_includes/provider.vectorizer.py
#	docs/weaviate/model-providers/cohere/embeddings-multimodal.md
#	docs/weaviate/model-providers/google/embeddings-multimodal.md
#	docs/weaviate/model-providers/voyageai/embeddings.md
#	docs/weaviate/starter-guides/custom-vectors.mdx
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
docs: low-severity fixes from the docs deep review
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.
docs: fix five review findings that were never dispatched
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
…ction

docs(model-providers): document how OpenAI request URLs are built
Add docs for `effort` in Search Mode
Reconciles 111 commits of main into v1-39/main, which had drifted far
enough that PR #479 could no longer merge.

Only _includes/feature-notes/boost.mdx conflicted textually; the other
12 files GitHub reported auto-merged. All 13 were checked against both
parents anyway.

boost.mdx is the one place both sides could not be kept: main restyled
the Preview caution's title on a line the 1.39 work deletes outright,
because Boost is GA in 1.39. Took the 1.39 side.
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.

@orca-security-eu orca-security-eu Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Orca Security Scan Summary

Status Check Issues by priority
Passed Passed Secrets high 0   medium 0   low 0   info 0 View in Orca

@g-despot
g-despot merged commit 049d71f into v1-39/main Aug 12, 2026
4 checks passed
@g-despot
g-despot deleted the nakama/7b80ac75 branch August 12, 2026 08:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants