Skip to content

Commit ff85103

Browse files
committed
feat(gh-518): add multi2multivec-weaviate module
1 parent d58cf69 commit ff85103

3 files changed

Lines changed: 188 additions & 1 deletion

File tree

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

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import io.weaviate.client6.v1.api.collections.vectorizers.Img2VecNeuralVectorizer;
1919
import io.weaviate.client6.v1.api.collections.vectorizers.Multi2MultiVecJinaAiVectorizer;
20+
import io.weaviate.client6.v1.api.collections.vectorizers.Multi2MultiVecWeaviateVectorizer;
2021
import io.weaviate.client6.v1.api.collections.vectorizers.Multi2VecAwsVectorizer;
2122
import io.weaviate.client6.v1.api.collections.vectorizers.Multi2VecBindVectorizer;
2223
import io.weaviate.client6.v1.api.collections.vectorizers.Multi2VecClipVectorizer;
@@ -78,7 +79,8 @@ public enum Kind implements JsonEnum<Kind> {
7879
MULTI2VEC_NVIDIA("multi2vec-nvidia"),
7980
MULTI2VEC_VOYAGEAI("multi2vec-voyageai"),
8081
TEXT2MULTIVEC_JINAAI("text2multivec-jinaai"),
81-
MULTI2MULTIVEC_JINAAI("multi2multivec-jinaai");
82+
MULTI2MULTIVEC_JINAAI("multi2multivec-jinaai"),
83+
MULTI2MULTIVEC_WEAVIATE("multi2multivec-weaviate");
8284

8385
private static final Map<String, Kind> jsonValueMap = JsonEnum.collectNames(Kind.values());
8486
private final String jsonValue;
@@ -208,6 +210,43 @@ public static Map.Entry<String, VectorConfig> multi2multivecJinaai(String vector
208210
return Map.entry(vectorName, Multi2MultiVecJinaAiVectorizer.of(fn));
209211
}
210212

213+
/** Create a vector index with an {@code multi2multivec-weaviate} vectorizer. */
214+
public static Map.Entry<String, VectorConfig> multi2multivecWeaviate() {
215+
return multi2multivecWeaviate(VectorIndex.DEFAULT_VECTOR_NAME);
216+
}
217+
218+
/**
219+
* Create a vector index with an {@code multi2multivec-weaviate} vectorizer.
220+
*
221+
* @param fn Lambda expression for optional parameters.
222+
*/
223+
public static Map.Entry<String, VectorConfig> multi2multivecWeaviate(
224+
Function<Multi2MultiVecWeaviateVectorizer.Builder, ObjectBuilder<Multi2MultiVecWeaviateVectorizer>> fn) {
225+
return multi2multivecWeaviate(VectorIndex.DEFAULT_VECTOR_NAME, fn);
226+
}
227+
228+
/**
229+
* Create a named vector index with an {@code multi2multivec-weaviate}
230+
* vectorizer.
231+
*
232+
* @param vectorName Vector name.
233+
*/
234+
public static Map.Entry<String, VectorConfig> multi2multivecWeaviate(String vectorName) {
235+
return Map.entry(vectorName, Multi2MultiVecWeaviateVectorizer.of());
236+
}
237+
238+
/**
239+
* Create a named vector index with an {@code multi2multivec-weaviate}
240+
* vectorizer.
241+
*
242+
* @param vectorName Vector name.
243+
* @param fn Lambda expression for optional parameters.
244+
*/
245+
public static Map.Entry<String, VectorConfig> multi2multivecWeaviate(String vectorName,
246+
Function<Multi2MultiVecWeaviateVectorizer.Builder, ObjectBuilder<Multi2MultiVecWeaviateVectorizer>> fn) {
247+
return Map.entry(vectorName, Multi2MultiVecWeaviateVectorizer.of(fn));
248+
}
249+
211250
/** Create a vector index with an {@code multi2vec-aws} vectorizer. */
212251
public static Map.Entry<String, VectorConfig> multi2vecAws() {
213252
return multi2vecAws(VectorIndex.DEFAULT_VECTOR_NAME);
@@ -1650,6 +1689,7 @@ private final void init(Gson gson) {
16501689
addAdapter(gson, VectorConfig.Kind.MULTI2VEC_VOYAGEAI, Multi2VecVoyageAiVectorizer.class);
16511690
addAdapter(gson, VectorConfig.Kind.TEXT2MULTIVEC_JINAAI, Text2MultiVecJinaAiVectorizer.class);
16521691
addAdapter(gson, VectorConfig.Kind.MULTI2MULTIVEC_JINAAI, Multi2MultiVecJinaAiVectorizer.class);
1692+
addAdapter(gson, VectorConfig.Kind.MULTI2MULTIVEC_WEAVIATE, Multi2MultiVecWeaviateVectorizer.class);
16531693
}
16541694

16551695
@SuppressWarnings("unchecked")
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
package io.weaviate.client6.v1.api.collections.vectorizers;
2+
3+
import java.util.Arrays;
4+
import java.util.List;
5+
import java.util.function.Function;
6+
7+
import com.google.gson.annotations.SerializedName;
8+
9+
import io.weaviate.client6.v1.api.collections.Quantization;
10+
import io.weaviate.client6.v1.api.collections.VectorConfig;
11+
import io.weaviate.client6.v1.api.collections.VectorIndex;
12+
import io.weaviate.client6.v1.internal.ObjectBuilder;
13+
14+
public record Multi2MultiVecWeaviateVectorizer(
15+
/** Base URL of the embedding service. */
16+
@SerializedName("baseURL") String baseUrl,
17+
/** Inference model to use. */
18+
@SerializedName("model") String model,
19+
/** BLOB properties included in the embedding. */
20+
@SerializedName("imageFields") List<String> imageFields,
21+
/** TEXT properties included in the embedding. */
22+
@SerializedName("textFields") List<String> textFields,
23+
/** Vector index configuration. */
24+
VectorIndex vectorIndex,
25+
/** Vector quantization method. */
26+
Quantization quantization) implements VectorConfig {
27+
28+
@Override
29+
public VectorConfig.Kind _kind() {
30+
return VectorConfig.Kind.MULTI2MULTIVEC_WEAVIATE;
31+
}
32+
33+
@Override
34+
public Object _self() {
35+
return this;
36+
}
37+
38+
/** ColBERT-family model available in the Weaviate Embedding Service. */
39+
public static String MODERNVBERT_COLMODERNVBERT = "ModernVBERT/colmodernvbert";
40+
41+
public static Multi2MultiVecWeaviateVectorizer of() {
42+
return of(ObjectBuilder.identity());
43+
}
44+
45+
public static Multi2MultiVecWeaviateVectorizer of(
46+
Function<Builder, ObjectBuilder<Multi2MultiVecWeaviateVectorizer>> fn) {
47+
return fn.apply(new Builder()).build();
48+
}
49+
50+
public Multi2MultiVecWeaviateVectorizer(Builder builder) {
51+
this(
52+
builder.baseUrl,
53+
builder.model,
54+
builder.imageFields,
55+
builder.textFields,
56+
builder.vectorIndex,
57+
builder.quantization);
58+
}
59+
60+
public static class Builder implements ObjectBuilder<Multi2MultiVecWeaviateVectorizer> {
61+
private VectorIndex vectorIndex = VectorIndex.DEFAULT_VECTOR_INDEX;
62+
private Quantization quantization;
63+
64+
private String baseUrl;
65+
private String model;
66+
67+
private List<String> imageFields;
68+
private List<String> textFields;
69+
70+
public Builder baseUrl(String baseUrl) {
71+
this.baseUrl = baseUrl;
72+
return this;
73+
}
74+
75+
public Builder model(String model) {
76+
this.model = model;
77+
return this;
78+
}
79+
80+
/** Add BLOB properties to include in the embedding. */
81+
public Builder imageFields(List<String> fields) {
82+
imageFields = fields;
83+
return this;
84+
}
85+
86+
/** Add BLOB properties to include in the embedding. */
87+
public Builder imageFields(String... fields) {
88+
return imageFields(Arrays.asList(fields));
89+
}
90+
91+
/** Add TEXT properties to include in the embedding. */
92+
public Builder textFields(List<String> fields) {
93+
textFields = fields;
94+
return this;
95+
}
96+
97+
/** Add TEXT properties to include in the embedding. */
98+
public Builder textFields(String... fields) {
99+
return textFields(Arrays.asList(fields));
100+
}
101+
102+
/**
103+
* Override default vector index configuration.
104+
*
105+
* <a href=
106+
* "https://docs.weaviate.io/weaviate/config-refs/indexing/vector-index#hnsw-index-parameters">HNSW</a>
107+
* is the default vector index.
108+
*/
109+
public Builder vectorIndex(VectorIndex vectorIndex) {
110+
this.vectorIndex = vectorIndex;
111+
return this;
112+
}
113+
114+
public Builder quantization(Quantization quantization) {
115+
this.quantization = quantization;
116+
return this;
117+
}
118+
119+
@Override
120+
public Multi2MultiVecWeaviateVectorizer build() {
121+
return new Multi2MultiVecWeaviateVectorizer(this);
122+
}
123+
}
124+
}

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import io.weaviate.client6.v1.api.collections.vectorindex.MultiVector.Aggregation;
4141
import io.weaviate.client6.v1.api.collections.vectorizers.Img2VecNeuralVectorizer;
4242
import io.weaviate.client6.v1.api.collections.vectorizers.Multi2MultiVecJinaAiVectorizer;
43+
import io.weaviate.client6.v1.api.collections.vectorizers.Multi2MultiVecWeaviateVectorizer;
4344
import io.weaviate.client6.v1.api.collections.vectorizers.Multi2VecAwsVectorizer;
4445
import io.weaviate.client6.v1.api.collections.vectorizers.Multi2VecClipVectorizer;
4546
import io.weaviate.client6.v1.api.collections.vectorizers.Multi2VecCohereVectorizer;
@@ -632,6 +633,28 @@ public static Object[][] testCases() {
632633
}
633634
""",
634635
},
636+
{
637+
VectorConfig.class,
638+
Multi2MultiVecWeaviateVectorizer.of(v -> v
639+
.baseUrl("example.com")
640+
.model(Multi2MultiVecWeaviateVectorizer.MODERNVBERT_COLMODERNVBERT)
641+
.imageFields("a", "b")
642+
.textFields("c")),
643+
"""
644+
{
645+
"vectorIndexType": "hnsw",
646+
"vectorIndexConfig": {},
647+
"vectorizer": {
648+
"multi2multivec-weaviate": {
649+
"baseURL": "example.com",
650+
"model": "ModernVBERT/colmodernvbert",
651+
"imageFields": ["a", "b"],
652+
"textFields": ["c"]
653+
}
654+
}
655+
}
656+
""",
657+
},
635658
{
636659
VectorConfig.class,
637660
Multi2VecClipVectorizer.of(v -> v.imageFields("a", "b").textFields("c")),

0 commit comments

Comments
 (0)