Skip to content

v1.19 - #164

Merged
IvanPleshkov merged 9 commits into
masterfrom
v1.19
Aug 4, 2026
Merged

v1.19#164
IvanPleshkov merged 9 commits into
masterfrom
v1.19

Conversation

@IvanPleshkov

@IvanPleshkov IvanPleshkov commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Regenerate both clients from the qdrant dev branch and bump to 1.19.0.

NOTE: there are deprecation removal in openapi schema. Removed in TS client API

IvanPleshkov and others added 6 commits August 3, 2026 14:28
Regenerate both clients from the qdrant `dev` branch and bump to 1.19.0.

gRPC: memory placement (`Memory` enum on vector/index/quantization params,
`PayloadStorageParams`), keyword prefix matching, `SliceCondition`, per-request
IDF corpus, `Datatype::Turbo4`, `max_disk_usage_percent`, explicit no-stemming.
The search/recommend/discover RPCs are marked deprecated upstream.

REST: same feature set. Qdrant also dropped the eight deprecated
search/recommend/discover endpoints from its OpenAPI spec (qdrant/qdrant#9982),
so the generator no longer emits them, but the actix handlers still serve
traffic. They are preserved by hand in `src/openapi/deprecated_*.ts` and marked
`@deprecated` in `qdrant-client.ts`, matching the additive-only line the Rust
and Go clients took for 1.19.

Also:

- Pin `openapi-typescript` back to 6.2.6. It was bumped to ^7.13.0 in #150
  without regenerating; v7 emits `requestBody?: never`, which collapses
  `OpArgType` to `never` in `@qdrant/openapi-typescript-fetch@1.2.6` and breaks
  every call site. Later 6.x patches widen nullable `anyOf` fields such as
  `ScoredPoint.payload` to `unknown`.
- Teach `generate_client_construction.ts` to skip semicolons inside doc
  comments; the rewritten `/readyz` description contains one and split an
  interface member in half.
- Forward `payload` and `metadata` from `createCollection`/`recreateCollection`
  (`metadata` was missed in 1.18).
- Cover the new API surface in the REST integration tests.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Reverses the previous commit's decision to keep them alive by hand. Qdrant
removed the eight endpoints from its OpenAPI spec in qdrant/qdrant#9982, and
we follow the spec: the actix handlers still answer, but an endpoint that is
not in the spec is not part of the client's contract.

This breaks semver — the removal is agreed on for 1.19 rather than deferred to
a major.

Removed from `QdrantClient`: `search`, `searchBatch`, `searchPointGroups`,
`recommend`, `recommendBatch`, `recommend_batch`, `recommendPointGroups`,
`discoverPoints`, `discoverBatchPoints`. Their request types leave `Schemas`
with them, since the generator no longer emits them.

`src/openapi/deprecated_{schema,api_client}.ts` are deleted and `api-client.ts`
and `types.ts` go back to consuming the generated output unchanged.

The gRPC client is untouched: those RPCs are only marked deprecated upstream,
so they are still generated and still work.

Tests and the node-js-basic example move to `query`/`queryBatch`. The example's
sample-output comments are refreshed against a real run — note `query` returns
`{points: [...]}` where `search` returned a bare array. `search points filter`
is dropped rather than migrated: it was identical to the existing
`query nearest points`.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The note added with the pin named `requestBody?: never` as the cause. It is
not: an absent request body infers harmlessly. The breakage comes from the
placeholder parameter slots (`query?: never`, `path?: never`) — an optional
`never` property has type `undefined`, and `OpArgType` intersects the slots,
so `{collection_name: string} & undefined` is `never`.

Measured against the v1.19 dev schema: 16 of 67 operations become `never` and
11 become `undefined`, not "every call site".

Upstream openapi-typescript-fetch 2.x already solved this with a `NonNever`
guard; with it all 67 operations resolve. Our fork is two years behind, and
exists for BigInt point ids that upstream lacks, so the way out is to port the
guard into the fork rather than migrate off it.

Separately, the 6.x type erosion starts exactly at 6.7.2, and it traces back to
Qdrant's own spec: 260 nullable fields are written as a bare `{nullable: true}`
anyOf branch, which carries no type and so renders as `unknown`.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
#150 raised openapi-typescript from ^6.2.6 to ^7.13.0 without regenerating the
client, so the incompatibility with @qdrant/openapi-typescript-fetch@1.2.6 went
unnoticed until this release regenerated. Put the range back exactly as it was
before that bump rather than hard-pinning: it is a dev dependency, the lockfile
still resolves 6.2.6, and the generated output is unchanged.

Also drop the notes this branch added to how_to_release.md, leaving it as it is
on master.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`dev` moved while this branch was being prepared — qdrant/qdrant#10035 landed
the cluster-wide quota API. Regenerating picks up:

- REST `GET /quotas` and `PUT /quotas`, wrapped as `getQuotas` / `updateQuotas`,
  plus the `QuotaConfig`, `QuotaStatus`, `QuotaUsage`, `PeerQuotaUsage`,
  `QuotaExceeded` and `QuotaTelemetry` schemas, and `TelemetryData.quota`.
- `max_disk_usage_percent` leaves `StrictModeConfig` — it is now cluster-wide on
  the quota config. The gRPC field is reserved and `max_resident_memory_percent`
  is deprecated there, with removal announced for 1.21. This branch had shipped
  the strict-mode field and asserted on it; both are updated.
- `quota_internal.proto` is new and internal — `qdrant.proto` does not import it,
  and its name matches every other excluded internal proto — so it is added to
  the removal list in `generate-grpc-sources.sh`. Without that, the next codegen
  would emit a `quota_internal_pb.ts` we do not want.

Both codegens are idempotent against dev@aa6c5d84, and the integration suites
run green against the matching `qdrant/qdrant:dev` image.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
IvanPleshkov and others added 2 commits August 3, 2026 14:56
CI pins the image to v1.18.0 until 1.19 is published, and the whole
`Qdrant v1.19 API` block targets API that server does not have.

Half of it fails loudly there, but `memory`, `payload` and `params.idf` are
accepted and silently ignored rather than rejected, so those tests failed as
`expected undefined to match object` and `0.5288952 not to be 0.5288952` — noise
that says nothing about the client.

The gate probes `/quotas`, which shipped in the same release and answers 404 on
older servers. Version comparison would not work: qdrant's `dev` branch reports
`1.18.3-dev` while carrying the full 1.19 API, so a `semver.gte(…, '1.19.0')`
check would skip the block exactly where it needs to run. Only a 404 counts as
"old server" — anything else propagates, so an unreachable server still fails
the run instead of quietly skipping it.

Verified against all three: v1.18.0 skips the block (18 passed, 7 skipped),
dev runs it (25 passed), and a stopped server aborts with ECONNREFUSED.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The pin to v1.18.0 was only there because 1.19 is not tagged yet, and it forced
the suite to carry a release-shaped seam: a `/quotas` probe, a `describe.skipIf`
and a separate "Qdrant v1.19 API" block whose tests were skipped on the very
server CI ran.

Point the script at `dev` instead — the client tracks that branch until the
release is tagged, so it is the server the generated code actually matches — and
fold the block back into the single `QdrantClient` suite. No probe, no skips,
every test runs the same way.

Collections renamed off the release too: `test_collection_v1_19` is now
`test_collection_params` and `test_collection_v1_19_sparse` is
`test_collection_sparse`.

Ran through `integration-tests.sh` itself: 25 REST + 17 gRPC, none skipped.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Comment thread packages/qdrant-js/scripts/integration-tests.sh Outdated
@IvanPleshkov
IvanPleshkov marked this pull request as ready for review August 3, 2026 13:40
@IvanPleshkov
IvanPleshkov requested a review from generall August 3, 2026 13:55
@IvanPleshkov
IvanPleshkov merged commit 9c83170 into master Aug 4, 2026
7 checks passed
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.

1 participant