diff --git a/docs/grpc/docs.md b/docs/grpc/docs.md
index 5ed864f6bd..0bb6c6056f 100644
--- a/docs/grpc/docs.md
+++ b/docs/grpc/docs.md
@@ -47,6 +47,7 @@
- [ListCollectionsRequest](#qdrant-ListCollectionsRequest)
- [ListCollectionsResponse](#qdrant-ListCollectionsResponse)
- [LocalShardInfo](#qdrant-LocalShardInfo)
+ - [MaxOptimizationThreads](#qdrant-MaxOptimizationThreads)
- [MoveShard](#qdrant-MoveShard)
- [MultiVectorConfig](#qdrant-MultiVectorConfig)
- [OptimizerStatus](#qdrant-OptimizerStatus)
@@ -89,6 +90,7 @@
- [CompressionRatio](#qdrant-CompressionRatio)
- [Datatype](#qdrant-Datatype)
- [Distance](#qdrant-Distance)
+ - [MaxOptimizationThreads.Setting](#qdrant-MaxOptimizationThreads-Setting)
- [Modifier](#qdrant-Modifier)
- [MultiVectorComparator](#qdrant-MultiVectorComparator)
- [PayloadSchemaType](#qdrant-PayloadSchemaType)
@@ -1018,6 +1020,22 @@
+
+
+### MaxOptimizationThreads
+
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| value | [uint64](#uint64) | | |
+| setting | [MaxOptimizationThreads.Setting](#qdrant-MaxOptimizationThreads-Setting) | | |
+
+
+
+
+
+
### MoveShard
@@ -1101,7 +1119,8 @@ To disable vector indexing, set to `0`.
Note: 1kB = 1 vector of size 256. |
| flush_interval_sec | [uint64](#uint64) | optional | Interval between forced flushes. |
-| max_optimization_threads | [uint64](#uint64) | optional | 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. |
+| deprecated_max_optimization_threads | [uint64](#uint64) | optional | Deprecated in favor of `max_optimization_threads` |
+| max_optimization_threads | [MaxOptimizationThreads](#qdrant-MaxOptimizationThreads) | optional | 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. |
@@ -1751,6 +1770,17 @@ Note: 1kB = 1 vector of size 256. |
+
+
+### MaxOptimizationThreads.Setting
+
+
+| Name | Number | Description |
+| ---- | ------ | ----------- |
+| Auto | 0 | |
+
+
+
### Modifier
diff --git a/docs/redoc/master/openapi.json b/docs/redoc/master/openapi.json
index b175e97cb2..3f05dbbeec 100644
--- a/docs/redoc/master/openapi.json
+++ b/docs/redoc/master/openapi.json
@@ -9449,14 +9449,36 @@
"nullable": true
},
"max_optimization_threads": {
- "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.",
- "type": "integer",
- "format": "uint",
- "minimum": 0,
- "nullable": true
+ "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.",
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/MaxOptimizationThreads"
+ },
+ {
+ "nullable": true
+ }
+ ]
}
}
},
+ "MaxOptimizationThreads": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/MaxOptimizationThreadsSetting"
+ },
+ {
+ "type": "integer",
+ "format": "uint",
+ "minimum": 0
+ }
+ ]
+ },
+ "MaxOptimizationThreadsSetting": {
+ "type": "string",
+ "enum": [
+ "auto"
+ ]
+ },
"InitFrom": {
"description": "Operation for creating new collection and (optionally) specify index params",
"type": "object",
diff --git a/lib/api/src/grpc/conversions.rs b/lib/api/src/grpc/conversions.rs
index a85a16501e..7a9e3ad234 100644
--- a/lib/api/src/grpc/conversions.rs
+++ b/lib/api/src/grpc/conversions.rs
@@ -22,10 +22,10 @@ use super::qdrant::{
raw_query, start_from, BinaryQuantization, BoolIndexParams, CompressionRatio,
DatetimeIndexParams, DatetimeRange, Direction, FacetHit, FacetHitInternal, FacetValue,
FacetValueInternal, FieldType, FloatIndexParams, GeoIndexParams, GeoLineString, GroupId,
- HardwareUsage, HasVectorCondition, KeywordIndexParams, LookupLocation, MultiVectorComparator,
- MultiVectorConfig, OrderBy, OrderValue, Range, RawVector, RecommendStrategy, RetrievedPoint,
- SearchMatrixPair, SearchPointGroups, SearchPoints, ShardKeySelector, SparseIndices, StartFrom,
- UuidIndexParams, VectorsOutput, WithLookup,
+ HardwareUsage, HasVectorCondition, KeywordIndexParams, LookupLocation, MaxOptimizationThreads,
+ MultiVectorComparator, MultiVectorConfig, OrderBy, OrderValue, Range, RawVector,
+ RecommendStrategy, RetrievedPoint, SearchMatrixPair, SearchPointGroups, SearchPoints,
+ ShardKeySelector, SparseIndices, StartFrom, UuidIndexParams, VectorsOutput, WithLookup,
};
use crate::conversions::json;
use crate::grpc::qdrant::condition::ConditionOneOf;
@@ -1609,6 +1609,76 @@ impl From for StartFrom {
}
}
+impl TryFrom for rest::MaxOptimizationThreads {
+ type Error = Status;
+
+ fn try_from(value: MaxOptimizationThreads) -> Result {
+ use crate::grpc::qdrant::max_optimization_threads::{Setting, Variant};
+
+ let variant = value
+ .variant
+ .ok_or_else(|| Status::invalid_argument("Malformed MaxOptimizationThreads"))?;
+
+ let converted = match variant {
+ Variant::Setting(setting_int) => {
+ let setting = Setting::try_from(setting_int).map_err(|err| {
+ Status::invalid_argument(format!(
+ "Invalid MaxOptimizationThreads setting: {err}"
+ ))
+ })?;
+
+ match setting {
+ Setting::Auto => Self::Setting(rest::MaxOptimizationThreadsSetting::Auto),
+ }
+ }
+ Variant::Value(num_threads) => Self::Threads(num_threads as usize),
+ };
+ Ok(converted)
+ }
+}
+
+impl TryFrom for Option {
+ type Error = Status;
+
+ fn try_from(value: MaxOptimizationThreads) -> Result {
+ use crate::grpc::qdrant::max_optimization_threads::{Setting, Variant};
+
+ let variant = value
+ .variant
+ .ok_or_else(|| Status::invalid_argument("Malformed MaxOptimizationThreads"))?;
+
+ Ok(match variant {
+ Variant::Setting(setting_int) => {
+ let setting = Setting::try_from(setting_int).map_err(|err| {
+ Status::invalid_argument(format!(
+ "Invalid MaxOptimizationThreads setting: {err}"
+ ))
+ })?;
+
+ match setting {
+ Setting::Auto => None,
+ }
+ }
+ Variant::Value(num_threads) => Some(num_threads as usize),
+ })
+ }
+}
+
+impl From