diff --git a/examples/node-js-basic/package.json b/examples/node-js-basic/package.json index 71ee6d8..89d1a84 100644 --- a/examples/node-js-basic/package.json +++ b/examples/node-js-basic/package.json @@ -15,6 +15,6 @@ "author": "Qdrant Team", "license": "Apache-2.0", "dependencies": { - "@qdrant/qdrant-js": "^1.12.0" + "@qdrant/qdrant-js": "^1.13.0" } } diff --git a/packages/js-client-grpc/CHANGELOG.md b/packages/js-client-grpc/CHANGELOG.md index 5a5cc58..016a685 100644 --- a/packages/js-client-grpc/CHANGELOG.md +++ b/packages/js-client-grpc/CHANGELOG.md @@ -1,5 +1,11 @@ # @qdrant/js-client-grpc +## 1.13.0 + +### Minor Changes + +- Qdrant v1.13.0 API + ## 1.12.0 ### Minor Changes diff --git a/packages/js-client-grpc/package.json b/packages/js-client-grpc/package.json index e8100cd..3ec9c8d 100644 --- a/packages/js-client-grpc/package.json +++ b/packages/js-client-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@qdrant/js-client-grpc", - "version": "1.12.0", + "version": "1.13.0", "engines": { "node": ">=18.0.0", "pnpm": ">=8" diff --git a/packages/js-client-grpc/proto/collections.proto b/packages/js-client-grpc/proto/collections.proto index 474735f..ca9d8a5 100644 --- a/packages/js-client-grpc/proto/collections.proto +++ b/packages/js-client-grpc/proto/collections.proto @@ -145,6 +145,17 @@ enum CompressionRatio { x64 = 4; } +message MaxOptimizationThreads { + enum Setting { + Auto = 0; + } + + oneof variant { + uint64 value = 1; + Setting setting = 2; + } +} + message OptimizerStatus { bool ok = 1; string error = 2; @@ -237,7 +248,7 @@ message OptimizersConfigDiff { optional uint64 max_segment_size = 4; /* Maximum size (in kilobytes) of vectors to store in-memory per segment. - Segments larger than this threshold will be stored as read-only memmaped file. + Segments larger than this threshold will be stored as read-only memmapped file. Memmap storage is disabled by default, to enable it, set this threshold to a reasonable value. @@ -260,13 +271,17 @@ message OptimizersConfigDiff { Interval between forced flushes. */ optional uint64 flush_interval_sec = 7; + + // Deprecated in favor of `max_optimization_threads` + optional uint64 deprecated_max_optimization_threads = 8; + /* Max number of threads (jobs) for running optimizations per shard. Note: each optimization job will also use `max_indexing_threads` threads by itself for index building. - If null - have no limit and choose dynamically to saturate CPU. + If "auto" - have no limit and choose dynamically to saturate CPU. If 0 - no optimization threads, optimizations will be disabled. */ - optional uint64 max_optimization_threads = 8; + optional MaxOptimizationThreads max_optimization_threads = 9; } message ScalarQuantization { @@ -320,6 +335,13 @@ message StrictModeConfig { optional uint32 search_max_hnsw_ef = 6; optional bool search_allow_exact = 7; optional float search_max_oversampling = 8; + optional uint64 upsert_max_batchsize = 9; + optional uint64 max_collection_vector_size_bytes = 10; + optional uint32 read_rate_limit = 11; // Max number of read operations per minute per replica + optional uint32 write_rate_limit = 12; // Max number of write operations per minute per replica + optional uint64 max_collection_payload_size_bytes = 13; + optional uint64 filter_max_conditions = 14; + optional uint64 condition_max_size = 15; } message CreateCollection { @@ -351,6 +373,7 @@ message UpdateCollection { optional VectorsConfigDiff vectors_config = 6; // New vector parameters optional QuantizationConfigDiff quantization_config = 7; // Quantization configuration of vector optional SparseVectorConfig sparse_vectors_config = 8; // New sparse vector parameters + optional StrictModeConfig strict_mode_config = 9; // New strict mode configuration } message DeleteCollection { @@ -430,6 +453,7 @@ message TextIndexParams { } message BoolIndexParams { + optional bool on_disk = 1; // If true - store index on disk. } message DatetimeIndexParams { @@ -530,7 +554,8 @@ enum ReplicaState { Listener = 4; // A shard which receives data, but is not used for search; Useful for backup shards PartialSnapshot = 5; // Deprecated: snapshot shard transfer is in progress; Updates should not be sent to (and are ignored by) the shard Recovery = 6; // Shard is undergoing recovered by an external node; Normally rejects updates, accepts updates if force is true - Resharding = 7; // Points are being migrated to this shard as part of resharding + Resharding = 7; // Points are being migrated to this shard as part of scale-up resharding + ReshardingScaleDown = 8; // Points are being migrated to this shard as part of scale-down resharding } message ShardKey { @@ -566,6 +591,15 @@ message ReshardingInfo { uint32 shard_id = 1; uint64 peer_id = 2; optional ShardKey shard_key = 3; + ReshardingDirection direction = 4; +} + +/* + Resharding direction, scale up or down in number of shards +*/ +enum ReshardingDirection { + Up = 0; // Scale up, add a new shard + Down = 1; // Scale down, remove a shard } message CollectionClusterInfoResponse { @@ -574,8 +608,7 @@ message CollectionClusterInfoResponse { repeated LocalShardInfo local_shards = 3; // Local shards repeated RemoteShardInfo remote_shards = 4; // Remote shards repeated ShardTransferInfo shard_transfers = 5; // Shard transfers - // TODO(resharding): enable on release: - // repeated ReshardingInfo resharding_operations = 6; // Resharding operations + repeated ReshardingInfo resharding_operations = 6; // Resharding operations } message MoveShard { diff --git a/packages/js-client-grpc/proto/points.proto b/packages/js-client-grpc/proto/points.proto index 03fa593..7078e0f 100644 --- a/packages/js-client-grpc/proto/points.proto +++ b/packages/js-client-grpc/proto/points.proto @@ -46,11 +46,48 @@ message SparseIndices { repeated uint32 data = 1; } +message Document { + string text = 1; // Text of the document + string model = 3; // Model name + map options = 4; // Model options +} + +message Image { + Value image = 1; // Image data, either base64 encoded or URL + string model = 2; // Model name + map options = 3; // Model options +} + +message InferenceObject { + Value object = 1; // Object to infer + string model = 2; // Model name + map options = 3; // Model options +} + // Legacy vector format, which determines the vector type by the configuration of its fields. message Vector { - repeated float data = 1; // Vector data (flatten for multi vectors) - optional SparseIndices indices = 2; // Sparse indices for sparse vectors - optional uint32 vectors_count = 3; // Number of vectors per multi vector + repeated float data = 1; // Vector data (flatten for multi vectors), deprecated + optional SparseIndices indices = 2; // Sparse indices for sparse vectors, deprecated + optional uint32 vectors_count = 3; // Number of vectors per multi vector, deprecated + oneof vector { + DenseVector dense = 101; // Dense vector + SparseVector sparse = 102; // Sparse vector + MultiDenseVector multi_dense = 103; // Multi dense vector + Document document = 104; + Image image = 105; + InferenceObject object = 106; + } +} + +message VectorOutput { + repeated float data = 1; // Vector data (flatten for multi vectors), deprecated + optional SparseIndices indices = 2; // Sparse indices for sparse vectors, deprecated + optional uint32 vectors_count = 3; // Number of vectors per multi vector, deprecated + oneof vector { + DenseVector dense = 101; // Dense vector + SparseVector sparse = 102; // Sparse vector + MultiDenseVector multi_dense = 103; // Multi dense vector + } } message DenseVector { @@ -73,6 +110,9 @@ message VectorInput { DenseVector dense = 2; SparseVector sparse = 3; MultiDenseVector multi_dense = 4; + Document document = 5; + Image image = 6; + InferenceObject object = 7; } } @@ -214,6 +254,10 @@ message NamedVectors { map vectors = 1; } +message NamedVectorsOutput { + map vectors = 1; +} + message Vectors { oneof vectors_options { Vector vector = 1; @@ -221,6 +265,13 @@ message Vectors { } } +message VectorsOutput { + oneof vectors_options { + VectorOutput vector = 1; + NamedVectorsOutput vectors = 2; + } +} + message VectorsSelector { repeated string names = 1; // List of vectors to include into result } @@ -737,7 +788,7 @@ message ScoredPoint { float score = 3; // Similarity score reserved 4; // deprecated "vector" field uint64 version = 5; // Last update operation applied to this point - optional Vectors vectors = 6; // Vectors to search + optional VectorsOutput vectors = 6; // Vectors to search optional ShardKey shard_key = 7; // Shard key optional OrderValue order_value = 8; // Order by value } @@ -766,21 +817,25 @@ message GroupsResult { message SearchResponse { repeated ScoredPoint result = 1; double time = 2; // Time spent to process + optional HardwareUsage usage = 3; } message QueryResponse { repeated ScoredPoint result = 1; double time = 2; // Time spent to process + optional HardwareUsage usage = 3; } message QueryBatchResponse { repeated BatchResult result = 1; double time = 2; // Time spent to process + optional HardwareUsage usage = 3; } message QueryGroupsResponse { GroupsResult result = 1; double time = 2; // Time spent to process + optional HardwareUsage usage = 3; } message BatchResult { @@ -790,16 +845,19 @@ message BatchResult { message SearchBatchResponse { repeated BatchResult result = 1; double time = 2; // Time spent to process + optional HardwareUsage usage = 3; } message SearchGroupsResponse { GroupsResult result = 1; double time = 2; // Time spent to process + optional HardwareUsage usage = 3; } message CountResponse { CountResult result = 1; double time = 2; // Time spent to process + optional HardwareUsage usage = 3; } message ScrollResponse { @@ -816,7 +874,7 @@ message RetrievedPoint { PointId id = 1; map payload = 2; reserved 3; // deprecated "vector" field - optional Vectors vectors = 4; + optional VectorsOutput vectors = 4; optional ShardKey shard_key = 5; // Shard key optional OrderValue order_value = 6; // Order-by value } @@ -829,26 +887,31 @@ message GetResponse { message RecommendResponse { repeated ScoredPoint result = 1; double time = 2; // Time spent to process + optional HardwareUsage usage = 3; } message RecommendBatchResponse { repeated BatchResult result = 1; double time = 2; // Time spent to process + optional HardwareUsage usage = 3; } message DiscoverResponse { repeated ScoredPoint result = 1; double time = 2; // Time spent to process + optional HardwareUsage usage = 3; } message DiscoverBatchResponse { repeated BatchResult result = 1; double time = 2; // Time spent to process + optional HardwareUsage usage = 3; } message RecommendGroupsResponse { GroupsResult result = 1; double time = 2; // Time spent to process + optional HardwareUsage usage = 3; } message UpdateBatchResponse { @@ -864,11 +927,13 @@ message FacetResponse { message SearchMatrixPairsResponse { SearchMatrixPairs result = 1; double time = 2; // Time spent to process + optional HardwareUsage usage = 3; } message SearchMatrixOffsetsResponse { SearchMatrixOffsets result = 1; double time = 2; // Time spent to process + optional HardwareUsage usage = 3; } // --------------------------------------------- @@ -895,6 +960,7 @@ message Condition { Filter filter = 4; IsNullCondition is_null = 5; NestedCondition nested = 6; + HasVectorCondition has_vector = 7; } } @@ -910,6 +976,10 @@ message HasIdCondition { repeated PointId has_id = 1; } +message HasVectorCondition { + string has_vector = 1; +} + message NestedCondition { string key = 1; // Path to nested object Filter filter = 2; // Filter condition @@ -1021,3 +1091,13 @@ message GeoPoint { double lon = 1; double lat = 2; } + +// --------------------------------------------- +// ------------ Hardware measurements ---------- +// --------------------------------------------- + +message HardwareUsage { + uint64 cpu = 1; + uint64 io_read = 2; + uint64 io_write = 3; +} diff --git a/packages/js-client-grpc/src/client-version.ts b/packages/js-client-grpc/src/client-version.ts index e0e4613..8451b85 100644 --- a/packages/js-client-grpc/src/client-version.ts +++ b/packages/js-client-grpc/src/client-version.ts @@ -1,4 +1,4 @@ -export const PACKAGE_VERSION = '1.12.0'; +export const PACKAGE_VERSION = '1.13.0'; interface Version { major: number; diff --git a/packages/js-client-grpc/src/proto/collections_pb.ts b/packages/js-client-grpc/src/proto/collections_pb.ts index 37036ac..56c07ae 100644 --- a/packages/js-client-grpc/src/proto/collections_pb.ts +++ b/packages/js-client-grpc/src/proto/collections_pb.ts @@ -394,11 +394,18 @@ export enum ReplicaState { Recovery = 6, /** - * Points are being migrated to this shard as part of resharding + * Points are being migrated to this shard as part of scale-up resharding * * @generated from enum value: Resharding = 7; */ Resharding = 7, + + /** + * Points are being migrated to this shard as part of scale-down resharding + * + * @generated from enum value: ReshardingScaleDown = 8; + */ + ReshardingScaleDown = 8, } // Retrieve enum metadata with: proto3.getEnumType(ReplicaState) proto3.util.setEnumType(ReplicaState, "qdrant.ReplicaState", [ @@ -410,6 +417,34 @@ proto3.util.setEnumType(ReplicaState, "qdrant.ReplicaState", [ { no: 5, name: "PartialSnapshot" }, { no: 6, name: "Recovery" }, { no: 7, name: "Resharding" }, + { no: 8, name: "ReshardingScaleDown" }, +]); + +/** + * + * Resharding direction, scale up or down in number of shards + * + * @generated from enum qdrant.ReshardingDirection + */ +export enum ReshardingDirection { + /** + * Scale up, add a new shard + * + * @generated from enum value: Up = 0; + */ + Up = 0, + + /** + * Scale down, remove a shard + * + * @generated from enum value: Down = 1; + */ + Down = 1, +} +// Retrieve enum metadata with: proto3.getEnumType(ReshardingDirection) +proto3.util.setEnumType(ReshardingDirection, "qdrant.ReshardingDirection", [ + { no: 0, name: "Up" }, + { no: 1, name: "Down" }, ]); /** @@ -1209,6 +1244,70 @@ export class ListCollectionsResponse extends Message { } } +/** + * @generated from message qdrant.MaxOptimizationThreads + */ +export class MaxOptimizationThreads extends Message { + /** + * @generated from oneof qdrant.MaxOptimizationThreads.variant + */ + variant: { + /** + * @generated from field: uint64 value = 1; + */ + value: bigint; + case: "value"; + } | { + /** + * @generated from field: qdrant.MaxOptimizationThreads.Setting setting = 2; + */ + value: MaxOptimizationThreads_Setting; + case: "setting"; + } | { case: undefined; value?: undefined } = { case: undefined }; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.MaxOptimizationThreads"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "value", kind: "scalar", T: 4 /* ScalarType.UINT64 */, oneof: "variant" }, + { no: 2, name: "setting", kind: "enum", T: proto3.getEnumType(MaxOptimizationThreads_Setting), oneof: "variant" }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): MaxOptimizationThreads { + return new MaxOptimizationThreads().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): MaxOptimizationThreads { + return new MaxOptimizationThreads().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): MaxOptimizationThreads { + return new MaxOptimizationThreads().fromJsonString(jsonString, options); + } + + static equals(a: MaxOptimizationThreads | PlainMessage | undefined, b: MaxOptimizationThreads | PlainMessage | undefined): boolean { + return proto3.util.equals(MaxOptimizationThreads, a, b); + } +} + +/** + * @generated from enum qdrant.MaxOptimizationThreads.Setting + */ +export enum MaxOptimizationThreads_Setting { + /** + * @generated from enum value: Auto = 0; + */ + Auto = 0, +} +// Retrieve enum metadata with: proto3.getEnumType(MaxOptimizationThreads_Setting) +proto3.util.setEnumType(MaxOptimizationThreads_Setting, "qdrant.MaxOptimizationThreads.Setting", [ + { no: 0, name: "Auto" }, +]); + /** * @generated from message qdrant.OptimizerStatus */ @@ -1502,7 +1601,7 @@ export class OptimizersConfigDiff extends Message { /** * * Maximum size (in kilobytes) of vectors to store in-memory per segment. - * Segments larger than this threshold will be stored as read-only memmaped file. + * Segments larger than this threshold will be stored as read-only memmapped file. * * Memmap storage is disabled by default, to enable it, set this threshold to a reasonable value. * @@ -1536,16 +1635,23 @@ export class OptimizersConfigDiff extends Message { */ flushIntervalSec?: bigint; + /** + * Deprecated in favor of `max_optimization_threads` + * + * @generated from field: optional uint64 deprecated_max_optimization_threads = 8; + */ + deprecatedMaxOptimizationThreads?: bigint; + /** * * Max number of threads (jobs) for running optimizations per shard. * Note: each optimization job will also use `max_indexing_threads` threads by itself for index building. - * If null - have no limit and choose dynamically to saturate CPU. + * If "auto" - have no limit and choose dynamically to saturate CPU. * If 0 - no optimization threads, optimizations will be disabled. * - * @generated from field: optional uint64 max_optimization_threads = 8; + * @generated from field: optional qdrant.MaxOptimizationThreads max_optimization_threads = 9; */ - maxOptimizationThreads?: bigint; + maxOptimizationThreads?: MaxOptimizationThreads; constructor(data?: PartialMessage) { super(); @@ -1562,7 +1668,8 @@ export class OptimizersConfigDiff extends Message { { no: 5, name: "memmap_threshold", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, { no: 6, name: "indexing_threshold", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, { no: 7, name: "flush_interval_sec", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, - { no: 8, name: "max_optimization_threads", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + { no: 8, name: "deprecated_max_optimization_threads", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + { no: 9, name: "max_optimization_threads", kind: "message", T: MaxOptimizationThreads, opt: true }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): OptimizersConfigDiff { @@ -1919,6 +2026,45 @@ export class StrictModeConfig extends Message { */ searchMaxOversampling?: number; + /** + * @generated from field: optional uint64 upsert_max_batchsize = 9; + */ + upsertMaxBatchsize?: bigint; + + /** + * @generated from field: optional uint64 max_collection_vector_size_bytes = 10; + */ + maxCollectionVectorSizeBytes?: bigint; + + /** + * Max number of read operations per minute per replica + * + * @generated from field: optional uint32 read_rate_limit = 11; + */ + readRateLimit?: number; + + /** + * Max number of write operations per minute per replica + * + * @generated from field: optional uint32 write_rate_limit = 12; + */ + writeRateLimit?: number; + + /** + * @generated from field: optional uint64 max_collection_payload_size_bytes = 13; + */ + maxCollectionPayloadSizeBytes?: bigint; + + /** + * @generated from field: optional uint64 filter_max_conditions = 14; + */ + filterMaxConditions?: bigint; + + /** + * @generated from field: optional uint64 condition_max_size = 15; + */ + conditionMaxSize?: bigint; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -1935,6 +2081,13 @@ export class StrictModeConfig extends Message { { no: 6, name: "search_max_hnsw_ef", kind: "scalar", T: 13 /* ScalarType.UINT32 */, opt: true }, { no: 7, name: "search_allow_exact", kind: "scalar", T: 8 /* ScalarType.BOOL */, opt: true }, { no: 8, name: "search_max_oversampling", kind: "scalar", T: 2 /* ScalarType.FLOAT */, opt: true }, + { no: 9, name: "upsert_max_batchsize", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + { no: 10, name: "max_collection_vector_size_bytes", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + { no: 11, name: "read_rate_limit", kind: "scalar", T: 13 /* ScalarType.UINT32 */, opt: true }, + { no: 12, name: "write_rate_limit", kind: "scalar", T: 13 /* ScalarType.UINT32 */, opt: true }, + { no: 13, name: "max_collection_payload_size_bytes", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + { no: 14, name: "filter_max_conditions", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + { no: 15, name: "condition_max_size", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): StrictModeConfig { @@ -2165,6 +2318,13 @@ export class UpdateCollection extends Message { */ sparseVectorsConfig?: SparseVectorConfig; + /** + * New strict mode configuration + * + * @generated from field: optional qdrant.StrictModeConfig strict_mode_config = 9; + */ + strictModeConfig?: StrictModeConfig; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -2181,6 +2341,7 @@ export class UpdateCollection extends Message { { no: 6, name: "vectors_config", kind: "message", T: VectorsConfigDiff, opt: true }, { no: 7, name: "quantization_config", kind: "message", T: QuantizationConfigDiff, opt: true }, { no: 8, name: "sparse_vectors_config", kind: "message", T: SparseVectorConfig, opt: true }, + { no: 9, name: "strict_mode_config", kind: "message", T: StrictModeConfig, opt: true }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): UpdateCollection { @@ -2802,6 +2963,13 @@ export class TextIndexParams extends Message { * @generated from message qdrant.BoolIndexParams */ export class BoolIndexParams extends Message { + /** + * If true - store index on disk. + * + * @generated from field: optional bool on_disk = 1; + */ + onDisk?: boolean; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -2810,6 +2978,7 @@ export class BoolIndexParams extends Message { static readonly runtime: typeof proto3 = proto3; static readonly typeName = "qdrant.BoolIndexParams"; static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "on_disk", kind: "scalar", T: 8 /* ScalarType.BOOL */, opt: true }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): BoolIndexParams { @@ -3883,6 +4052,11 @@ export class ReshardingInfo extends Message { */ shardKey?: ShardKey; + /** + * @generated from field: qdrant.ReshardingDirection direction = 4; + */ + direction = ReshardingDirection.Up; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -3894,6 +4068,7 @@ export class ReshardingInfo extends Message { { no: 1, name: "shard_id", kind: "scalar", T: 13 /* ScalarType.UINT32 */ }, { no: 2, name: "peer_id", kind: "scalar", T: 4 /* ScalarType.UINT64 */ }, { no: 3, name: "shard_key", kind: "message", T: ShardKey, opt: true }, + { no: 4, name: "direction", kind: "enum", T: proto3.getEnumType(ReshardingDirection) }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): ReshardingInfo { @@ -3952,6 +4127,13 @@ export class CollectionClusterInfoResponse extends Message) { super(); proto3.util.initPartial(data, this); @@ -3965,6 +4147,7 @@ export class CollectionClusterInfoResponse extends Message): CollectionClusterInfoResponse { diff --git a/packages/js-client-grpc/src/proto/points_pb.ts b/packages/js-client-grpc/src/proto/points_pb.ts index 3af7a70..43119b4 100644 --- a/packages/js-client-grpc/src/proto/points_pb.ts +++ b/packages/js-client-grpc/src/proto/points_pb.ts @@ -5,8 +5,8 @@ import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf"; import { Message, proto3, protoInt64, Timestamp } from "@bufbuild/protobuf"; -import { PayloadIndexParams, ShardKey } from "./collections_pb.js"; import { Value } from "./json_with_int_pb.js"; +import { PayloadIndexParams, ShardKey } from "./collections_pb.js"; /** * @generated from enum qdrant.WriteOrderingType @@ -443,6 +443,171 @@ export class SparseIndices extends Message { } } +/** + * @generated from message qdrant.Document + */ +export class Document extends Message { + /** + * Text of the document + * + * @generated from field: string text = 1; + */ + text = ""; + + /** + * Model name + * + * @generated from field: string model = 3; + */ + model = ""; + + /** + * Model options + * + * @generated from field: map options = 4; + */ + options: { [key: string]: Value } = {}; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.Document"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "text", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 3, name: "model", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 4, name: "options", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "message", T: Value} }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): Document { + return new Document().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): Document { + return new Document().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): Document { + return new Document().fromJsonString(jsonString, options); + } + + static equals(a: Document | PlainMessage | undefined, b: Document | PlainMessage | undefined): boolean { + return proto3.util.equals(Document, a, b); + } +} + +/** + * @generated from message qdrant.Image + */ +export class Image extends Message { + /** + * Image data, either base64 encoded or URL + * + * @generated from field: qdrant.Value image = 1; + */ + image?: Value; + + /** + * Model name + * + * @generated from field: string model = 2; + */ + model = ""; + + /** + * Model options + * + * @generated from field: map options = 3; + */ + options: { [key: string]: Value } = {}; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.Image"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "image", kind: "message", T: Value }, + { no: 2, name: "model", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 3, name: "options", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "message", T: Value} }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): Image { + return new Image().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): Image { + return new Image().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): Image { + return new Image().fromJsonString(jsonString, options); + } + + static equals(a: Image | PlainMessage | undefined, b: Image | PlainMessage | undefined): boolean { + return proto3.util.equals(Image, a, b); + } +} + +/** + * @generated from message qdrant.InferenceObject + */ +export class InferenceObject extends Message { + /** + * Object to infer + * + * @generated from field: qdrant.Value object = 1; + */ + object?: Value; + + /** + * Model name + * + * @generated from field: string model = 2; + */ + model = ""; + + /** + * Model options + * + * @generated from field: map options = 3; + */ + options: { [key: string]: Value } = {}; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.InferenceObject"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "object", kind: "message", T: Value }, + { no: 2, name: "model", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 3, name: "options", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "message", T: Value} }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): InferenceObject { + return new InferenceObject().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): InferenceObject { + return new InferenceObject().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): InferenceObject { + return new InferenceObject().fromJsonString(jsonString, options); + } + + static equals(a: InferenceObject | PlainMessage | undefined, b: InferenceObject | PlainMessage | undefined): boolean { + return proto3.util.equals(InferenceObject, a, b); + } +} + /** * Legacy vector format, which determines the vector type by the configuration of its fields. * @@ -450,26 +615,73 @@ export class SparseIndices extends Message { */ export class Vector extends Message { /** - * Vector data (flatten for multi vectors) + * Vector data (flatten for multi vectors), deprecated * * @generated from field: repeated float data = 1; */ data: number[] = []; /** - * Sparse indices for sparse vectors + * Sparse indices for sparse vectors, deprecated * * @generated from field: optional qdrant.SparseIndices indices = 2; */ indices?: SparseIndices; /** - * Number of vectors per multi vector + * Number of vectors per multi vector, deprecated * * @generated from field: optional uint32 vectors_count = 3; */ vectorsCount?: number; + /** + * @generated from oneof qdrant.Vector.vector + */ + vector: { + /** + * Dense vector + * + * @generated from field: qdrant.DenseVector dense = 101; + */ + value: DenseVector; + case: "dense"; + } | { + /** + * Sparse vector + * + * @generated from field: qdrant.SparseVector sparse = 102; + */ + value: SparseVector; + case: "sparse"; + } | { + /** + * Multi dense vector + * + * @generated from field: qdrant.MultiDenseVector multi_dense = 103; + */ + value: MultiDenseVector; + case: "multiDense"; + } | { + /** + * @generated from field: qdrant.Document document = 104; + */ + value: Document; + case: "document"; + } | { + /** + * @generated from field: qdrant.Image image = 105; + */ + value: Image; + case: "image"; + } | { + /** + * @generated from field: qdrant.InferenceObject object = 106; + */ + value: InferenceObject; + case: "object"; + } | { case: undefined; value?: undefined } = { case: undefined }; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -481,6 +693,12 @@ export class Vector extends Message { { no: 1, name: "data", kind: "scalar", T: 2 /* ScalarType.FLOAT */, repeated: true }, { no: 2, name: "indices", kind: "message", T: SparseIndices, opt: true }, { no: 3, name: "vectors_count", kind: "scalar", T: 13 /* ScalarType.UINT32 */, opt: true }, + { no: 101, name: "dense", kind: "message", T: DenseVector, oneof: "vector" }, + { no: 102, name: "sparse", kind: "message", T: SparseVector, oneof: "vector" }, + { no: 103, name: "multi_dense", kind: "message", T: MultiDenseVector, oneof: "vector" }, + { no: 104, name: "document", kind: "message", T: Document, oneof: "vector" }, + { no: 105, name: "image", kind: "message", T: Image, oneof: "vector" }, + { no: 106, name: "object", kind: "message", T: InferenceObject, oneof: "vector" }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): Vector { @@ -500,6 +718,93 @@ export class Vector extends Message { } } +/** + * @generated from message qdrant.VectorOutput + */ +export class VectorOutput extends Message { + /** + * Vector data (flatten for multi vectors), deprecated + * + * @generated from field: repeated float data = 1; + */ + data: number[] = []; + + /** + * Sparse indices for sparse vectors, deprecated + * + * @generated from field: optional qdrant.SparseIndices indices = 2; + */ + indices?: SparseIndices; + + /** + * Number of vectors per multi vector, deprecated + * + * @generated from field: optional uint32 vectors_count = 3; + */ + vectorsCount?: number; + + /** + * @generated from oneof qdrant.VectorOutput.vector + */ + vector: { + /** + * Dense vector + * + * @generated from field: qdrant.DenseVector dense = 101; + */ + value: DenseVector; + case: "dense"; + } | { + /** + * Sparse vector + * + * @generated from field: qdrant.SparseVector sparse = 102; + */ + value: SparseVector; + case: "sparse"; + } | { + /** + * Multi dense vector + * + * @generated from field: qdrant.MultiDenseVector multi_dense = 103; + */ + value: MultiDenseVector; + case: "multiDense"; + } | { case: undefined; value?: undefined } = { case: undefined }; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.VectorOutput"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "data", kind: "scalar", T: 2 /* ScalarType.FLOAT */, repeated: true }, + { no: 2, name: "indices", kind: "message", T: SparseIndices, opt: true }, + { no: 3, name: "vectors_count", kind: "scalar", T: 13 /* ScalarType.UINT32 */, opt: true }, + { no: 101, name: "dense", kind: "message", T: DenseVector, oneof: "vector" }, + { no: 102, name: "sparse", kind: "message", T: SparseVector, oneof: "vector" }, + { no: 103, name: "multi_dense", kind: "message", T: MultiDenseVector, oneof: "vector" }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): VectorOutput { + return new VectorOutput().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): VectorOutput { + return new VectorOutput().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): VectorOutput { + return new VectorOutput().fromJsonString(jsonString, options); + } + + static equals(a: VectorOutput | PlainMessage | undefined, b: VectorOutput | PlainMessage | undefined): boolean { + return proto3.util.equals(VectorOutput, a, b); + } +} + /** * @generated from message qdrant.DenseVector */ @@ -650,6 +955,24 @@ export class VectorInput extends Message { */ value: MultiDenseVector; case: "multiDense"; + } | { + /** + * @generated from field: qdrant.Document document = 5; + */ + value: Document; + case: "document"; + } | { + /** + * @generated from field: qdrant.Image image = 6; + */ + value: Image; + case: "image"; + } | { + /** + * @generated from field: qdrant.InferenceObject object = 7; + */ + value: InferenceObject; + case: "object"; } | { case: undefined; value?: undefined } = { case: undefined }; constructor(data?: PartialMessage) { @@ -664,6 +987,9 @@ export class VectorInput extends Message { { no: 2, name: "dense", kind: "message", T: DenseVector, oneof: "variant" }, { no: 3, name: "sparse", kind: "message", T: SparseVector, oneof: "variant" }, { no: 4, name: "multi_dense", kind: "message", T: MultiDenseVector, oneof: "variant" }, + { no: 5, name: "document", kind: "message", T: Document, oneof: "variant" }, + { no: 6, name: "image", kind: "message", T: Image, oneof: "variant" }, + { no: 7, name: "object", kind: "message", T: InferenceObject, oneof: "variant" }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): VectorInput { @@ -1699,6 +2025,43 @@ export class NamedVectors extends Message { } } +/** + * @generated from message qdrant.NamedVectorsOutput + */ +export class NamedVectorsOutput extends Message { + /** + * @generated from field: map vectors = 1; + */ + vectors: { [key: string]: VectorOutput } = {}; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.NamedVectorsOutput"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "vectors", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "message", T: VectorOutput} }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): NamedVectorsOutput { + return new NamedVectorsOutput().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): NamedVectorsOutput { + return new NamedVectorsOutput().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): NamedVectorsOutput { + return new NamedVectorsOutput().fromJsonString(jsonString, options); + } + + static equals(a: NamedVectorsOutput | PlainMessage | undefined, b: NamedVectorsOutput | PlainMessage | undefined): boolean { + return proto3.util.equals(NamedVectorsOutput, a, b); + } +} + /** * @generated from message qdrant.Vectors */ @@ -1749,6 +2112,56 @@ export class Vectors extends Message { } } +/** + * @generated from message qdrant.VectorsOutput + */ +export class VectorsOutput extends Message { + /** + * @generated from oneof qdrant.VectorsOutput.vectors_options + */ + vectorsOptions: { + /** + * @generated from field: qdrant.VectorOutput vector = 1; + */ + value: VectorOutput; + case: "vector"; + } | { + /** + * @generated from field: qdrant.NamedVectorsOutput vectors = 2; + */ + value: NamedVectorsOutput; + case: "vectors"; + } | { case: undefined; value?: undefined } = { case: undefined }; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.VectorsOutput"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "vector", kind: "message", T: VectorOutput, oneof: "vectors_options" }, + { no: 2, name: "vectors", kind: "message", T: NamedVectorsOutput, oneof: "vectors_options" }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): VectorsOutput { + return new VectorsOutput().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): VectorsOutput { + return new VectorsOutput().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): VectorsOutput { + return new VectorsOutput().fromJsonString(jsonString, options); + } + + static equals(a: VectorsOutput | PlainMessage | undefined, b: VectorsOutput | PlainMessage | undefined): boolean { + return proto3.util.equals(VectorsOutput, a, b); + } +} + /** * @generated from message qdrant.VectorsSelector */ @@ -5495,9 +5908,9 @@ export class ScoredPoint extends Message { /** * Vectors to search * - * @generated from field: optional qdrant.Vectors vectors = 6; + * @generated from field: optional qdrant.VectorsOutput vectors = 6; */ - vectors?: Vectors; + vectors?: VectorsOutput; /** * Shard key @@ -5525,7 +5938,7 @@ export class ScoredPoint extends Message { { no: 2, name: "payload", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "message", T: Value} }, { no: 3, name: "score", kind: "scalar", T: 2 /* ScalarType.FLOAT */ }, { no: 5, name: "version", kind: "scalar", T: 4 /* ScalarType.UINT64 */ }, - { no: 6, name: "vectors", kind: "message", T: Vectors, opt: true }, + { no: 6, name: "vectors", kind: "message", T: VectorsOutput, opt: true }, { no: 7, name: "shard_key", kind: "message", T: ShardKey, opt: true }, { no: 8, name: "order_value", kind: "message", T: OrderValue, opt: true }, ]); @@ -5720,6 +6133,11 @@ export class SearchResponse extends Message { */ time = 0; + /** + * @generated from field: optional qdrant.HardwareUsage usage = 3; + */ + usage?: HardwareUsage; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -5730,6 +6148,7 @@ export class SearchResponse extends Message { static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "result", kind: "message", T: ScoredPoint, repeated: true }, { no: 2, name: "time", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + { no: 3, name: "usage", kind: "message", T: HardwareUsage, opt: true }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): SearchResponse { @@ -5765,6 +6184,11 @@ export class QueryResponse extends Message { */ time = 0; + /** + * @generated from field: optional qdrant.HardwareUsage usage = 3; + */ + usage?: HardwareUsage; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -5775,6 +6199,7 @@ export class QueryResponse extends Message { static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "result", kind: "message", T: ScoredPoint, repeated: true }, { no: 2, name: "time", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + { no: 3, name: "usage", kind: "message", T: HardwareUsage, opt: true }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): QueryResponse { @@ -5810,6 +6235,11 @@ export class QueryBatchResponse extends Message { */ time = 0; + /** + * @generated from field: optional qdrant.HardwareUsage usage = 3; + */ + usage?: HardwareUsage; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -5820,6 +6250,7 @@ export class QueryBatchResponse extends Message { static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "result", kind: "message", T: BatchResult, repeated: true }, { no: 2, name: "time", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + { no: 3, name: "usage", kind: "message", T: HardwareUsage, opt: true }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): QueryBatchResponse { @@ -5855,6 +6286,11 @@ export class QueryGroupsResponse extends Message { */ time = 0; + /** + * @generated from field: optional qdrant.HardwareUsage usage = 3; + */ + usage?: HardwareUsage; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -5865,6 +6301,7 @@ export class QueryGroupsResponse extends Message { static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "result", kind: "message", T: GroupsResult }, { no: 2, name: "time", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + { no: 3, name: "usage", kind: "message", T: HardwareUsage, opt: true }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): QueryGroupsResponse { @@ -5937,6 +6374,11 @@ export class SearchBatchResponse extends Message { */ time = 0; + /** + * @generated from field: optional qdrant.HardwareUsage usage = 3; + */ + usage?: HardwareUsage; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -5947,6 +6389,7 @@ export class SearchBatchResponse extends Message { static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "result", kind: "message", T: BatchResult, repeated: true }, { no: 2, name: "time", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + { no: 3, name: "usage", kind: "message", T: HardwareUsage, opt: true }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): SearchBatchResponse { @@ -5982,6 +6425,11 @@ export class SearchGroupsResponse extends Message { */ time = 0; + /** + * @generated from field: optional qdrant.HardwareUsage usage = 3; + */ + usage?: HardwareUsage; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -5992,6 +6440,7 @@ export class SearchGroupsResponse extends Message { static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "result", kind: "message", T: GroupsResult }, { no: 2, name: "time", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + { no: 3, name: "usage", kind: "message", T: HardwareUsage, opt: true }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): SearchGroupsResponse { @@ -6027,6 +6476,11 @@ export class CountResponse extends Message { */ time = 0; + /** + * @generated from field: optional qdrant.HardwareUsage usage = 3; + */ + usage?: HardwareUsage; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -6037,6 +6491,7 @@ export class CountResponse extends Message { static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "result", kind: "message", T: CountResult }, { no: 2, name: "time", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + { no: 3, name: "usage", kind: "message", T: HardwareUsage, opt: true }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): CountResponse { @@ -6161,9 +6616,9 @@ export class RetrievedPoint extends Message { payload: { [key: string]: Value } = {}; /** - * @generated from field: optional qdrant.Vectors vectors = 4; + * @generated from field: optional qdrant.VectorsOutput vectors = 4; */ - vectors?: Vectors; + vectors?: VectorsOutput; /** * Shard key @@ -6189,7 +6644,7 @@ export class RetrievedPoint extends Message { static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "id", kind: "message", T: PointId }, { no: 2, name: "payload", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "message", T: Value} }, - { no: 4, name: "vectors", kind: "message", T: Vectors, opt: true }, + { no: 4, name: "vectors", kind: "message", T: VectorsOutput, opt: true }, { no: 5, name: "shard_key", kind: "message", T: ShardKey, opt: true }, { no: 6, name: "order_value", kind: "message", T: OrderValue, opt: true }, ]); @@ -6272,6 +6727,11 @@ export class RecommendResponse extends Message { */ time = 0; + /** + * @generated from field: optional qdrant.HardwareUsage usage = 3; + */ + usage?: HardwareUsage; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -6282,6 +6742,7 @@ export class RecommendResponse extends Message { static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "result", kind: "message", T: ScoredPoint, repeated: true }, { no: 2, name: "time", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + { no: 3, name: "usage", kind: "message", T: HardwareUsage, opt: true }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): RecommendResponse { @@ -6317,6 +6778,11 @@ export class RecommendBatchResponse extends Message { */ time = 0; + /** + * @generated from field: optional qdrant.HardwareUsage usage = 3; + */ + usage?: HardwareUsage; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -6327,6 +6793,7 @@ export class RecommendBatchResponse extends Message { static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "result", kind: "message", T: BatchResult, repeated: true }, { no: 2, name: "time", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + { no: 3, name: "usage", kind: "message", T: HardwareUsage, opt: true }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): RecommendBatchResponse { @@ -6362,6 +6829,11 @@ export class DiscoverResponse extends Message { */ time = 0; + /** + * @generated from field: optional qdrant.HardwareUsage usage = 3; + */ + usage?: HardwareUsage; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -6372,6 +6844,7 @@ export class DiscoverResponse extends Message { static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "result", kind: "message", T: ScoredPoint, repeated: true }, { no: 2, name: "time", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + { no: 3, name: "usage", kind: "message", T: HardwareUsage, opt: true }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): DiscoverResponse { @@ -6407,6 +6880,11 @@ export class DiscoverBatchResponse extends Message { */ time = 0; + /** + * @generated from field: optional qdrant.HardwareUsage usage = 3; + */ + usage?: HardwareUsage; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -6417,6 +6895,7 @@ export class DiscoverBatchResponse extends Message { static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "result", kind: "message", T: BatchResult, repeated: true }, { no: 2, name: "time", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + { no: 3, name: "usage", kind: "message", T: HardwareUsage, opt: true }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): DiscoverBatchResponse { @@ -6452,6 +6931,11 @@ export class RecommendGroupsResponse extends Message { */ time = 0; + /** + * @generated from field: optional qdrant.HardwareUsage usage = 3; + */ + usage?: HardwareUsage; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -6462,6 +6946,7 @@ export class RecommendGroupsResponse extends Message { static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "result", kind: "message", T: GroupsResult }, { no: 2, name: "time", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + { no: 3, name: "usage", kind: "message", T: HardwareUsage, opt: true }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): RecommendGroupsResponse { @@ -6587,6 +7072,11 @@ export class SearchMatrixPairsResponse extends Message) { super(); proto3.util.initPartial(data, this); @@ -6597,6 +7087,7 @@ export class SearchMatrixPairsResponse extends Message [ { no: 1, name: "result", kind: "message", T: SearchMatrixPairs }, { no: 2, name: "time", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + { no: 3, name: "usage", kind: "message", T: HardwareUsage, opt: true }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): SearchMatrixPairsResponse { @@ -6632,6 +7123,11 @@ export class SearchMatrixOffsetsResponse extends Message) { super(); proto3.util.initPartial(data, this); @@ -6642,6 +7138,7 @@ export class SearchMatrixOffsetsResponse extends Message [ { no: 1, name: "result", kind: "message", T: SearchMatrixOffsets }, { no: 2, name: "time", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + { no: 3, name: "usage", kind: "message", T: HardwareUsage, opt: true }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): SearchMatrixOffsetsResponse { @@ -6810,6 +7307,12 @@ export class Condition extends Message { */ value: NestedCondition; case: "nested"; + } | { + /** + * @generated from field: qdrant.HasVectorCondition has_vector = 7; + */ + value: HasVectorCondition; + case: "hasVector"; } | { case: undefined; value?: undefined } = { case: undefined }; constructor(data?: PartialMessage) { @@ -6826,6 +7329,7 @@ export class Condition extends Message { { no: 4, name: "filter", kind: "message", T: Filter, oneof: "condition_one_of" }, { no: 5, name: "is_null", kind: "message", T: IsNullCondition, oneof: "condition_one_of" }, { no: 6, name: "nested", kind: "message", T: NestedCondition, oneof: "condition_one_of" }, + { no: 7, name: "has_vector", kind: "message", T: HasVectorCondition, oneof: "condition_one_of" }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): Condition { @@ -6956,6 +7460,43 @@ export class HasIdCondition extends Message { } } +/** + * @generated from message qdrant.HasVectorCondition + */ +export class HasVectorCondition extends Message { + /** + * @generated from field: string has_vector = 1; + */ + hasVector = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.HasVectorCondition"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "has_vector", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): HasVectorCondition { + return new HasVectorCondition().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): HasVectorCondition { + return new HasVectorCondition().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): HasVectorCondition { + return new HasVectorCondition().fromJsonString(jsonString, options); + } + + static equals(a: HasVectorCondition | PlainMessage | undefined, b: HasVectorCondition | PlainMessage | undefined): boolean { + return proto3.util.equals(HasVectorCondition, a, b); + } +} + /** * @generated from message qdrant.NestedCondition */ @@ -7805,3 +8346,52 @@ export class GeoPoint extends Message { } } +/** + * @generated from message qdrant.HardwareUsage + */ +export class HardwareUsage extends Message { + /** + * @generated from field: uint64 cpu = 1; + */ + cpu = protoInt64.zero; + + /** + * @generated from field: uint64 io_read = 2; + */ + ioRead = protoInt64.zero; + + /** + * @generated from field: uint64 io_write = 3; + */ + ioWrite = protoInt64.zero; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.HardwareUsage"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "cpu", kind: "scalar", T: 4 /* ScalarType.UINT64 */ }, + { no: 2, name: "io_read", kind: "scalar", T: 4 /* ScalarType.UINT64 */ }, + { no: 3, name: "io_write", kind: "scalar", T: 4 /* ScalarType.UINT64 */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): HardwareUsage { + return new HardwareUsage().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): HardwareUsage { + return new HardwareUsage().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): HardwareUsage { + return new HardwareUsage().fromJsonString(jsonString, options); + } + + static equals(a: HardwareUsage | PlainMessage | undefined, b: HardwareUsage | PlainMessage | undefined): boolean { + return proto3.util.equals(HardwareUsage, a, b); + } +} + diff --git a/packages/js-client-rest/CHANGELOG.md b/packages/js-client-rest/CHANGELOG.md index bf92cf5..3dcb4ad 100644 --- a/packages/js-client-rest/CHANGELOG.md +++ b/packages/js-client-rest/CHANGELOG.md @@ -1,5 +1,11 @@ # @qdrant/js-client-rest +## 1.13.0 + +### Minor Changes + +- Qdrant v1.13.0 API + ## 1.12.0 ### Minor Changes diff --git a/packages/js-client-rest/package.json b/packages/js-client-rest/package.json index 45793f2..be0e8d3 100644 --- a/packages/js-client-rest/package.json +++ b/packages/js-client-rest/package.json @@ -1,6 +1,6 @@ { "name": "@qdrant/js-client-rest", - "version": "1.12.0", + "version": "1.13.0", "engines": { "node": ">=18.0.0", "pnpm": ">=8" diff --git a/packages/js-client-rest/src/client-version.ts b/packages/js-client-rest/src/client-version.ts index e0e4613..8451b85 100644 --- a/packages/js-client-rest/src/client-version.ts +++ b/packages/js-client-rest/src/client-version.ts @@ -1,4 +1,4 @@ -export const PACKAGE_VERSION = '1.12.0'; +export const PACKAGE_VERSION = '1.13.0'; interface Version { major: number; diff --git a/packages/js-client-rest/src/openapi/generated_schema.ts b/packages/js-client-rest/src/openapi/generated_schema.ts index 28a17ba..44a1b4f 100644 --- a/packages/js-client-rest/src/openapi/generated_schema.ts +++ b/packages/js-client-rest/src/openapi/generated_schema.ts @@ -548,13 +548,15 @@ export interface components { OptimizersStatus: OneOf<["ok", { error: string; }]>; + /** @description Information about the collection configuration */ CollectionConfig: { params: components["schemas"]["CollectionParams"]; hnsw_config: components["schemas"]["HnswConfig"]; optimizer_config: components["schemas"]["OptimizersConfig"]; - wal_config: components["schemas"]["WalConfig"]; + wal_config?: components["schemas"]["WalConfig"] | (Record | null); /** @default null */ quantization_config?: components["schemas"]["QuantizationConfig"] | (Record | null); + strict_mode_config?: components["schemas"]["StrictModeConfig"] | (Record | null); }; CollectionParams: { vectors?: components["schemas"]["VectorsConfig"]; @@ -584,8 +586,10 @@ export interface components { */ read_fan_out_factor?: number | null; /** - * @description If true - point's payload will not be stored in memory. It will be read from the disk every time it is requested. This setting saves RAM by (slightly) increasing the response time. Note: those payload values that are involved in filtering and are indexed - remain in RAM. - * @default false + * @description If true - point's payload will not be stored in memory. It will be read from the disk every time it is requested. This setting saves RAM by (slightly) increasing the response time. Note: those payload values that are involved in filtering and are indexed - remain in RAM. + * + * Default: true + * @default true */ on_disk_payload?: boolean; /** @description Configuration of the sparse vector storage */ @@ -790,7 +794,7 @@ export interface components { max_segment_size?: number | null; /** * Format: uint - * @description Maximum size (in kilobytes) of vectors to store in-memory per segment. Segments larger than this threshold will be stored as read-only memmaped file. + * @description Maximum size (in kilobytes) of vectors to store in-memory per segment. Segments larger than this threshold will be stored as read-only memmapped file. * * Memmap storage is disabled by default, to enable it, set this threshold to a reasonable value. * @@ -836,6 +840,71 @@ export interface components { */ wal_segments_ahead: number; }; + StrictModeConfig: { + /** @description Whether strict mode is enabled for a collection or not. */ + enabled?: boolean | null; + /** + * Format: uint + * @description Max allowed `limit` parameter for all APIs that don't have their own max limit. + */ + max_query_limit?: number | null; + /** + * Format: uint + * @description Max allowed `timeout` parameter. + */ + max_timeout?: number | null; + /** @description Allow usage of unindexed fields in retrieval based (eg. search) filters. */ + unindexed_filtering_retrieve?: boolean | null; + /** @description Allow usage of unindexed fields in filtered updates (eg. delete by payload). */ + unindexed_filtering_update?: boolean | null; + /** + * Format: uint + * @description Max HNSW value allowed in search parameters. + */ + search_max_hnsw_ef?: number | null; + /** @description Whether exact search is allowed or not. */ + search_allow_exact?: boolean | null; + /** + * Format: double + * @description Max oversampling value allowed in search. + */ + search_max_oversampling?: number | null; + /** + * Format: uint + * @description Max batchsize when upserting + */ + upsert_max_batchsize?: number | null; + /** + * Format: uint + * @description Max size of a collections vector storage in bytes, ignoring replicas. + */ + max_collection_vector_size_bytes?: number | null; + /** + * Format: uint + * @description Max number of read operations per minute per replica + */ + read_rate_limit?: number | null; + /** + * Format: uint + * @description Max number of write operations per minute per replica + */ + write_rate_limit?: number | null; + /** + * Format: uint + * @description Max size of a collections payload storage in bytes + */ + max_collection_payload_size_bytes?: number | null; + /** + * Format: uint + * @description Max conditions a filter can have. + */ + filter_max_conditions?: number | null; + /** + * Format: uint + * @description Max size of a condition, eg. items in `MatchAny`. + */ + condition_max_size?: number | null; + }; /** @description Display payload field type & index information */ PayloadIndexInfo: { data_type: components["schemas"]["PayloadSchemaType"]; @@ -915,6 +984,8 @@ export interface components { TokenizerType: "prefix" | "whitespace" | "word" | "multilingual"; BoolIndexParams: { type: components["schemas"]["BoolIndexType"]; + /** @description If true, store the index on disk. Default: false. */ + on_disk?: boolean | null; }; /** @enum {string} */ BoolIndexType: "bool"; @@ -969,7 +1040,7 @@ export interface components { /** @description Payload - values assigned to the point */ payload?: components["schemas"]["Payload"] | (Record | null); /** @description Vector of the point */ - vector?: components["schemas"]["VectorStruct"] | (Record | null); + vector?: components["schemas"]["VectorStructOutput"] | (Record | null); /** @description Shard Key */ shard_key?: components["schemas"]["ShardKey"] | (Record | null); order_value?: components["schemas"]["OrderValue"] | (Record | null); @@ -983,11 +1054,12 @@ export interface components { Payload: { [key: string]: unknown; }; - /** @description Full vector data per point separator with single and multiple vector modes */ - VectorStruct: (number)[] | ((number)[])[] | ({ - [key: string]: components["schemas"]["Vector"] | undefined; - }) | components["schemas"]["Document"]; - Vector: (number)[] | components["schemas"]["SparseVector"] | ((number)[])[] | components["schemas"]["Document"]; + /** @description Vector data stored in Point */ + VectorStructOutput: (number)[] | ((number)[])[] | ({ + [key: string]: components["schemas"]["VectorOutput"] | undefined; + }); + /** @description Vector Data stored in Point */ + VectorOutput: (number)[] | components["schemas"]["SparseVector"] | ((number)[])[]; /** @description Sparse vector structure */ SparseVector: { /** @description Indices must be unique */ @@ -995,17 +1067,6 @@ export interface components { /** @description Values and indices must be the same length */ values: (number)[]; }; - /** - * @description WARN: Work-in-progress, unimplemented - * - * Text document for embedding. Requires inference infrastructure, unimplemented. - */ - Document: { - /** @description Text of the document This field will be used as input for the embedding model */ - text: string; - /** @description Name of the model used to generate the vector List of available models depends on a provider */ - model?: string | null; - }; OrderValue: number; /** @description Search request. Holds all conditions and parameters for the search of most similar points by vector similarity given the filtering restrictions. */ SearchRequest: { @@ -1081,7 +1142,7 @@ export interface components { */ must_not?: components["schemas"]["Condition"] | (components["schemas"]["Condition"])[] | (Record | null); }; - Condition: components["schemas"]["FieldCondition"] | components["schemas"]["IsEmptyCondition"] | components["schemas"]["IsNullCondition"] | components["schemas"]["HasIdCondition"] | components["schemas"]["NestedCondition"] | components["schemas"]["Filter"]; + Condition: components["schemas"]["FieldCondition"] | components["schemas"]["IsEmptyCondition"] | components["schemas"]["IsNullCondition"] | components["schemas"]["HasIdCondition"] | components["schemas"]["HasVectorCondition"] | components["schemas"]["NestedCondition"] | components["schemas"]["Filter"]; /** @description All possible payload filtering conditions */ FieldCondition: { /** @description Payload key */ @@ -1249,6 +1310,10 @@ export interface components { HasIdCondition: { has_id: (components["schemas"]["ExtendedPointId"])[]; }; + /** @description Filter points which have specific vector assigned */ + HasVectorCondition: { + has_vector: string; + }; NestedCondition: { nested: components["schemas"]["Nested"]; }; @@ -1326,7 +1391,7 @@ export interface components { /** @description Payload - values assigned to the point */ payload?: components["schemas"]["Payload"] | (Record | null); /** @description Vector of the point */ - vector?: components["schemas"]["VectorStruct"] | (Record | null); + vector?: components["schemas"]["VectorStructOutput"] | (Record | null); /** @description Shard Key */ shard_key?: components["schemas"]["ShardKey"] | (Record | null); /** @description Order-by value */ @@ -1522,7 +1587,9 @@ export interface components { */ write_consistency_factor?: number | null; /** - * @description If true - point's payload will not be stored in memory. It will be read from the disk every time it is requested. This setting saves RAM by (slightly) increasing the response time. Note: those payload values that are involved in filtering and are indexed - remain in RAM. + * @description If true - point's payload will not be stored in memory. It will be read from the disk every time it is requested. This setting saves RAM by (slightly) increasing the response time. Note: those payload values that are involved in filtering and are indexed - remain in RAM. + * + * Default: true * @default null */ on_disk_payload?: boolean | null; @@ -1546,6 +1613,8 @@ export interface components { sparse_vectors?: ({ [key: string]: components["schemas"]["SparseVectorParams"] | undefined; }) | null; + /** @description Strict-mode config. */ + strict_mode_config?: components["schemas"]["StrictModeConfig"] | (Record | null); }; WalConfigDiff: { /** @@ -1586,7 +1655,7 @@ export interface components { max_segment_size?: number | null; /** * Format: uint - * @description Maximum size (in kilobytes) of vectors to store in-memory per segment. Segments larger than this threshold will be stored as read-only memmaped file. + * @description Maximum size (in kilobytes) of vectors to store in-memory per segment. Segments larger than this threshold will be stored as read-only memmapped file. * * Memmap storage is disabled by default, to enable it, set this threshold to a reasonable value. * @@ -1611,12 +1680,12 @@ export interface components { * @description Minimum interval between forced flushes. */ flush_interval_sec?: number | null; - /** - * Format: uint - * @description Max number of threads (jobs) for running optimizations per shard. Note: each optimization job will also use `max_indexing_threads` threads by itself for index building. If null - have no limit and choose dynamically to saturate CPU. If 0 - no optimization threads, optimizations will be disabled. - */ - max_optimization_threads?: number | null; + /** @description Max number of threads (jobs) for running optimizations per shard. Note: each optimization job will also use `max_indexing_threads` threads by itself for index building. If "auto" - have no limit and choose dynamically to saturate CPU. If 0 - no optimization threads, optimizations will be disabled. */ + max_optimization_threads?: components["schemas"]["MaxOptimizationThreads"] | (Record | null); }; + MaxOptimizationThreads: components["schemas"]["MaxOptimizationThreadsSetting"] | number; + /** @enum {string} */ + MaxOptimizationThreadsSetting: "auto"; /** @description Operation for creating new collection and (optionally) specify index params */ InitFrom: { collection: string; @@ -1638,6 +1707,7 @@ export interface components { quantization_config?: components["schemas"]["QuantizationConfigDiff"] | (Record | null); /** @description Map of sparse vector data parameters to update for each sparse vector. */ sparse_vectors?: components["schemas"]["SparseVectorsConfig"] | (Record | null); + strict_mode_config?: components["schemas"]["StrictModeConfig"] | (Record | null); }; /** * @description Vector update params for multiple vectors @@ -1740,7 +1810,69 @@ export interface components { }; BatchVectorStruct: ((number)[])[] | (((number)[])[])[] | ({ [key: string]: (components["schemas"]["Vector"])[] | undefined; - }) | (components["schemas"]["Document"])[]; + }) | (components["schemas"]["Document"])[] | (components["schemas"]["Image"])[] | (components["schemas"]["InferenceObject"])[]; + /** @description Vector Data Vectors can be described directly with values Or specified with source "objects" for inference */ + Vector: (number)[] | components["schemas"]["SparseVector"] | ((number)[])[] | components["schemas"]["Document"] | components["schemas"]["Image"] | components["schemas"]["InferenceObject"]; + /** + * @description WARN: Work-in-progress, unimplemented + * + * Text document for embedding. Requires inference infrastructure, unimplemented. + */ + Document: { + /** + * @description Text of the document This field will be used as input for the embedding model + * @example This is a document text + */ + text: string; + /** + * @description Name of the model used to generate the vector List of available models depends on a provider + * @example jinaai/jina-embeddings-v2-base-en + */ + model: string; + /** @description Parameters for the model Values of the parameters are model-specific */ + options?: { + [key: string]: unknown; + } | null; + }; + /** + * @description WARN: Work-in-progress, unimplemented + * + * Image object for embedding. Requires inference infrastructure, unimplemented. + */ + Image: { + /** + * @description Image data: base64 encoded image or an URL + * @example https://example.com/image.jpg + */ + image: unknown; + /** + * @description Name of the model used to generate the vector List of available models depends on a provider + * @example Qdrant/clip-ViT-B-32-vision + */ + model: string; + /** @description Parameters for the model Values of the parameters are model-specific */ + options?: { + [key: string]: unknown; + } | null; + }; + /** + * @description WARN: Work-in-progress, unimplemented + * + * Custom object for embedding. Requires inference infrastructure, unimplemented. + */ + InferenceObject: { + /** @description Arbitrary data, used as input for the embedding model Used if the model requires more than one input or a custom input */ + object: unknown; + /** + * @description Name of the model used to generate the vector List of available models depends on a provider + * @example jinaai/jina-embeddings-v2-base-en + */ + model: string; + /** @description Parameters for the model Values of the parameters are model-specific */ + options?: { + [key: string]: unknown; + } | null; + }; PointsList: { points: (components["schemas"]["PointStruct"])[]; shard_key?: components["schemas"]["ShardKeySelector"] | (Record | null); @@ -1751,6 +1883,10 @@ export interface components { /** @description Payload values (optional) */ payload?: components["schemas"]["Payload"] | (Record | null); }; + /** @description Full vector data per point separator with single and multiple vector modes */ + VectorStruct: (number)[] | ((number)[])[] | ({ + [key: string]: components["schemas"]["Vector"] | undefined; + }) | components["schemas"]["Document"] | components["schemas"]["Image"] | components["schemas"]["InferenceObject"]; /** @description This data structure is used in API interface and applied across multiple shards */ SetPayload: { payload: components["schemas"]["Payload"]; @@ -1931,7 +2067,7 @@ export interface components { * @description State of the single shard within a replica set. * @enum {string} */ - ReplicaState: "Active" | "Dead" | "Partial" | "Initializing" | "Listener" | "PartialSnapshot" | "Recovery"; + ReplicaState: "Active" | "Dead" | "Partial" | "Initializing" | "Listener" | "PartialSnapshot" | "Recovery" | "Resharding" | "ReshardingScaleDown"; RemoteShardInfo: { /** * Format: uint32 @@ -1950,6 +2086,13 @@ export interface components { ShardTransferInfo: { /** Format: uint32 */ shard_id: number; + /** + * Format: uint32 + * @description Target shard ID if different than source shard ID + * + * Used exclusively with `ReshardStreamRecords` transfer method. + */ + to_shard_id?: number | null; /** * Format: uint64 * @description Source peer id @@ -1967,7 +2110,7 @@ export interface components { comment?: string | null; }; /** @description Methods for transferring a shard from one node to another. */ - ShardTransferMethod: "stream_records" | "snapshot" | "wal_delta"; + ShardTransferMethod: "stream_records" | "snapshot" | "wal_delta" | "resharding_stream_records"; ReshardingInfo: { direction: components["schemas"]["ReshardingDirection"]; /** Format: uint32 */ @@ -1975,8 +2118,6 @@ export interface components { /** Format: uint64 */ peer_id: number; shard_key?: components["schemas"]["ShardKey"] | (Record | null); - /** @description A human-readable report of the operation progress. Available only on the source peer. */ - comment?: string | null; }; /** @description Resharding direction, scale up or down in number of shards */ ReshardingDirection: "up" | "down"; @@ -1984,8 +2125,10 @@ export interface components { id: string; app: components["schemas"]["AppBuildTelemetry"]; collections: components["schemas"]["CollectionsTelemetry"]; - cluster: components["schemas"]["ClusterTelemetry"]; - requests: components["schemas"]["RequestsTelemetry"]; + cluster?: components["schemas"]["ClusterTelemetry"] | (Record | null); + requests?: components["schemas"]["RequestsTelemetry"] | (Record | null); + memory?: components["schemas"]["MemoryTelemetry"] | (Record | null); + hardware?: components["schemas"]["HardwareTelemetry"] | (Record | null); }; AppBuildTelemetry: { name: string; @@ -2002,6 +2145,7 @@ export interface components { web_feature: boolean; service_debug_feature: boolean; recovery_mode: boolean; + gpu: boolean; }; RunningEnvironmentTelemetry: { distribution?: string | null; @@ -2014,6 +2158,13 @@ export interface components { /** Format: uint */ disk_size?: number | null; cpu_flags: string; + cpu_endian?: components["schemas"]["CpuEndian"] | (Record | null); + gpu_devices?: (components["schemas"]["GpuDeviceTelemetry"])[] | null; + }; + /** @enum {string} */ + CpuEndian: "little" | "big" | "other"; + GpuDeviceTelemetry: { + name: string; }; CollectionsTelemetry: { /** Format: uint */ @@ -2025,14 +2176,32 @@ export interface components { id: string; /** Format: uint64 */ init_time_ms: number; - config: components["schemas"]["CollectionConfig"]; + config: components["schemas"]["CollectionConfigInternal"]; shards: (components["schemas"]["ReplicaSetTelemetry"])[]; transfers: (components["schemas"]["ShardTransferInfo"])[]; resharding: (components["schemas"]["ReshardingInfo"])[]; + shard_clean_tasks: { + [key: string]: components["schemas"]["ShardCleanStatusTelemetry"] | undefined; + }; + }; + CollectionConfigInternal: { + params: components["schemas"]["CollectionParams"]; + hnsw_config: components["schemas"]["HnswConfig"]; + optimizer_config: components["schemas"]["OptimizersConfig"]; + wal_config: components["schemas"]["WalConfig"]; + /** @default null */ + quantization_config?: components["schemas"]["QuantizationConfig"] | (Record | null); + strict_mode_config?: components["schemas"]["StrictModeConfig"] | (Record | null); + /** + * Format: uuid + * @default null + */ + uuid?: string | null; }; ReplicaSetTelemetry: { /** Format: uint32 */ id: number; + key?: components["schemas"]["ShardKey"] | (Record | null); local?: components["schemas"]["LocalShardTelemetry"] | (Record | null); remote: (components["schemas"]["RemoteShardTelemetry"])[]; replicate_states: { @@ -2049,9 +2218,12 @@ export interface components { total_optimized_points: number; segments: (components["schemas"]["SegmentTelemetry"])[]; optimizations: components["schemas"]["OptimizerTelemetry"]; + async_scorer?: boolean | null; }; /** - * @description Current state of the shard (supports same states as the collection) `Green` - all good. `Yellow` - optimization is running, 'Grey' - optimizations are possible but not triggered, `Red` - some operations failed and was not recovered + * @description Current state of the shard (supports same states as the collection) + * + * `Green` - all good. `Yellow` - optimization is running, 'Grey' - optimizations are possible but not triggered, `Red` - some operations failed and was not recovered * @enum {string} */ ShardStatus: "green" | "yellow" | "grey" | "red"; @@ -2072,6 +2244,16 @@ export interface components { num_indexed_vectors: number; /** Format: uint */ num_deleted_vectors: number; + /** + * Format: uint + * @description An ESTIMATION of effective amount of bytes used for vectors Do NOT rely on this number unless you know what you are doing + */ + vectors_size_bytes: number; + /** + * Format: uint + * @description An estimation of the effective amount of bytes used for payloads + */ + payloads_size_bytes: number; /** Format: uint */ ram_usage_bytes: number; /** Format: uint */ @@ -2144,6 +2326,7 @@ export interface components { /** @description Config of single sparse vector data storage */ SparseVectorDataConfig: { index: components["schemas"]["SparseIndexConfig"]; + storage_type?: components["schemas"]["SparseVectorStorageType"]; }; /** @description Configuration for sparse inverted index. */ SparseIndexConfig: { @@ -2160,6 +2343,7 @@ export interface components { }; /** @description Sparse index types */ SparseIndexType: "MutableRam" | "ImmutableRam" | "Mmap"; + SparseVectorStorageType: "on_disk" | "mmap"; /** @description Type of payload storage */ PayloadStorageType: OneOf<[{ /** @enum {string} */ @@ -2167,6 +2351,9 @@ export interface components { }, { /** @enum {string} */ type: "on_disk"; + }, { + /** @enum {string} */ + type: "mmap"; }]>; VectorIndexSearchesTelemetry: { index_name?: string | null; @@ -2210,9 +2397,15 @@ export interface components { }; PayloadIndexTelemetry: { field_name?: string | null; - /** Format: uint */ + /** + * Format: uint + * @description The amount of values indexed for all points. + */ points_values_count: number; - /** Format: uint */ + /** + * Format: uint + * @description The amount of points that have at least one value indexed. + */ points_count: number; /** Format: uint */ histogram_bucket_size?: number | null; @@ -2254,6 +2447,18 @@ export interface components { searches: components["schemas"]["OperationDurationStatistics"]; updates: components["schemas"]["OperationDurationStatistics"]; }; + ShardCleanStatusTelemetry: OneOf<["started" | "done" | "cancelled", { + progress: components["schemas"]["ShardCleanStatusProgressTelemetry"]; + }, { + failed: components["schemas"]["ShardCleanStatusFailedTelemetry"]; + }]>; + ShardCleanStatusProgressTelemetry: { + /** Format: uint */ + deleted_points: number; + }; + ShardCleanStatusFailedTelemetry: { + reason: string; + }; CollectionsAggregatedTelemetry: { /** Format: uint */ vectors: number; @@ -2320,7 +2525,48 @@ export interface components { [key: string]: components["schemas"]["OperationDurationStatistics"] | undefined; }; }; - ClusterOperations: components["schemas"]["MoveShardOperation"] | components["schemas"]["ReplicateShardOperation"] | components["schemas"]["AbortTransferOperation"] | components["schemas"]["DropReplicaOperation"] | components["schemas"]["CreateShardingKeyOperation"] | components["schemas"]["DropShardingKeyOperation"] | components["schemas"]["RestartTransferOperation"]; + MemoryTelemetry: { + /** + * Format: uint + * @description Total number of bytes in active pages allocated by the application + */ + active_bytes: number; + /** + * Format: uint + * @description Total number of bytes allocated by the application + */ + allocated_bytes: number; + /** + * Format: uint + * @description Total number of bytes dedicated to metadata + */ + metadata_bytes: number; + /** + * Format: uint + * @description Maximum number of bytes in physically resident data pages mapped + */ + resident_bytes: number; + /** + * Format: uint + * @description Total number of bytes in virtual memory mappings + */ + retained_bytes: number; + }; + HardwareTelemetry: { + collection_data: { + [key: string]: components["schemas"]["HardwareUsage"] | undefined; + }; + }; + /** @description Usage of the hardware resources, spent to process the request */ + HardwareUsage: { + /** Format: uint */ + cpu: number; + /** Format: uint */ + io_read: number; + /** Format: uint */ + io_write: number; + }; + ClusterOperations: components["schemas"]["MoveShardOperation"] | components["schemas"]["ReplicateShardOperation"] | components["schemas"]["AbortTransferOperation"] | components["schemas"]["DropReplicaOperation"] | components["schemas"]["CreateShardingKeyOperation"] | components["schemas"]["DropShardingKeyOperation"] | components["schemas"]["RestartTransferOperation"] | components["schemas"]["StartReshardingOperation"] | components["schemas"]["AbortReshardingOperation"]; MoveShardOperation: { move_shard: components["schemas"]["MoveShard"]; }; @@ -2403,6 +2649,19 @@ export interface components { to_peer_id: number; method: components["schemas"]["ShardTransferMethod"]; }; + StartReshardingOperation: { + start_resharding: components["schemas"]["StartResharding"]; + }; + StartResharding: { + direction: components["schemas"]["ReshardingDirection"]; + /** Format: uint64 */ + peer_id?: number | null; + shard_key?: components["schemas"]["ShardKey"] | (Record | null); + }; + AbortReshardingOperation: { + abort_resharding: components["schemas"]["AbortResharding"]; + }; + AbortResharding: Record; SearchRequestBatch: { searches: (components["schemas"]["SearchRequest"])[]; }; @@ -2436,7 +2695,9 @@ export interface components { api_key?: string | null; }; /** - * @description Defines source of truth for snapshot recovery: `NoSync` means - restore snapshot without *any* additional synchronization. `Snapshot` means - prefer snapshot data over the current state. `Replica` means - prefer existing data over the snapshot. + * @description Defines source of truth for snapshot recovery: + * + * `NoSync` means - restore snapshot without *any* additional synchronization. `Snapshot` means - prefer snapshot data over the current state. `Replica` means - prefer existing data over the snapshot. * @enum {string} */ SnapshotPriority: "no_sync" | "snapshot" | "replica"; @@ -2808,7 +3069,7 @@ export interface components { lookup_from?: components["schemas"]["LookupLocation"] | (Record | null); }; QueryInterface: components["schemas"]["VectorInput"] | components["schemas"]["Query"]; - VectorInput: (number)[] | components["schemas"]["SparseVector"] | ((number)[])[] | components["schemas"]["ExtendedPointId"] | components["schemas"]["Document"]; + VectorInput: (number)[] | components["schemas"]["SparseVector"] | ((number)[])[] | components["schemas"]["ExtendedPointId"] | components["schemas"]["Document"] | components["schemas"]["Image"] | components["schemas"]["InferenceObject"]; Query: components["schemas"]["NearestQuery"] | components["schemas"]["RecommendQuery"] | components["schemas"]["DiscoverQuery"] | components["schemas"]["ContextQuery"] | components["schemas"]["OrderByQuery"] | components["schemas"]["FusionQuery"] | components["schemas"]["SampleQuery"]; NearestQuery: { nearest: components["schemas"]["VectorInput"]; @@ -3010,6 +3271,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -3062,6 +3325,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -3113,6 +3378,8 @@ export interface operations { query?: { /** @description If true, anonymize result */ anonymize?: boolean; + /** @description Level of details in telemetry data. Minimal level is 0, maximal is infinity */ + details_level?: number; }; }; responses: { @@ -3120,6 +3387,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -3178,6 +3447,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -3220,6 +3491,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -3336,6 +3609,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -3369,6 +3644,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -3415,6 +3692,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -3451,6 +3730,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -3493,6 +3774,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -3548,6 +3831,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -3597,6 +3882,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -3652,6 +3939,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -3700,6 +3989,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -3754,6 +4045,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -3796,6 +4089,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -3846,6 +4141,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -3888,6 +4185,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -3940,6 +4239,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -3982,6 +4283,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -4018,6 +4321,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -4197,6 +4502,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -4387,6 +4694,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -4718,6 +5027,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -4926,6 +5237,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -4980,6 +5293,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -5034,6 +5349,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -5088,6 +5405,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -5142,6 +5461,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -5196,6 +5517,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -5250,6 +5573,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -5304,6 +5629,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -5358,6 +5685,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -5412,6 +5741,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -5466,6 +5797,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -5520,6 +5853,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -5574,6 +5909,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -5628,6 +5965,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -5682,6 +6021,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -5736,6 +6077,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -5790,6 +6133,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -5844,6 +6189,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -5901,6 +6248,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -5955,6 +6304,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -6007,6 +6358,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -6061,6 +6414,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -6115,6 +6470,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -6169,6 +6526,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -6223,6 +6582,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -6277,6 +6638,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request @@ -6331,6 +6694,8 @@ export interface operations { 200: { content: { "application/json": { + /** @default null */ + usage?: components["schemas"]["HardwareUsage"] | (Record | null); /** * Format: float * @description Time spent to process this request diff --git a/packages/js-client-rest/src/qdrant-client.ts b/packages/js-client-rest/src/qdrant-client.ts index a94c5ec..a0504d3 100644 --- a/packages/js-client-rest/src/qdrant-client.ts +++ b/packages/js-client-rest/src/qdrant-client.ts @@ -1211,6 +1211,7 @@ export class QdrantClient { * - quantization_config: Params for quantization, if None - quantization will be disabled * - init_from: Use data stored in another collection to initialize this collection * - sparse_vectors: Sparse vector data config + * - strict_mode_config: Strict mode configuration * - timeout: * Wait for operation commit timeout in seconds. * If timeout is reached, request will return with service error. @@ -1231,6 +1232,7 @@ export class QdrantClient { wal_config, write_consistency_factor, sparse_vectors, + strict_mode_config, }: {timeout?: number} & SchemaFor<'CreateCollection'>, ) { const response = await this._openApiClient.collections.createCollection({ @@ -1248,6 +1250,7 @@ export class QdrantClient { wal_config, write_consistency_factor, sparse_vectors, + strict_mode_config, }); return maybe(response.data.result).orThrow('Create collection returned empty'); @@ -1286,6 +1289,7 @@ export class QdrantClient { * - quantizationConfig: Params for quantization, if None - quantization will be disabled * - initFrom: Use data stored in another collection to initialize this collection * - sparse_vectors: Sparse vector data config + * - strict_mode_config: Strict mode configuration * - timeout: * Wait for operation commit timeout in seconds. * If timeout is reached, request will return with service error. @@ -1306,6 +1310,7 @@ export class QdrantClient { wal_config, write_consistency_factor, sparse_vectors, + strict_mode_config, }: {timeout?: number} & SchemaFor<'CreateCollection'>, ) { maybe( @@ -1332,6 +1337,7 @@ export class QdrantClient { wal_config, write_consistency_factor, sparse_vectors, + strict_mode_config, }); return maybe(response).orThrow('Create collection returned empty'); diff --git a/packages/qdrant-js/CHANGELOG.md b/packages/qdrant-js/CHANGELOG.md index 57f76bf..f4fd5d1 100644 --- a/packages/qdrant-js/CHANGELOG.md +++ b/packages/qdrant-js/CHANGELOG.md @@ -1,5 +1,17 @@ # @qdrant/qdrant-js +## 1.13.0 + +### Minor Changes + +- Qdrant v1.13.0 API + +### Patch Changes + +- Updated dependencies []: + - @qdrant/js-client-grpc@1.13.0 + - @qdrant/js-client-rest@1.13.0 + ## 1.12.0 ### Minor Changes diff --git a/packages/qdrant-js/package.json b/packages/qdrant-js/package.json index 55de7b8..7c31f20 100644 --- a/packages/qdrant-js/package.json +++ b/packages/qdrant-js/package.json @@ -1,6 +1,6 @@ { "name": "@qdrant/qdrant-js", - "version": "1.12.0", + "version": "1.13.0", "engines": { "node": ">=18.0.0", "pnpm": ">=8" @@ -57,8 +57,8 @@ "clean": "rimraf ./dist" }, "dependencies": { - "@qdrant/js-client-rest": "workspace:1.12.0", - "@qdrant/js-client-grpc": "workspace:1.12.0" + "@qdrant/js-client-rest": "workspace:1.13.0", + "@qdrant/js-client-grpc": "workspace:1.13.0" }, "peerDependencies": { "typescript": ">=4.1" diff --git a/packages/qdrant-js/scripts/integration-tests.sh b/packages/qdrant-js/scripts/integration-tests.sh index 55d2323..7e8696a 100755 --- a/packages/qdrant-js/scripts/integration-tests.sh +++ b/packages/qdrant-js/scripts/integration-tests.sh @@ -9,7 +9,7 @@ function stop_docker() docker stop qdrant_test } -QDRANT_LATEST="v1.12.0" +QDRANT_LATEST="v1.13.0" QDRANT_VERSION=${QDRANT_VERSION:-"$QDRANT_LATEST"} QDRANT_HOST='127.0.0.1:6333' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3e8b342..48241f6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -128,10 +128,10 @@ importers: packages/qdrant-js: dependencies: '@qdrant/js-client-grpc': - specifier: workspace:1.12.0 + specifier: workspace:1.13.0 version: link:../js-client-grpc '@qdrant/js-client-rest': - specifier: workspace:1.12.0 + specifier: workspace:1.13.0 version: link:../js-client-rest typescript: specifier: '>=4.1'