Skip to content

Commit 6ccbe7e

Browse files
committed
feat(vectorizer): add support for multi2vec-twelvelabs module
1 parent 7dbbe29 commit 6ccbe7e

3 files changed

Lines changed: 270 additions & 1 deletion

File tree

‎src/main/java/io/weaviate/client6/v1/api/collections/VectorConfig.java‎

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import io.weaviate.client6.v1.api.collections.vectorizers.Multi2VecGoogleVectorizer;
2626
import io.weaviate.client6.v1.api.collections.vectorizers.Multi2VecJinaAiVectorizer;
2727
import io.weaviate.client6.v1.api.collections.vectorizers.Multi2VecNvidiaVectorizer;
28+
import io.weaviate.client6.v1.api.collections.vectorizers.Multi2VecTwelveLabsVectorizer;
2829
import io.weaviate.client6.v1.api.collections.vectorizers.Multi2VecVoyageAiVectorizer;
2930
import io.weaviate.client6.v1.api.collections.vectorizers.Ref2VecCentroidVectorizer;
3031
import io.weaviate.client6.v1.api.collections.vectorizers.SelfProvidedVectorizer;
@@ -33,10 +34,10 @@
3334
import io.weaviate.client6.v1.api.collections.vectorizers.Text2VecAzureOpenAiVectorizer;
3435
import io.weaviate.client6.v1.api.collections.vectorizers.Text2VecCohereVectorizer;
3536
import io.weaviate.client6.v1.api.collections.vectorizers.Text2VecDatabricksVectorizer;
37+
import io.weaviate.client6.v1.api.collections.vectorizers.Text2VecDigitalOceanVectorizer;
3638
import io.weaviate.client6.v1.api.collections.vectorizers.Text2VecGoogleVectorizer;
3739
import io.weaviate.client6.v1.api.collections.vectorizers.Text2VecHuggingFaceVectorizer;
3840
import io.weaviate.client6.v1.api.collections.vectorizers.Text2VecJinaAiVectorizer;
39-
import io.weaviate.client6.v1.api.collections.vectorizers.Text2VecDigitalOceanVectorizer;
4041
import io.weaviate.client6.v1.api.collections.vectorizers.Text2VecMistralVectorizer;
4142
import io.weaviate.client6.v1.api.collections.vectorizers.Text2VecModel2VecVectorizer;
4243
import io.weaviate.client6.v1.api.collections.vectorizers.Text2VecMorphVectorizer;
@@ -78,6 +79,7 @@ public enum Kind implements JsonEnum<Kind> {
7879
MULTI2VEC_GOOGLE("multi2vec-google"),
7980
MULTI2VEC_COHERE("multi2vec-cohere"),
8081
MULTI2VEC_JINAAI("multi2vec-jinaai"),
82+
MULTI2VEC_TWELVELABS("multi2vec-twelvelabs"),
8183
MULTI2VEC_NVIDIA("multi2vec-nvidia"),
8284
MULTI2VEC_VOYAGEAI("multi2vec-voyageai"),
8385
TEXT2MULTIVEC_JINAAI("text2multivec-jinaai"),
@@ -530,6 +532,36 @@ public static Map.Entry<String, VectorConfig> multi2vecJinaAi() {
530532
return multi2vecJinaAi(VectorIndex.DEFAULT_VECTOR_NAME);
531533
}
532534

535+
/**
536+
* Create a vector index with an {@code multi2vec-twelvelabs} vectorizer.
537+
*
538+
* @param fn Lambda expression for optional parameters.
539+
*/
540+
public static Map.Entry<String, VectorConfig> multi2vecTwelveLabs(
541+
Function<Multi2VecTwelveLabsVectorizer.Builder, ObjectBuilder<Multi2VecTwelveLabsVectorizer>> fn) {
542+
return multi2vecTwelveLabs(VectorIndex.DEFAULT_VECTOR_NAME, fn);
543+
}
544+
545+
/**
546+
* Create a named vector index with an {@code multi2vec-twelvelabs} vectorizer.
547+
*
548+
* @param vectorName Vector name.
549+
*/
550+
public static Map.Entry<String, VectorConfig> multi2vecTwelveLabs(String vectorName) {
551+
return Map.entry(vectorName, Multi2VecTwelveLabsVectorizer.of());
552+
}
553+
554+
/**
555+
* Create a named vector index with an {@code multi2vec-twelvelabs} vectorizer.
556+
*
557+
* @param vectorName Vector name.
558+
* @param fn Lambda expression for optional parameters.
559+
*/
560+
public static Map.Entry<String, VectorConfig> multi2vecTwelveLabs(String vectorName,
561+
Function<Multi2VecTwelveLabsVectorizer.Builder, ObjectBuilder<Multi2VecTwelveLabsVectorizer>> fn) {
562+
return Map.entry(vectorName, Multi2VecTwelveLabsVectorizer.of(fn));
563+
}
564+
533565
/**
534566
* Create a vector index with an {@code multi2vec-jinaai} vectorizer.
535567
*
@@ -1475,6 +1507,16 @@ default public Multi2VecGoogleVectorizer asMulti2VecGoogle() {
14751507
return _as(VectorConfig.Kind.MULTI2VEC_GOOGLE);
14761508
}
14771509

1510+
/** Is this an instance of {@link Multi2VecTwelveLabsVectorizer}? */
1511+
default public boolean isMulti2VecTwelveLabs() {
1512+
return _is(VectorConfig.Kind.MULTI2VEC_TWELVELABS);
1513+
}
1514+
1515+
/** Convert this instance to {@link Multi2VecTwelveLabsVectorizer}. */
1516+
default public Multi2VecTwelveLabsVectorizer asMulti2VecTwelveLabs() {
1517+
return _as(VectorConfig.Kind.MULTI2VEC_TWELVELABS);
1518+
}
1519+
14781520
/** Is this an instance of {@link Multi2VecJinaAiVectorizer}? */
14791521
default public boolean isMulti2VecJinaAi() {
14801522
return _is(VectorConfig.Kind.MULTI2VEC_JINAAI);
@@ -1733,6 +1775,7 @@ private final void init(Gson gson) {
17331775
addAdapter(gson, VectorConfig.Kind.MULTI2VEC_GOOGLE, Multi2VecGoogleVectorizer.class);
17341776
addAdapter(gson, VectorConfig.Kind.MULTI2VEC_COHERE, Multi2VecCohereVectorizer.class);
17351777
addAdapter(gson, VectorConfig.Kind.MULTI2VEC_JINAAI, Multi2VecJinaAiVectorizer.class);
1778+
addAdapter(gson, VectorConfig.Kind.MULTI2VEC_TWELVELABS, Multi2VecTwelveLabsVectorizer.class);
17361779
addAdapter(gson, VectorConfig.Kind.MULTI2VEC_NVIDIA, Multi2VecNvidiaVectorizer.class);
17371780
addAdapter(gson, VectorConfig.Kind.MULTI2VEC_VOYAGEAI, Multi2VecVoyageAiVectorizer.class);
17381781
addAdapter(gson, VectorConfig.Kind.TEXT2MULTIVEC_JINAAI, Text2MultiVecJinaAiVectorizer.class);
Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
package io.weaviate.client6.v1.api.collections.vectorizers;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.List;
6+
import java.util.function.Function;
7+
8+
import com.google.gson.annotations.SerializedName;
9+
10+
import io.weaviate.client6.v1.api.collections.Quantization;
11+
import io.weaviate.client6.v1.api.collections.VectorConfig;
12+
import io.weaviate.client6.v1.api.collections.VectorIndex;
13+
import io.weaviate.client6.v1.internal.ObjectBuilder;
14+
15+
public record Multi2VecTwelveLabsVectorizer(
16+
/** Base URL of the embedding service. */
17+
@SerializedName("baseURL") String baseUrl,
18+
/** Inference model to use. */
19+
@SerializedName("model") String model,
20+
/** BLOB properties included in the embedding. */
21+
@SerializedName("imageFields") List<String> imageFields,
22+
/** TEXT properties included in the embedding. */
23+
@SerializedName("textFields") List<String> textFields,
24+
/** Weights of the included properties. */
25+
@SerializedName("weights") Weights weights,
26+
/** Vector index configuration. */
27+
VectorIndex vectorIndex,
28+
/** Vector quantization method. */
29+
Quantization quantization) implements VectorConfig {
30+
31+
private static record Weights(
32+
/**
33+
* Weights of the BLOB properties. Values appear in the same order as the
34+
* corresponding property names in {@code imageFields}.
35+
*/
36+
@SerializedName("imageWeights") List<Float> imageWeights,
37+
/**
38+
* Weights of the TEXT properties. Values appear in the same order as the
39+
* corresponding property names in {@code textFields}.
40+
*/
41+
@SerializedName("textWeights") List<Float> textWeights) {
42+
}
43+
44+
@Override
45+
public VectorConfig.Kind _kind() {
46+
return VectorConfig.Kind.MULTI2VEC_JINAAI;
47+
}
48+
49+
@Override
50+
public Object _self() {
51+
return this;
52+
}
53+
54+
public static final String MARENGO30 = "marengo3.0";
55+
56+
public static Multi2VecTwelveLabsVectorizer of() {
57+
return of(ObjectBuilder.identity());
58+
}
59+
60+
public static Multi2VecTwelveLabsVectorizer of(Function<Builder, ObjectBuilder<Multi2VecTwelveLabsVectorizer>> fn) {
61+
return fn.apply(new Builder()).build();
62+
}
63+
64+
public Multi2VecTwelveLabsVectorizer(
65+
String baseUrl,
66+
String model,
67+
List<String> imageFields,
68+
List<String> textFields,
69+
Weights weights,
70+
VectorIndex vectorIndex,
71+
Quantization quantization) {
72+
this.baseUrl = baseUrl;
73+
this.model = model;
74+
this.imageFields = imageFields;
75+
this.textFields = textFields;
76+
this.weights = weights;
77+
this.vectorIndex = vectorIndex;
78+
this.quantization = quantization;
79+
}
80+
81+
public Multi2VecTwelveLabsVectorizer(Builder builder) {
82+
this(
83+
builder.baseUrl,
84+
builder.model,
85+
builder.imageFields,
86+
builder.textFields,
87+
builder.getWeights(),
88+
builder.vectorIndex,
89+
builder.quantization);
90+
}
91+
92+
public static class Builder implements ObjectBuilder<Multi2VecTwelveLabsVectorizer> {
93+
private VectorIndex vectorIndex = VectorIndex.DEFAULT_VECTOR_INDEX;
94+
private Quantization quantization;
95+
96+
private List<String> imageFields;
97+
private List<Float> imageWeights;
98+
private List<String> textFields;
99+
private List<Float> textWeights;
100+
101+
private String baseUrl;
102+
private String model;
103+
104+
/** Set base URL of the embedding service. */
105+
public Builder baseUrl(String baseUrl) {
106+
this.baseUrl = baseUrl;
107+
return this;
108+
}
109+
110+
public Builder model(String model) {
111+
this.model = model;
112+
return this;
113+
}
114+
115+
/** Add BLOB properties to include in the embedding. */
116+
public Builder imageFields(List<String> fields) {
117+
this.imageFields = fields;
118+
return this;
119+
}
120+
121+
/** Add BLOB properties to include in the embedding. */
122+
public Builder imageFields(String... fields) {
123+
return imageFields(Arrays.asList(fields));
124+
}
125+
126+
/**
127+
* Add BLOB property to include in the embedding.
128+
*
129+
* @param field Property name.
130+
* @param weight Custom weight between 0.0 and 1.0.
131+
*/
132+
public Builder imageField(String field, float weight) {
133+
if (this.imageFields == null) {
134+
this.imageFields = new ArrayList<>();
135+
}
136+
if (this.imageWeights == null) {
137+
this.imageWeights = new ArrayList<>();
138+
}
139+
this.imageFields.add(field);
140+
this.imageWeights.add(weight);
141+
return this;
142+
}
143+
144+
/** Add TEXT properties to include in the embedding. */
145+
public Builder textFields(List<String> fields) {
146+
this.textFields = fields;
147+
return this;
148+
}
149+
150+
/** Add TEXT properties to include in the embedding. */
151+
public Builder textFields(String... fields) {
152+
return textFields(Arrays.asList(fields));
153+
}
154+
155+
/**
156+
* Add TEXT property to include in the embedding.
157+
*
158+
* @param field Property name.
159+
* @param weight Custom weight between 0.0 and 1.0.
160+
*/
161+
public Builder textField(String field, float weight) {
162+
if (this.textFields == null) {
163+
this.textFields = new ArrayList<>();
164+
}
165+
if (this.textWeights == null) {
166+
this.textWeights = new ArrayList<>();
167+
}
168+
this.textFields.add(field);
169+
this.textWeights.add(weight);
170+
return this;
171+
}
172+
173+
protected Weights getWeights() {
174+
if (this.textWeights != null || this.imageWeights != null) {
175+
return new Weights(this.imageWeights, this.textWeights);
176+
}
177+
return null;
178+
}
179+
180+
/**
181+
* Override default vector index configuration.
182+
*
183+
* <a href=
184+
* "https://docs.weaviate.io/weaviate/config-refs/indexing/vector-index#hnsw-index-parameters">HNSW</a>
185+
* is the default vector index.
186+
*/
187+
public Builder vectorIndex(VectorIndex vectorIndex) {
188+
this.vectorIndex = vectorIndex;
189+
return this;
190+
}
191+
192+
public Builder quantization(Quantization quantization) {
193+
this.quantization = quantization;
194+
return this;
195+
}
196+
197+
@Override
198+
public Multi2VecTwelveLabsVectorizer build() {
199+
return new Multi2VecTwelveLabsVectorizer(this);
200+
}
201+
}
202+
}

‎src/test/java/io/weaviate/client6/v1/internal/json/JSONTest.java‎

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import io.weaviate.client6.v1.api.collections.vectorizers.Multi2VecGoogleVectorizer;
4848
import io.weaviate.client6.v1.api.collections.vectorizers.Multi2VecJinaAiVectorizer;
4949
import io.weaviate.client6.v1.api.collections.vectorizers.Multi2VecNvidiaVectorizer;
50+
import io.weaviate.client6.v1.api.collections.vectorizers.Multi2VecTwelveLabsVectorizer;
5051
import io.weaviate.client6.v1.api.collections.vectorizers.Multi2VecVoyageAiVectorizer;
5152
import io.weaviate.client6.v1.api.collections.vectorizers.SelfProvidedVectorizer;
5253
import io.weaviate.client6.v1.api.collections.vectorizers.Text2VecAwsVectorizer;
@@ -974,6 +975,29 @@ public static Object[][] testCases() {
974975
}
975976
""",
976977
},
978+
{
979+
VectorConfig.class,
980+
Multi2VecTwelveLabsVectorizer.of(
981+
v -> v
982+
.baseUrl("example.com")
983+
.model(Multi2VecTwelveLabsVectorizer.MARENGO30)
984+
.imageFields("a", "b")
985+
.textFields("c")),
986+
"""
987+
{
988+
"vectorIndexType": "hnsw",
989+
"vectorIndexConfig": {},
990+
"vectorizer": {
991+
"multi2vec-twelvelabs": {
992+
"baseURL": "example.com",
993+
"model": "marengo3.0",
994+
"imageFields": ["a", "b"],
995+
"textFields": ["c"]
996+
}
997+
}
998+
}
999+
""",
1000+
},
9771001
{
9781002
VectorConfig.class,
9791003
Multi2VecJinaAiVectorizer.of(v -> v.imageFields("a", "b").textFields("c")),

0 commit comments

Comments
 (0)