From 5363553156458a8162041802f24748311899ca45 Mon Sep 17 00:00:00 2001
From: Ivan Despot <66276597+g-despot@users.noreply.github.com>
Date: Wed, 9 Sep 2026 12:36:19 +0200
Subject: [PATCH] feat: add the generative-meta module (Weaviate 1.39.3)
---
.github/workflows/main.yaml | 2 +-
ci/docker-compose.yml | 2 +-
.../Integration/TestCollections.cs | 44 ++++++++++
.../Unit/TestCollection.cs | 64 ++++++++++++++
.../Unit/TestGenerativeShortcuts.cs | 47 ++++++++++
.../Configure/GenerativeConfig.cs | 34 ++++++++
.../Configure/GenerativeProvider.cs | 34 ++++++++
.../Models/Generative/Providers.cs | 87 +++++++++++++++++++
.../Models/GenerativeConfig.cs | 63 ++++++++++++++
.../Models/Serialization.GenerativeConfig.cs | 5 ++
src/Weaviate.Client/PublicAPI.Unshipped.txt | 68 +++++++++++++++
src/Weaviate.Client/gRPC/Search.Builders.cs | 15 ++++
.../gRPC/proto/v1/generative.proto | 33 +++++++
13 files changed, 496 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml
index 97e4c11d..3c12517a 100644
--- a/.github/workflows/main.yaml
+++ b/.github/workflows/main.yaml
@@ -142,7 +142,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- version: ["1.32.27", "1.33.18", "1.34.20", "1.35.23", "1.36.23", "1.37.16", "1.38.9", "1.39.0"]
+ version: ["1.32.27", "1.33.18", "1.34.20", "1.35.23", "1.36.23", "1.37.16", "1.38.9", "1.39.3"]
uses: ./.github/workflows/test-on-weaviate-version.yml
secrets: inherit
with:
diff --git a/ci/docker-compose.yml b/ci/docker-compose.yml
index 8985a259..4c23333f 100644
--- a/ci/docker-compose.yml
+++ b/ci/docker-compose.yml
@@ -22,7 +22,7 @@ services:
QUERY_DEFAULTS_LIMIT: 25
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true'
PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
- ENABLE_MODULES: text2vec-transformers,text2vec-cohere,backup-filesystem,generative-dummy,generative-anyscale,reranker-dummy,reranker-cohere,text2vec-ollama,generative-ollama,multi2vec-google,generative-deepseek,generative-digitalocean
+ ENABLE_MODULES: text2vec-transformers,text2vec-cohere,backup-filesystem,generative-dummy,generative-anyscale,reranker-dummy,reranker-cohere,text2vec-ollama,generative-ollama,multi2vec-google,generative-deepseek,generative-digitalocean,generative-meta
BACKUP_FILESYSTEM_PATH: "/tmp/backups"
EXPORT_ENABLED: 'true'
EXPORT_DEFAULT_PATH: "/tmp/exports"
diff --git a/src/Weaviate.Client.Tests/Integration/TestCollections.cs b/src/Weaviate.Client.Tests/Integration/TestCollections.cs
index 3c38f3a8..79838570 100644
--- a/src/Weaviate.Client.Tests/Integration/TestCollections.cs
+++ b/src/Weaviate.Client.Tests/Integration/TestCollections.cs
@@ -289,6 +289,50 @@ public async Task Collection_Creates_And_Retrieves_GenerativeDigitalOcean_Config
Assert.Equal(["STOP"], digitalOcean.Stop);
}
+ ///
+ /// Tests that a generative-meta collection round-trips through a real server.
+ ///
+ ///
+ /// Fractional floats are dropped by the server's config parser — integral values only.
+ ///
+ [Fact]
+ public async Task Collection_Creates_And_Retrieves_GenerativeMeta_Config()
+ {
+ RequireModule("generative-meta");
+
+ // Arrange
+ var collectionClient = await CollectionFactory(
+ properties: [Property.Text("Name")],
+ generativeConfig: Configure.Generative.Meta(
+ model: "muse-spark-1.2",
+ temperature: 1,
+ maxTokens: 100,
+ frequencyPenalty: 0,
+ presencePenalty: 0,
+ topP: 1,
+ baseURL: "https://api.meta.ai",
+ reasoningEffort: "xhigh"
+ )
+ );
+
+ // Act
+ var collection = await _weaviate
+ .Collections.Use(collectionClient.Name)
+ .Config.Get(TestContext.Current.CancellationToken);
+
+ // Assert
+ Assert.NotNull(collection);
+ var meta = Assert.IsType(collection.GenerativeConfig);
+ Assert.Equal("muse-spark-1.2", meta.Model);
+ Assert.Equal(1, meta.Temperature);
+ Assert.Equal(100, meta.MaxTokens);
+ Assert.Equal(0, meta.FrequencyPenalty);
+ Assert.Equal(0, meta.PresencePenalty);
+ Assert.Equal(1, meta.TopP);
+ Assert.Equal("https://api.meta.ai", meta.BaseURL);
+ Assert.Equal("xhigh", meta.ReasoningEffort);
+ }
+
///
/// Tests that test collections export
///
diff --git a/src/Weaviate.Client.Tests/Unit/TestCollection.cs b/src/Weaviate.Client.Tests/Unit/TestCollection.cs
index 08771d46..69f49b26 100644
--- a/src/Weaviate.Client.Tests/Unit/TestCollection.cs
+++ b/src/Weaviate.Client.Tests/Unit/TestCollection.cs
@@ -529,6 +529,70 @@ public void Collection_GenerativeDigitalOcean_Serializes_And_RoundTrips()
Assert.Equal(["STOP"], typed.Stop);
}
+ ///
+ /// Pins the exact wire keys — a wrong key or casing is silently ignored by the server.
+ ///
+ [Fact]
+ public void Collection_GenerativeMeta_Serializes_And_RoundTrips()
+ {
+ // Arrange
+ var full = Assert.IsType(
+ Configure.Generative.Meta(
+ model: "muse-spark-1.2",
+ temperature: 0.5,
+ maxTokens: 100,
+ frequencyPenalty: 0.1,
+ presencePenalty: 0.2,
+ topP: 0.9,
+ baseURL: "https://api.meta.ai",
+ reasoningEffort: "xhigh"
+ )
+ );
+ var empty = Assert.IsType(Configure.Generative.Meta());
+
+ // Act
+ var jsonFull = JsonSerializer.Serialize(
+ full,
+ Rest.WeaviateRestClient.RestJsonSerializerOptions
+ );
+ var jsonEmpty = JsonSerializer.Serialize(
+ empty,
+ Rest.WeaviateRestClient.RestJsonSerializerOptions
+ );
+
+ // Assert
+ Assert.Equal("generative-meta", full.Type);
+ Assert.Contains("\"model\":\"muse-spark-1.2\"", jsonFull);
+ Assert.Contains("\"temperature\":0.5", jsonFull);
+ Assert.Contains("\"maxTokens\":100", jsonFull);
+ Assert.Contains("\"frequencyPenalty\":0.1", jsonFull);
+ Assert.Contains("\"presencePenalty\":0.2", jsonFull);
+ Assert.Contains("\"topP\":0.9", jsonFull);
+ Assert.Contains("\"baseURL\":\"https://api.meta.ai\"", jsonFull);
+ Assert.Contains("\"reasoningEffort\":\"xhigh\"", jsonFull);
+ Assert.Contains("\"type\":\"generative-meta\"", jsonFull);
+
+ // Nothing set means nothing else sent, so the server keeps its own defaults.
+ Assert.Equal("{\"type\":\"generative-meta\"}", jsonEmpty);
+
+ var roundTripped = GenerativeConfigSerialization.Factory(
+ GenerativeConfig.Meta.TypeValue,
+ JsonSerializer.Deserialize