From 72e41b1ad5770469007bf0da959d03533226a155 Mon Sep 17 00:00:00 2001
From: Ivan Despot <66276597+g-despot@users.noreply.github.com>
Date: Wed, 12 Aug 2026 08:44:46 +0200
Subject: [PATCH 1/2] feat: add hybrid diversity selection via MMR (Weaviate
1.38.6+)
---
.../Integration/TestSearchHybrid.cs | 138 +++++++++++++
.../Unit/TestHybridDiversitySyntax.cs | 191 ++++++++++++++++++
src/Weaviate.Client/GenerateClient.Hybrid.cs | 12 ++
src/Weaviate.Client/Models/Search.cs | 14 ++
src/Weaviate.Client/PublicAPI.Unshipped.txt | 78 +++++++
src/Weaviate.Client/QueryClient.Hybrid.cs | 12 ++
.../Typed/TypedGenerateClient.Hybrid.cs | 12 ++
.../Typed/TypedQueryClient.Hybrid.cs | 12 ++
src/Weaviate.Client/gRPC/Search.Builders.cs | 17 +-
src/Weaviate.Client/gRPC/Search.cs | 5 +-
10 files changed, 489 insertions(+), 2 deletions(-)
create mode 100644 src/Weaviate.Client.Tests/Unit/TestHybridDiversitySyntax.cs
diff --git a/src/Weaviate.Client.Tests/Integration/TestSearchHybrid.cs b/src/Weaviate.Client.Tests/Integration/TestSearchHybrid.cs
index 2ca6eee5..7b648315 100644
--- a/src/Weaviate.Client.Tests/Integration/TestSearchHybrid.cs
+++ b/src/Weaviate.Client.Tests/Integration/TestSearchHybrid.cs
@@ -880,6 +880,144 @@ await collection.Query.Hybrid(
Assert.Equal(splitAcross, andCrossObjs[0].UUID);
}
+ ///
+ /// Creates a collection with 3 tight clusters (a, b, c) of vectors in 3D.
+ ///
+ private async Task CreateClusteredCollection()
+ {
+ var collection = await CollectionFactory(
+ properties: new[] { Property.Text("name") },
+ vectorConfig: Configure.Vector(t => t.SelfProvided())
+ );
+
+ var data = new (string Name, float[] Vector)[]
+ {
+ ("a1", [1.0f, 0.0f, 0.0f]),
+ ("a2", [0.95f, 0.05f, 0.0f]),
+ ("a3", [0.9f, 0.1f, 0.0f]),
+ ("b1", [0.0f, 1.0f, 0.0f]),
+ ("b2", [0.05f, 0.95f, 0.0f]),
+ ("c1", [0.0f, 0.0f, 1.0f]),
+ };
+ foreach (var (name, vector) in data)
+ {
+ await collection.Data.Insert(
+ new { name },
+ vectors: vector,
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+ }
+
+ return collection;
+ }
+
+ ///
+ /// Tests that test hybrid diversity balance zero differs from balance one
+ ///
+ [Fact]
+ public async Task Test_Hybrid_Diversity_Balance_Reorders()
+ {
+ RequireVersion("1.38.6");
+
+ var collection = await CreateClusteredCollection();
+
+ var baseline = (
+ await collection.Query.Hybrid(
+ query: null,
+ vectors: new float[] { 1f, 0f, 0f },
+ limit: 3,
+ cancellationToken: TestContext.Current.CancellationToken
+ )
+ )
+ .Select(o => o.UUID)
+ .ToList();
+
+ var balanceZero = (
+ await collection.Query.Hybrid(
+ query: null,
+ vectors: new float[] { 1f, 0f, 0f },
+ diversitySelection: new Diversity.MMR(Limit: 3, Balance: 0.0f),
+ limit: 3,
+ cancellationToken: TestContext.Current.CancellationToken
+ )
+ )
+ .Select(o => o.UUID)
+ .ToList();
+
+ var balanceOne = (
+ await collection.Query.Hybrid(
+ query: null,
+ vectors: new float[] { 1f, 0f, 0f },
+ diversitySelection: new Diversity.MMR(Limit: 3, Balance: 1.0f),
+ limit: 3,
+ cancellationToken: TestContext.Current.CancellationToken
+ )
+ )
+ .Select(o => o.UUID)
+ .ToList();
+
+ // Pure diversity picks across clusters, so it must differ from pure relevance,
+ // while pure relevance matches the plain hybrid baseline.
+ Assert.NotEqual(balanceZero, balanceOne);
+ Assert.Equal(baseline, balanceOne);
+ }
+
+ ///
+ /// Tests that test hybrid diversity mmr limit caps results
+ ///
+ [Fact]
+ public async Task Test_Hybrid_Diversity_MMR_Limit_Caps_Results()
+ {
+ RequireVersion("1.38.6");
+
+ var collection = await CollectionFactory(
+ properties: new[] { Property.Text("name") },
+ vectorConfig: Configure.Vector(t => t.SelfProvided())
+ );
+
+ // Enough items (>25) that a small mmr limit is distinguishable from the server's default limit.
+ for (var i = 0; i < 50; i++)
+ {
+ await collection.Data.Insert(
+ new { name = $"t{i}" },
+ vectors: new float[] { 1.0f - 0.001f * i, 0f, 0f },
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+ }
+
+ var objs = await collection.Query.Hybrid(
+ query: null,
+ vectors: new float[] { 1f, 0f, 0f },
+ diversitySelection: new Diversity.MMR(Limit: 5, Balance: 0.5f),
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ Assert.Equal(5, objs.Count());
+ }
+
+ ///
+ /// Tests that test hybrid diversity missing limit errors
+ ///
+ [Fact]
+ public async Task Test_Hybrid_Diversity_MissingLimit_Errors()
+ {
+ RequireVersion("1.38.6");
+
+ var collection = await CreateClusteredCollection();
+
+ // The server requires the MMR limit; the client forwards the request unvalidated.
+ var exception = await Assert.ThrowsAnyAsync(async () =>
+ await collection.Query.Hybrid(
+ query: null,
+ vectors: new float[] { 1f, 0f, 0f },
+ diversitySelection: new Diversity.MMR(Balance: 0.5f),
+ cancellationToken: TestContext.Current.CancellationToken
+ )
+ );
+ Assert.NotNull(exception.InnerException);
+ Assert.Contains("MMR limit", exception.InnerException.Message);
+ }
+
///
/// Tests that test aggregate max vector distance
///
diff --git a/src/Weaviate.Client.Tests/Unit/TestHybridDiversitySyntax.cs b/src/Weaviate.Client.Tests/Unit/TestHybridDiversitySyntax.cs
new file mode 100644
index 00000000..0a10717f
--- /dev/null
+++ b/src/Weaviate.Client.Tests/Unit/TestHybridDiversitySyntax.cs
@@ -0,0 +1,191 @@
+using Weaviate.Client.Models;
+using Weaviate.Client.Tests.Unit.Mocks;
+using Weaviate.Client.Typed;
+using V1 = Weaviate.Client.Grpc.Protobuf.V1;
+
+namespace Weaviate.Client.Tests.Unit;
+
+///
+/// Unit tests verifying the hybrid diversity selection maps to the expected
+/// Selection message in the gRPC request across the query, generate and typed paths.
+///
+[Collection("Unit Tests")]
+public class TestHybridDiversitySyntax : IAsyncLifetime
+{
+ private const string CollectionName = "TestCollection";
+
+ private Func _getRequest = null!;
+ private CollectionClient _collection = null!;
+
+ ///
+ /// The article test type
+ ///
+ private class Article
+ {
+ ///
+ /// The title
+ ///
+ public string? Title { get; set; }
+ }
+
+ ///
+ /// Initializes this instance
+ ///
+ /// The value task
+ public ValueTask InitializeAsync()
+ {
+ var (client, getRequest) = MockGrpcClient.CreateWithSearchCapture(new Version(1, 39, 0));
+ _getRequest = getRequest;
+ _collection = client.Collections.Use(CollectionName);
+ return ValueTask.CompletedTask;
+ }
+
+ ///
+ /// Disposes this instance
+ ///
+ /// The value task
+ public ValueTask DisposeAsync()
+ {
+ GC.SuppressFinalize(this);
+ return ValueTask.CompletedTask;
+ }
+
+ ///
+ /// Tests that hybrid diversity selection sets selection on the request
+ ///
+ [Fact]
+ public async Task Hybrid_DiversitySelection_MMR_SetsSelection()
+ {
+ // Act
+ await _collection.Query.Hybrid(
+ query: null,
+ vectors: new float[] { 1f, 0f, 0f },
+ diversitySelection: new Diversity.MMR(Limit: 7, Balance: 0.5f),
+ limit: 7,
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.NotNull(request.HybridSearch.Selection);
+ Assert.Equal(7u, request.HybridSearch.Selection.Mmr.Limit);
+ Assert.Equal(0.5f, request.HybridSearch.Selection.Mmr.Balance);
+ }
+
+ ///
+ /// Tests that hybrid diversity selection with omitted balance leaves balance unset
+ ///
+ [Fact]
+ public async Task Hybrid_DiversitySelection_BalanceOmitted_LeavesBalanceUnset()
+ {
+ // Act
+ await _collection.Query.Hybrid(
+ query: null,
+ vectors: new float[] { 1f, 0f, 0f },
+ diversitySelection: new Diversity.MMR(Limit: 3),
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.NotNull(request.HybridSearch.Selection);
+ Assert.True(request.HybridSearch.Selection.Mmr.HasLimit);
+ Assert.False(request.HybridSearch.Selection.Mmr.HasBalance);
+ }
+
+ ///
+ /// Tests that hybrid without diversity selection leaves selection unset
+ ///
+ [Fact]
+ public async Task Hybrid_NoDiversitySelection_LeavesSelectionUnset()
+ {
+ // Act
+ await _collection.Query.Hybrid(
+ query: null,
+ vectors: new float[] { 1f, 0f, 0f },
+ limit: 5,
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.Null(request.HybridSearch.Selection);
+ }
+
+ ///
+ /// Tests that generate hybrid diversity selection sets selection on the request
+ ///
+ [Fact]
+ public async Task Generate_Hybrid_DiversitySelection_SetsSelection()
+ {
+ // Act
+ await _collection.Generate.Hybrid(
+ query: null,
+ vectors: new float[] { 1f, 0f, 0f },
+ diversitySelection: new Diversity.MMR(Limit: 4, Balance: 0.25f),
+ singlePrompt: "Describe {title}",
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.NotNull(request.HybridSearch.Selection);
+ Assert.Equal(4u, request.HybridSearch.Selection.Mmr.Limit);
+ Assert.Equal(0.25f, request.HybridSearch.Selection.Mmr.Balance);
+ }
+
+ ///
+ /// Tests that typed hybrid diversity selection sets selection on the request
+ ///
+ [Fact]
+ public async Task Typed_Hybrid_DiversitySelection_SetsSelection()
+ {
+ // Arrange
+ var typedQueryClient = new TypedQueryClient(_collection.Query);
+
+ // Act
+ await typedQueryClient.Hybrid(
+ query: null,
+ vectors: new float[] { 1f, 0f, 0f },
+ diversitySelection: new Diversity.MMR(Limit: 2, Balance: 1.0f),
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.NotNull(request.HybridSearch.Selection);
+ Assert.Equal(2u, request.HybridSearch.Selection.Mmr.Limit);
+ Assert.Equal(1.0f, request.HybridSearch.Selection.Mmr.Balance);
+ }
+
+ ///
+ /// Tests that typed generate hybrid diversity selection sets selection on the request
+ ///
+ [Fact]
+ public async Task Typed_Generate_Hybrid_DiversitySelection_SetsSelection()
+ {
+ // Arrange
+ var typedGenerateClient = new TypedGenerateClient(_collection.Generate);
+
+ // Act
+ await typedGenerateClient.Hybrid(
+ query: null,
+ vectors: new float[] { 1f, 0f, 0f },
+ diversitySelection: new Diversity.MMR(Limit: 6),
+ singlePrompt: "Describe {title}",
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.NotNull(request.HybridSearch.Selection);
+ Assert.Equal(6u, request.HybridSearch.Selection.Mmr.Limit);
+ Assert.False(request.HybridSearch.Selection.Mmr.HasBalance);
+ }
+}
diff --git a/src/Weaviate.Client/GenerateClient.Hybrid.cs b/src/Weaviate.Client/GenerateClient.Hybrid.cs
index 9dcd8d1d..3a59cf17 100644
--- a/src/Weaviate.Client/GenerateClient.Hybrid.cs
+++ b/src/Weaviate.Client/GenerateClient.Hybrid.cs
@@ -20,6 +20,7 @@ public Task Hybrid(
uint? limit = null,
uint? offset = null,
BM25Operator? bm25Operator = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Filter? filters = null,
Rerank? rerank = null,
@@ -42,6 +43,7 @@ public Task Hybrid(
limit: limit,
offset: offset,
bm25Operator: bm25Operator,
+ diversitySelection: diversitySelection,
autoLimit: autoLimit,
filters: filters,
rerank: rerank,
@@ -68,6 +70,7 @@ public async Task Hybrid(
uint? limit = null,
uint? offset = null,
BM25Operator? bm25Operator = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Filter? filters = null,
Rerank? rerank = null,
@@ -99,6 +102,7 @@ public async Task Hybrid(
limit: limit,
offset: offset,
bm25Operator: bm25Operator,
+ diversitySelection: diversitySelection,
autoLimit: autoLimit,
filters: filters,
rerank: rerank,
@@ -129,6 +133,7 @@ public Task Hybrid(
uint? limit = null,
uint? offset = null,
BM25Operator? bm25Operator = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Filter? filters = null,
Rerank? rerank = null,
@@ -152,6 +157,7 @@ public Task Hybrid(
limit: limit,
offset: offset,
bm25Operator: bm25Operator,
+ diversitySelection: diversitySelection,
autoLimit: autoLimit,
filters: filters,
rerank: rerank,
@@ -179,6 +185,7 @@ public async Task Hybrid(
uint? limit = null,
uint? offset = null,
BM25Operator? bm25Operator = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Filter? filters = null,
Rerank? rerank = null,
@@ -210,6 +217,7 @@ public async Task Hybrid(
limit: limit,
offset: offset,
bm25Operator: bm25Operator,
+ diversitySelection: diversitySelection,
autoLimit: autoLimit,
filters: filters,
groupBy: groupBy,
@@ -259,6 +267,7 @@ public static async Task Hybrid(
uint? limit = null,
uint? offset = null,
BM25Operator? bm25Operator = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Filter? filters = null,
Rerank? rerank = null,
@@ -281,6 +290,7 @@ await client.Hybrid(
limit: limit,
offset: offset,
bm25Operator: bm25Operator,
+ diversitySelection: diversitySelection,
autoLimit: autoLimit,
filters: filters,
rerank: rerank,
@@ -310,6 +320,7 @@ public static async Task Hybrid(
uint? limit = null,
uint? offset = null,
BM25Operator? bm25Operator = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Filter? filters = null,
Rerank? rerank = null,
@@ -333,6 +344,7 @@ await client.Hybrid(
limit: limit,
offset: offset,
bm25Operator: bm25Operator,
+ diversitySelection: diversitySelection,
autoLimit: autoLimit,
filters: filters,
rerank: rerank,
diff --git a/src/Weaviate.Client/Models/Search.cs b/src/Weaviate.Client/Models/Search.cs
index 8396f51a..46f16d7f 100644
--- a/src/Weaviate.Client/Models/Search.cs
+++ b/src/Weaviate.Client/Models/Search.cs
@@ -97,3 +97,17 @@ public record AndCross() : BM25Operator("AndCross");
///
public record Or(int MinimumMatch) : BM25Operator("Or");
}
+
+///
+/// The diversity selection applied to search results. Requires Weaviate 1.38.6+.
+///
+public abstract record Diversity
+{
+ ///
+ /// Maximal Marginal Relevance; Limit is the number of results returned after
+ /// diversification (the server requires it to be at least 1), Balance is the
+ /// trade-off in [0.0, 1.0] — 1.0 pure relevance, 0.0 pure diversity (the server
+ /// default when omitted).
+ ///
+ public record MMR(uint? Limit = null, float? Balance = null) : Diversity;
+}
diff --git a/src/Weaviate.Client/PublicAPI.Unshipped.txt b/src/Weaviate.Client/PublicAPI.Unshipped.txt
index 2ba157c5..fb336e28 100644
--- a/src/Weaviate.Client/PublicAPI.Unshipped.txt
+++ b/src/Weaviate.Client/PublicAPI.Unshipped.txt
@@ -43,3 +43,81 @@ virtual Weaviate.Client.Models.BM25Operator.AndCross.Equals(Weaviate.Client.Mode
Weaviate.Client.Models.BM25Operator.AndCross
Weaviate.Client.Models.BM25Operator.AndCross.AndCross() -> void
Weaviate.Client.Models.BM25Operator.AndCross.AndCross(Weaviate.Client.Models.BM25Operator.AndCross! original) -> void
+*REMOVED*static Weaviate.Client.GenerateClientHybridExtensions.Hybrid(this Weaviate.Client.GenerateClient! client, string! query, Weaviate.Client.Models.HybridVectorInput.FactoryFn! vectors, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Models.SinglePrompt? singlePrompt = null, Weaviate.Client.Models.GroupedTask? groupedTask = null, Weaviate.Client.Models.GenerativeProvider? provider = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+*REMOVED*static Weaviate.Client.GenerateClientHybridExtensions.Hybrid(this Weaviate.Client.GenerateClient! client, string! query, Weaviate.Client.Models.HybridVectorInput.FactoryFn! vectors, Weaviate.Client.Models.GroupByRequest! groupBy, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Models.SinglePrompt? singlePrompt = null, Weaviate.Client.Models.GroupedTask? groupedTask = null, Weaviate.Client.Models.GenerativeProvider? provider = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+*REMOVED*static Weaviate.Client.QueryClientHybridExtensions.Hybrid(this Weaviate.Client.QueryClient! client, string? query = null, Weaviate.Client.Models.HybridVectorInput.FactoryFn? vectors = null, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+*REMOVED*static Weaviate.Client.QueryClientHybridExtensions.Hybrid(this Weaviate.Client.QueryClient! client, string? query, Weaviate.Client.Models.HybridVectorInput.FactoryFn? vectors, Weaviate.Client.Models.GroupByRequest! groupBy, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+*REMOVED*static Weaviate.Client.Typed.TypedGenerateClientHybridExtensions.Hybrid(this Weaviate.Client.Typed.TypedGenerateClient! client, string! query, Weaviate.Client.Models.HybridVectorInput.FactoryFn! vectors, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Models.SinglePrompt? singlePrompt = null, Weaviate.Client.Models.GroupedTask? groupedTask = null, Weaviate.Client.Models.GenerativeProvider? provider = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>!
+*REMOVED*static Weaviate.Client.Typed.TypedGenerateClientHybridExtensions.Hybrid(this Weaviate.Client.Typed.TypedGenerateClient! client, string! query, Weaviate.Client.Models.HybridVectorInput.FactoryFn! vectors, Weaviate.Client.Models.GroupByRequest! groupBy, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Models.SinglePrompt? singlePrompt = null, Weaviate.Client.Models.GroupedTask? groupedTask = null, Weaviate.Client.Models.GenerativeProvider? provider = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>!
+*REMOVED*static Weaviate.Client.Typed.TypedQueryClientHybridExtensions.Hybrid(this Weaviate.Client.Typed.TypedQueryClient! client, string! query, Weaviate.Client.Models.HybridVectorInput.FactoryFn! vectors, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>!>!
+*REMOVED*static Weaviate.Client.Typed.TypedQueryClientHybridExtensions.Hybrid(this Weaviate.Client.Typed.TypedQueryClient! client, string! query, Weaviate.Client.Models.HybridVectorInput.FactoryFn! vectors, Weaviate.Client.Models.GroupByRequest! groupBy, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>!
+*REMOVED*Weaviate.Client.GenerateClient.Hybrid(string! query, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Models.SinglePrompt? singlePrompt = null, Weaviate.Client.Models.GroupedTask? groupedTask = null, Weaviate.Client.Models.GenerativeProvider? provider = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+*REMOVED*Weaviate.Client.GenerateClient.Hybrid(string! query, Weaviate.Client.Models.GroupByRequest! groupBy, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Models.SinglePrompt? singlePrompt = null, Weaviate.Client.Models.GroupedTask? groupedTask = null, Weaviate.Client.Models.GenerativeProvider? provider = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+*REMOVED*Weaviate.Client.GenerateClient.Hybrid(string? query, Weaviate.Client.Models.HybridVectorInput? vectors, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Models.SinglePrompt? singlePrompt = null, Weaviate.Client.Models.GroupedTask? groupedTask = null, Weaviate.Client.Models.GenerativeProvider? provider = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+*REMOVED*Weaviate.Client.GenerateClient.Hybrid(string? query, Weaviate.Client.Models.HybridVectorInput? vectors, Weaviate.Client.Models.GroupByRequest! groupBy, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Models.SinglePrompt? singlePrompt = null, Weaviate.Client.Models.GroupedTask? groupedTask = null, Weaviate.Client.Models.GenerativeProvider? provider = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+*REMOVED*Weaviate.Client.QueryClient.Hybrid(string! query, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+*REMOVED*Weaviate.Client.QueryClient.Hybrid(string! query, Weaviate.Client.Models.GroupByRequest! groupBy, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+*REMOVED*Weaviate.Client.QueryClient.Hybrid(string? query, Weaviate.Client.Models.HybridVectorInput? vectors, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+*REMOVED*Weaviate.Client.QueryClient.Hybrid(string? query, Weaviate.Client.Models.HybridVectorInput? vectors, Weaviate.Client.Models.GroupByRequest! groupBy, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+*REMOVED*Weaviate.Client.Typed.TypedGenerateClient.Hybrid(string! query, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Models.SinglePrompt? singlePrompt = null, Weaviate.Client.Models.GroupedTask? groupedTask = null, Weaviate.Client.Models.GenerativeProvider? provider = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>!
+*REMOVED*Weaviate.Client.Typed.TypedGenerateClient.Hybrid(string! query, Weaviate.Client.Models.GroupByRequest! groupBy, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Models.SinglePrompt? singlePrompt = null, Weaviate.Client.Models.GroupedTask? groupedTask = null, Weaviate.Client.Models.GenerativeProvider? provider = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>!
+*REMOVED*Weaviate.Client.Typed.TypedGenerateClient.Hybrid(string? query, Weaviate.Client.Models.HybridVectorInput? vectors, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Models.SinglePrompt? singlePrompt = null, Weaviate.Client.Models.GroupedTask? groupedTask = null, Weaviate.Client.Models.GenerativeProvider? provider = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>!
+*REMOVED*Weaviate.Client.Typed.TypedGenerateClient.Hybrid(string? query, Weaviate.Client.Models.HybridVectorInput? vectors, Weaviate.Client.Models.GroupByRequest! groupBy, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Models.SinglePrompt? singlePrompt = null, Weaviate.Client.Models.GroupedTask? groupedTask = null, Weaviate.Client.Models.GenerativeProvider? provider = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>!
+*REMOVED*Weaviate.Client.Typed.TypedQueryClient.Hybrid(string! query, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>!>!
+*REMOVED*Weaviate.Client.Typed.TypedQueryClient.Hybrid(string! query, Weaviate.Client.Models.GroupByRequest! groupBy, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>!
+*REMOVED*Weaviate.Client.Typed.TypedQueryClient.Hybrid(string? query, Weaviate.Client.Models.HybridVectorInput? vectors, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>!>!
+*REMOVED*Weaviate.Client.Typed.TypedQueryClient.Hybrid(string? query, Weaviate.Client.Models.HybridVectorInput? vectors, Weaviate.Client.Models.GroupByRequest! groupBy, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>!
+abstract Weaviate.Client.Models.Diversity.$() -> Weaviate.Client.Models.Diversity!
+override sealed Weaviate.Client.Models.Diversity.MMR.Equals(Weaviate.Client.Models.Diversity? other) -> bool
+override Weaviate.Client.Models.Diversity.Equals(object? obj) -> bool
+override Weaviate.Client.Models.Diversity.GetHashCode() -> int
+override Weaviate.Client.Models.Diversity.MMR.$() -> Weaviate.Client.Models.Diversity.MMR!
+override Weaviate.Client.Models.Diversity.MMR.EqualityContract.get -> System.Type!
+override Weaviate.Client.Models.Diversity.MMR.Equals(object? obj) -> bool
+override Weaviate.Client.Models.Diversity.MMR.GetHashCode() -> int
+override Weaviate.Client.Models.Diversity.MMR.PrintMembers(System.Text.StringBuilder! builder) -> bool
+override Weaviate.Client.Models.Diversity.MMR.ToString() -> string!
+override Weaviate.Client.Models.Diversity.ToString() -> string!
+static Weaviate.Client.GenerateClientHybridExtensions.Hybrid(this Weaviate.Client.GenerateClient! client, string! query, Weaviate.Client.Models.HybridVectorInput.FactoryFn! vectors, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, Weaviate.Client.Models.Diversity? diversitySelection = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Models.SinglePrompt? singlePrompt = null, Weaviate.Client.Models.GroupedTask? groupedTask = null, Weaviate.Client.Models.GenerativeProvider? provider = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+static Weaviate.Client.GenerateClientHybridExtensions.Hybrid(this Weaviate.Client.GenerateClient! client, string! query, Weaviate.Client.Models.HybridVectorInput.FactoryFn! vectors, Weaviate.Client.Models.GroupByRequest! groupBy, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, Weaviate.Client.Models.Diversity? diversitySelection = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Models.SinglePrompt? singlePrompt = null, Weaviate.Client.Models.GroupedTask? groupedTask = null, Weaviate.Client.Models.GenerativeProvider? provider = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+static Weaviate.Client.Models.Diversity.MMR.operator !=(Weaviate.Client.Models.Diversity.MMR? left, Weaviate.Client.Models.Diversity.MMR? right) -> bool
+static Weaviate.Client.Models.Diversity.MMR.operator ==(Weaviate.Client.Models.Diversity.MMR? left, Weaviate.Client.Models.Diversity.MMR? right) -> bool
+static Weaviate.Client.Models.Diversity.operator !=(Weaviate.Client.Models.Diversity? left, Weaviate.Client.Models.Diversity? right) -> bool
+static Weaviate.Client.Models.Diversity.operator ==(Weaviate.Client.Models.Diversity? left, Weaviate.Client.Models.Diversity? right) -> bool
+static Weaviate.Client.QueryClientHybridExtensions.Hybrid(this Weaviate.Client.QueryClient! client, string? query = null, Weaviate.Client.Models.HybridVectorInput.FactoryFn? vectors = null, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, Weaviate.Client.Models.Diversity? diversitySelection = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+static Weaviate.Client.QueryClientHybridExtensions.Hybrid(this Weaviate.Client.QueryClient! client, string? query, Weaviate.Client.Models.HybridVectorInput.FactoryFn? vectors, Weaviate.Client.Models.GroupByRequest! groupBy, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, Weaviate.Client.Models.Diversity? diversitySelection = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+static Weaviate.Client.Typed.TypedGenerateClientHybridExtensions.Hybrid(this Weaviate.Client.Typed.TypedGenerateClient! client, string! query, Weaviate.Client.Models.HybridVectorInput.FactoryFn! vectors, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, Weaviate.Client.Models.Diversity? diversitySelection = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Models.SinglePrompt? singlePrompt = null, Weaviate.Client.Models.GroupedTask? groupedTask = null, Weaviate.Client.Models.GenerativeProvider? provider = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>!
+static Weaviate.Client.Typed.TypedGenerateClientHybridExtensions.Hybrid(this Weaviate.Client.Typed.TypedGenerateClient! client, string! query, Weaviate.Client.Models.HybridVectorInput.FactoryFn! vectors, Weaviate.Client.Models.GroupByRequest! groupBy, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, Weaviate.Client.Models.Diversity? diversitySelection = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Models.SinglePrompt? singlePrompt = null, Weaviate.Client.Models.GroupedTask? groupedTask = null, Weaviate.Client.Models.GenerativeProvider? provider = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>!
+static Weaviate.Client.Typed.TypedQueryClientHybridExtensions.Hybrid(this Weaviate.Client.Typed.TypedQueryClient! client, string! query, Weaviate.Client.Models.HybridVectorInput.FactoryFn! vectors, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, Weaviate.Client.Models.Diversity? diversitySelection = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>!>!
+static Weaviate.Client.Typed.TypedQueryClientHybridExtensions.Hybrid(this Weaviate.Client.Typed.TypedQueryClient! client, string! query, Weaviate.Client.Models.HybridVectorInput.FactoryFn! vectors, Weaviate.Client.Models.GroupByRequest! groupBy, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, Weaviate.Client.Models.Diversity? diversitySelection = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>!
+virtual Weaviate.Client.Models.Diversity.EqualityContract.get -> System.Type!
+virtual Weaviate.Client.Models.Diversity.Equals(Weaviate.Client.Models.Diversity? other) -> bool
+virtual Weaviate.Client.Models.Diversity.MMR.Equals(Weaviate.Client.Models.Diversity.MMR? other) -> bool
+virtual Weaviate.Client.Models.Diversity.PrintMembers(System.Text.StringBuilder! builder) -> bool
+Weaviate.Client.GenerateClient.Hybrid(string! query, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, Weaviate.Client.Models.Diversity? diversitySelection = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Models.SinglePrompt? singlePrompt = null, Weaviate.Client.Models.GroupedTask? groupedTask = null, Weaviate.Client.Models.GenerativeProvider? provider = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+Weaviate.Client.GenerateClient.Hybrid(string! query, Weaviate.Client.Models.GroupByRequest! groupBy, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, Weaviate.Client.Models.Diversity? diversitySelection = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Models.SinglePrompt? singlePrompt = null, Weaviate.Client.Models.GroupedTask? groupedTask = null, Weaviate.Client.Models.GenerativeProvider? provider = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+Weaviate.Client.GenerateClient.Hybrid(string? query, Weaviate.Client.Models.HybridVectorInput? vectors, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, Weaviate.Client.Models.Diversity? diversitySelection = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Models.SinglePrompt? singlePrompt = null, Weaviate.Client.Models.GroupedTask? groupedTask = null, Weaviate.Client.Models.GenerativeProvider? provider = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+Weaviate.Client.GenerateClient.Hybrid(string? query, Weaviate.Client.Models.HybridVectorInput? vectors, Weaviate.Client.Models.GroupByRequest! groupBy, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, Weaviate.Client.Models.Diversity? diversitySelection = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Models.SinglePrompt? singlePrompt = null, Weaviate.Client.Models.GroupedTask? groupedTask = null, Weaviate.Client.Models.GenerativeProvider? provider = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+Weaviate.Client.Models.Diversity
+Weaviate.Client.Models.Diversity.Diversity() -> void
+Weaviate.Client.Models.Diversity.Diversity(Weaviate.Client.Models.Diversity! original) -> void
+Weaviate.Client.Models.Diversity.MMR
+Weaviate.Client.Models.Diversity.MMR.Balance.get -> float?
+Weaviate.Client.Models.Diversity.MMR.Balance.init -> void
+Weaviate.Client.Models.Diversity.MMR.Deconstruct(out uint? Limit, out float? Balance) -> void
+Weaviate.Client.Models.Diversity.MMR.Limit.get -> uint?
+Weaviate.Client.Models.Diversity.MMR.Limit.init -> void
+Weaviate.Client.Models.Diversity.MMR.MMR(uint? Limit = null, float? Balance = null) -> void
+Weaviate.Client.Models.Diversity.MMR.MMR(Weaviate.Client.Models.Diversity.MMR! original) -> void
+Weaviate.Client.QueryClient.Hybrid(string! query, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, Weaviate.Client.Models.Diversity? diversitySelection = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+Weaviate.Client.QueryClient.Hybrid(string! query, Weaviate.Client.Models.GroupByRequest! groupBy, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, Weaviate.Client.Models.Diversity? diversitySelection = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+Weaviate.Client.QueryClient.Hybrid(string? query, Weaviate.Client.Models.HybridVectorInput? vectors, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, Weaviate.Client.Models.Diversity? diversitySelection = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+Weaviate.Client.QueryClient.Hybrid(string? query, Weaviate.Client.Models.HybridVectorInput? vectors, Weaviate.Client.Models.GroupByRequest! groupBy, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, Weaviate.Client.Models.Diversity? diversitySelection = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+Weaviate.Client.Typed.TypedGenerateClient.Hybrid(string! query, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, Weaviate.Client.Models.Diversity? diversitySelection = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Models.SinglePrompt? singlePrompt = null, Weaviate.Client.Models.GroupedTask? groupedTask = null, Weaviate.Client.Models.GenerativeProvider? provider = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>!
+Weaviate.Client.Typed.TypedGenerateClient.Hybrid(string! query, Weaviate.Client.Models.GroupByRequest! groupBy, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, Weaviate.Client.Models.Diversity? diversitySelection = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Models.SinglePrompt? singlePrompt = null, Weaviate.Client.Models.GroupedTask? groupedTask = null, Weaviate.Client.Models.GenerativeProvider? provider = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>!
+Weaviate.Client.Typed.TypedGenerateClient.Hybrid(string? query, Weaviate.Client.Models.HybridVectorInput? vectors, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, Weaviate.Client.Models.Diversity? diversitySelection = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Models.SinglePrompt? singlePrompt = null, Weaviate.Client.Models.GroupedTask? groupedTask = null, Weaviate.Client.Models.GenerativeProvider? provider = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>!
+Weaviate.Client.Typed.TypedGenerateClient.Hybrid(string? query, Weaviate.Client.Models.HybridVectorInput? vectors, Weaviate.Client.Models.GroupByRequest! groupBy, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, Weaviate.Client.Models.Diversity? diversitySelection = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Models.SinglePrompt? singlePrompt = null, Weaviate.Client.Models.GroupedTask? groupedTask = null, Weaviate.Client.Models.GenerativeProvider? provider = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>!
+Weaviate.Client.Typed.TypedQueryClient.Hybrid(string! query, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, Weaviate.Client.Models.Diversity? diversitySelection = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>!>!
+Weaviate.Client.Typed.TypedQueryClient.Hybrid(string! query, Weaviate.Client.Models.GroupByRequest! groupBy, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, Weaviate.Client.Models.Diversity? diversitySelection = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>!
+Weaviate.Client.Typed.TypedQueryClient.Hybrid(string? query, Weaviate.Client.Models.HybridVectorInput? vectors, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, Weaviate.Client.Models.Diversity? diversitySelection = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>!>!
+Weaviate.Client.Typed.TypedQueryClient.Hybrid(string? query, Weaviate.Client.Models.HybridVectorInput? vectors, Weaviate.Client.Models.GroupByRequest! groupBy, float? alpha = null, string![]? queryProperties = null, Weaviate.Client.Models.HybridFusion? fusionType = null, float? maxVectorDistance = null, uint? limit = null, uint? offset = null, Weaviate.Client.Models.BM25Operator? bm25Operator = null, Weaviate.Client.Models.Diversity? diversitySelection = null, uint? autoLimit = null, Weaviate.Client.Models.Filter? filters = null, Weaviate.Client.Models.Rerank? rerank = null, Weaviate.Client.Internal.AutoArray? returnProperties = null, System.Collections.Generic.IList? returnReferences = null, Weaviate.Client.Models.MetadataQuery? returnMetadata = null, Weaviate.Client.Models.VectorQuery? includeVectors = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>!
diff --git a/src/Weaviate.Client/QueryClient.Hybrid.cs b/src/Weaviate.Client/QueryClient.Hybrid.cs
index f0519b37..368cb009 100644
--- a/src/Weaviate.Client/QueryClient.Hybrid.cs
+++ b/src/Weaviate.Client/QueryClient.Hybrid.cs
@@ -20,6 +20,7 @@ public Task Hybrid(
uint? limit = null,
uint? offset = null,
BM25Operator? bm25Operator = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Filter? filters = null,
Rerank? rerank = null,
@@ -39,6 +40,7 @@ public Task Hybrid(
limit: limit,
offset: offset,
bm25Operator: bm25Operator,
+ diversitySelection: diversitySelection,
autoLimit: autoLimit,
filters: filters,
rerank: rerank,
@@ -62,6 +64,7 @@ public async Task Hybrid(
uint? limit = null,
uint? offset = null,
BM25Operator? bm25Operator = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Filter? filters = null,
Rerank? rerank = null,
@@ -90,6 +93,7 @@ public async Task Hybrid(
limit: limit,
offset: offset,
bm25Operator: bm25Operator,
+ diversitySelection: diversitySelection,
autoLimit: autoLimit,
filters: filters,
rerank: rerank,
@@ -116,6 +120,7 @@ public Task Hybrid(
uint? limit = null,
uint? offset = null,
BM25Operator? bm25Operator = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Filter? filters = null,
Rerank? rerank = null,
@@ -136,6 +141,7 @@ public Task Hybrid(
limit: limit,
offset: offset,
bm25Operator: bm25Operator,
+ diversitySelection: diversitySelection,
autoLimit: autoLimit,
filters: filters,
rerank: rerank,
@@ -160,6 +166,7 @@ public async Task Hybrid(
uint? limit = null,
uint? offset = null,
BM25Operator? bm25Operator = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Filter? filters = null,
Rerank? rerank = null,
@@ -188,6 +195,7 @@ public async Task Hybrid(
limit: limit,
offset: offset,
bm25Operator: bm25Operator,
+ diversitySelection: diversitySelection,
autoLimit: autoLimit,
filters: filters,
groupBy: groupBy,
@@ -232,6 +240,7 @@ public static async Task Hybrid(
uint? limit = null,
uint? offset = null,
BM25Operator? bm25Operator = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Filter? filters = null,
Rerank? rerank = null,
@@ -254,6 +263,7 @@ public static async Task Hybrid(
limit: limit,
offset: offset,
bm25Operator: bm25Operator,
+ diversitySelection: diversitySelection,
autoLimit: autoLimit,
filters: filters,
rerank: rerank,
@@ -281,6 +291,7 @@ public static async Task Hybrid(
uint? limit = null,
uint? offset = null,
BM25Operator? bm25Operator = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Filter? filters = null,
Rerank? rerank = null,
@@ -304,6 +315,7 @@ public static async Task Hybrid(
limit: limit,
offset: offset,
bm25Operator: bm25Operator,
+ diversitySelection: diversitySelection,
autoLimit: autoLimit,
filters: filters,
rerank: rerank,
diff --git a/src/Weaviate.Client/Typed/TypedGenerateClient.Hybrid.cs b/src/Weaviate.Client/Typed/TypedGenerateClient.Hybrid.cs
index c6416bea..c9cb9913 100644
--- a/src/Weaviate.Client/Typed/TypedGenerateClient.Hybrid.cs
+++ b/src/Weaviate.Client/Typed/TypedGenerateClient.Hybrid.cs
@@ -21,6 +21,7 @@ public Task> Hybrid(
uint? limit = null,
uint? offset = null,
BM25Operator? bm25Operator = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Filter? filters = null,
Rerank? rerank = null,
@@ -43,6 +44,7 @@ public Task> Hybrid(
limit: limit,
offset: offset,
bm25Operator: bm25Operator,
+ diversitySelection: diversitySelection,
autoLimit: autoLimit,
filters: filters,
rerank: rerank,
@@ -69,6 +71,7 @@ public async Task> Hybrid(
uint? limit = null,
uint? offset = null,
BM25Operator? bm25Operator = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Filter? filters = null,
Rerank? rerank = null,
@@ -92,6 +95,7 @@ public async Task> Hybrid(
limit: limit,
offset: offset,
bm25Operator: bm25Operator,
+ diversitySelection: diversitySelection,
autoLimit: autoLimit,
filters: filters,
rerank: rerank,
@@ -120,6 +124,7 @@ public Task> Hybrid(
uint? limit = null,
uint? offset = null,
BM25Operator? bm25Operator = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Filter? filters = null,
Rerank? rerank = null,
@@ -143,6 +148,7 @@ public Task> Hybrid(
limit: limit,
offset: offset,
bm25Operator: bm25Operator,
+ diversitySelection: diversitySelection,
autoLimit: autoLimit,
filters: filters,
rerank: rerank,
@@ -170,6 +176,7 @@ public async Task> Hybrid(
uint? limit = null,
uint? offset = null,
BM25Operator? bm25Operator = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Filter? filters = null,
Rerank? rerank = null,
@@ -194,6 +201,7 @@ public async Task> Hybrid(
limit: limit,
offset: offset,
bm25Operator: bm25Operator,
+ diversitySelection: diversitySelection,
autoLimit: autoLimit,
filters: filters,
rerank: rerank,
@@ -230,6 +238,7 @@ public static async Task> Hybrid(
uint? limit = null,
uint? offset = null,
BM25Operator? bm25Operator = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Filter? filters = null,
Rerank? rerank = null,
@@ -253,6 +262,7 @@ await client.Hybrid(
limit: limit,
offset: offset,
bm25Operator: bm25Operator,
+ diversitySelection: diversitySelection,
autoLimit: autoLimit,
filters: filters,
rerank: rerank,
@@ -282,6 +292,7 @@ public static async Task> Hybrid(
uint? limit = null,
uint? offset = null,
BM25Operator? bm25Operator = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Filter? filters = null,
Rerank? rerank = null,
@@ -306,6 +317,7 @@ await client.Hybrid(
limit: limit,
offset: offset,
bm25Operator: bm25Operator,
+ diversitySelection: diversitySelection,
autoLimit: autoLimit,
filters: filters,
rerank: rerank,
diff --git a/src/Weaviate.Client/Typed/TypedQueryClient.Hybrid.cs b/src/Weaviate.Client/Typed/TypedQueryClient.Hybrid.cs
index 8743ea53..62ca455c 100644
--- a/src/Weaviate.Client/Typed/TypedQueryClient.Hybrid.cs
+++ b/src/Weaviate.Client/Typed/TypedQueryClient.Hybrid.cs
@@ -21,6 +21,7 @@ public Task>> Hybrid(
uint? limit = null,
uint? offset = null,
BM25Operator? bm25Operator = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Filter? filters = null,
Rerank? rerank = null,
@@ -40,6 +41,7 @@ public Task>> Hybrid(
limit: limit,
offset: offset,
bm25Operator: bm25Operator,
+ diversitySelection: diversitySelection,
autoLimit: autoLimit,
filters: filters,
rerank: rerank,
@@ -63,6 +65,7 @@ public async Task>> Hybrid(
uint? limit = null,
uint? offset = null,
BM25Operator? bm25Operator = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Filter? filters = null,
Rerank? rerank = null,
@@ -83,6 +86,7 @@ public async Task>> Hybrid(
limit: limit,
offset: offset,
bm25Operator: bm25Operator,
+ diversitySelection: diversitySelection,
autoLimit: autoLimit,
filters: filters,
rerank: rerank,
@@ -108,6 +112,7 @@ public Task> Hybrid(
uint? limit = null,
uint? offset = null,
BM25Operator? bm25Operator = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Filter? filters = null,
Rerank? rerank = null,
@@ -128,6 +133,7 @@ public Task> Hybrid(
limit: limit,
offset: offset,
bm25Operator: bm25Operator,
+ diversitySelection: diversitySelection,
autoLimit: autoLimit,
filters: filters,
rerank: rerank,
@@ -152,6 +158,7 @@ public async Task> Hybrid(
uint? limit = null,
uint? offset = null,
BM25Operator? bm25Operator = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Filter? filters = null,
Rerank? rerank = null,
@@ -173,6 +180,7 @@ public async Task> Hybrid(
limit: limit,
offset: offset,
bm25Operator: bm25Operator,
+ diversitySelection: diversitySelection,
autoLimit: autoLimit,
filters: filters,
rerank: rerank,
@@ -225,6 +233,7 @@ public static async Task>> Hybrid(
uint? limit = null,
uint? offset = null,
BM25Operator? bm25Operator = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Filter? filters = null,
Rerank? rerank = null,
@@ -245,6 +254,7 @@ await client.Hybrid(
limit: limit,
offset: offset,
bm25Operator: bm25Operator,
+ diversitySelection: diversitySelection,
autoLimit: autoLimit,
filters: filters,
rerank: rerank,
@@ -271,6 +281,7 @@ public static async Task> Hybrid(
uint? limit = null,
uint? offset = null,
BM25Operator? bm25Operator = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Filter? filters = null,
Rerank? rerank = null,
@@ -292,6 +303,7 @@ await client.Hybrid(
limit: limit,
offset: offset,
bm25Operator: bm25Operator,
+ diversitySelection: diversitySelection,
autoLimit: autoLimit,
filters: filters,
rerank: rerank,
diff --git a/src/Weaviate.Client/gRPC/Search.Builders.cs b/src/Weaviate.Client/gRPC/Search.Builders.cs
index 3d463e43..31ced27c 100644
--- a/src/Weaviate.Client/gRPC/Search.Builders.cs
+++ b/src/Weaviate.Client/gRPC/Search.Builders.cs
@@ -875,6 +875,7 @@ private void BuildBM25(
/// The fusion type
/// The max vector distance
/// The bm 25 operator
+ /// The diversity selection
/// The hybrid
private V1.Hybrid BuildHybrid(
string? query = null,
@@ -883,7 +884,8 @@ private V1.Hybrid BuildHybrid(
string[]? queryProperties = null,
HybridFusion? fusionType = null,
float? maxVectorDistance = null,
- BM25Operator? bm25Operator = null
+ BM25Operator? bm25Operator = null,
+ Diversity? diversitySelection = null
)
{
var hybrid = new V1.Hybrid();
@@ -1021,6 +1023,19 @@ private V1.Hybrid BuildHybrid(
MinimumOrTokensMatch = (bm25Operator as BM25Operator.Or)?.MinimumMatch ?? 1,
};
}
+ if (diversitySelection is Diversity.MMR mmr)
+ {
+ var mmrGrpc = new V1.Selection.Types.MMR();
+ if (mmr.Limit.HasValue)
+ {
+ mmrGrpc.Limit = mmr.Limit.Value;
+ }
+ if (mmr.Balance.HasValue)
+ {
+ mmrGrpc.Balance = mmr.Balance.Value;
+ }
+ hybrid.Selection = new V1.Selection { Mmr = mmrGrpc };
+ }
return hybrid;
}
diff --git a/src/Weaviate.Client/gRPC/Search.cs b/src/Weaviate.Client/gRPC/Search.cs
index 296f5455..0569f0d7 100644
--- a/src/Weaviate.Client/gRPC/Search.cs
+++ b/src/Weaviate.Client/gRPC/Search.cs
@@ -336,6 +336,7 @@ internal partial class WeaviateGrpcClient
/// The limit
/// The offset
/// The bm 25 operator
+ /// The diversity selection
/// The auto limit
/// The filters
/// The group by
@@ -362,6 +363,7 @@ internal partial class WeaviateGrpcClient
uint? limit = null,
uint? offset = null,
BM25Operator? bm25Operator = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Filter? filters = null,
GroupByRequest? groupBy = null,
@@ -410,7 +412,8 @@ internal partial class WeaviateGrpcClient
queryProperties,
fusionType,
maxVectorDistance,
- bm25Operator
+ bm25Operator,
+ diversitySelection
);
return await Search(request, cancellationToken);
From 8cd55503ace09da84fb96ac21dc28281823c9d9c Mon Sep 17 00:00:00 2001
From: Ivan Despot <66276597+g-despot@users.noreply.github.com>
Date: Thu, 13 Aug 2026 09:53:48 +0200
Subject: [PATCH 2/2] feat: accept diversity selection on near* queries
(Weaviate 1.37+)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Diversity/MMR was wired into hybrid only. base_search.proto carries an
optional Selection on NearVector, NearTextSearch, NearObject and each
Near*Search message, and the server has supported it since 1.37.0 —
hybrid diversity is the newer 1.38.6 addition, so the broader surface was
in fact the older one.
Threads diversitySelection through the 74 near* overloads across the
query, generate and typed clients, and moves the hybrid mapping into a
shared BuildSelection helper. No proto change was needed. Aggregate is
deliberately excluded, matching the python client.
---
.../Unit/TestNearDiversitySyntax.cs | 785 ++++++++++++++++++
.../GenerateClient.NearMedia.cs | 6 +
.../GenerateClient.NearObject.cs | 6 +
.../GenerateClient.NearText.cs | 18 +
.../GenerateClient.NearVector.cs | 20 +
src/Weaviate.Client/Models/Search.cs | 4 +-
src/Weaviate.Client/PublicAPI.Unshipped.txt | 148 ++++
src/Weaviate.Client/QueryClient.NearMedia.cs | 12 +
src/Weaviate.Client/QueryClient.NearObject.cs | 6 +
src/Weaviate.Client/QueryClient.NearText.cs | 18 +
src/Weaviate.Client/QueryClient.NearVector.cs | 24 +
.../Typed/TypedGenerateClient.NearMedia.cs | 6 +
.../Typed/TypedGenerateClient.NearObject.cs | 6 +
.../Typed/TypedGenerateClient.NearText.cs | 18 +
.../Typed/TypedGenerateClient.NearVector.cs | 24 +
.../Typed/TypedQueryClient.NearMedia.cs | 6 +
.../Typed/TypedQueryClient.NearObject.cs | 6 +
.../Typed/TypedQueryClient.NearText.cs | 18 +
.../Typed/TypedQueryClient.NearVector.cs | 24 +
src/Weaviate.Client/gRPC/Search.Builders.cs | 69 +-
src/Weaviate.Client/gRPC/Search.cs | 53 +-
21 files changed, 1259 insertions(+), 18 deletions(-)
create mode 100644 src/Weaviate.Client.Tests/Unit/TestNearDiversitySyntax.cs
diff --git a/src/Weaviate.Client.Tests/Unit/TestNearDiversitySyntax.cs b/src/Weaviate.Client.Tests/Unit/TestNearDiversitySyntax.cs
new file mode 100644
index 00000000..75e1db5a
--- /dev/null
+++ b/src/Weaviate.Client.Tests/Unit/TestNearDiversitySyntax.cs
@@ -0,0 +1,785 @@
+using Weaviate.Client.Models;
+using Weaviate.Client.Tests.Unit.Mocks;
+using Weaviate.Client.Typed;
+using V1 = Weaviate.Client.Grpc.Protobuf.V1;
+
+namespace Weaviate.Client.Tests.Unit;
+
+///
+/// Unit tests verifying the near-vector, near-object, near-text and near-media diversity
+/// selection maps to the expected Selection message in the gRPC request across the query,
+/// generate and typed paths.
+///
+[Collection("Unit Tests")]
+public class TestNearDiversitySyntax : IAsyncLifetime
+{
+ private const string CollectionName = "TestCollection";
+
+ private static readonly byte[] TestMediaBytes = [1, 2, 3, 4, 5];
+
+ private static readonly Guid TestObjectID = new("11111111-1111-1111-1111-111111111111");
+
+ private Func _getRequest = null!;
+ private CollectionClient _collection = null!;
+
+ ///
+ /// The article test type
+ ///
+ private class Article
+ {
+ ///
+ /// The title
+ ///
+ public string? Title { get; set; }
+ }
+
+ ///
+ /// Initializes this instance
+ ///
+ /// The value task
+ public ValueTask InitializeAsync()
+ {
+ var (client, getRequest) = MockGrpcClient.CreateWithSearchCapture(new Version(1, 39, 0));
+ _getRequest = getRequest;
+ _collection = client.Collections.Use(CollectionName);
+ return ValueTask.CompletedTask;
+ }
+
+ ///
+ /// Disposes this instance
+ ///
+ /// The value task
+ public ValueTask DisposeAsync()
+ {
+ GC.SuppressFinalize(this);
+ return ValueTask.CompletedTask;
+ }
+
+ #region NearVector
+
+ ///
+ /// Tests that near vector diversity selection sets selection on the request
+ ///
+ [Fact]
+ public async Task NearVector_DiversitySelection_MMR_SetsSelection()
+ {
+ // Act
+ await _collection.Query.NearVector(
+ new float[] { 1f, 0f, 0f },
+ diversitySelection: new Diversity.MMR(Limit: 7, Balance: 0.5f),
+ limit: 7,
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.NotNull(request.NearVector.Selection);
+ Assert.Equal(7u, request.NearVector.Selection.Mmr.Limit);
+ Assert.Equal(0.5f, request.NearVector.Selection.Mmr.Balance);
+ }
+
+ ///
+ /// Tests that near vector diversity selection with omitted balance leaves balance unset
+ ///
+ [Fact]
+ public async Task NearVector_DiversitySelection_BalanceOmitted_LeavesBalanceUnset()
+ {
+ // Act
+ await _collection.Query.NearVector(
+ new float[] { 1f, 0f, 0f },
+ diversitySelection: new Diversity.MMR(Limit: 3),
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.NotNull(request.NearVector.Selection);
+ Assert.True(request.NearVector.Selection.Mmr.HasLimit);
+ Assert.Equal(3u, request.NearVector.Selection.Mmr.Limit);
+ Assert.False(request.NearVector.Selection.Mmr.HasBalance);
+ }
+
+ ///
+ /// Tests that near vector diversity selection with omitted limit leaves limit unset
+ ///
+ [Fact]
+ public async Task NearVector_DiversitySelection_LimitOmitted_LeavesLimitUnset()
+ {
+ // Act
+ await _collection.Query.NearVector(
+ new float[] { 1f, 0f, 0f },
+ diversitySelection: new Diversity.MMR(Balance: 0.25f),
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.NotNull(request.NearVector.Selection);
+ Assert.False(request.NearVector.Selection.Mmr.HasLimit);
+ Assert.True(request.NearVector.Selection.Mmr.HasBalance);
+ Assert.Equal(0.25f, request.NearVector.Selection.Mmr.Balance);
+ }
+
+ ///
+ /// Tests that near vector without diversity selection leaves selection unset
+ ///
+ [Fact]
+ public async Task NearVector_NoDiversitySelection_LeavesSelectionUnset()
+ {
+ // Act
+ await _collection.Query.NearVector(
+ new float[] { 1f, 0f, 0f },
+ limit: 5,
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.Null(request.NearVector.Selection);
+ }
+
+ ///
+ /// Tests that near vector with group by carries the diversity selection
+ ///
+ [Fact]
+ public async Task NearVector_GroupBy_DiversitySelection_SetsSelection()
+ {
+ // Act
+ await _collection.Query.NearVector(
+ new float[] { 1f, 0f, 0f },
+ new GroupByRequest("category") { ObjectsPerGroup = 3 },
+ diversitySelection: new Diversity.MMR(Limit: 5, Balance: 0.75f),
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.NotNull(request.NearVector.Selection);
+ Assert.Equal(5u, request.NearVector.Selection.Mmr.Limit);
+ Assert.Equal(0.75f, request.NearVector.Selection.Mmr.Balance);
+ }
+
+ #endregion
+
+ #region NearObject
+
+ ///
+ /// Tests that near object diversity selection sets selection on the request
+ ///
+ [Fact]
+ public async Task NearObject_DiversitySelection_MMR_SetsSelection()
+ {
+ // Act
+ await _collection.Query.NearObject(
+ TestObjectID,
+ diversitySelection: new Diversity.MMR(Limit: 4, Balance: 0.4f),
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.NotNull(request.NearObject.Selection);
+ Assert.Equal(4u, request.NearObject.Selection.Mmr.Limit);
+ Assert.Equal(0.4f, request.NearObject.Selection.Mmr.Balance);
+ }
+
+ ///
+ /// Tests that near object diversity selection with omitted balance leaves balance unset
+ ///
+ [Fact]
+ public async Task NearObject_DiversitySelection_BalanceOmitted_LeavesBalanceUnset()
+ {
+ // Act
+ await _collection.Query.NearObject(
+ TestObjectID,
+ diversitySelection: new Diversity.MMR(Limit: 2),
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.NotNull(request.NearObject.Selection);
+ Assert.True(request.NearObject.Selection.Mmr.HasLimit);
+ Assert.False(request.NearObject.Selection.Mmr.HasBalance);
+ }
+
+ ///
+ /// Tests that near object without diversity selection leaves selection unset
+ ///
+ [Fact]
+ public async Task NearObject_NoDiversitySelection_LeavesSelectionUnset()
+ {
+ // Act
+ await _collection.Query.NearObject(
+ TestObjectID,
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.Null(request.NearObject.Selection);
+ }
+
+ #endregion
+
+ #region NearText
+
+ ///
+ /// Tests that near text diversity selection sets selection on the request
+ ///
+ [Fact]
+ public async Task NearText_DiversitySelection_MMR_SetsSelection()
+ {
+ // Act
+ await _collection.Query.NearText(
+ "banana",
+ diversitySelection: new Diversity.MMR(Limit: 6, Balance: 0.2f),
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.NotNull(request.NearText.Selection);
+ Assert.Equal(6u, request.NearText.Selection.Mmr.Limit);
+ Assert.Equal(0.2f, request.NearText.Selection.Mmr.Balance);
+ }
+
+ ///
+ /// Tests that near text diversity selection with omitted limit leaves limit unset
+ ///
+ [Fact]
+ public async Task NearText_DiversitySelection_LimitOmitted_LeavesLimitUnset()
+ {
+ // Act
+ await _collection.Query.NearText(
+ "banana",
+ diversitySelection: new Diversity.MMR(Balance: 0.9f),
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.NotNull(request.NearText.Selection);
+ Assert.False(request.NearText.Selection.Mmr.HasLimit);
+ Assert.Equal(0.9f, request.NearText.Selection.Mmr.Balance);
+ }
+
+ ///
+ /// Tests that near text without diversity selection leaves selection unset
+ ///
+ [Fact]
+ public async Task NearText_NoDiversitySelection_LeavesSelectionUnset()
+ {
+ // Act
+ await _collection.Query.NearText(
+ "banana",
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.Null(request.NearText.Selection);
+ }
+
+ ///
+ /// Tests that the near text lambda builder overload carries the diversity selection
+ ///
+ [Fact]
+ public async Task NearText_LambdaBuilder_DiversitySelection_SetsSelection()
+ {
+ // Act
+ await _collection.Query.NearText(
+ v => v(["banana"]).TargetVectorsSum("title", "description"),
+ diversitySelection: new Diversity.MMR(Limit: 8),
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.NotNull(request.NearText.Selection);
+ Assert.Equal(8u, request.NearText.Selection.Mmr.Limit);
+ }
+
+ #endregion
+
+ #region NearMedia
+
+ ///
+ /// Returns the selection carried by the near-media message of the given type
+ ///
+ /// The request
+ /// The media type
+ /// The selection, or null when unset
+ private static V1.Selection? MediaSelection(
+ V1.SearchRequest request,
+ NearMediaType mediaType
+ ) =>
+ mediaType switch
+ {
+ NearMediaType.Image => request.NearImage?.Selection,
+ NearMediaType.Video => request.NearVideo?.Selection,
+ NearMediaType.Audio => request.NearAudio?.Selection,
+ NearMediaType.Depth => request.NearDepth?.Selection,
+ NearMediaType.Thermal => request.NearThermal?.Selection,
+ NearMediaType.IMU => request.NearImu?.Selection,
+ _ => throw new ArgumentOutOfRangeException(nameof(mediaType)),
+ };
+
+ ///
+ /// Builds the near-media input for the given media type
+ ///
+ /// The media type
+ /// The near media input factory
+ private static NearMediaInput.FactoryFn MediaFactory(NearMediaType mediaType) =>
+ mediaType switch
+ {
+ NearMediaType.Image => m => m.Image(TestMediaBytes).Build(),
+ NearMediaType.Video => m => m.Video(TestMediaBytes).Build(),
+ NearMediaType.Audio => m => m.Audio(TestMediaBytes).Build(),
+ NearMediaType.Depth => m => m.Depth(TestMediaBytes).Build(),
+ NearMediaType.Thermal => m => m.Thermal(TestMediaBytes).Build(),
+ NearMediaType.IMU => m => m.IMU(TestMediaBytes).Build(),
+ _ => throw new ArgumentOutOfRangeException(nameof(mediaType)),
+ };
+
+ ///
+ /// Tests that every near media type carries the diversity selection
+ ///
+ /// The media type
+ /// A task
+ [Theory]
+ [InlineData(NearMediaType.Image)]
+ [InlineData(NearMediaType.Video)]
+ [InlineData(NearMediaType.Audio)]
+ [InlineData(NearMediaType.Depth)]
+ [InlineData(NearMediaType.Thermal)]
+ [InlineData(NearMediaType.IMU)]
+ public async Task NearMedia_DiversitySelection_MMR_SetsSelection(NearMediaType mediaType)
+ {
+ // Act
+ await _collection.Query.NearMedia(
+ MediaFactory(mediaType),
+ diversitySelection: new Diversity.MMR(Limit: 9, Balance: 0.6f),
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ var selection = MediaSelection(request, mediaType);
+ Assert.NotNull(selection);
+ Assert.Equal(9u, selection.Mmr.Limit);
+ Assert.Equal(0.6f, selection.Mmr.Balance);
+ }
+
+ ///
+ /// Tests that near media diversity selection with omitted balance leaves balance unset
+ ///
+ [Fact]
+ public async Task NearMedia_DiversitySelection_BalanceOmitted_LeavesBalanceUnset()
+ {
+ // Act
+ await _collection.Query.NearMedia(
+ m => m.Image(TestMediaBytes).Build(),
+ diversitySelection: new Diversity.MMR(Limit: 1),
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.NotNull(request.NearImage.Selection);
+ Assert.True(request.NearImage.Selection.Mmr.HasLimit);
+ Assert.False(request.NearImage.Selection.Mmr.HasBalance);
+ }
+
+ ///
+ /// Tests that near media without diversity selection leaves selection unset
+ ///
+ [Fact]
+ public async Task NearMedia_NoDiversitySelection_LeavesSelectionUnset()
+ {
+ // Act
+ await _collection.Query.NearMedia(
+ m => m.Image(TestMediaBytes).Build(),
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.Null(request.NearImage.Selection);
+ }
+
+ #endregion
+
+ #region Generate
+
+ ///
+ /// Tests that generate near vector diversity selection sets selection on the request
+ ///
+ [Fact]
+ public async Task Generate_NearVector_DiversitySelection_SetsSelection()
+ {
+ // Act
+ await _collection.Generate.NearVector(
+ new float[] { 1f, 0f, 0f },
+ diversitySelection: new Diversity.MMR(Limit: 4, Balance: 0.25f),
+ singlePrompt: "Describe {title}",
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.NotNull(request.NearVector.Selection);
+ Assert.Equal(4u, request.NearVector.Selection.Mmr.Limit);
+ Assert.Equal(0.25f, request.NearVector.Selection.Mmr.Balance);
+ }
+
+ ///
+ /// Tests that generate near object diversity selection sets selection on the request
+ ///
+ [Fact]
+ public async Task Generate_NearObject_DiversitySelection_SetsSelection()
+ {
+ // Act
+ await _collection.Generate.NearObject(
+ TestObjectID,
+ diversitySelection: new Diversity.MMR(Limit: 3, Balance: 0.1f),
+ singlePrompt: "Describe {title}",
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.NotNull(request.NearObject.Selection);
+ Assert.Equal(3u, request.NearObject.Selection.Mmr.Limit);
+ Assert.Equal(0.1f, request.NearObject.Selection.Mmr.Balance);
+ }
+
+ ///
+ /// Tests that generate near text diversity selection sets selection on the request
+ ///
+ [Fact]
+ public async Task Generate_NearText_DiversitySelection_SetsSelection()
+ {
+ // Act
+ await _collection.Generate.NearText(
+ "banana",
+ diversitySelection: new Diversity.MMR(Limit: 6),
+ singlePrompt: "Describe {title}",
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.NotNull(request.NearText.Selection);
+ Assert.Equal(6u, request.NearText.Selection.Mmr.Limit);
+ Assert.False(request.NearText.Selection.Mmr.HasBalance);
+ }
+
+ ///
+ /// Tests that generate near media diversity selection sets selection on the request
+ ///
+ [Fact]
+ public async Task Generate_NearMedia_DiversitySelection_SetsSelection()
+ {
+ // Act
+ await _collection.Generate.NearMedia(
+ m => m.Image(TestMediaBytes).Build(),
+ diversitySelection: new Diversity.MMR(Limit: 2, Balance: 0.8f),
+ singlePrompt: "Describe {title}",
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.NotNull(request.NearImage.Selection);
+ Assert.Equal(2u, request.NearImage.Selection.Mmr.Limit);
+ Assert.Equal(0.8f, request.NearImage.Selection.Mmr.Balance);
+ }
+
+ ///
+ /// Tests that generate near vector without diversity selection leaves selection unset
+ ///
+ [Fact]
+ public async Task Generate_NearVector_NoDiversitySelection_LeavesSelectionUnset()
+ {
+ // Act
+ await _collection.Generate.NearVector(
+ new float[] { 1f, 0f, 0f },
+ singlePrompt: "Describe {title}",
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.Null(request.NearVector.Selection);
+ }
+
+ #endregion
+
+ #region Typed
+
+ ///
+ /// Tests that typed near vector diversity selection sets selection on the request
+ ///
+ [Fact]
+ public async Task Typed_NearVector_DiversitySelection_SetsSelection()
+ {
+ // Arrange
+ var typedQueryClient = new TypedQueryClient(_collection.Query);
+
+ // Act
+ await typedQueryClient.NearVector(
+ new float[] { 1f, 0f, 0f },
+ diversitySelection: new Diversity.MMR(Limit: 2, Balance: 1.0f),
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.NotNull(request.NearVector.Selection);
+ Assert.Equal(2u, request.NearVector.Selection.Mmr.Limit);
+ Assert.Equal(1.0f, request.NearVector.Selection.Mmr.Balance);
+ }
+
+ ///
+ /// Tests that typed near object diversity selection sets selection on the request
+ ///
+ [Fact]
+ public async Task Typed_NearObject_DiversitySelection_SetsSelection()
+ {
+ // Arrange
+ var typedQueryClient = new TypedQueryClient(_collection.Query);
+
+ // Act
+ await typedQueryClient.NearObject(
+ TestObjectID,
+ diversitySelection: new Diversity.MMR(Limit: 5),
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.NotNull(request.NearObject.Selection);
+ Assert.Equal(5u, request.NearObject.Selection.Mmr.Limit);
+ Assert.False(request.NearObject.Selection.Mmr.HasBalance);
+ }
+
+ ///
+ /// Tests that typed near text diversity selection sets selection on the request
+ ///
+ [Fact]
+ public async Task Typed_NearText_DiversitySelection_SetsSelection()
+ {
+ // Arrange
+ var typedQueryClient = new TypedQueryClient(_collection.Query);
+
+ // Act
+ await typedQueryClient.NearText(
+ "banana",
+ diversitySelection: new Diversity.MMR(Balance: 0.3f),
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.NotNull(request.NearText.Selection);
+ Assert.False(request.NearText.Selection.Mmr.HasLimit);
+ Assert.Equal(0.3f, request.NearText.Selection.Mmr.Balance);
+ }
+
+ ///
+ /// Tests that typed near media diversity selection sets selection on the request
+ ///
+ [Fact]
+ public async Task Typed_NearMedia_DiversitySelection_SetsSelection()
+ {
+ // Arrange
+ var typedQueryClient = new TypedQueryClient(_collection.Query);
+
+ // Act
+ await typedQueryClient.NearMedia(
+ m => m.Image(TestMediaBytes).Build(),
+ diversitySelection: new Diversity.MMR(Limit: 3, Balance: 0.7f),
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.NotNull(request.NearImage.Selection);
+ Assert.Equal(3u, request.NearImage.Selection.Mmr.Limit);
+ Assert.Equal(0.7f, request.NearImage.Selection.Mmr.Balance);
+ }
+
+ ///
+ /// Tests that typed near vector without diversity selection leaves selection unset
+ ///
+ [Fact]
+ public async Task Typed_NearVector_NoDiversitySelection_LeavesSelectionUnset()
+ {
+ // Arrange
+ var typedQueryClient = new TypedQueryClient(_collection.Query);
+
+ // Act
+ await typedQueryClient.NearVector(
+ new float[] { 1f, 0f, 0f },
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.Null(request.NearVector.Selection);
+ }
+
+ #endregion
+
+ #region Typed generate
+
+ ///
+ /// Tests that typed generate near vector diversity selection sets selection on the request
+ ///
+ [Fact]
+ public async Task Typed_Generate_NearVector_DiversitySelection_SetsSelection()
+ {
+ // Arrange
+ var typedGenerateClient = new TypedGenerateClient(_collection.Generate);
+
+ // Act
+ await typedGenerateClient.NearVector(
+ new float[] { 1f, 0f, 0f },
+ diversitySelection: new Diversity.MMR(Limit: 6),
+ singlePrompt: "Describe {title}",
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.NotNull(request.NearVector.Selection);
+ Assert.Equal(6u, request.NearVector.Selection.Mmr.Limit);
+ Assert.False(request.NearVector.Selection.Mmr.HasBalance);
+ }
+
+ ///
+ /// Tests that typed generate near object diversity selection sets selection on the request
+ ///
+ [Fact]
+ public async Task Typed_Generate_NearObject_DiversitySelection_SetsSelection()
+ {
+ // Arrange
+ var typedGenerateClient = new TypedGenerateClient(_collection.Generate);
+
+ // Act
+ await typedGenerateClient.NearObject(
+ TestObjectID,
+ diversitySelection: new Diversity.MMR(Limit: 1, Balance: 0.05f),
+ singlePrompt: "Describe {title}",
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.NotNull(request.NearObject.Selection);
+ Assert.Equal(1u, request.NearObject.Selection.Mmr.Limit);
+ Assert.Equal(0.05f, request.NearObject.Selection.Mmr.Balance);
+ }
+
+ ///
+ /// Tests that typed generate near text diversity selection sets selection on the request
+ ///
+ [Fact]
+ public async Task Typed_Generate_NearText_DiversitySelection_SetsSelection()
+ {
+ // Arrange
+ var typedGenerateClient = new TypedGenerateClient(_collection.Generate);
+
+ // Act
+ await typedGenerateClient.NearText(
+ "banana",
+ diversitySelection: new Diversity.MMR(Limit: 7, Balance: 0.45f),
+ singlePrompt: "Describe {title}",
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.NotNull(request.NearText.Selection);
+ Assert.Equal(7u, request.NearText.Selection.Mmr.Limit);
+ Assert.Equal(0.45f, request.NearText.Selection.Mmr.Balance);
+ }
+
+ ///
+ /// Tests that typed generate near media diversity selection sets selection on the request
+ ///
+ [Fact]
+ public async Task Typed_Generate_NearMedia_DiversitySelection_SetsSelection()
+ {
+ // Arrange
+ var typedGenerateClient = new TypedGenerateClient(_collection.Generate);
+
+ // Act
+ await typedGenerateClient.NearMedia(
+ m => m.Image(TestMediaBytes).Build(),
+ diversitySelection: new Diversity.MMR(Balance: 0.15f),
+ singlePrompt: "Describe {title}",
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.NotNull(request.NearImage.Selection);
+ Assert.False(request.NearImage.Selection.Mmr.HasLimit);
+ Assert.Equal(0.15f, request.NearImage.Selection.Mmr.Balance);
+ }
+
+ ///
+ /// Tests that typed generate near vector without diversity selection leaves selection unset
+ ///
+ [Fact]
+ public async Task Typed_Generate_NearVector_NoDiversitySelection_LeavesSelectionUnset()
+ {
+ // Arrange
+ var typedGenerateClient = new TypedGenerateClient(_collection.Generate);
+
+ // Act
+ await typedGenerateClient.NearVector(
+ new float[] { 1f, 0f, 0f },
+ singlePrompt: "Describe {title}",
+ cancellationToken: TestContext.Current.CancellationToken
+ );
+
+ // Assert
+ var request = _getRequest();
+ Assert.NotNull(request);
+ Assert.Null(request.NearVector.Selection);
+ }
+
+ #endregion
+}
diff --git a/src/Weaviate.Client/GenerateClient.NearMedia.cs b/src/Weaviate.Client/GenerateClient.NearMedia.cs
index 607f663d..fbb7b0ad 100644
--- a/src/Weaviate.Client/GenerateClient.NearMedia.cs
+++ b/src/Weaviate.Client/GenerateClient.NearMedia.cs
@@ -28,6 +28,7 @@ public partial class GenerateClient
/// Filters to apply to the search.
/// Maximum number of results to return.
/// Number of results to skip.
+ /// Diversity selection to apply to the results.
/// Automatic result cutoff threshold.
/// Re-ranking configuration.
/// Single prompt for generative AI.
@@ -44,6 +45,7 @@ public async Task NearMedia(
Filter? filters = null,
uint? limit = null,
uint? offset = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Rerank? rerank = null,
SinglePrompt? singlePrompt = null,
@@ -65,6 +67,7 @@ public async Task NearMedia(
distance: input.Distance,
limit: limit,
offset: offset,
+ diversitySelection: diversitySelection,
autoLimit: autoLimit,
filters: filters,
groupBy: null,
@@ -100,6 +103,7 @@ public async Task NearMedia(
/// Filters to apply to the search.
/// Maximum number of results to return.
/// Number of results to skip.
+ /// Diversity selection to apply to the results.
/// Automatic result cutoff threshold.
/// Re-ranking configuration.
/// Single prompt for generative AI.
@@ -117,6 +121,7 @@ public async Task NearMedia(
Filter? filters = null,
uint? limit = null,
uint? offset = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Rerank? rerank = null,
SinglePrompt? singlePrompt = null,
@@ -138,6 +143,7 @@ public async Task NearMedia(
distance: input.Distance,
limit: limit,
offset: offset,
+ diversitySelection: diversitySelection,
autoLimit: autoLimit,
filters: filters,
groupBy: groupBy,
diff --git a/src/Weaviate.Client/GenerateClient.NearObject.cs b/src/Weaviate.Client/GenerateClient.NearObject.cs
index e1035d82..5b79b81f 100644
--- a/src/Weaviate.Client/GenerateClient.NearObject.cs
+++ b/src/Weaviate.Client/GenerateClient.NearObject.cs
@@ -16,6 +16,7 @@ public partial class GenerateClient
/// Distance threshold
/// Maximum number of results
/// Offset for pagination
+ /// The diversity selection
/// Auto-limit threshold
/// Filters to apply
/// Rerank configuration
@@ -35,6 +36,7 @@ public async Task NearObject(
double? distance = null,
uint? limit = null,
uint? offset = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Filter? filters = null,
Rerank? rerank = null,
@@ -56,6 +58,7 @@ public async Task NearObject(
distance: distance,
limit: limit,
offset: offset,
+ diversitySelection: diversitySelection,
autoLimit: autoLimit,
filters: filters,
groupBy: null,
@@ -84,6 +87,7 @@ public async Task NearObject(
/// Distance threshold
/// Maximum number of results
/// Offset for pagination
+ /// The diversity selection
/// Auto-limit threshold
/// Filters to apply
/// Rerank configuration
@@ -104,6 +108,7 @@ public async Task NearObject(
double? distance = null,
uint? limit = null,
uint? offset = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Filter? filters = null,
Rerank? rerank = null,
@@ -125,6 +130,7 @@ public async Task NearObject(
distance: distance,
limit: limit,
offset: offset,
+ diversitySelection: diversitySelection,
autoLimit: autoLimit,
filters: filters,
groupBy: groupBy,
diff --git a/src/Weaviate.Client/GenerateClient.NearText.cs b/src/Weaviate.Client/GenerateClient.NearText.cs
index 544f0603..c32a0d2f 100644
--- a/src/Weaviate.Client/GenerateClient.NearText.cs
+++ b/src/Weaviate.Client/GenerateClient.NearText.cs
@@ -18,6 +18,7 @@ public partial class GenerateClient
/// Move away from concept
/// Maximum number of results
/// Offset for pagination
+ /// The diversity selection
/// Auto-cut threshold
/// Filters to apply
/// Rerank configuration
@@ -38,6 +39,7 @@ public async Task NearText(
Move? moveAway = null,
uint? limit = null,
uint? offset = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Filter? filters = null,
Rerank? rerank = null,
@@ -60,6 +62,7 @@ public async Task NearText(
moveTo: moveTo,
moveAway: moveAway,
offset: offset,
+ diversitySelection: diversitySelection,
autoLimit: autoLimit,
targetVector: null,
filters: filters,
@@ -88,6 +91,7 @@ public async Task NearText(
/// Move away from concept
/// Maximum number of results
/// Offset for pagination
+ /// The diversity selection
/// Auto-cut threshold
/// Filters to apply
/// Rerank configuration
@@ -109,6 +113,7 @@ public async Task NearText(
Move? moveAway = null,
uint? limit = null,
uint? offset = null,
+ Diversity? diversitySelection = null,
uint? autoLimit = null,
Filter? filters = null,
Rerank? rerank = null,
@@ -132,6 +137,7 @@ public async Task