diff --git a/src/Weaviate.Client.Tests/Unit/TestVectorizers.cs b/src/Weaviate.Client.Tests/Unit/TestVectorizers.cs index a27dfa09..4ecbb419 100644 --- a/src/Weaviate.Client.Tests/Unit/TestVectorizers.cs +++ b/src/Weaviate.Client.Tests/Unit/TestVectorizers.cs @@ -413,4 +413,87 @@ public void Test_Multi2VecGoogleGemini_Serializes_AudioFields_WeightedFields() Assert.Contains("\"textFields\"", json); Assert.Contains("\"videoFields\"", json); } + + /// + /// Tests that Text2VecDigitalOcean serializes baseURL and model correctly under the + /// text2vec-digitalocean module key. + /// + [Fact] + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "Performance", + "CA1869:Cache and reuse 'JsonSerializerOptions' instances", + Justification = "" + )] + public void Test_Text2VecDigitalOcean_Serializes_BaseURL_And_Model() + { + // Arrange + var vc = Configure.Vector( + "default", + v => + v.Text2VecDigitalOcean( + model: "qwen3-embedding-0.6b", + baseURL: "https://inference.do-ai.run", + vectorizeCollectionName: false + ) + ); + + // Act + var dto = vc.Vectorizer?.ToDto() ?? default; + var json = JsonSerializer.Serialize( + dto, + new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + WriteIndented = false, + } + ); + + // Assert + Assert.Contains("\"text2vec-digitalocean\"", json); + Assert.Contains("\"baseURL\":\"https://inference.do-ai.run\"", json); + Assert.Contains("\"model\":\"qwen3-embedding-0.6b\"", json); + Assert.Contains("\"vectorizeClassName\":false", json); + } + + /// + /// Tests that Text2VecDigitalOcean omits unset optional fields so the server can apply + /// its defaults (no baseURL). model is required by the factory so it is + /// always present. + /// + [Fact] + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "Performance", + "CA1869:Cache and reuse 'JsonSerializerOptions' instances", + Justification = "" + )] + public void Test_Text2VecDigitalOcean_Omits_Unset_BaseURL() + { + // Arrange + var vc = Configure.Vector( + "default", + v => v.Text2VecDigitalOcean(model: "qwen3-embedding-0.6b") + ); + + // Act + var dto = vc.Vectorizer?.ToDto() ?? default; + var json = JsonSerializer.Serialize( + dto, + new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + DefaultIgnoreCondition = System + .Text + .Json + .Serialization + .JsonIgnoreCondition + .WhenWritingNull, + WriteIndented = false, + } + ); + + // Assert + Assert.Contains("\"text2vec-digitalocean\"", json); + Assert.Contains("\"model\":\"qwen3-embedding-0.6b\"", json); + Assert.DoesNotContain("\"baseURL\"", json); + } } diff --git a/src/Weaviate.Client/Configure/VectorizerFactory.cs b/src/Weaviate.Client/Configure/VectorizerFactory.cs index 240f3c22..c4bf056d 100644 --- a/src/Weaviate.Client/Configure/VectorizerFactory.cs +++ b/src/Weaviate.Client/Configure/VectorizerFactory.cs @@ -750,6 +750,27 @@ public VectorizerConfig Text2VecMistral( VectorizeCollectionName = vectorizeCollectionName, }; + /// + /// Creates a configuration for the text2vec-digitalocean vectorizer. + /// See the documentation + /// for detailed usage. + /// + /// The model to use, e.g. qwen3-embedding-0.6b. Required by the server. + /// The base URL where API requests should go. Defaults to null, which uses the server-defined default of https://inference.do-ai.run. + /// Whether to vectorize the collection name. + /// The vectorizer config + public VectorizerConfig Text2VecDigitalOcean( + string model, + string? baseURL = null, + bool? vectorizeCollectionName = null + ) => + new Text2VecDigitalOcean + { + BaseURL = baseURL, + Model = model, + VectorizeCollectionName = vectorizeCollectionName, + }; + /// /// Texts the 2 vec model 2 vec using the specified inference url /// diff --git a/src/Weaviate.Client/Models/Vectorizer.cs b/src/Weaviate.Client/Models/Vectorizer.cs index 12510a98..e27ce4f9 100644 --- a/src/Weaviate.Client/Models/Vectorizer.cs +++ b/src/Weaviate.Client/Models/Vectorizer.cs @@ -1064,6 +1064,39 @@ internal Text2VecMistral() { } public bool? VectorizeCollectionName { get; set; } = null; } + /// + /// The configuration for text vectorization using the DigitalOcean module. + /// See the documentation + /// for detailed usage. + /// + [Vectorizer("text2vec-digitalocean")] + public record Text2VecDigitalOcean : VectorizerConfig + { + /// + /// Initializes a new instance of the class + /// + [JsonConstructor] + internal Text2VecDigitalOcean() { } + + /// + /// Gets or sets the base URL where API requests should go. + /// Defaults to null, which uses the server-defined default of https://inference.do-ai.run. + /// + [JsonPropertyName("baseURL")] + public string? BaseURL { get; set; } = null; + + /// + /// Gets or sets the model to use, e.g. qwen3-embedding-0.6b. Required by the server. + /// + public string? Model { get; set; } = null; + + /// + /// Gets or sets the value of the vectorize collection name + /// + [JsonPropertyName("vectorizeClassName")] + public bool? VectorizeCollectionName { get; set; } = null; + } + /// /// The configuration for text vectorization using the Model2Vec module. /// See the documentation for detailed usage. diff --git a/src/Weaviate.Client/PublicAPI.Unshipped.txt b/src/Weaviate.Client/PublicAPI.Unshipped.txt index 7dc5c581..7fae55fa 100644 --- a/src/Weaviate.Client/PublicAPI.Unshipped.txt +++ b/src/Weaviate.Client/PublicAPI.Unshipped.txt @@ -1 +1,20 @@ #nullable enable +override sealed Weaviate.Client.Models.Vectorizer.Text2VecDigitalOcean.Equals(Weaviate.Client.Models.VectorizerConfig? other) -> bool +override Weaviate.Client.Models.Vectorizer.Text2VecDigitalOcean.$() -> Weaviate.Client.Models.Vectorizer.Text2VecDigitalOcean! +override Weaviate.Client.Models.Vectorizer.Text2VecDigitalOcean.EqualityContract.get -> System.Type! +override Weaviate.Client.Models.Vectorizer.Text2VecDigitalOcean.Equals(object? obj) -> bool +override Weaviate.Client.Models.Vectorizer.Text2VecDigitalOcean.GetHashCode() -> int +override Weaviate.Client.Models.Vectorizer.Text2VecDigitalOcean.PrintMembers(System.Text.StringBuilder! builder) -> bool +override Weaviate.Client.Models.Vectorizer.Text2VecDigitalOcean.ToString() -> string! +static Weaviate.Client.Models.Vectorizer.Text2VecDigitalOcean.operator !=(Weaviate.Client.Models.Vectorizer.Text2VecDigitalOcean? left, Weaviate.Client.Models.Vectorizer.Text2VecDigitalOcean? right) -> bool +static Weaviate.Client.Models.Vectorizer.Text2VecDigitalOcean.operator ==(Weaviate.Client.Models.Vectorizer.Text2VecDigitalOcean? left, Weaviate.Client.Models.Vectorizer.Text2VecDigitalOcean? right) -> bool +virtual Weaviate.Client.Models.Vectorizer.Text2VecDigitalOcean.Equals(Weaviate.Client.Models.Vectorizer.Text2VecDigitalOcean? other) -> bool +Weaviate.Client.Models.Vectorizer.Text2VecDigitalOcean +Weaviate.Client.Models.Vectorizer.Text2VecDigitalOcean.BaseURL.get -> string? +Weaviate.Client.Models.Vectorizer.Text2VecDigitalOcean.BaseURL.set -> void +Weaviate.Client.Models.Vectorizer.Text2VecDigitalOcean.Model.get -> string? +Weaviate.Client.Models.Vectorizer.Text2VecDigitalOcean.Model.set -> void +Weaviate.Client.Models.Vectorizer.Text2VecDigitalOcean.Text2VecDigitalOcean(Weaviate.Client.Models.Vectorizer.Text2VecDigitalOcean! original) -> void +Weaviate.Client.Models.Vectorizer.Text2VecDigitalOcean.VectorizeCollectionName.get -> bool? +Weaviate.Client.Models.Vectorizer.Text2VecDigitalOcean.VectorizeCollectionName.set -> void +Weaviate.Client.VectorizerFactory.Text2VecDigitalOcean(string! model, string? baseURL = null, bool? vectorizeCollectionName = null) -> Weaviate.Client.Models.VectorizerConfig!