From 59259f9e615fa6263e443106e658ffb5da897a0c Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Wed, 18 Sep 2024 22:05:07 +0200 Subject: [PATCH 01/65] first skeleton + draft tests --- settings.gradle | 1 + .../apache/solr/schema/DenseVectorField.java | 21 ++ .../apache/solr/search/neural/KnnQParser.java | 4 +- solr/modules/llm/README.md | 21 ++ solr/modules/llm/build.gradle | 37 +++ .../solr/llm/embedding/EmbeddingModel.java | 126 +++++++++ .../solr/llm/embedding/package-info.java | 26 ++ .../llm/search/TextEmbedderQParserPlugin.java | 116 +++++++++ .../apache/solr/llm/search/package-info.java | 19 ++ .../llm/store/EmbeddingModelException.java | 30 +++ .../solr/llm/store/EmbeddingModelStore.java | 67 +++++ .../apache/solr/llm/store/package-info.java | 19 ++ .../rest/ManagedEmbeddingModelStore.java | 220 ++++++++++++++++ .../solr/llm/store/rest/package-info.java | 22 ++ .../TextEmbedderUpdateProcessor.java | 104 ++++++++ .../TextEmbedderUpdateProcessorFactory.java | 118 +++++++++ .../llm/update/processor/package-info.java | 19 ++ solr/modules/llm/src/java/overview.html | 21 ++ solr/modules/llm/src/test-files/log4j2.xml | 43 ++++ .../modelExamples/cohere-model.json | 14 + .../solr/collection1/conf/schema.xml | 122 +++++++++ .../solr/collection1/conf/solrconfig-llm.xml | 58 +++++ .../solr/collection1/conf/stopwords.txt | 16 ++ .../solr/collection1/conf/synonyms.txt | 28 ++ solr/modules/llm/src/test-files/solr/solr.xml | 41 +++ .../test/org/apache/solr/llm/TestLlmBase.java | 241 ++++++++++++++++++ .../solr/llm/store/rest/TestModelManager.java | 132 ++++++++++ .../rest/TestModelManagerPersistence.java | 96 +++++++ 28 files changed, 1780 insertions(+), 2 deletions(-) create mode 100644 solr/modules/llm/README.md create mode 100644 solr/modules/llm/build.gradle create mode 100644 solr/modules/llm/src/java/org/apache/solr/llm/embedding/EmbeddingModel.java create mode 100644 solr/modules/llm/src/java/org/apache/solr/llm/embedding/package-info.java create mode 100644 solr/modules/llm/src/java/org/apache/solr/llm/search/TextEmbedderQParserPlugin.java create mode 100644 solr/modules/llm/src/java/org/apache/solr/llm/search/package-info.java create mode 100644 solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelException.java create mode 100644 solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java create mode 100644 solr/modules/llm/src/java/org/apache/solr/llm/store/package-info.java create mode 100644 solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java create mode 100644 solr/modules/llm/src/java/org/apache/solr/llm/store/rest/package-info.java create mode 100644 solr/modules/llm/src/java/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessor.java create mode 100644 solr/modules/llm/src/java/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessorFactory.java create mode 100644 solr/modules/llm/src/java/org/apache/solr/llm/update/processor/package-info.java create mode 100644 solr/modules/llm/src/java/overview.html create mode 100644 solr/modules/llm/src/test-files/log4j2.xml create mode 100644 solr/modules/llm/src/test-files/modelExamples/cohere-model.json create mode 100644 solr/modules/llm/src/test-files/solr/collection1/conf/schema.xml create mode 100644 solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml create mode 100644 solr/modules/llm/src/test-files/solr/collection1/conf/stopwords.txt create mode 100644 solr/modules/llm/src/test-files/solr/collection1/conf/synonyms.txt create mode 100644 solr/modules/llm/src/test-files/solr/solr.xml create mode 100644 solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java create mode 100644 solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java create mode 100644 solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java diff --git a/settings.gradle b/settings.gradle index 7035b75bfdf..2bb10796251 100644 --- a/settings.gradle +++ b/settings.gradle @@ -53,6 +53,7 @@ include "solr:modules:hdfs" include "solr:modules:jwt-auth" include "solr:modules:langid" include "solr:modules:ltr" +include "solr:modules:llm" include "solr:modules:s3-repository" include "solr:modules:scripting" include "solr:modules:sql" diff --git a/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java b/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java index 4d528361dd4..d8cd0f1925b 100644 --- a/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java +++ b/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java @@ -363,6 +363,27 @@ public ValueSource getValueSource(SchemaField field, QParser parser) { SolrException.ErrorCode.BAD_REQUEST, "Vector encoding not supported for function queries."); } + public Query getKnnVectorQuery( + String fieldName, byte[] vectorToSearch, int topK, Query filterQuery) { + + DenseVectorParser vectorBuilder = + getVectorBuilder(vectorToSearch, DenseVectorParser.BuilderPhase.QUERY); + + + return new KnnByteVectorQuery(fieldName, vectorToSearch, topK, filterQuery); + } + + public Query getKnnVectorQuery( + String fieldName, float[] vectorToSearch, int topK, Query filterQuery) { + + DenseVectorParser vectorBuilder = + getVectorBuilder(vectorToSearch, DenseVectorParser.BuilderPhase.QUERY); + + + return new KnnFloatVectorQuery(fieldName, vectorToSearch, topK, filterQuery); + } + + public Query getKnnVectorQuery( String fieldName, String vectorToSearch, int topK, Query filterQuery) { diff --git a/solr/core/src/java/org/apache/solr/search/neural/KnnQParser.java b/solr/core/src/java/org/apache/solr/search/neural/KnnQParser.java index 166dada5b7f..b6d9f2541cd 100644 --- a/solr/core/src/java/org/apache/solr/search/neural/KnnQParser.java +++ b/solr/core/src/java/org/apache/solr/search/neural/KnnQParser.java @@ -26,8 +26,8 @@ public class KnnQParser extends AbstractVectorQParserBase { // retrieve the top K results based on the distance similarity function - static final String TOP_K = "topK"; - static final int DEFAULT_TOP_K = 10; + protected static final String TOP_K = "topK"; + protected static final int DEFAULT_TOP_K = 10; public KnnQParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) { super(qstr, localParams, params, req); diff --git a/solr/modules/llm/README.md b/solr/modules/llm/README.md new file mode 100644 index 00000000000..5a291f55bce --- /dev/null +++ b/solr/modules/llm/README.md @@ -0,0 +1,21 @@ + + +The Large Language Model module for Solr provides a set of mechanisms for plugging in third party LLM implementations. +It currently provides embedding models and text vectorisation through langChain4j + +See https://solr.apache.org/guide/solr/latest/query-guide/result-clustering.html for how to get started. diff --git a/solr/modules/llm/build.gradle b/solr/modules/llm/build.gradle new file mode 100644 index 00000000000..5ab0aee1ddb --- /dev/null +++ b/solr/modules/llm/build.gradle @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +apply plugin: 'java-library' + +description = 'Indexing/Query time integration with LLM' + +dependencies { + implementation project(':solr:core') + implementation project(':solr:solrj') + + implementation 'org.apache.lucene:lucene-core' + + implementation 'dev.langchain4j:langchain4j-cohere:0.34.0' + implementation 'dev.langchain4j:langchain4j:0.34.0' + implementation 'org.slf4j:slf4j-api' + + testImplementation project(':solr:test-framework') + testImplementation 'junit:junit' + testImplementation 'org.hamcrest:hamcrest' + + testImplementation 'commons-io:commons-io' +} diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/EmbeddingModel.java b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/EmbeddingModel.java new file mode 100644 index 00000000000..eac807fa43c --- /dev/null +++ b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/EmbeddingModel.java @@ -0,0 +1,126 @@ +package org.apache.solr.llm.embedding; + +import dev.langchain4j.data.embedding.Embedding; +import dev.langchain4j.model.cohere.CohereEmbeddingModel; +import dev.langchain4j.model.embedding.DimensionAwareEmbeddingModel; +import org.apache.lucene.util.Accountable; +import org.apache.lucene.util.RamUsageEstimator; +import org.apache.solr.core.SolrResourceLoader; +import org.apache.solr.llm.store.EmbeddingModelException; +import org.apache.solr.util.SolrPluginUtils; +import java.util.Map; +import java.util.Objects; + + +public class EmbeddingModel implements Accountable { + private static final long BASE_RAM_BYTES = + RamUsageEstimator.shallowSizeOfInstance(EmbeddingModel.class); + + protected final String name; + private final Map params; + private DimensionAwareEmbeddingModel embedder; + private Integer hashCode; + + public static EmbeddingModel getInstance( + SolrResourceLoader solrResourceLoader, + String className, + String name, + Map params) + throws EmbeddingModelException { + final DimensionAwareEmbeddingModel embedder; + try { +// // create an instance of the model +// embedder = +// solrResourceLoader.newInstance( +// className, +// DimensionAwareEmbeddingModel.class, +// new String[0], // no sub packages +// new Class[] { +// String.class, Map.class +// }, +// new Object[] {name, params}); +// if (params != null) { +// SolrPluginUtils.invokeSetters(embedder, params.entrySet()); +// } + + //how to instantiate embedder? + embedder = CohereEmbeddingModel.builder() + .baseUrl(System.getenv("OPENAI_BASE_URL")) + .apiKey(System.getenv("OPENAI_API_KEY")) + .modelName("") + .logRequests(true) + .logResponses(true) + .build(); //this need to happen through inversion of control, where for each json param a method of the builder is called with the parameter the json value + } catch (final Exception e) { + throw new EmbeddingModelException("Model loading failed for " + className, e); + } + return new EmbeddingModel(name, embedder, params); + } + + public EmbeddingModel(String name, DimensionAwareEmbeddingModel embedder, Map params) { + this.name = name; + this.embedder = embedder; + this.params = params; + } + + public float[] floatVectorise(String text){ + Embedding vector = embedder.embed(text).content(); + return vector.vector(); + } + + public byte[] byteVectorise(String text){ + return new byte[0]; + } + + @Override + public String toString() { + return getClass().getSimpleName() + "(name=" + getName() + ")"; + } + + @Override + public long ramBytesUsed() { + return BASE_RAM_BYTES + + RamUsageEstimator.sizeOfObject(name) + + RamUsageEstimator.sizeOfObject(embedder); + } + @Override + public int hashCode() { + if (hashCode == null) { + hashCode = calculateHashCode(); + } + return hashCode; + } + + private int calculateHashCode() { + final int prime = 31; + int result = 1; + result = (prime * result) + Objects.hashCode(name); + result = (prime * result) + Objects.hashCode(embedder); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (!(obj instanceof EmbeddingModel)) return false; + final EmbeddingModel other = (EmbeddingModel) obj; + return Objects.equals(embedder, other.embedder) + && Objects.equals(name, other.name); + } + + public String getName() { + return name; + } + + public DimensionAwareEmbeddingModel getEmbedder() { + return embedder; + } + + public void setEmbedder(DimensionAwareEmbeddingModel embedder) { + this.embedder = embedder; + } + + public Map getParams() { + return params; + } +} diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/package-info.java b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/package-info.java new file mode 100644 index 00000000000..07590e7eb05 --- /dev/null +++ b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/package-info.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * A {@link org.apache.solr.handler.component.SearchComponent} for dynamic, unsupervised grouping of + * search results based on the content of their text fields or contextual snippets around + * query-matching regions. + * + *

The default implementation uses clustering algorithms from the Carrot2 project. + */ +package java.org.apache.solr.llm.embedding; diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/search/TextEmbedderQParserPlugin.java b/solr/modules/llm/src/java/org/apache/solr/llm/search/TextEmbedderQParserPlugin.java new file mode 100644 index 00000000000..3f188d731e3 --- /dev/null +++ b/solr/modules/llm/src/java/org/apache/solr/llm/search/TextEmbedderQParserPlugin.java @@ -0,0 +1,116 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.solr.llm.search; + +import org.apache.lucene.index.VectorEncoding; +import org.apache.lucene.search.Query; +import org.apache.lucene.util.ResourceLoader; +import org.apache.lucene.util.ResourceLoaderAware; +import org.apache.solr.common.SolrException; +import org.apache.solr.common.params.SolrParams; +import org.apache.solr.common.util.NamedList; +import org.apache.solr.core.SolrResourceLoader; +import org.apache.solr.llm.embedding.EmbeddingModel; +import org.apache.solr.llm.store.rest.ManagedEmbeddingModelStore; +import org.apache.solr.request.SolrQueryRequest; +import org.apache.solr.rest.ManagedResource; +import org.apache.solr.rest.ManagedResourceObserver; +import org.apache.solr.schema.DenseVectorField; +import org.apache.solr.schema.SchemaField; +import org.apache.solr.search.QParser; +import org.apache.solr.search.QParserPlugin; +import org.apache.solr.search.SyntaxError; +import org.apache.solr.search.neural.KnnQParser; + +import java.io.IOException; + + +/** + * A neural query parser to run K-nearest neighbors search on Dense Vector fields. See Wiki page + * https://solr.apache.org/guide/solr/latest/query-guide/dense-vector-search.html + */ +public class TextEmbedderQParserPlugin extends QParserPlugin + implements ResourceLoaderAware, ManagedResourceObserver { + public static final String NAME = "embed"; + /** query parser plugin: the name of the attribute for setting the model */ + public static final String EMBEDDING_MODEL = "model"; + + private ManagedEmbeddingModelStore modelStore = null; + + + @Override + public QParser createParser( + String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) { + return new TextEmbedderQParser(qstr, localParams, params, req); + } + + @Override + public void inform(ResourceLoader loader) throws IOException { + final SolrResourceLoader solrResourceLoader = (SolrResourceLoader) loader; + ManagedEmbeddingModelStore.registerManagedEmbeddingModelStore(solrResourceLoader, this); + } + + @Override + public void onManagedResourceInitialized(NamedList args, ManagedResource res) + throws SolrException { + if (res instanceof ManagedEmbeddingModelStore) { + modelStore = (ManagedEmbeddingModelStore) res; + } + if (modelStore != null) { + // now we can safely load the models + modelStore.loadStoredModels(); + } + } + + public class TextEmbedderQParser extends KnnQParser { + + public TextEmbedderQParser( + String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) { + super(qstr, localParams, params, req); + } + + @Override + public Query parse() throws SyntaxError { + final String embeddingModelName = localParams.get(EMBEDDING_MODEL); + EmbeddingModel embedder = modelStore.getModel(embeddingModelName); + + final SchemaField schemaField = req.getCore().getLatestSchema().getField(getFieldName()); + final DenseVectorField denseVectorType = getCheckedFieldType(schemaField); + VectorEncoding vectorEncoding = denseVectorType.getVectorEncoding(); + final int topK = localParams.getInt(TOP_K, DEFAULT_TOP_K); + + switch (vectorEncoding) { + case FLOAT32: { + float[] vectorToSearch = embedder.floatVectorise(qstr); + return denseVectorType.getKnnVectorQuery( + schemaField.getName(), vectorToSearch, topK, getFilterQuery()); + } + case BYTE: { + byte[] vectorToSearch = embedder.byteVectorise(qstr); + return denseVectorType.getKnnVectorQuery( + schemaField.getName(), vectorToSearch, topK, getFilterQuery()); + } + default: + throw new SolrException( + SolrException.ErrorCode.SERVER_ERROR, + "Unexpected state. Vector Encoding: " + vectorEncoding); + } + + + } + } +} diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/search/package-info.java b/solr/modules/llm/src/java/org/apache/solr/llm/search/package-info.java new file mode 100644 index 00000000000..6b43d541cf5 --- /dev/null +++ b/solr/modules/llm/src/java/org/apache/solr/llm/search/package-info.java @@ -0,0 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** APIs and classes for implementing Neural (Dense Retrieval) QueryParsers. */ +package java.org.apache.solr.llm.search; diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelException.java b/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelException.java new file mode 100644 index 00000000000..b31a7bbffbc --- /dev/null +++ b/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelException.java @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.solr.llm.store; + +public class EmbeddingModelException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public EmbeddingModelException(String message) { + super(message); + } + + public EmbeddingModelException(String message, Exception cause) { + super(message, cause); + } +} diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java b/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java new file mode 100644 index 00000000000..ae7ec9af409 --- /dev/null +++ b/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.solr.llm.store; + + + + +import org.apache.solr.llm.embedding.EmbeddingModel; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class EmbeddingModelStore { + + private final Map availableModels; + + public EmbeddingModelStore() { + availableModels = new HashMap<>(); + } + + public synchronized EmbeddingModel getModel(String name) { + return availableModels.get(name); + } + + public void clear() { + availableModels.clear(); + } + + public List getModels() { + final List availableModelsValues = + new ArrayList(availableModels.values()); + return Collections.unmodifiableList(availableModelsValues); + } + + @Override + public String toString() { + return "ModelStore [availableModels=" + availableModels.keySet() + "]"; + } + + public EmbeddingModel delete(String modelName) { + return availableModels.remove(modelName); + } + + public synchronized void addModel(EmbeddingModel modeldata) throws EmbeddingModelException { + final String name = modeldata.getName(); + if (availableModels.containsKey(name)) { + throw new EmbeddingModelException("model '" + name + "' already exists. Please use a different name"); + } + availableModels.put(modeldata.getName(), modeldata); + } +} diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/package-info.java b/solr/modules/llm/src/java/org/apache/solr/llm/store/package-info.java new file mode 100644 index 00000000000..42a7a4c6710 --- /dev/null +++ b/solr/modules/llm/src/java/org/apache/solr/llm/store/package-info.java @@ -0,0 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** Contains feature and model store related classes. */ +package java.org.apache.solr.llm.store; diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java new file mode 100644 index 00000000000..25b5b4c99f8 --- /dev/null +++ b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java @@ -0,0 +1,220 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.solr.llm.store.rest; + +import org.apache.solr.common.SolrException; +import org.apache.solr.common.util.NamedList; +import org.apache.solr.core.SolrCore; +import org.apache.solr.core.SolrResourceLoader; +import org.apache.solr.llm.embedding.EmbeddingModel; +import org.apache.solr.llm.store.EmbeddingModelException; +import org.apache.solr.llm.store.EmbeddingModelStore; +import org.apache.solr.response.SolrQueryResponse; +import org.apache.solr.rest.BaseSolrResource; +import org.apache.solr.rest.ManagedResource; +import org.apache.solr.rest.ManagedResourceObserver; +import org.apache.solr.rest.ManagedResourceStorage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.invoke.MethodHandles; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** Menaged resource for storing a model */ +public class ManagedEmbeddingModelStore extends ManagedResource + implements ManagedResource.ChildResourceSupport { + + public static void registerManagedEmbeddingModelStore( + SolrResourceLoader solrResourceLoader, ManagedResourceObserver managedResourceObserver) { + solrResourceLoader + .getManagedResourceRegistry() + .registerManagedResource(REST_END_POINT, ManagedEmbeddingModelStore.class, managedResourceObserver); + } + + public static ManagedEmbeddingModelStore getManagedModelStore(SolrCore core) { + return (ManagedEmbeddingModelStore) core.getRestManager().getManagedResource(REST_END_POINT); + } + + /** the model store rest endpoint */ + public static final String REST_END_POINT = "/schema/embedding-model-store"; + + /** Managed model store: the name of the attribute containing all the models of a model store */ + private static final String MODELS_JSON_FIELD = "models"; + + /** name of the attribute containing a class */ + static final String CLASS_KEY = "class"; + + /** name of the attribute containing a name */ + static final String NAME_KEY = "name"; + + /** name of the attribute containing parameters */ + static final String PARAMS_KEY = "params"; + + + private final EmbeddingModelStore store; + + private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + public ManagedEmbeddingModelStore( + String resourceId, SolrResourceLoader loader, ManagedResourceStorage.StorageIO storageIO) + throws SolrException { + super(resourceId, loader, storageIO); + store = new EmbeddingModelStore(); + } + + @Override + protected ManagedResourceStorage createStorage( + ManagedResourceStorage.StorageIO storageIO, SolrResourceLoader loader) throws SolrException { + return new ManagedResourceStorage.JsonStorage(storageIO, loader, -1); + } + + + private Object managedData; + + @Override + protected void onManagedDataLoadedFromStorage(NamedList managedInitArgs, Object managedData) + throws SolrException { + store.clear(); + // the managed models on the disk or on zookeeper will be loaded in a lazy + // way, since we need to set the managed features first (unfortunately + // managed resources do not + // decouple the creation of a managed resource with the reading of the data + // from the storage) + this.managedData = managedData; + } + + public void loadStoredModels() { + log.info("------ managed models ~ loading ------"); + + if ((managedData != null) && (managedData instanceof List)) { + @SuppressWarnings({"unchecked"}) + final List> up = (List>) managedData; + for (final Map u : up) { + addModelFromMap(u); + } + } + } + + private void addModelFromMap(Map modelMap) { + try { + final EmbeddingModel algo = fromEmbeddingModelMap(solrResourceLoader,modelMap); + addModel(algo); + } catch (final EmbeddingModelException e) { + throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, e); + } + } + + public synchronized void addModel(EmbeddingModel model) throws EmbeddingModelException { + try { + if (log.isInfoEnabled()) { + log.info("adding model {}", model.getName()); + } + store.addModel(model); + } catch (final EmbeddingModelException e) { + throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, e); + } + } + + @SuppressWarnings("unchecked") + @Override + protected Object applyUpdatesToManagedData(Object updates) { + + if (updates instanceof List) { + final List> up = (List>) updates; + for (final Map u : up) { + addModelFromMap(u); + } + } + + if (updates instanceof Map) { + final Map map = (Map) updates; + addModelFromMap(map); + } + + return modelsAsManagedResources(store.getModels()); + } + + @Override + public synchronized void doDeleteChild(BaseSolrResource endpoint, String childId) { + store.delete(childId); + storeManagedData(applyUpdatesToManagedData(null)); + } + + /** + * Called to retrieve a named part (the given childId) of the resource at the given endpoint. + * Note: since we have a unique child managed store we ignore the childId. + */ + @Override + public void doGet(BaseSolrResource endpoint, String childId) { + + final SolrQueryResponse response = endpoint.getSolrResponse(); + response.add(MODELS_JSON_FIELD, modelsAsManagedResources(store.getModels())); + } + + public EmbeddingModel getModel(String modelName) { + // this function replicates getModelStore().getModel(modelName), but + // it simplifies the testing (we can avoid to mock also a ModelStore). + return store.getModel(modelName); + } + + @Override + public String toString() { + return "ManagedModelStore [store=" + store + "]"; + } + + /** + * Returns the available models as a list of Maps objects. After an update the managed resources + * needs to return the resources in this format in order to store in json somewhere (zookeeper, + * disk...) + * + * @return the available models as a list of Maps objects + */ + private static List modelsAsManagedResources(List models) { + final List list = new ArrayList<>(models.size()); + for (final EmbeddingModel model : models) { + list.add(toEmbeddingModelMap(model)); + } + return list; + } + + @SuppressWarnings("unchecked") + public static EmbeddingModel fromEmbeddingModelMap( + SolrResourceLoader solrResourceLoader, + Map modelMap) { + + final EmbeddingModel embedder = + EmbeddingModel.getInstance( + solrResourceLoader, + (String) modelMap.get(CLASS_KEY), // modelClassName + (String) modelMap.get(NAME_KEY), // modelName + (Map) modelMap.get(PARAMS_KEY)); + return embedder; + } + + private static LinkedHashMap toEmbeddingModelMap(EmbeddingModel model) { + final LinkedHashMap modelMap = new LinkedHashMap<>(5, 1.0f); + + modelMap.put(NAME_KEY, model.getName()); + modelMap.put(CLASS_KEY, model.getClass().getName()); + modelMap.put(PARAMS_KEY, model.getParams()); + + return modelMap; + } +} diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/package-info.java b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/package-info.java new file mode 100644 index 00000000000..65d0caa4103 --- /dev/null +++ b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/package-info.java @@ -0,0 +1,22 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Contains the {@link org.apache.solr.rest.ManagedResource} that encapsulate the feature and the + * model stores. + */ +package java.org.apache.solr.llm.store.rest; diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessor.java b/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessor.java new file mode 100644 index 00000000000..83f37826df4 --- /dev/null +++ b/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessor.java @@ -0,0 +1,104 @@ +///* +// * Licensed to the Apache Software Foundation (ASF) under one or more +// * contributor license agreements. See the NOTICE file distributed with +// * this work for additional information regarding copyright ownership. +// * The ASF licenses this file to You under the Apache License, Version 2.0 +// * (the "License"); you may not use this file except in compliance with +// * the License. You may obtain a copy of the License at +// * +// * http://www.apache.org/licenses/LICENSE-2.0 +// * +// * Unless required by applicable law or agreed to in writing, software +// * distributed under the License is distributed on an "AS IS" BASIS, +// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// * See the License for the specific language governing permissions and +// * limitations under the License. +// */ +// +//package java.org.apache.solr.llm.update.processor; +// +//import org.apache.lucene.analysis.Analyzer; +//import org.apache.lucene.document.Document; +//import org.apache.lucene.index.IndexReader; +//import org.apache.lucene.index.VectorEncoding; +//import org.apache.lucene.util.BytesRef; +//import org.apache.solr.common.SolrException; +//import org.apache.solr.common.SolrInputDocument; +//import org.apache.solr.schema.DenseVectorField; +//import org.apache.solr.schema.IndexSchema; +//import org.apache.solr.schema.SchemaField; +//import org.apache.solr.update.AddUpdateCommand; +//import org.apache.solr.update.DocumentBuilder; +//import org.apache.solr.update.processor.ClassificationUpdateProcessorFactory.Algorithm; +//import org.apache.solr.update.processor.ClassificationUpdateProcessorParams; +//import org.apache.solr.update.processor.UpdateRequestProcessor; +// +//import java.io.IOException; +//import java.org.apache.solr.llm.embedding.EmbeddingModel; +//import java.util.HashMap; +//import java.util.Map; +// +//class TextEmbedderUpdateProcessor extends UpdateRequestProcessor { +///* +// private final String inputField; +// private final String outputField; +// private EmbeddingModel embedder; +// +// /** +// * Sole constructor +// * +// * @param classificationParams classification advanced params +// * @param next next update processor in the chain +// * @param indexReader index reader +// * @param schema schema +// */ +// public TextEmbedderUpdateProcessor( +// String modelName, +// String inputField, +// String outputField, +// UpdateRequestProcessor next, +// IndexReader indexReader, +// IndexSchema schema) { +// super(next); +// this.inputField = inputField; +// this.outputField = outputField; +// final SchemaField schemaField = schema.getField(outputField); +// final DenseVectorField denseVectorType = getCheckedFieldType(schemaField); +// +// embedder = new EmbeddingModel();// retrieve the embedderModel by name +// +// final DenseVectorField denseVectorType = getCheckedFieldType(schemaField); +// VectorEncoding vectorEncoding = denseVectorType.getVectorEncoding(); +// } +// +// public TextEmbedderUpdateProcessor(String inputField, String outputField, EmbeddingModel embedder, UpdateRequestProcessor next) { +// super(); +// } +// +// /** +// * @param cmd the update command in input containing the Document to classify +// * @throws IOException If there is a low-level I/O error +// */ +// @Override +// public void processAdd(AddUpdateCommand cmd) throws IOException { +// SolrInputDocument doc = cmd.getSolrInputDocument(); +// Object textToEmbed = doc.getFieldValue(inputField); +// embedder. +// doc.addField(outputField, assignedClass); +// +// if (documentClass == null) { +// Document luceneDocument = +// DocumentBuilder.toDocument(doc, cmd.getReq().getSchema(), false, true); +// List> assignedClassifications = +// classifier.getClasses(luceneDocument, maxOutputClasses); +// if (assignedClassifications != null) { +// for (ClassificationResult singleClassification : assignedClassifications) { +// String assignedClass = singleClassification.getAssignedClass().utf8ToString(); +// doc.addField(predictedClassField, assignedClass); +// } +// } +// } +// super.processAdd(cmd); +// } +// */ +//} diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessorFactory.java b/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessorFactory.java new file mode 100644 index 00000000000..6a4d94f1737 --- /dev/null +++ b/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessorFactory.java @@ -0,0 +1,118 @@ +///* +// * Licensed to the Apache Software Foundation (ASF) under one or more +// * contributor license agreements. See the NOTICE file distributed with +// * this work for additional information regarding copyright ownership. +// * The ASF licenses this file to You under the Apache License, Version 2.0 +// * (the "License"); you may not use this file except in compliance with +// * the License. You may obtain a copy of the License at +// * +// * http://www.apache.org/licenses/LICENSE-2.0 +// * +// * Unless required by applicable law or agreed to in writing, software +// * distributed under the License is distributed on an "AS IS" BASIS, +// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// * See the License for the specific language governing permissions and +// * limitations under the License. +// */ +// +//package java.org.apache.solr.llm.update.processor; +// +//import org.apache.lucene.index.IndexReader; +//import org.apache.lucene.search.Query; +//import org.apache.solr.common.SolrException; +//import org.apache.solr.common.cloud.SolrClassLoader; +//import org.apache.solr.common.params.SolrParams; +//import org.apache.solr.common.util.NamedList; +//import org.apache.solr.core.SolrCore; +//import org.apache.solr.core.SolrResourceLoader; +//import org.apache.solr.request.SolrQueryRequest; +//import org.apache.solr.response.SolrQueryResponse; +//import org.apache.solr.schema.DenseVectorField; +//import org.apache.solr.schema.FieldType; +//import org.apache.solr.schema.IndexSchema; +//import org.apache.solr.schema.SchemaField; +//import org.apache.solr.search.LuceneQParser; +//import org.apache.solr.search.SyntaxError; +//import org.apache.solr.update.processor.ClassificationUpdateProcessorParams; +//import org.apache.solr.update.processor.UpdateRequestProcessor; +//import org.apache.solr.update.processor.UpdateRequestProcessorFactory; +//import org.apache.solr.util.plugin.SolrCoreAware; +// +//import java.io.IOException; +//import java.org.apache.solr.llm.embedding.EmbeddingModel; +//import java.util.Locale; +// +///** +// * This class implements an UpdateProcessorFactory for the Classification Update Processor. It takes +// * in input a series of parameter that will be necessary to instantiate and use the Classifier +// * +// * @since 6.1.0 +// */ +//public class TextEmbedderUpdateProcessorFactory extends UpdateRequestProcessorFactory implements SolrCoreAware { +// private SolrResourceLoader solrResourceLoader = null; +// private static final String INPUT_FIELD_PARAM = "inputField"; +// private static final String OUTPUT_FIELD_PARAM = "outputField"; +// private static final String MODEl_NAME_PARAM = "model"; +// +// private String inputField; +// private final String outputField; +// private final String modelName; +// +// private EmbeddingModel embedder = null; +// private SolrParams params; +// +// @Override +// public void init(final NamedList args) { +// if (args != null) { +// params = args.toSolrParams(); +// inputField = +// params.get(INPUT_FIELD_PARAM); // must be a comma separated list of fields +// checkNotNull(INPUT_FIELD_PARAM, inputField); +// +// outputField = (params.get(OUTPUT_FIELD_PARAM)); +// solrResourceLoader.getCoreContainer(). +// SolrClassLoader schemaLoader = solrResourceLoader.getSchemaLoader(); +// schemaLoader. +// IndexSchema schema = req.getSchema(); +// SchemaField schemaField = schema.getField(outputField); +// final DenseVectorField denseVectorType = checkFieldType(schemaField); +// +// String modelName = params.get(MODEl_NAME_PARAM); +// solrResourceLoader.getSolrConfig(). +// } +// } +// +// private void checkNotNull(String paramName, Object param) { +// if (param == null) { +// throw new SolrException( +// SolrException.ErrorCode.SERVER_ERROR, +// "Text Embedder UpdateProcessor '" + paramName + "' can not be null"); +// } +// } +// +// @Override +// public UpdateRequestProcessor getInstance( +// SolrQueryRequest req, SolrQueryResponse rsp, UpdateRequestProcessor next) { +// +// IndexSchema schema = req.getSchema(); +// IndexReader indexReader = req.getSearcher().getIndexReader(); +// +// return new TextEmbedderUpdateProcessor(inputField, outputField, embedder, next); +// } +// +// +// protected static DenseVectorField checkFieldType(SchemaField schemaField) { +// FieldType fieldType = schemaField.getType(); +// if (!(fieldType instanceof DenseVectorField)) { +// throw new SolrException( +// SolrException.ErrorCode.BAD_REQUEST, +// "only DenseVectorField is compatible to store vectors"); +// } +// return (DenseVectorField) fieldType; +// } +// +// @Override +// public void inform(SolrCore core) { +// solrResourceLoader = core.getResourceLoader(); +// } +//} diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/package-info.java b/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/package-info.java new file mode 100644 index 00000000000..96757069175 --- /dev/null +++ b/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/package-info.java @@ -0,0 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** APIs and classes for implementing Neural (Dense Retrieval) QueryParsers. */ +package java.org.apache.solr.llm.update.processor; diff --git a/solr/modules/llm/src/java/overview.html b/solr/modules/llm/src/java/overview.html new file mode 100644 index 00000000000..bfa75cdd277 --- /dev/null +++ b/solr/modules/llm/src/java/overview.html @@ -0,0 +1,21 @@ + + + +Apache Solr Search Server: text clustering module + + diff --git a/solr/modules/llm/src/test-files/log4j2.xml b/solr/modules/llm/src/test-files/log4j2.xml new file mode 100644 index 00000000000..5e696935965 --- /dev/null +++ b/solr/modules/llm/src/test-files/log4j2.xml @@ -0,0 +1,43 @@ + + + + + + + + + %maxLen{%-4r %-5p (%t) [%notEmpty{n:%X{node_name}}%notEmpty{ c:%X{collection}}%notEmpty{ s:%X{shard}}%notEmpty{ r:%X{replica}}%notEmpty{ x:%X{core}}%notEmpty{ t:%X{trace_id}}] %c{1.} %m%notEmpty{ + =>%ex{short}}}{10240}%n + + + + + + + + + + + + + + + + + + diff --git a/solr/modules/llm/src/test-files/modelExamples/cohere-model.json b/solr/modules/llm/src/test-files/modelExamples/cohere-model.json new file mode 100644 index 00000000000..e967d91a295 --- /dev/null +++ b/solr/modules/llm/src/test-files/modelExamples/cohere-model.json @@ -0,0 +1,14 @@ +{ + "class": "dev.langchain4j.model.cohere.CohereEmbeddingModel", + "name": "cohere", + "params": { + "baseUrl": "cohereUrl", + "apiKey": "cohereApiKey", + "modelName": "cohereName", + "inputType": "cohereInputType", + "timeout": 10, + "logRequests": true, + "logResponses": false, + "maxSegmentsPerBatch": 55 + } +} diff --git a/solr/modules/llm/src/test-files/solr/collection1/conf/schema.xml b/solr/modules/llm/src/test-files/solr/collection1/conf/schema.xml new file mode 100644 index 00000000000..8291b9bc7d6 --- /dev/null +++ b/solr/modules/llm/src/test-files/solr/collection1/conf/schema.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml b/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml new file mode 100644 index 00000000000..34adb5baa51 --- /dev/null +++ b/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml @@ -0,0 +1,58 @@ + + + + + ${tests.luceneMatchVersion:LATEST} + ${solr.data.dir:} + + + + + + + + + + + + + + + + + + 15000 + false + + + 1000 + + + ${solr.data.dir:} + + + + + + + + explicit + json + true + id + + + + diff --git a/solr/modules/llm/src/test-files/solr/collection1/conf/stopwords.txt b/solr/modules/llm/src/test-files/solr/collection1/conf/stopwords.txt new file mode 100644 index 00000000000..eabae3b7c0d --- /dev/null +++ b/solr/modules/llm/src/test-files/solr/collection1/conf/stopwords.txt @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +a diff --git a/solr/modules/llm/src/test-files/solr/collection1/conf/synonyms.txt b/solr/modules/llm/src/test-files/solr/collection1/conf/synonyms.txt new file mode 100644 index 00000000000..461ed4df6e4 --- /dev/null +++ b/solr/modules/llm/src/test-files/solr/collection1/conf/synonyms.txt @@ -0,0 +1,28 @@ +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +#----------------------------------------------------------------------- +#some test synonym mappings unlikely to appear in real input text +aaafoo => aaabar +bbbfoo => bbbfoo bbbbar +cccfoo => cccbar cccbaz +fooaaa,baraaa,bazaaa + +# Some synonym groups specific to this example +GB,gib,gigabyte,gigabytes +MB,mib,megabyte,megabytes +Television, Televisions, TV, TVs +#notice we use "gib" instead of "GiB" so any WordDelimiterGraphFilter coming +#after us won't split it into two words. + +# Synonym mappings can be used for spelling correction too +pixima => pixma diff --git a/solr/modules/llm/src/test-files/solr/solr.xml b/solr/modules/llm/src/test-files/solr/solr.xml new file mode 100644 index 00000000000..7506c1c8951 --- /dev/null +++ b/solr/modules/llm/src/test-files/solr/solr.xml @@ -0,0 +1,41 @@ + + + + + + ${shareSchema:false} + ${configSetBaseDir:configsets} + ${coreRootDirectory:.} + + + ${urlScheme:} + ${socketTimeout:90000} + ${connTimeout:15000} + + + + 127.0.0.1 + ${hostPort:8983} + ${solr.zkclienttimeout:30000} + ${genericCoreNodeNames:true} + ${leaderVoteWait:10000} + ${distribUpdateConnTimeout:45000} + ${distribUpdateSoTimeout:340000} + + + diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java b/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java new file mode 100644 index 00000000000..b757950bd86 --- /dev/null +++ b/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java @@ -0,0 +1,241 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.solr.llm; + +import org.apache.commons.io.file.PathUtils; +import org.apache.solr.common.util.Utils; +import org.apache.solr.core.SolrCore; +import org.apache.solr.core.SolrResourceLoader; +import org.apache.solr.llm.embedding.EmbeddingModel; +import org.apache.solr.llm.store.EmbeddingModelException; +import org.apache.solr.llm.store.rest.ManagedEmbeddingModelStore; +import org.apache.solr.util.RestTestBase; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.invoke.MethodHandles; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Map; + +public class TestLlmBase extends RestTestBase { + + private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + protected static final SolrResourceLoader solrResourceLoader = + new SolrResourceLoader(Path.of("").toAbsolutePath()); + + protected static Path tmpSolrHome; + protected static Path tmpConfDir; + + public static final String MODEL_FILE_NAME = "_schema_embedding-model-store.json"; + protected static final String COLLECTION = "collection1"; + protected static final String CONF_DIR = COLLECTION + "/conf"; + + protected static Path mstorefile = null; + + + protected static void setuptest(boolean bulkIndex) throws Exception { + setuptest("solrconfig-llm.xml", "schema.xml"); + if (bulkIndex) prepareIndex(); + } + + protected static void setupPersistenttest(boolean bulkIndex) throws Exception { + setupPersistentTest("solrconfig-llm.xml", "schema.xml"); + if (bulkIndex) prepareIndex(); + } + + public static ManagedEmbeddingModelStore getManagedModelStore() { + try (SolrCore core = solrClientTestRule.getCoreContainer().getCore(DEFAULT_TEST_CORENAME)) { + return ManagedEmbeddingModelStore.getManagedModelStore(core); + } + } + + protected static void setupTestInit(String solrconfig, String schema, boolean isPersistent) + throws Exception { + tmpSolrHome = createTempDir(); + tmpConfDir = tmpSolrHome.resolve(CONF_DIR); + tmpConfDir.toFile().deleteOnExit(); + PathUtils.copyDirectory(TEST_PATH(), tmpSolrHome.toAbsolutePath()); + + final Path mstore = tmpConfDir.resolve(MODEL_FILE_NAME); + + if (isPersistent) { + mstorefile = mstore; + } + + if (Files.exists(mstore)) { + if (log.isInfoEnabled()) { + log.info("remove model store config file in {}", mstore.toAbsolutePath()); + } + Files.delete(mstore); + } + if (!solrconfig.equals("solrconfig-llm.xml")) { + Files.copy( + tmpSolrHome.resolve(CONF_DIR).resolve(solrconfig), + tmpSolrHome.resolve(CONF_DIR).resolve("solrconfig-llm.xml")); + } + if (!schema.equals("schema.xml")) { + Files.copy( + tmpSolrHome.resolve(CONF_DIR).resolve(schema), + tmpSolrHome.resolve(CONF_DIR).resolve("schema.xml")); + } + + System.setProperty("managed.schema.mutable", "true"); + } + + public static void setuptest(String solrconfig, String schema) throws Exception { + + setupTestInit(solrconfig, schema, false); + System.setProperty("enable.update.log", "false"); + + createJettyAndHarness( + tmpSolrHome.toAbsolutePath().toString(), solrconfig, schema, "/solr", true, null); + } + + public static void setupPersistentTest(String solrconfig, String schema) throws Exception { + + setupTestInit(solrconfig, schema, true); + + createJettyAndHarness( + tmpSolrHome.toAbsolutePath().toString(), solrconfig, schema, "/solr", true, null); + } + + protected static void aftertest() throws Exception { + if (null != restTestHarness) { + restTestHarness.close(); + restTestHarness = null; + } + solrClientTestRule.reset(); + if (null != tmpSolrHome) { + PathUtils.deleteDirectory(tmpSolrHome); + tmpSolrHome = null; + } + System.clearProperty("managed.schema.mutable"); + } + + public static void makeRestTestHarnessNull() { + restTestHarness = null; + } + + /** produces a model encoded in json * */ + public static String getModelInJson( + String name, String className, String params) { + final StringBuilder sb = new StringBuilder(); + sb.append("{\n"); + sb.append("\"name\":").append('"').append(name).append('"').append(",\n"); + sb.append("\"class\":").append('"').append(className).append('"').append(",\n"); + if (params != null) { + sb.append(",\n"); + sb.append("\"params\":").append(params); + } + sb.append("\n}\n"); + return sb.toString(); + } + + protected static void loadModel( + String name, String className, String params) throws Exception { + final String model = getModelInJson(name, className, params); + log.info("loading model \n{} ", model); + assertJPut(ManagedEmbeddingModelStore.REST_END_POINT, model, "/responseHeader/status==0"); + } + + public static void loadModels(String fileName) throws Exception { + final URL url = TestLlmBase.class.getResource("/modelExamples/" + fileName); + final String multipleModels = Files.readString(Path.of(url.toURI()), StandardCharsets.UTF_8); + + assertJPut(ManagedEmbeddingModelStore.REST_END_POINT, multipleModels, "/responseHeader/status==0"); + } + + public static EmbeddingModel createModelFromFiles(String modelFileName, String featureFileName) + throws EmbeddingModelException, Exception { + return createModelFromFiles( + modelFileName, featureFileName); + } + + public static EmbeddingModel createModelFromFiles( + String modelFileName) + throws Exception { + URL url = TestLlmBase.class.getResource("/modelExamples/" + modelFileName); + final String modelJson = Files.readString(Path.of(url.toURI()), StandardCharsets.UTF_8); + final ManagedEmbeddingModelStore ms = getManagedModelStore(); + + final EmbeddingModel model = + ManagedEmbeddingModelStore.fromEmbeddingModelMap( + solrResourceLoader, mapFromJson(modelJson)); + ms.addModel(model); + return model; + } + + @SuppressWarnings("unchecked") + private static Map mapFromJson(String json) throws EmbeddingModelException { + Object parsedJson = null; + try { + parsedJson = Utils.fromJSONString(json); + } catch (final Exception ioExc) { + throw new EmbeddingModelException("ObjectBuilder failed parsing json", ioExc); + } + return (Map) parsedJson; + } + + + protected static void prepareIndex() throws Exception { + assertU( + adoc( + "title", + "bloomberg different bla", + "description", + "bloomberg", + "id", + "6", + "popularity", + "1")); + assertU( + adoc( + "title", + "bloomberg bloomberg ", + "description", + "bloomberg", + "id", + "7", + "popularity", + "2")); + assertU( + adoc( + "title", + "bloomberg bloomberg bloomberg", + "description", + "bloomberg", + "id", + "8", + "popularity", + "3")); + assertU( + adoc( + "title", + "bloomberg bloomberg bloomberg bloomberg", + "description", + "bloomberg", + "id", + "9", + "popularity", + "5")); + assertU(commit()); + } +} diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java new file mode 100644 index 00000000000..dd3af8fc902 --- /dev/null +++ b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java @@ -0,0 +1,132 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.solr.llm.store.rest; + +import dev.langchain4j.model.cohere.CohereEmbeddingModel; +import org.apache.solr.common.util.NamedList; +import org.apache.solr.core.SolrResourceLoader; +import org.apache.solr.llm.TestLlmBase; +import org.apache.solr.rest.ManagedResource; +import org.apache.solr.rest.ManagedResourceStorage; +import org.apache.solr.rest.RestManager; +import org.junit.BeforeClass; +import org.junit.Test; +import org.apache.solr.llm.search.TextEmbedderQParserPlugin; + +public class TestModelManager extends TestLlmBase { + + @BeforeClass + public static void init() throws Exception { + setuptest(false); + } + + @Test + public void test() throws Exception { + final SolrResourceLoader loader = new SolrResourceLoader(tmpSolrHome); + + final RestManager.Registry registry = loader.getManagedResourceRegistry(); + assertNotNull( + "Expected a non-null RestManager.Registry from the SolrResourceLoader!", registry); + + final String resourceId = "/schema/mstore1"; + registry.registerManagedResource(resourceId, ManagedEmbeddingModelStore.class, new TextEmbedderQParserPlugin()); + + final NamedList initArgs = new NamedList<>(); + + final RestManager restManager = new RestManager(); + restManager.init(loader, initArgs, new ManagedResourceStorage.InMemoryStorageIO()); + + final ManagedResource res = restManager.getManagedResource(resourceId); + assertTrue(res instanceof ManagedEmbeddingModelStore); + assertEquals(res.getResourceId(), resourceId); + } + + @Test + public void testRestManagerEndpoints() throws Exception { + assertJQ("/schema/managed", "/responseHeader/status==0"); + + final String cohereModelClassName = CohereEmbeddingModel.class.getName(); + + // Add models + String model = + "{ \"name\":\"testModel1\", \"class\":\"" + cohereModelClassName + "\"}"; + // fails since it does not have params + assertJPut(ManagedEmbeddingModelStore.REST_END_POINT, model, "/responseHeader/status==400"); + // success + model = + "{ \"name\":\"testModel2\", \"class\":\"" + + cohereModelClassName + + "\",\"params\":{\"baseUrl\":\"cohereUrl2\"," + + "\"apiKey\":\"cohereApiKey2\"," + + "\"modelName\":\"cohereName2\"," + + "\"inputType\":1.0," + + "\"logRequests\":1.0," + + "\"logResponses\":1.0," + + "\"maxSegmentsPerBatch\":1.0" + + "}}"; + assertJPut(ManagedEmbeddingModelStore.REST_END_POINT, model, "/responseHeader/status==0"); + // success + final String multipleModels = + "[{ \"name\":\"testModel3\", \"class\":\"" + + cohereModelClassName + + "\"params\":{\"baseUrl\":\"cohereUrl3\"," + + "\"apiKey\":\"cohereApiKey3\"," + + "\"modelName\":\"cohereName3\"," + + "\"inputType\":1.0," + + "\"logRequests\":1.0," + + "\"logResponses\":1.0," + + "\"maxSegmentsPerBatch\":1.0" + + "}}\n" + + ",{ \"name\":\"testModel4\", \"class\":\"" + + cohereModelClassName + + "\"params\":{\"baseUrl\":\"cohereUrl4\"," + + "\"apiKey\":\"cohereApiKey4\"," + + "\"modelName\":\"cohereName4\"," + + "\"inputType\":1.0," + + "\"logRequests\":1.0," + + "\"logResponses\":1.0," + + "\"maxSegmentsPerBatch\":1.0" + + "}}]"; + assertJPut(ManagedEmbeddingModelStore.REST_END_POINT, multipleModels, "/responseHeader/status==0"); + final String qryResult = JQ(ManagedEmbeddingModelStore.REST_END_POINT); + + assertTrue( + qryResult.contains("\"name\":\"testModel2\"") + && qryResult.contains("\"name\":\"testModel3\"") + && qryResult.contains("\"name\":\"testModel4\"")); + + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='testModel2'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[1]/name=='testModel3'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[2]/name=='testModel4'"); + restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/testModel2"); + restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/testModel3"); + restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/testModel4"); + assertJQ( + ManagedEmbeddingModelStore.REST_END_POINT, + "/models==[]'"); + } + + @Test + public void testEndpointsFromFile() throws Exception { + loadModels("cohere-model.json"); + + final String modelName = "6029760550880411648"; + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); + + restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/" + modelName); + } +} diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java new file mode 100644 index 00000000000..aff63dd9c1d --- /dev/null +++ b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java @@ -0,0 +1,96 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.solr.llm.store.rest; + +import dev.langchain4j.model.cohere.CohereEmbeddingModel; +import org.apache.solr.common.util.Utils; +import org.apache.solr.llm.TestLlmBase; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; + +import static java.nio.charset.StandardCharsets.UTF_8; + +public class TestModelManagerPersistence extends TestLlmBase { + + @Before + public void init() throws Exception { + setupPersistenttest(true); + } + + @After + public void cleanup() throws Exception { + aftertest(); + } + + @Test + public void testModelAreStoredCompact() throws Exception { + loadModel( + "cohere1", + CohereEmbeddingModel.class.getName(), + "{\"baseUrl\":\"cohereUrl1\"," + + "\"apiKey\":\"cohereApiKey1\"," + + "\"modelName\":\"cohereName1\"," + + "\"inputType\":1.0," + + "\"logRequests\":1.0," + + "\"logResponses\":1.0," + + "\"maxSegmentsPerBatch\":1.0" + + "}"); + + final String mstorecontent = Files.readString(mstorefile, StandardCharsets.UTF_8); + Object mStoreObject = Utils.fromJSONString(mstorecontent); + assertEquals(new String(Utils.toJSON(mStoreObject, -1), UTF_8), mstorecontent); + } + + @Test + public void testModelStorePersistence() throws Exception { + // check models are empty + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/==[]"); + + // load models and features from files + loadModels("cohere-model.json"); + + // check loaded models and features + final String modelName = "6029760550880411648"; + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); + + // check persistence after reload + restTestHarness.reload(); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); + + // check persistence after restart + getJetty().stop(); + getJetty().start(); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); + + // delete loaded models and features + restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/" + modelName); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/==[]"); + + // check persistence after reload + restTestHarness.reload(); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/==[]"); + + // check persistence after restart + getJetty().stop(); + getJetty().start(); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/==[]"); + } +} From e38ccd6dfcb0ba70853479f9bc685f188e4ffa70 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Sat, 5 Oct 2024 10:51:07 +0100 Subject: [PATCH 02/65] first skeleton + first tests working --- .../randomization/policies/solr-tests.policy | 2 + solr/modules/llm/build.gradle | 4 +- .../solr/llm/embedding/EmbeddingModel.java | 54 ++++++++-------- .../solr/llm/store/EmbeddingModelStore.java | 4 +- .../rest/ManagedEmbeddingModelStore.java | 6 +- .../modelExamples/cohere-model.json | 16 +++-- .../solr/llm/store/rest/TestModelManager.java | 63 ++++++++++--------- solr/server/etc/security.policy | 3 +- 8 files changed, 79 insertions(+), 73 deletions(-) diff --git a/gradle/testing/randomization/policies/solr-tests.policy b/gradle/testing/randomization/policies/solr-tests.policy index 61df0871a35..ba5a50dccf2 100644 --- a/gradle/testing/randomization/policies/solr-tests.policy +++ b/gradle/testing/randomization/policies/solr-tests.policy @@ -58,6 +58,8 @@ grant { // needed by randomizedtesting runner to identify test methods. permission java.lang.reflect.ReflectPermission "suppressAccessChecks"; + permission java.lang.reflect.ReflectPermission "newProxyInPackage.dev.langchain4j.model.cohere"; + permission java.net.SocketPermission "api.cohere.ai", "accept,listen,connect,resolve"; permission java.lang.RuntimePermission "accessDeclaredMembers"; // needed by certain tests to redirect sysout/syserr: permission java.lang.RuntimePermission "setIO"; diff --git a/solr/modules/llm/build.gradle b/solr/modules/llm/build.gradle index 5ab0aee1ddb..e0f889297d9 100644 --- a/solr/modules/llm/build.gradle +++ b/solr/modules/llm/build.gradle @@ -25,8 +25,8 @@ dependencies { implementation 'org.apache.lucene:lucene-core' - implementation 'dev.langchain4j:langchain4j-cohere:0.34.0' - implementation 'dev.langchain4j:langchain4j:0.34.0' + implementation 'dev.langchain4j:langchain4j-cohere:0.35.0' + implementation 'dev.langchain4j:langchain4j:0.35.0' implementation 'org.slf4j:slf4j-api' testImplementation project(':solr:test-framework') diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/EmbeddingModel.java b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/EmbeddingModel.java index eac807fa43c..8dd8478835f 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/EmbeddingModel.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/EmbeddingModel.java @@ -7,7 +7,8 @@ import org.apache.lucene.util.RamUsageEstimator; import org.apache.solr.core.SolrResourceLoader; import org.apache.solr.llm.store.EmbeddingModelException; -import org.apache.solr.util.SolrPluginUtils; + +import java.time.Duration; import java.util.Map; import java.util.Objects; @@ -27,34 +28,35 @@ public static EmbeddingModel getInstance( String name, Map params) throws EmbeddingModelException { - final DimensionAwareEmbeddingModel embedder; try { -// // create an instance of the model -// embedder = -// solrResourceLoader.newInstance( -// className, -// DimensionAwareEmbeddingModel.class, -// new String[0], // no sub packages -// new Class[] { -// String.class, Map.class -// }, -// new Object[] {name, params}); -// if (params != null) { -// SolrPluginUtils.invokeSetters(embedder, params.entrySet()); -// } - - //how to instantiate embedder? - embedder = CohereEmbeddingModel.builder() - .baseUrl(System.getenv("OPENAI_BASE_URL")) - .apiKey(System.getenv("OPENAI_API_KEY")) - .modelName("") - .logRequests(true) - .logResponses(true) - .build(); //this need to happen through inversion of control, where for each json param a method of the builder is called with the parameter the json value + DimensionAwareEmbeddingModel embedder; + Class modelClass = Class.forName(className); + var builder = modelClass.getMethod("builder").invoke(null); + for (String paramName : params.keySet()) { + switch (paramName) { + case "timeout": + Duration timeOut = Duration.ofSeconds((Long) params.get(paramName)); + builder.getClass().getMethod(paramName, Duration.class).invoke(builder, timeOut); + break; + case "logRequests": + builder.getClass().getMethod(paramName, Boolean.class).invoke(builder, params.get(paramName)); + break; + case "logResponses": + builder.getClass().getMethod(paramName, Boolean.class).invoke(builder, params.get(paramName)); + break; + case "maxSegmentsPerBatch": + builder.getClass().getMethod(paramName, Integer.class).invoke(builder, ((Long)params.get(paramName)).intValue()); + break; + default: + builder.getClass().getMethod(paramName, String.class).invoke(builder, params.get(paramName)); + } + } + + embedder = (DimensionAwareEmbeddingModel) builder.getClass().getMethod("build").invoke(builder); + return new EmbeddingModel(name, embedder, params); } catch (final Exception e) { - throw new EmbeddingModelException("Model loading failed for " + className, e); + throw new EmbeddingModelException("Model loading failed for " + className, e); } - return new EmbeddingModel(name, embedder, params); } public EmbeddingModel(String name, DimensionAwareEmbeddingModel embedder, Map params) { diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java b/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java index ae7ec9af409..ca1f7790cc7 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java @@ -22,7 +22,7 @@ import org.apache.solr.llm.embedding.EmbeddingModel; import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -31,7 +31,7 @@ public class EmbeddingModelStore { private final Map availableModels; public EmbeddingModelStore() { - availableModels = new HashMap<>(); + availableModels = new LinkedHashMap<>(); } public synchronized EmbeddingModel getModel(String name) { diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java index 25b5b4c99f8..102de4d633b 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java @@ -114,8 +114,8 @@ public void loadStoredModels() { private void addModelFromMap(Map modelMap) { try { - final EmbeddingModel algo = fromEmbeddingModelMap(solrResourceLoader,modelMap); - addModel(algo); + final EmbeddingModel embedder = fromEmbeddingModelMap(solrResourceLoader,modelMap); + addModel(embedder); } catch (final EmbeddingModelException e) { throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, e); } @@ -169,8 +169,6 @@ public void doGet(BaseSolrResource endpoint, String childId) { } public EmbeddingModel getModel(String modelName) { - // this function replicates getModelStore().getModel(modelName), but - // it simplifies the testing (we can avoid to mock also a ModelStore). return store.getModel(modelName); } diff --git a/solr/modules/llm/src/test-files/modelExamples/cohere-model.json b/solr/modules/llm/src/test-files/modelExamples/cohere-model.json index e967d91a295..f32a8d461a1 100644 --- a/solr/modules/llm/src/test-files/modelExamples/cohere-model.json +++ b/solr/modules/llm/src/test-files/modelExamples/cohere-model.json @@ -1,14 +1,12 @@ { "class": "dev.langchain4j.model.cohere.CohereEmbeddingModel", - "name": "cohere", + "name": "cohere-1", "params": { - "baseUrl": "cohereUrl", - "apiKey": "cohereApiKey", - "modelName": "cohereName", - "inputType": "cohereInputType", - "timeout": 10, + "baseUrl": "https://api.cohere.ai/v1/", + "apiKey": "apiKey",//xhQtF4zYtDq9zs2WlTPMDRStUlhZGNlxSOPEbhAl + "modelName": "embed-english-light-v3.0", + "inputType": "search_document", + "timeout": 60, "logRequests": true, - "logResponses": false, - "maxSegmentsPerBatch": 55 - } + "logResponses": true} } diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java index dd3af8fc902..3e2e944ff68 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java @@ -68,38 +68,36 @@ public void testRestManagerEndpoints() throws Exception { assertJPut(ManagedEmbeddingModelStore.REST_END_POINT, model, "/responseHeader/status==400"); // success model = - "{ \"name\":\"testModel2\", \"class\":\"" - + cohereModelClassName - + "\",\"params\":{\"baseUrl\":\"cohereUrl2\"," + - "\"apiKey\":\"cohereApiKey2\"," + - "\"modelName\":\"cohereName2\"," + - "\"inputType\":1.0," + - "\"logRequests\":1.0," + - "\"logResponses\":1.0," + - "\"maxSegmentsPerBatch\":1.0" + + "{ name:\"testModel2\", class:\"" + + cohereModelClassName + "\"," + + "params:{" + + "baseUrl:\"https://api.cohere.ai/v1/\"," + + "apiKey:\"cohereApiKey2\"," + + "modelName:\"embed-english-light-v3.0\"," + + "inputType:\"search_document\"," + + "logRequests:true," + + "logResponses:false" + "}}"; assertJPut(ManagedEmbeddingModelStore.REST_END_POINT, model, "/responseHeader/status==0"); // success final String multipleModels = - "[{ \"name\":\"testModel3\", \"class\":\"" - + cohereModelClassName - + "\"params\":{\"baseUrl\":\"cohereUrl3\"," + - "\"apiKey\":\"cohereApiKey3\"," + - "\"modelName\":\"cohereName3\"," + - "\"inputType\":1.0," + - "\"logRequests\":1.0," + - "\"logResponses\":1.0," + - "\"maxSegmentsPerBatch\":1.0" + + "[{ name:\"testModel3\", class:\"" + + cohereModelClassName+"\"," + + "params:{baseUrl:\"https://api.cohere.ai/v1/\"," + + "apiKey:\"cohereApiKey3\"," + + "modelName:\"embed-english-light-v3.0\"," + + "inputType:\"search_document\"," + + "logRequests:true," + + "logResponses:false" + "}}\n" - + ",{ \"name\":\"testModel4\", \"class\":\"" - + cohereModelClassName - + "\"params\":{\"baseUrl\":\"cohereUrl4\"," + - "\"apiKey\":\"cohereApiKey4\"," + - "\"modelName\":\"cohereName4\"," + - "\"inputType\":1.0," + - "\"logRequests\":1.0," + - "\"logResponses\":1.0," + - "\"maxSegmentsPerBatch\":1.0" + + + ",{ name:\"testModel4\", class:\"" + + cohereModelClassName+"\"," + + "params:{baseUrl:\"https://api.cohere.ai/v1/\"," + + "apiKey:\"cohereApiKey4\"," + + "modelName:\"embed-english-light-v3.0\"," + + "inputType:\"search_document\"," + + "logRequests:true," + + "logResponses:false" + "}}]"; assertJPut(ManagedEmbeddingModelStore.REST_END_POINT, multipleModels, "/responseHeader/status==0"); final String qryResult = JQ(ManagedEmbeddingModelStore.REST_END_POINT); @@ -121,11 +119,18 @@ public void testRestManagerEndpoints() throws Exception { } @Test - public void testEndpointsFromFile() throws Exception { + public void loadModel_Cohere_shouldLoadModelConfig() throws Exception { loadModels("cohere-model.json"); - final String modelName = "6029760550880411648"; + final String modelName = "cohere-1"; assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/baseUrl=='https://api.cohere.ai/v1/'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/modelName=='embed-english-light-v3.0'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/inputType=='search_document'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/timeout==60"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logRequests==true"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logResponses==true"); restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/" + modelName); } diff --git a/solr/server/etc/security.policy b/solr/server/etc/security.policy index c898ac8dbfe..777f850923a 100644 --- a/solr/server/etc/security.policy +++ b/solr/server/etc/security.policy @@ -60,6 +60,8 @@ grant { // needed by randomizedtesting runner to identify test methods. permission java.lang.reflect.ReflectPermission "suppressAccessChecks"; + permission java.lang.reflect.ReflectPermission "newProxyInPackage.dev.langchain4j.model.cohere"; + permission java.net.SocketPermission "api.cohere.ai", "accept,listen,connect,resolve"; permission java.lang.RuntimePermission "accessDeclaredMembers"; // needed by certain tests to redirect sysout/syserr: permission java.lang.RuntimePermission "setIO"; @@ -108,7 +110,6 @@ grant { permission java.lang.RuntimePermission "getProtectionDomain"; // needed by aws s3 sdk (Apache HTTP Client) permission java.lang.RuntimePermission "accessClassInPackage.jdk.internal.reflect"; - // These two *have* to be spelled out a separate permission java.lang.management.ManagementPermission "control"; permission java.lang.management.ManagementPermission "monitor"; From 7f194792e99570e3d95ac041f20b62fc68aeb36c Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Sat, 5 Oct 2024 11:59:14 +0100 Subject: [PATCH 03/65] added openAI support --- .../randomization/policies/solr-tests.policy | 4 ++++ solr/modules/llm/build.gradle | 2 ++ .../solr/llm/embedding/EmbeddingModel.java | 1 - .../test-files/modelExamples/cohere-model.json | 2 +- .../test-files/modelExamples/openai-model.json | 9 +++++++++ .../solr/llm/store/rest/TestModelManager.java | 17 +++++++++++++++-- solr/server/etc/security.policy | 4 ++++ 7 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 solr/modules/llm/src/test-files/modelExamples/openai-model.json diff --git a/gradle/testing/randomization/policies/solr-tests.policy b/gradle/testing/randomization/policies/solr-tests.policy index ba5a50dccf2..75c3da7aa44 100644 --- a/gradle/testing/randomization/policies/solr-tests.policy +++ b/gradle/testing/randomization/policies/solr-tests.policy @@ -59,7 +59,11 @@ grant { // needed by randomizedtesting runner to identify test methods. permission java.lang.reflect.ReflectPermission "suppressAccessChecks"; permission java.lang.reflect.ReflectPermission "newProxyInPackage.dev.langchain4j.model.cohere"; + permission java.lang.reflect.ReflectPermission "newProxyInPackage.dev.ai4j.openai4j"; permission java.net.SocketPermission "api.cohere.ai", "accept,listen,connect,resolve"; + permission java.net.SocketPermission "api.openai.com", "accept,listen,connect,resolve"; + permission java.net.SocketPermission "langchain4j.dev", "accept,listen,connect,resolve"; + permission java.lang.RuntimePermission "accessDeclaredMembers"; // needed by certain tests to redirect sysout/syserr: permission java.lang.RuntimePermission "setIO"; diff --git a/solr/modules/llm/build.gradle b/solr/modules/llm/build.gradle index e0f889297d9..71213517f44 100644 --- a/solr/modules/llm/build.gradle +++ b/solr/modules/llm/build.gradle @@ -25,8 +25,10 @@ dependencies { implementation 'org.apache.lucene:lucene-core' + implementation 'dev.langchain4j:langchain4j-open-ai:0.35.0' implementation 'dev.langchain4j:langchain4j-cohere:0.35.0' implementation 'dev.langchain4j:langchain4j:0.35.0' + implementation 'org.slf4j:slf4j-api' testImplementation project(':solr:test-framework') diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/EmbeddingModel.java b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/EmbeddingModel.java index 8dd8478835f..2f6d5b321ae 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/EmbeddingModel.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/EmbeddingModel.java @@ -51,7 +51,6 @@ public static EmbeddingModel getInstance( builder.getClass().getMethod(paramName, String.class).invoke(builder, params.get(paramName)); } } - embedder = (DimensionAwareEmbeddingModel) builder.getClass().getMethod("build").invoke(builder); return new EmbeddingModel(name, embedder, params); } catch (final Exception e) { diff --git a/solr/modules/llm/src/test-files/modelExamples/cohere-model.json b/solr/modules/llm/src/test-files/modelExamples/cohere-model.json index f32a8d461a1..41ef544b2ec 100644 --- a/solr/modules/llm/src/test-files/modelExamples/cohere-model.json +++ b/solr/modules/llm/src/test-files/modelExamples/cohere-model.json @@ -3,7 +3,7 @@ "name": "cohere-1", "params": { "baseUrl": "https://api.cohere.ai/v1/", - "apiKey": "apiKey",//xhQtF4zYtDq9zs2WlTPMDRStUlhZGNlxSOPEbhAl + "apiKey": "apiKey-cohere", "modelName": "embed-english-light-v3.0", "inputType": "search_document", "timeout": 60, diff --git a/solr/modules/llm/src/test-files/modelExamples/openai-model.json b/solr/modules/llm/src/test-files/modelExamples/openai-model.json new file mode 100644 index 00000000000..a7ff61f6b73 --- /dev/null +++ b/solr/modules/llm/src/test-files/modelExamples/openai-model.json @@ -0,0 +1,9 @@ +{ + "class": "dev.langchain4j.model.openai.OpenAiEmbeddingModel", + "name": "openai-1", + "params": { + "baseUrl": "https://api.openai.com/v1", + "apiKey": "apiKey-openAI", + "modelName": "text-embedding-3-small" + } +} diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java index 3e2e944ff68..02748f468b2 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java @@ -119,13 +119,13 @@ public void testRestManagerEndpoints() throws Exception { } @Test - public void loadModel_Cohere_shouldLoadModelConfig() throws Exception { + public void loadModel_cohere_shouldLoadModelConfig() throws Exception { loadModels("cohere-model.json"); final String modelName = "cohere-1"; assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/baseUrl=='https://api.cohere.ai/v1/'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-cohere'"); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/modelName=='embed-english-light-v3.0'"); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/inputType=='search_document'"); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/timeout==60"); @@ -134,4 +134,17 @@ public void loadModel_Cohere_shouldLoadModelConfig() throws Exception { restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/" + modelName); } + + @Test + public void loadModel_openAi_shouldLoadModelConfig() throws Exception { + loadModels("openai-model.json"); + + final String modelName = "openai-1"; + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/baseUrl=='https://api.openai.com/v1'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-openAI'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/modelName=='text-embedding-3-small'"); + + restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/" + modelName); + } } diff --git a/solr/server/etc/security.policy b/solr/server/etc/security.policy index 777f850923a..c1caceeedb6 100644 --- a/solr/server/etc/security.policy +++ b/solr/server/etc/security.policy @@ -61,7 +61,11 @@ grant { // needed by randomizedtesting runner to identify test methods. permission java.lang.reflect.ReflectPermission "suppressAccessChecks"; permission java.lang.reflect.ReflectPermission "newProxyInPackage.dev.langchain4j.model.cohere"; + permission java.lang.reflect.ReflectPermission "newProxyInPackage.dev.ai4j.openai4j"; permission java.net.SocketPermission "api.cohere.ai", "accept,listen,connect,resolve"; + permission java.net.SocketPermission "api.openai.com", "accept,listen,connect,resolve"; + permission java.net.SocketPermission "langchain4j.dev", "accept,listen,connect,resolve"; + permission java.lang.RuntimePermission "accessDeclaredMembers"; // needed by certain tests to redirect sysout/syserr: permission java.lang.RuntimePermission "setIO"; From c53eaaa7b516a6ca7a0468c837f023aafa457dc8 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Sat, 5 Oct 2024 19:29:04 +0100 Subject: [PATCH 04/65] added mistralAI support --- .../testing/randomization/policies/solr-tests.policy | 1 + solr/modules/llm/build.gradle | 1 + .../src/test-files/modelExamples/mistralai-model.json | 8 ++++++++ .../apache/solr/llm/store/rest/TestModelManager.java | 11 +++++++++++ solr/server/etc/security.policy | 1 + 5 files changed, 22 insertions(+) create mode 100644 solr/modules/llm/src/test-files/modelExamples/mistralai-model.json diff --git a/gradle/testing/randomization/policies/solr-tests.policy b/gradle/testing/randomization/policies/solr-tests.policy index 75c3da7aa44..6ff77610f39 100644 --- a/gradle/testing/randomization/policies/solr-tests.policy +++ b/gradle/testing/randomization/policies/solr-tests.policy @@ -62,6 +62,7 @@ grant { permission java.lang.reflect.ReflectPermission "newProxyInPackage.dev.ai4j.openai4j"; permission java.net.SocketPermission "api.cohere.ai", "accept,listen,connect,resolve"; permission java.net.SocketPermission "api.openai.com", "accept,listen,connect,resolve"; + permission java.net.SocketPermission "api.mistral.ai", "accept,listen,connect,resolve"; permission java.net.SocketPermission "langchain4j.dev", "accept,listen,connect,resolve"; permission java.lang.RuntimePermission "accessDeclaredMembers"; diff --git a/solr/modules/llm/build.gradle b/solr/modules/llm/build.gradle index 71213517f44..e6c8face028 100644 --- a/solr/modules/llm/build.gradle +++ b/solr/modules/llm/build.gradle @@ -25,6 +25,7 @@ dependencies { implementation 'org.apache.lucene:lucene-core' + implementation 'dev.langchain4j:langchain4j-mistral-ai:0.35.0' implementation 'dev.langchain4j:langchain4j-open-ai:0.35.0' implementation 'dev.langchain4j:langchain4j-cohere:0.35.0' implementation 'dev.langchain4j:langchain4j:0.35.0' diff --git a/solr/modules/llm/src/test-files/modelExamples/mistralai-model.json b/solr/modules/llm/src/test-files/modelExamples/mistralai-model.json new file mode 100644 index 00000000000..ca9f932aea5 --- /dev/null +++ b/solr/modules/llm/src/test-files/modelExamples/mistralai-model.json @@ -0,0 +1,8 @@ +{ + "class": "dev.langchain4j.model.mistralai.MistralAiEmbeddingModel", + "name": "mistralai-1", + "params": { + "apiKey": "apiKey-mistralAI", + "modelName": "mistral-embed" + } +} diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java index 02748f468b2..e435e42639a 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java @@ -147,4 +147,15 @@ public void loadModel_openAi_shouldLoadModelConfig() throws Exception { restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/" + modelName); } + + @Test + public void loadModel_mistralAi_shouldLoadModelConfig() throws Exception { + loadModels("mistralai-model.json"); + + final String modelName = "mistralai-1"; + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-mistralAI'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/modelName=='mistral-embed'"); + restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/" + modelName); + } } diff --git a/solr/server/etc/security.policy b/solr/server/etc/security.policy index c1caceeedb6..5e952e6882d 100644 --- a/solr/server/etc/security.policy +++ b/solr/server/etc/security.policy @@ -64,6 +64,7 @@ grant { permission java.lang.reflect.ReflectPermission "newProxyInPackage.dev.ai4j.openai4j"; permission java.net.SocketPermission "api.cohere.ai", "accept,listen,connect,resolve"; permission java.net.SocketPermission "api.openai.com", "accept,listen,connect,resolve"; + permission java.net.SocketPermission "api.mistral.ai", "accept,listen,connect,resolve"; permission java.net.SocketPermission "langchain4j.dev", "accept,listen,connect,resolve"; permission java.lang.RuntimePermission "accessDeclaredMembers"; From b38a305d03456a8a761da9fb3f2edc425c1d9e31 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Sat, 5 Oct 2024 19:47:19 +0100 Subject: [PATCH 05/65] consolidated support for core set of parameters --- .../solr/llm/embedding/EmbeddingModel.java | 20 ++++++++++++------- .../rest/ManagedEmbeddingModelStore.java | 15 +++----------- .../modelExamples/cohere-model.json | 15 +++++++------- .../modelExamples/mistralai-model.json | 7 ++++++- .../modelExamples/openai-model.json | 6 +++++- .../test/org/apache/solr/llm/TestLlmBase.java | 3 +-- .../solr/llm/store/rest/TestModelManager.java | 10 ++++++++++ 7 files changed, 46 insertions(+), 30 deletions(-) diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/EmbeddingModel.java b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/EmbeddingModel.java index 2f6d5b321ae..2531926dc8c 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/EmbeddingModel.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/EmbeddingModel.java @@ -1,7 +1,6 @@ package org.apache.solr.llm.embedding; import dev.langchain4j.data.embedding.Embedding; -import dev.langchain4j.model.cohere.CohereEmbeddingModel; import dev.langchain4j.model.embedding.DimensionAwareEmbeddingModel; import org.apache.lucene.util.Accountable; import org.apache.lucene.util.RamUsageEstimator; @@ -16,14 +15,18 @@ public class EmbeddingModel implements Accountable { private static final long BASE_RAM_BYTES = RamUsageEstimator.shallowSizeOfInstance(EmbeddingModel.class); - + public static final String TIMEOUT_PARAM = "timeout"; + public static final String LOG_REQUESTS_PARAM = "logRequests"; + public static final String LOG_RESPONSES_PARAM = "logResponses"; + public static final String MAX_SEGMENTS_PER_BATCH_PARAM = "maxSegmentsPerBatch"; + public static final String MAX_RETRIES_PARAM = "maxRetries"; + protected final String name; private final Map params; private DimensionAwareEmbeddingModel embedder; private Integer hashCode; public static EmbeddingModel getInstance( - SolrResourceLoader solrResourceLoader, String className, String name, Map params) @@ -34,17 +37,20 @@ public static EmbeddingModel getInstance( var builder = modelClass.getMethod("builder").invoke(null); for (String paramName : params.keySet()) { switch (paramName) { - case "timeout": + case TIMEOUT_PARAM: Duration timeOut = Duration.ofSeconds((Long) params.get(paramName)); builder.getClass().getMethod(paramName, Duration.class).invoke(builder, timeOut); break; - case "logRequests": + case LOG_REQUESTS_PARAM: builder.getClass().getMethod(paramName, Boolean.class).invoke(builder, params.get(paramName)); break; - case "logResponses": + case LOG_RESPONSES_PARAM: builder.getClass().getMethod(paramName, Boolean.class).invoke(builder, params.get(paramName)); break; - case "maxSegmentsPerBatch": + case MAX_SEGMENTS_PER_BATCH_PARAM: + builder.getClass().getMethod(paramName, Integer.class).invoke(builder, ((Long)params.get(paramName)).intValue()); + break; + case MAX_RETRIES_PARAM: builder.getClass().getMethod(paramName, Integer.class).invoke(builder, ((Long)params.get(paramName)).intValue()); break; default: diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java index 102de4d633b..544a3e84d66 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java @@ -37,7 +37,7 @@ import java.util.List; import java.util.Map; -/** Menaged resource for storing a model */ +/** Managed resource for storing a model */ public class ManagedEmbeddingModelStore extends ManagedResource implements ManagedResource.ChildResourceSupport { @@ -54,20 +54,15 @@ public static ManagedEmbeddingModelStore getManagedModelStore(SolrCore core) { /** the model store rest endpoint */ public static final String REST_END_POINT = "/schema/embedding-model-store"; - /** Managed model store: the name of the attribute containing all the models of a model store */ private static final String MODELS_JSON_FIELD = "models"; - /** name of the attribute containing a class */ static final String CLASS_KEY = "class"; - /** name of the attribute containing a name */ static final String NAME_KEY = "name"; - /** name of the attribute containing parameters */ static final String PARAMS_KEY = "params"; - - + private final EmbeddingModelStore store; private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); @@ -85,7 +80,6 @@ protected ManagedResourceStorage createStorage( return new ManagedResourceStorage.JsonStorage(storageIO, loader, -1); } - private Object managedData; @Override @@ -114,7 +108,7 @@ public void loadStoredModels() { private void addModelFromMap(Map modelMap) { try { - final EmbeddingModel embedder = fromEmbeddingModelMap(solrResourceLoader,modelMap); + final EmbeddingModel embedder = fromEmbeddingModelMap(modelMap); addModel(embedder); } catch (final EmbeddingModelException e) { throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, e); @@ -194,12 +188,10 @@ private static List modelsAsManagedResources(List models @SuppressWarnings("unchecked") public static EmbeddingModel fromEmbeddingModelMap( - SolrResourceLoader solrResourceLoader, Map modelMap) { final EmbeddingModel embedder = EmbeddingModel.getInstance( - solrResourceLoader, (String) modelMap.get(CLASS_KEY), // modelClassName (String) modelMap.get(NAME_KEY), // modelName (Map) modelMap.get(PARAMS_KEY)); @@ -212,7 +204,6 @@ private static LinkedHashMap toEmbeddingModelMap(EmbeddingModel modelMap.put(NAME_KEY, model.getName()); modelMap.put(CLASS_KEY, model.getClass().getName()); modelMap.put(PARAMS_KEY, model.getParams()); - return modelMap; } } diff --git a/solr/modules/llm/src/test-files/modelExamples/cohere-model.json b/solr/modules/llm/src/test-files/modelExamples/cohere-model.json index 41ef544b2ec..5eef83667b5 100644 --- a/solr/modules/llm/src/test-files/modelExamples/cohere-model.json +++ b/solr/modules/llm/src/test-files/modelExamples/cohere-model.json @@ -2,11 +2,12 @@ "class": "dev.langchain4j.model.cohere.CohereEmbeddingModel", "name": "cohere-1", "params": { - "baseUrl": "https://api.cohere.ai/v1/", - "apiKey": "apiKey-cohere", - "modelName": "embed-english-light-v3.0", - "inputType": "search_document", - "timeout": 60, - "logRequests": true, - "logResponses": true} + "baseUrl": "https://api.cohere.ai/v1/", + "apiKey": "apiKey-cohere", + "modelName": "embed-english-light-v3.0", + "inputType": "search_document", + "timeout": 60, + "logRequests": true, + "logResponses": true + } } diff --git a/solr/modules/llm/src/test-files/modelExamples/mistralai-model.json b/solr/modules/llm/src/test-files/modelExamples/mistralai-model.json index ca9f932aea5..082a1a434f1 100644 --- a/solr/modules/llm/src/test-files/modelExamples/mistralai-model.json +++ b/solr/modules/llm/src/test-files/modelExamples/mistralai-model.json @@ -2,7 +2,12 @@ "class": "dev.langchain4j.model.mistralai.MistralAiEmbeddingModel", "name": "mistralai-1", "params": { + "baseUrl": "https://api.mistral.ai/v1", "apiKey": "apiKey-mistralAI", - "modelName": "mistral-embed" + "modelName": "mistral-embed", + "timeout": 60, + "logRequests": true, + "logResponses": true, + "maxRetries": 5 } } diff --git a/solr/modules/llm/src/test-files/modelExamples/openai-model.json b/solr/modules/llm/src/test-files/modelExamples/openai-model.json index a7ff61f6b73..a90d5bd6285 100644 --- a/solr/modules/llm/src/test-files/modelExamples/openai-model.json +++ b/solr/modules/llm/src/test-files/modelExamples/openai-model.json @@ -4,6 +4,10 @@ "params": { "baseUrl": "https://api.openai.com/v1", "apiKey": "apiKey-openAI", - "modelName": "text-embedding-3-small" + "modelName": "text-embedding-3-small", + "timeout": 60, + "logRequests": true, + "logResponses": true, + "maxRetries": 5 } } diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java b/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java index b757950bd86..560342e9423 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java @@ -177,8 +177,7 @@ public static EmbeddingModel createModelFromFiles( final ManagedEmbeddingModelStore ms = getManagedModelStore(); final EmbeddingModel model = - ManagedEmbeddingModelStore.fromEmbeddingModelMap( - solrResourceLoader, mapFromJson(modelJson)); + ManagedEmbeddingModelStore.fromEmbeddingModelMap(mapFromJson(modelJson)); ms.addModel(model); return model; } diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java index e435e42639a..275679ad973 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java @@ -144,6 +144,10 @@ public void loadModel_openAi_shouldLoadModelConfig() throws Exception { assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/baseUrl=='https://api.openai.com/v1'"); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-openAI'"); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/modelName=='text-embedding-3-small'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/timeout==60"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logRequests==true"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logResponses==true"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/maxRetries==5"); restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/" + modelName); } @@ -154,8 +158,14 @@ public void loadModel_mistralAi_shouldLoadModelConfig() throws Exception { final String modelName = "mistralai-1"; assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/baseUrl=='https://api.mistral.ai/v1'"); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-mistralAI'"); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/modelName=='mistral-embed'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/timeout==60"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logRequests==true"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logResponses==true"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/maxRetries==5"); + restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/" + modelName); } } From 941fd7c45fb4d0f75af21bf4d5e11f1084246fc4 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Mon, 7 Oct 2024 16:10:39 +0100 Subject: [PATCH 06/65] introduced support for huggingface --- .../testing/randomization/policies/solr-tests.policy | 2 ++ solr/modules/llm/build.gradle | 3 ++- .../test-files/modelExamples/huggingface-model.json | 8 ++++++++ .../apache/solr/llm/store/rest/TestModelManager.java | 12 ++++++++++++ solr/server/etc/security.policy | 2 ++ 5 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 solr/modules/llm/src/test-files/modelExamples/huggingface-model.json diff --git a/gradle/testing/randomization/policies/solr-tests.policy b/gradle/testing/randomization/policies/solr-tests.policy index 6ff77610f39..534bd110cb0 100644 --- a/gradle/testing/randomization/policies/solr-tests.policy +++ b/gradle/testing/randomization/policies/solr-tests.policy @@ -60,9 +60,11 @@ grant { permission java.lang.reflect.ReflectPermission "suppressAccessChecks"; permission java.lang.reflect.ReflectPermission "newProxyInPackage.dev.langchain4j.model.cohere"; permission java.lang.reflect.ReflectPermission "newProxyInPackage.dev.ai4j.openai4j"; + permission java.lang.reflect.ReflectPermission "newProxyInPackage.dev.langchain4j.model.huggingface"; permission java.net.SocketPermission "api.cohere.ai", "accept,listen,connect,resolve"; permission java.net.SocketPermission "api.openai.com", "accept,listen,connect,resolve"; permission java.net.SocketPermission "api.mistral.ai", "accept,listen,connect,resolve"; + permission java.net.SocketPermission "api-inference.huggingface.co", "accept,listen,connect,resolve"; permission java.net.SocketPermission "langchain4j.dev", "accept,listen,connect,resolve"; permission java.lang.RuntimePermission "accessDeclaredMembers"; diff --git a/solr/modules/llm/build.gradle b/solr/modules/llm/build.gradle index e6c8face028..51ef6c19b54 100644 --- a/solr/modules/llm/build.gradle +++ b/solr/modules/llm/build.gradle @@ -24,7 +24,8 @@ dependencies { implementation project(':solr:solrj') implementation 'org.apache.lucene:lucene-core' - + + implementation 'dev.langchain4j:langchain4j-hugging-face:0.35.0' implementation 'dev.langchain4j:langchain4j-mistral-ai:0.35.0' implementation 'dev.langchain4j:langchain4j-open-ai:0.35.0' implementation 'dev.langchain4j:langchain4j-cohere:0.35.0' diff --git a/solr/modules/llm/src/test-files/modelExamples/huggingface-model.json b/solr/modules/llm/src/test-files/modelExamples/huggingface-model.json new file mode 100644 index 00000000000..f0a72cdf758 --- /dev/null +++ b/solr/modules/llm/src/test-files/modelExamples/huggingface-model.json @@ -0,0 +1,8 @@ +{ + "class": "dev.langchain4j.model.huggingface.HuggingFaceEmbeddingModel", + "name": "huggingface-1", + "params": { + "accessToken": "apiKey-huggingface", + "modelId": "sentence-transformers/all-MiniLM-L6-v2" + } +} diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java index 275679ad973..0d397006341 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java @@ -168,4 +168,16 @@ public void loadModel_mistralAi_shouldLoadModelConfig() throws Exception { restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/" + modelName); } + + @Test + public void loadModel_huggingface_shouldLoadModelConfig() throws Exception { + loadModels("huggingface-model.json"); + + final String modelName = "huggingface-1"; + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/accessToken=='apiKey-huggingface'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/modelId=='sentence-transformers/all-MiniLM-L6-v2'"); + + restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/" + modelName); + } } diff --git a/solr/server/etc/security.policy b/solr/server/etc/security.policy index 5e952e6882d..1536424cd58 100644 --- a/solr/server/etc/security.policy +++ b/solr/server/etc/security.policy @@ -62,9 +62,11 @@ grant { permission java.lang.reflect.ReflectPermission "suppressAccessChecks"; permission java.lang.reflect.ReflectPermission "newProxyInPackage.dev.langchain4j.model.cohere"; permission java.lang.reflect.ReflectPermission "newProxyInPackage.dev.ai4j.openai4j"; + permission java.lang.reflect.ReflectPermission "newProxyInPackage.dev.langchain4j.model.huggingface"; permission java.net.SocketPermission "api.cohere.ai", "accept,listen,connect,resolve"; permission java.net.SocketPermission "api.openai.com", "accept,listen,connect,resolve"; permission java.net.SocketPermission "api.mistral.ai", "accept,listen,connect,resolve"; + permission java.net.SocketPermission "api-inference.huggingface.co", "accept,listen,connect,resolve"; permission java.net.SocketPermission "langchain4j.dev", "accept,listen,connect,resolve"; permission java.lang.RuntimePermission "accessDeclaredMembers"; From 53dd7bff12f3ab73162ad40e020e1d239af0cad4 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Wed, 9 Oct 2024 12:36:58 +0100 Subject: [PATCH 07/65] fixed persistence + tests --- ...dingModel.java => SolrEmbeddingModel.java} | 24 ++++----- .../llm/search/TextEmbedderQParserPlugin.java | 4 +- .../solr/llm/store/EmbeddingModelStore.java | 16 +++--- .../rest/ManagedEmbeddingModelStore.java | 50 ++++++++----------- .../test/org/apache/solr/llm/TestLlmBase.java | 12 ++--- .../rest/TestModelManagerPersistence.java | 44 +++++++++++----- 6 files changed, 81 insertions(+), 69 deletions(-) rename solr/modules/llm/src/java/org/apache/solr/llm/embedding/{EmbeddingModel.java => SolrEmbeddingModel.java} (84%) diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/EmbeddingModel.java b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java similarity index 84% rename from solr/modules/llm/src/java/org/apache/solr/llm/embedding/EmbeddingModel.java rename to solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java index 2531926dc8c..a3df83398c3 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/EmbeddingModel.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java @@ -2,9 +2,9 @@ import dev.langchain4j.data.embedding.Embedding; import dev.langchain4j.model.embedding.DimensionAwareEmbeddingModel; +import dev.langchain4j.model.embedding.EmbeddingModel; import org.apache.lucene.util.Accountable; import org.apache.lucene.util.RamUsageEstimator; -import org.apache.solr.core.SolrResourceLoader; import org.apache.solr.llm.store.EmbeddingModelException; import java.time.Duration; @@ -12,9 +12,9 @@ import java.util.Objects; -public class EmbeddingModel implements Accountable { +public class SolrEmbeddingModel implements Accountable { private static final long BASE_RAM_BYTES = - RamUsageEstimator.shallowSizeOfInstance(EmbeddingModel.class); + RamUsageEstimator.shallowSizeOfInstance(SolrEmbeddingModel.class); public static final String TIMEOUT_PARAM = "timeout"; public static final String LOG_REQUESTS_PARAM = "logRequests"; public static final String LOG_RESPONSES_PARAM = "logResponses"; @@ -23,16 +23,16 @@ public class EmbeddingModel implements Accountable { protected final String name; private final Map params; - private DimensionAwareEmbeddingModel embedder; + private EmbeddingModel embedder; private Integer hashCode; - public static EmbeddingModel getInstance( + public static SolrEmbeddingModel getInstance( String className, String name, Map params) throws EmbeddingModelException { try { - DimensionAwareEmbeddingModel embedder; + EmbeddingModel embedder; Class modelClass = Class.forName(className); var builder = modelClass.getMethod("builder").invoke(null); for (String paramName : params.keySet()) { @@ -57,14 +57,14 @@ public static EmbeddingModel getInstance( builder.getClass().getMethod(paramName, String.class).invoke(builder, params.get(paramName)); } } - embedder = (DimensionAwareEmbeddingModel) builder.getClass().getMethod("build").invoke(builder); - return new EmbeddingModel(name, embedder, params); + embedder = (EmbeddingModel) builder.getClass().getMethod("build").invoke(builder); + return new SolrEmbeddingModel(name, embedder, params); } catch (final Exception e) { throw new EmbeddingModelException("Model loading failed for " + className, e); } } - public EmbeddingModel(String name, DimensionAwareEmbeddingModel embedder, Map params) { + public SolrEmbeddingModel(String name, EmbeddingModel embedder, Map params) { this.name = name; this.embedder = embedder; this.params = params; @@ -109,8 +109,8 @@ private int calculateHashCode() { @Override public boolean equals(Object obj) { if (this == obj) return true; - if (!(obj instanceof EmbeddingModel)) return false; - final EmbeddingModel other = (EmbeddingModel) obj; + if (!(obj instanceof SolrEmbeddingModel)) return false; + final SolrEmbeddingModel other = (SolrEmbeddingModel) obj; return Objects.equals(embedder, other.embedder) && Objects.equals(name, other.name); } @@ -119,7 +119,7 @@ public String getName() { return name; } - public DimensionAwareEmbeddingModel getEmbedder() { + public EmbeddingModel getEmbedder() { return embedder; } diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/search/TextEmbedderQParserPlugin.java b/solr/modules/llm/src/java/org/apache/solr/llm/search/TextEmbedderQParserPlugin.java index 3f188d731e3..6970e72c4de 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/search/TextEmbedderQParserPlugin.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/search/TextEmbedderQParserPlugin.java @@ -24,7 +24,7 @@ import org.apache.solr.common.params.SolrParams; import org.apache.solr.common.util.NamedList; import org.apache.solr.core.SolrResourceLoader; -import org.apache.solr.llm.embedding.EmbeddingModel; +import org.apache.solr.llm.embedding.SolrEmbeddingModel; import org.apache.solr.llm.store.rest.ManagedEmbeddingModelStore; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.rest.ManagedResource; @@ -86,7 +86,7 @@ public TextEmbedderQParser( @Override public Query parse() throws SyntaxError { final String embeddingModelName = localParams.get(EMBEDDING_MODEL); - EmbeddingModel embedder = modelStore.getModel(embeddingModelName); + SolrEmbeddingModel embedder = modelStore.getModel(embeddingModelName); final SchemaField schemaField = req.getCore().getLatestSchema().getField(getFieldName()); final DenseVectorField denseVectorType = getCheckedFieldType(schemaField); diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java b/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java index ca1f7790cc7..1a7843ef401 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java @@ -19,7 +19,7 @@ -import org.apache.solr.llm.embedding.EmbeddingModel; +import org.apache.solr.llm.embedding.SolrEmbeddingModel; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashMap; @@ -28,13 +28,13 @@ public class EmbeddingModelStore { - private final Map availableModels; + private final Map availableModels; public EmbeddingModelStore() { availableModels = new LinkedHashMap<>(); } - public synchronized EmbeddingModel getModel(String name) { + public synchronized SolrEmbeddingModel getModel(String name) { return availableModels.get(name); } @@ -42,9 +42,9 @@ public void clear() { availableModels.clear(); } - public List getModels() { - final List availableModelsValues = - new ArrayList(availableModels.values()); + public List getModels() { + final List availableModelsValues = + new ArrayList(availableModels.values()); return Collections.unmodifiableList(availableModelsValues); } @@ -53,11 +53,11 @@ public String toString() { return "ModelStore [availableModels=" + availableModels.keySet() + "]"; } - public EmbeddingModel delete(String modelName) { + public SolrEmbeddingModel delete(String modelName) { return availableModels.remove(modelName); } - public synchronized void addModel(EmbeddingModel modeldata) throws EmbeddingModelException { + public synchronized void addModel(SolrEmbeddingModel modeldata) throws EmbeddingModelException { final String name = modeldata.getName(); if (availableModels.containsKey(name)) { throw new EmbeddingModelException("model '" + name + "' already exists. Please use a different name"); diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java index 544a3e84d66..a2a32026b9f 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java @@ -20,7 +20,7 @@ import org.apache.solr.common.util.NamedList; import org.apache.solr.core.SolrCore; import org.apache.solr.core.SolrResourceLoader; -import org.apache.solr.llm.embedding.EmbeddingModel; +import org.apache.solr.llm.embedding.SolrEmbeddingModel; import org.apache.solr.llm.store.EmbeddingModelException; import org.apache.solr.llm.store.EmbeddingModelStore; import org.apache.solr.response.SolrQueryResponse; @@ -86,11 +86,6 @@ protected ManagedResourceStorage createStorage( protected void onManagedDataLoadedFromStorage(NamedList managedInitArgs, Object managedData) throws SolrException { store.clear(); - // the managed models on the disk or on zookeeper will be loaded in a lazy - // way, since we need to set the managed features first (unfortunately - // managed resources do not - // decouple the creation of a managed resource with the reading of the data - // from the storage) this.managedData = managedData; } @@ -99,23 +94,23 @@ public void loadStoredModels() { if ((managedData != null) && (managedData instanceof List)) { @SuppressWarnings({"unchecked"}) - final List> up = (List>) managedData; - for (final Map u : up) { - addModelFromMap(u); + final List> embeddingModels = (List>) managedData; + for (final Map embeddingModel : embeddingModels) { + addModelFromMap(embeddingModel); } } } private void addModelFromMap(Map modelMap) { try { - final EmbeddingModel embedder = fromEmbeddingModelMap(modelMap); + final SolrEmbeddingModel embedder = fromEmbeddingModelMap(modelMap); addModel(embedder); } catch (final EmbeddingModelException e) { throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, e); } } - public synchronized void addModel(EmbeddingModel model) throws EmbeddingModelException { + public synchronized void addModel(SolrEmbeddingModel model) throws EmbeddingModelException { try { if (log.isInfoEnabled()) { log.info("adding model {}", model.getName()); @@ -129,11 +124,10 @@ public synchronized void addModel(EmbeddingModel model) throws EmbeddingModelExc @SuppressWarnings("unchecked") @Override protected Object applyUpdatesToManagedData(Object updates) { - if (updates instanceof List) { - final List> up = (List>) updates; - for (final Map u : up) { - addModelFromMap(u); + final List> embeddingModels = (List>) updates; + for (final Map embeddingModel : embeddingModels) { + addModelFromMap(embeddingModel); } } @@ -162,7 +156,7 @@ public void doGet(BaseSolrResource endpoint, String childId) { response.add(MODELS_JSON_FIELD, modelsAsManagedResources(store.getModels())); } - public EmbeddingModel getModel(String modelName) { + public SolrEmbeddingModel getModel(String modelName) { return store.getModel(modelName); } @@ -178,31 +172,29 @@ public String toString() { * * @return the available models as a list of Maps objects */ - private static List modelsAsManagedResources(List models) { + private static List modelsAsManagedResources(List models) { final List list = new ArrayList<>(models.size()); - for (final EmbeddingModel model : models) { + for (final SolrEmbeddingModel model : models) { list.add(toEmbeddingModelMap(model)); } return list; } @SuppressWarnings("unchecked") - public static EmbeddingModel fromEmbeddingModelMap( - Map modelMap) { - - final EmbeddingModel embedder = - EmbeddingModel.getInstance( - (String) modelMap.get(CLASS_KEY), // modelClassName - (String) modelMap.get(NAME_KEY), // modelName - (Map) modelMap.get(PARAMS_KEY)); + public static SolrEmbeddingModel fromEmbeddingModelMap( + Map embeddingModel) { + final SolrEmbeddingModel embedder = + SolrEmbeddingModel.getInstance( + (String) embeddingModel.get(CLASS_KEY), // modelClassName + (String) embeddingModel.get(NAME_KEY), // modelName + (Map) embeddingModel.get(PARAMS_KEY)); return embedder; } - private static LinkedHashMap toEmbeddingModelMap(EmbeddingModel model) { + private static LinkedHashMap toEmbeddingModelMap(SolrEmbeddingModel model) { final LinkedHashMap modelMap = new LinkedHashMap<>(5, 1.0f); - modelMap.put(NAME_KEY, model.getName()); - modelMap.put(CLASS_KEY, model.getClass().getName()); + modelMap.put(CLASS_KEY, model.getEmbedder().getClass().getName()); modelMap.put(PARAMS_KEY, model.getParams()); return modelMap; } diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java b/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java index 560342e9423..2d4c6105f75 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java @@ -20,7 +20,7 @@ import org.apache.solr.common.util.Utils; import org.apache.solr.core.SolrCore; import org.apache.solr.core.SolrResourceLoader; -import org.apache.solr.llm.embedding.EmbeddingModel; +import org.apache.solr.llm.embedding.SolrEmbeddingModel; import org.apache.solr.llm.store.EmbeddingModelException; import org.apache.solr.llm.store.rest.ManagedEmbeddingModelStore; import org.apache.solr.util.RestTestBase; @@ -48,7 +48,7 @@ public class TestLlmBase extends RestTestBase { protected static final String COLLECTION = "collection1"; protected static final String CONF_DIR = COLLECTION + "/conf"; - protected static Path mstorefile = null; + protected static Path embeddingModelStoreFile = null; protected static void setuptest(boolean bulkIndex) throws Exception { @@ -77,7 +77,7 @@ protected static void setupTestInit(String solrconfig, String schema, boolean is final Path mstore = tmpConfDir.resolve(MODEL_FILE_NAME); if (isPersistent) { - mstorefile = mstore; + embeddingModelStoreFile = mstore; } if (Files.exists(mstore)) { @@ -163,20 +163,20 @@ public static void loadModels(String fileName) throws Exception { assertJPut(ManagedEmbeddingModelStore.REST_END_POINT, multipleModels, "/responseHeader/status==0"); } - public static EmbeddingModel createModelFromFiles(String modelFileName, String featureFileName) + public static SolrEmbeddingModel createModelFromFiles(String modelFileName, String featureFileName) throws EmbeddingModelException, Exception { return createModelFromFiles( modelFileName, featureFileName); } - public static EmbeddingModel createModelFromFiles( + public static SolrEmbeddingModel createModelFromFiles( String modelFileName) throws Exception { URL url = TestLlmBase.class.getResource("/modelExamples/" + modelFileName); final String modelJson = Files.readString(Path.of(url.toURI()), StandardCharsets.UTF_8); final ManagedEmbeddingModelStore ms = getManagedModelStore(); - final EmbeddingModel model = + final SolrEmbeddingModel model = ManagedEmbeddingModelStore.fromEmbeddingModelMap(mapFromJson(modelJson)); ms.addModel(model); return model; diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java index aff63dd9c1d..bd59840eef1 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java @@ -45,18 +45,18 @@ public void testModelAreStoredCompact() throws Exception { loadModel( "cohere1", CohereEmbeddingModel.class.getName(), - "{\"baseUrl\":\"cohereUrl1\"," + - "\"apiKey\":\"cohereApiKey1\"," + - "\"modelName\":\"cohereName1\"," + - "\"inputType\":1.0," + - "\"logRequests\":1.0," + - "\"logResponses\":1.0," + - "\"maxSegmentsPerBatch\":1.0" + + "{" + + "baseUrl:\"https://api.cohere.ai/v1/\"," + + "apiKey:\"cohereApiKey2\"," + + "modelName:\"embed-english-light-v3.0\"," + + "inputType:\"search_document\"," + + "logRequests:true," + + "logResponses:false" + "}"); - final String mstorecontent = Files.readString(mstorefile, StandardCharsets.UTF_8); - Object mStoreObject = Utils.fromJSONString(mstorecontent); - assertEquals(new String(Utils.toJSON(mStoreObject, -1), UTF_8), mstorecontent); + final String embeddingModelStoreContent = Files.readString(embeddingModelStoreFile, StandardCharsets.UTF_8); + Object embeddingModelStoreObject = Utils.fromJSONString(embeddingModelStoreContent); + assertEquals(new String(Utils.toJSON(embeddingModelStoreObject, -1), UTF_8), embeddingModelStoreContent); } @Test @@ -67,18 +67,38 @@ public void testModelStorePersistence() throws Exception { // load models and features from files loadModels("cohere-model.json"); - // check loaded models and features - final String modelName = "6029760550880411648"; + final String modelName = "cohere-1"; assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/baseUrl=='https://api.cohere.ai/v1/'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-cohere'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/modelName=='embed-english-light-v3.0'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/inputType=='search_document'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/timeout==60"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logRequests==true"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logResponses==true"); // check persistence after reload restTestHarness.reload(); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/baseUrl=='https://api.cohere.ai/v1/'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-cohere'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/modelName=='embed-english-light-v3.0'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/inputType=='search_document'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/timeout==60"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logRequests==true"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logResponses==true"); // check persistence after restart getJetty().stop(); getJetty().start(); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/baseUrl=='https://api.cohere.ai/v1/'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-cohere'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/modelName=='embed-english-light-v3.0'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/inputType=='search_document'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/timeout==60"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logRequests==true"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logResponses==true"); // delete loaded models and features restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/" + modelName); From 736cae4e57e13737d3813bcec84ffca81657812d Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Thu, 10 Oct 2024 21:46:53 +0100 Subject: [PATCH 08/65] added embedded query parser + tests --- solr/modules/llm/build.gradle | 1 - .../llm/embedding/SolrEmbeddingModel.java | 48 +-- .../llm/search/TextEmbedderQParserPlugin.java | 132 +++--- .../test-files/modelExamples/dummy-model.json | 4 + .../solr/collection1/conf/schema.xml | 137 ++---- .../solr/collection1/conf/solrconfig-llm.xml | 2 +- .../test/org/apache/solr/llm/TestLlmBase.java | 113 +++-- .../llm/embedding/DummyEmbeddingModel.java | 49 +++ .../llm/search/TextEmbedderQParserTest.java | 399 ++++++++++++++++++ 9 files changed, 658 insertions(+), 227 deletions(-) create mode 100644 solr/modules/llm/src/test-files/modelExamples/dummy-model.json create mode 100644 solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModel.java create mode 100644 solr/modules/llm/src/test/org/apache/solr/llm/search/TextEmbedderQParserTest.java diff --git a/solr/modules/llm/build.gradle b/solr/modules/llm/build.gradle index 51ef6c19b54..286ba041a3c 100644 --- a/solr/modules/llm/build.gradle +++ b/solr/modules/llm/build.gradle @@ -36,6 +36,5 @@ dependencies { testImplementation project(':solr:test-framework') testImplementation 'junit:junit' testImplementation 'org.hamcrest:hamcrest' - testImplementation 'commons-io:commons-io' } diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java index a3df83398c3..c5f84955cb9 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java @@ -35,26 +35,28 @@ public static SolrEmbeddingModel getInstance( EmbeddingModel embedder; Class modelClass = Class.forName(className); var builder = modelClass.getMethod("builder").invoke(null); - for (String paramName : params.keySet()) { - switch (paramName) { - case TIMEOUT_PARAM: - Duration timeOut = Duration.ofSeconds((Long) params.get(paramName)); - builder.getClass().getMethod(paramName, Duration.class).invoke(builder, timeOut); - break; - case LOG_REQUESTS_PARAM: - builder.getClass().getMethod(paramName, Boolean.class).invoke(builder, params.get(paramName)); - break; - case LOG_RESPONSES_PARAM: - builder.getClass().getMethod(paramName, Boolean.class).invoke(builder, params.get(paramName)); - break; - case MAX_SEGMENTS_PER_BATCH_PARAM: - builder.getClass().getMethod(paramName, Integer.class).invoke(builder, ((Long)params.get(paramName)).intValue()); - break; - case MAX_RETRIES_PARAM: - builder.getClass().getMethod(paramName, Integer.class).invoke(builder, ((Long)params.get(paramName)).intValue()); - break; - default: - builder.getClass().getMethod(paramName, String.class).invoke(builder, params.get(paramName)); + if (params != null) { + for (String paramName : params.keySet()) { + switch (paramName) { + case TIMEOUT_PARAM: + Duration timeOut = Duration.ofSeconds((Long) params.get(paramName)); + builder.getClass().getMethod(paramName, Duration.class).invoke(builder, timeOut); + break; + case LOG_REQUESTS_PARAM: + builder.getClass().getMethod(paramName, Boolean.class).invoke(builder, params.get(paramName)); + break; + case LOG_RESPONSES_PARAM: + builder.getClass().getMethod(paramName, Boolean.class).invoke(builder, params.get(paramName)); + break; + case MAX_SEGMENTS_PER_BATCH_PARAM: + builder.getClass().getMethod(paramName, Integer.class).invoke(builder, ((Long) params.get(paramName)).intValue()); + break; + case MAX_RETRIES_PARAM: + builder.getClass().getMethod(paramName, Integer.class).invoke(builder, ((Long) params.get(paramName)).intValue()); + break; + default: + builder.getClass().getMethod(paramName, String.class).invoke(builder, params.get(paramName)); + } } } embedder = (EmbeddingModel) builder.getClass().getMethod("build").invoke(builder); @@ -70,15 +72,11 @@ public SolrEmbeddingModel(String name, EmbeddingModel embedder, Map args, ManagedResource res) - throws SolrException { - if (res instanceof ManagedEmbeddingModelStore) { - modelStore = (ManagedEmbeddingModelStore) res; - } - if (modelStore != null) { - // now we can safely load the models - modelStore.loadStoredModels(); + @Override + public QParser createParser( + String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) { + return new TextEmbedderQParser(qstr, localParams, params, req); } - } - - public class TextEmbedderQParser extends KnnQParser { - public TextEmbedderQParser( - String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) { - super(qstr, localParams, params, req); + @Override + public void inform(ResourceLoader loader) throws IOException { + final SolrResourceLoader solrResourceLoader = (SolrResourceLoader) loader; + ManagedEmbeddingModelStore.registerManagedEmbeddingModelStore(solrResourceLoader, this); } @Override - public Query parse() throws SyntaxError { - final String embeddingModelName = localParams.get(EMBEDDING_MODEL); - SolrEmbeddingModel embedder = modelStore.getModel(embeddingModelName); + public void onManagedResourceInitialized(NamedList args, ManagedResource res) + throws SolrException { + if (res instanceof ManagedEmbeddingModelStore) { + modelStore = (ManagedEmbeddingModelStore) res; + } + if (modelStore != null) { + // now we can safely load the models + modelStore.loadStoredModels(); + } + } - final SchemaField schemaField = req.getCore().getLatestSchema().getField(getFieldName()); - final DenseVectorField denseVectorType = getCheckedFieldType(schemaField); - VectorEncoding vectorEncoding = denseVectorType.getVectorEncoding(); - final int topK = localParams.getInt(TOP_K, DEFAULT_TOP_K); + public class TextEmbedderQParser extends KnnQParser { - switch (vectorEncoding) { - case FLOAT32: { - float[] vectorToSearch = embedder.floatVectorise(qstr); - return denseVectorType.getKnnVectorQuery( - schemaField.getName(), vectorToSearch, topK, getFilterQuery()); + public TextEmbedderQParser( + String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) { + super(qstr, localParams, params, req); } - case BYTE: { - byte[] vectorToSearch = embedder.byteVectorise(qstr); - return denseVectorType.getKnnVectorQuery( - schemaField.getName(), vectorToSearch, topK, getFilterQuery()); + + @Override + public Query parse() throws SyntaxError { + checkParam(qstr, "Query string is empty, nothing to embed"); + final String embeddingModelName = localParams.get(EMBEDDING_MODEL_PARAM); + checkParam(embeddingModelName, "The 'model' parameter is missing"); + SolrEmbeddingModel embedder = modelStore.getModel(embeddingModelName); + + if (embedder != null) { + final SchemaField schemaField = req.getCore().getLatestSchema().getField(getFieldName()); + final DenseVectorField denseVectorType = getCheckedFieldType(schemaField); + int fieldDimensions = denseVectorType.getDimension(); + VectorEncoding vectorEncoding = denseVectorType.getVectorEncoding(); + final int topK = localParams.getInt(TOP_K, DEFAULT_TOP_K); + + switch (vectorEncoding) { + case FLOAT32: { + float[] vectorToSearch = embedder.vectorise(qstr); + checkVectorDimension(vectorToSearch.length, fieldDimensions); + return denseVectorType.getKnnVectorQuery( + schemaField.getName(), vectorToSearch, topK, getFilterQuery()); + } + default: + throw new SolrException( + SolrException.ErrorCode.SERVER_ERROR, + "Vector Encoding not supported in automatic text embedding: " + vectorEncoding); + } + } else { + throw new SolrException( + SolrException.ErrorCode.BAD_REQUEST, + "The model requested '" + embeddingModelName + "' can't be found in the store: " + ManagedEmbeddingModelStore.REST_END_POINT); + } } - default: - throw new SolrException( - SolrException.ErrorCode.SERVER_ERROR, - "Unexpected state. Vector Encoding: " + vectorEncoding); - } + } + private void checkVectorDimension(int inputVectorDimension, int fieldVectorDimension) { + if (inputVectorDimension != fieldVectorDimension) { + throw new SolrException( + SolrException.ErrorCode.BAD_REQUEST, + "incorrect vector dimension." + + " The vector value has size " + + inputVectorDimension + + " while it is expected a vector with size " + + fieldVectorDimension); + } + } + private void checkParam(String value, String message) { + if (value == null || value.isBlank()) { + throw new SolrException( + SolrException.ErrorCode.BAD_REQUEST, + message); + } } - } } diff --git a/solr/modules/llm/src/test-files/modelExamples/dummy-model.json b/solr/modules/llm/src/test-files/modelExamples/dummy-model.json new file mode 100644 index 00000000000..3de81640d10 --- /dev/null +++ b/solr/modules/llm/src/test-files/modelExamples/dummy-model.json @@ -0,0 +1,4 @@ +{ + "class": "org.apache.solr.llm.embedding.DummyEmbeddingModel", + "name": "dummy-1" +} diff --git a/solr/modules/llm/src/test-files/solr/collection1/conf/schema.xml b/solr/modules/llm/src/test-files/solr/collection1/conf/schema.xml index 8291b9bc7d6..3f320eddfb0 100644 --- a/solr/modules/llm/src/test-files/solr/collection1/conf/schema.xml +++ b/solr/modules/llm/src/test-files/solr/collection1/conf/schema.xml @@ -1,4 +1,4 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml b/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml index 34adb5baa51..6a267ef099a 100644 --- a/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml +++ b/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml @@ -29,7 +29,7 @@ - + diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java b/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java index 2d4c6105f75..958abc47b39 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java @@ -17,6 +17,7 @@ package org.apache.solr.llm; import org.apache.commons.io.file.PathUtils; +import org.apache.solr.common.SolrInputDocument; import org.apache.solr.common.util.Utils; import org.apache.solr.core.SolrCore; import org.apache.solr.core.SolrResourceLoader; @@ -32,6 +33,9 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.Map; public class TestLlmBase extends RestTestBase { @@ -50,7 +54,11 @@ public class TestLlmBase extends RestTestBase { protected static Path embeddingModelStoreFile = null; - + protected static String IDField = "id"; + protected static String vectorField = "vector"; + protected static String vectorField2 = "vector2"; + protected static String vectorFieldByteEncoding = "vector_byte_encoding"; + protected static void setuptest(boolean bulkIndex) throws Exception { setuptest("solrconfig-llm.xml", "schema.xml"); if (bulkIndex) prepareIndex(); @@ -195,46 +203,69 @@ private static Map mapFromJson(String json) throws EmbeddingMode protected static void prepareIndex() throws Exception { - assertU( - adoc( - "title", - "bloomberg different bla", - "description", - "bloomberg", - "id", - "6", - "popularity", - "1")); - assertU( - adoc( - "title", - "bloomberg bloomberg ", - "description", - "bloomberg", - "id", - "7", - "popularity", - "2")); - assertU( - adoc( - "title", - "bloomberg bloomberg bloomberg", - "description", - "bloomberg", - "id", - "8", - "popularity", - "3")); - assertU( - adoc( - "title", - "bloomberg bloomberg bloomberg bloomberg", - "description", - "bloomberg", - "id", - "9", - "popularity", - "5")); + List docsToIndex = prepareDocs(); + for (SolrInputDocument doc : docsToIndex) { + assertU(adoc(doc)); + } + assertU(commit()); } + + private static List prepareDocs() { + int docsCount = 13; + List docs = new ArrayList<>(docsCount); + for (int i = 1; i < docsCount + 1; i++) { + SolrInputDocument doc = new SolrInputDocument(); + doc.addField(IDField, i); + docs.add(doc); + } + + docs.get(0) + .addField(vectorField, Arrays.asList(1f, 2f, 3f, 4f)); // cosine distance vector1= 1.0 + docs.get(1) + .addField( + vectorField, Arrays.asList(1.5f, 2.5f, 3.5f, 4.5f)); // cosine distance vector1= 0.998 + docs.get(2) + .addField( + vectorField, + Arrays.asList(7.5f, 15.5f, 17.5f, 22.5f)); // cosine distance vector1= 0.992 + docs.get(3) + .addField( + vectorField, Arrays.asList(1.4f, 2.4f, 3.4f, 4.4f)); // cosine distance vector1= 0.999 + docs.get(4) + .addField(vectorField, Arrays.asList(30f, 22f, 35f, 20f)); // cosine distance vector1= 0.862 + docs.get(5) + .addField(vectorField, Arrays.asList(40f, 1f, 1f, 200f)); // cosine distance vector1= 0.756 + docs.get(6) + .addField(vectorField, Arrays.asList(5f, 10f, 20f, 40f)); // cosine distance vector1= 0.970 + docs.get(7) + .addField( + vectorField, Arrays.asList(120f, 60f, 30f, 15f)); // cosine distance vector1= 0.515 + docs.get(8) + .addField( + vectorField, Arrays.asList(200f, 50f, 100f, 25f)); // cosine distance vector1= 0.554 + docs.get(9) + .addField( + vectorField, Arrays.asList(1.8f, 2.5f, 3.7f, 4.9f)); // cosine distance vector1= 0.997 + docs.get(10) + .addField(vectorField2, Arrays.asList(1f, 2f, 3f, 4f)); // cosine distance vector2= 1 + docs.get(11) + .addField( + vectorField2, + Arrays.asList(7.5f, 15.5f, 17.5f, 22.5f)); // cosine distance vector2= 0.992 + docs.get(12) + .addField( + vectorField2, Arrays.asList(1.5f, 2.5f, 3.5f, 4.5f)); // cosine distance vector2= 0.998 + + docs.get(0).addField(vectorFieldByteEncoding, Arrays.asList(1, 2, 3, 4)); + docs.get(1).addField(vectorFieldByteEncoding, Arrays.asList(2, 2, 1, 4)); + docs.get(2).addField(vectorFieldByteEncoding, Arrays.asList(1, 2, 1, 2)); + docs.get(3).addField(vectorFieldByteEncoding, Arrays.asList(7, 2, 1, 3)); + docs.get(4).addField(vectorFieldByteEncoding, Arrays.asList(19, 2, 4, 4)); + docs.get(5).addField(vectorFieldByteEncoding, Arrays.asList(19, 2, 4, 4)); + docs.get(6).addField(vectorFieldByteEncoding, Arrays.asList(18, 2, 4, 4)); + docs.get(7).addField(vectorFieldByteEncoding, Arrays.asList(8, 3, 2, 4)); + + return docs; + } } diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModel.java b/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModel.java new file mode 100644 index 00000000000..2e6ae5dbf13 --- /dev/null +++ b/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModel.java @@ -0,0 +1,49 @@ +package org.apache.solr.llm.embedding; + +import dev.langchain4j.data.embedding.Embedding; +import dev.langchain4j.data.segment.TextSegment; +import dev.langchain4j.model.embedding.EmbeddingModel; +import dev.langchain4j.model.output.Response; + +import java.util.List; + +public class DummyEmbeddingModel implements EmbeddingModel { + public DummyEmbeddingModel() { + } + + @Override + public Response embed(String text) { + Embedding dummy = new Embedding(new float[]{1.0f,2.0f,3.0f,4.0f}); + return new Response(dummy); + } + + @Override + public Response embed(TextSegment textSegment) { + Embedding dummy = new Embedding(new float[]{1.0f,2.0f,3.0f,4.0f}); + return new Response(dummy); + } + + @Override + public Response> embedAll(List textSegments) { + return null; + } + + @Override + public int dimension() { + return 4; + } + + public static DummyEmbeddingModelBuilder builder(){ + return new DummyEmbeddingModelBuilder(); + } + + public static class DummyEmbeddingModelBuilder{ + public DummyEmbeddingModelBuilder() { + } + + public DummyEmbeddingModel build(){ + return new DummyEmbeddingModel(); + } + } + +} diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/search/TextEmbedderQParserTest.java b/solr/modules/llm/src/test/org/apache/solr/llm/search/TextEmbedderQParserTest.java new file mode 100644 index 00000000000..750b6b6126a --- /dev/null +++ b/solr/modules/llm/src/test/org/apache/solr/llm/search/TextEmbedderQParserTest.java @@ -0,0 +1,399 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.solr.llm.search; + +import org.apache.solr.client.solrj.SolrQuery; +import org.apache.solr.llm.TestLlmBase; +import org.junit.BeforeClass; +import org.junit.Test; +import java.util.Arrays; + + +public class TextEmbedderQParserTest extends TestLlmBase { + @BeforeClass + public static void init() throws Exception { + setuptest(true); + loadModels("dummy-model.json"); + } + + @Test + public void notExistentModel_shouldThrowException() throws Exception { + final String solrQuery = "{!embed model=not-exist f=vector topK=5}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/error/msg=='The model requested \\'not-exist\\' can\\'t be found in the store: /schema/embedding-model-store'", + "/error/code==400" + ); + } + + @Test + public void missingModelParam_shouldThrowException() throws Exception { + final String solrQuery = "{!embed f=vector topK=5}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/error/msg=='The \\'model\\' parameter is missing'", + "/error/code==400" + ); + } + + @Test + public void incorrectVectorFieldType_shouldThrowException() throws Exception { + final String solrQuery = "{!embed model=dummy-1 f=id topK=5}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/error/msg=='only DenseVectorField is compatible with Vector Query Parsers'", + "/error/code==400" + ); + } + + @Test + public void undefinedVectorField_shouldThrowException() throws Exception { + final String solrQuery = "{!embed model=dummy-1 f=notExistent topK=5}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/error/msg=='undefined field: \"notExistent\"'", + "/error/code==400" + ); + } + + @Test + public void missingVectorFieldParam_shouldThrowException() throws Exception { + final String solrQuery = "{!embed model=dummy-1 topK=5}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/error/msg=='the Dense Vector field \\'f\\' is missing'", + "/error/code==400" + ); + } + + @Test + public void vectorByteEncodingField_shouldRaiseException() throws Exception { + final String solrQuery = "{!embed model=dummy-1 f=vector_byte_encoding topK=5}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/error/msg=='Vector Encoding not supported in automatic text embedding: BYTE'", + "/error/code==500" + ); + } + + @Test + public void missingQueryToEmbed_shouldThrowException() throws Exception { + final String solrQuery = "{!embed model=dummy-1 f=vector topK=5}"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/error/msg=='Query string is empty, nothing to embed'", + "/error/code==400"); + } + + @Test + public void incorrectVectorToSearchDimension_shouldThrowException() throws Exception { + final String solrQuery = "{!embed model=dummy-1 f=2048_float_vector topK=5}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/error/msg=='incorrect vector dimension. The vector value has size 4 while it is expected a vector with size 2048'", + "/error/code==400"); + } + + + @Test + public void topK_shouldEmbedAndReturnOnlyTopKResults() throws Exception { + final String solrQuery = "{!embed model=dummy-1 f=vector topK=5}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/response/numFound==5]", + "/response/docs/[0]/id=='1'", + "/response/docs/[1]/id=='4'", + "/response/docs/[2]/id=='2'", + "/response/docs/[3]/id=='10'", + "/response/docs/[4]/id=='3'" + ); + } + + @Test + public void vectorFieldParam_shouldSearchOnThatField() throws Exception { + final String solrQuery = "{!embed model=dummy-1 f=vector2 topK=5}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/response/numFound==3]", + "/response/docs/[0]/id=='11'", + "/response/docs/[1]/id=='13'", + "/response/docs/[2]/id=='12'" + ); + } + + @Test + public void embeddedQuery_shouldRankBySimilarityFunction() throws Exception { + final String solrQuery = "{!embed model=dummy-1 f=vector topK=10}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/response/numFound==10]", + "/response/docs/[0]/id=='1'", + "/response/docs/[1]/id=='4'", + "/response/docs/[2]/id=='2'", + "/response/docs/[3]/id=='10'", + "/response/docs/[4]/id=='3'", + "/response/docs/[5]/id=='7'", + "/response/docs/[6]/id=='5'", + "/response/docs/[7]/id=='6'", + "/response/docs/[8]/id=='9'", + "/response/docs/[9]/id=='8'" + ); + } + + @Test + public void embeddedQueryUsedInFilter_shouldFilterResultsBeforeTheQueryExecution() throws Exception { + final String solrQuery = "{!embed model=dummy-1 f=vector topK=4}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery("id:(3 4 9 2)"); + query.setFilterQueries(solrQuery); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/response/numFound==2]", + "/response/docs/[0]/id=='2'", + "/response/docs/[1]/id=='4'" + ); + + } + + @Test + public void embeddedQueryUsedInFilters_shouldFilterResultsBeforeTheQueryExecution() throws Exception { + final String solrQuery = "{!embed model=dummy-1 f=vector topK=4}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery("id:(3 4 9 2)"); + query.setFilterQueries(solrQuery, "id:(4 20 9)"); + query.add("fl", "id"); + + // topK=4 -> 1,4,2,10 + assertJQ( + "/query" + query.toQueryString(), + "/response/numFound==1]", + "/response/docs/[0]/id=='4'" + ); + } + + @Test + public void embeddedQueryUsedInFiltersWithPreFilter_shouldFilterResultsBeforeTheQueryExecution() throws Exception { + final String solrQuery = "{!embed model=dummy-1 f=vector topK=4 preFilter='id:(1 4 7 8 9)'}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery("id:(3 4 9 2)"); + query.setFilterQueries(solrQuery, "id:(4 20 9)"); + query.add("fl", "id"); + + // topK=4 w/localparam preFilter -> 1,4,7,9 + assertJQ( + "/query" + query.toQueryString(), + "/response/numFound==2]", + "/response/docs/[0]/id=='4'", + "/response/docs/[1]/id=='9'" + ); + } + + @Test + public void embeddedQueryUsedInFilters_rejectIncludeExclude() throws Exception { + for (String fq : + Arrays.asList( + "{!embed model=dummy-1 f=vector topK=5 includeTags=xxx}hello world", + "{!embed model=dummy-1 f=vector topK=5 excludeTags=xxx}hello world")) { + final SolrQuery query = new SolrQuery(); + query.setQuery("*:*"); + query.setFilterQueries(fq); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/error/msg=='Knn Query Parser used as a filter does not support includeTags or excludeTags localparams'", + "/error/code==400"); + } + } + + @Test + public void embeddedQueryAsSubQuery() throws Exception { + final String solrQuery = "*:* AND {!embed model=dummy-1 f=vector topK=5 v='hello world'}"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.setFilterQueries("id:(2 4 7 9 8 20 3)"); + query.add("fl", "id"); + + // When knn parser is a subquery, it should not pre-filter on any global fq params + // topK -> 1,4,2,10,3 -> fq -> 4,2,3 + assertJQ( + "/query" + query.toQueryString(), + "/response/numFound==3]", + "/response/docs/[0]/id=='4'", + "/response/docs/[1]/id=='2'", + "/response/docs/[2]/id=='3'" + ); + } + + @Test + public void embeddedQueryAsSubQuery_withPreFilter() throws Exception { + final String solrQuery = "*:* AND {!embed model=dummy-1 f=vector topK=5 preFilter='id:(2 4 7 9 8 20 3)' v='hello world'}"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.add("fl", "id"); + + // knn subquery should still accept `preFilter` local param + // filt -> topK -> 4,2,3,7,9 + assertJQ( + "/query" + query.toQueryString(), + "/response/numFound==5]", + "/response/docs/[0]/id=='4'", + "/response/docs/[1]/id=='2'", + "/response/docs/[2]/id=='3'", + "/response/docs/[3]/id=='7'", + "/response/docs/[4]/id=='9'" + ); + } + + @Test + public void embeddedQueryAsSubQuery_rejectIncludeExclude() throws Exception { + for (String q : + Arrays.asList( + "{!embed model=dummy-1 f=vector topK=5 includeTags=xxx}hello world", + "{!embed model=dummy-1 f=vector topK=5 excludeTags=xxx}hello world")) { + final SolrQuery query = new SolrQuery(); + query.setQuery("*:* OR " + q); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/error/msg=='Knn Query Parser used as a sub-query does not support includeTags or excludeTags localparams'", + "/error/code==400"); + } + } + + @Test + public void embeddedQueryWithCostlyFq_shouldPerformKnnSearchWithPostFilter() throws Exception { + final String solrQuery = "{!embed model=dummy-1 f=vector topK=10}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.setFilterQueries("{!frange cache=false l=0.99}$q"); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/response/numFound==5]", + "/response/docs/[0]/id=='1'", + "/response/docs/[1]/id=='4'", + "/response/docs/[2]/id=='2'", + "/response/docs/[3]/id=='10'", + "/response/docs/[4]/id=='3'" + ); + } + + @Test + public void embeddedQueryWithFilterQueries_shouldPerformKnnSearchWithPreFiltersAndPostFilters() throws Exception { + final String solrQuery = "{!embed model=dummy-1 f=vector topK=4}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.setFilterQueries("id:(3 4 9 2)", "{!frange cache=false l=0.99}$q"); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/response/numFound==2]", + "/response/docs/[0]/id=='4'", + "/response/docs/[1]/id=='2'" + ); + } + + @Test + public void embeddedQueryWithNegativeFilterQuery_shouldPerformKnnSearchInPreFilteredResults() throws Exception { + final String solrQuery = "{!embed model=dummy-1 f=vector topK=4}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.setFilterQueries("-id:4"); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/response/numFound==4]", + "/response/docs/[0]/id=='1'", + "/response/docs/[1]/id=='2'", + "/response/docs/[2]/id=='10'", + "/response/docs/[3]/id=='3'" + ); + } + + /** + * See {@link org.apache.solr.search.ReRankQParserPlugin.ReRankQueryRescorer#combine(float, + * boolean, float)}} for more details. + */ + @Test + public void embeddedQueryAsRerank_shouldAddSimilarityFunctionScore() throws Exception { + final SolrQuery query = new SolrQuery(); + query.set("rq", "{!rerank reRankQuery=$rqq reRankDocs=4 reRankWeight=1}"); + query.set("rqq", "{!embed model=dummy-1 f=vector topK=4}hello world"); + query.setQuery("id:(3 4 9 2)"); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/response/numFound==4]", + "/response/docs/[0]/id=='4'", + "/response/docs/[1]/id=='2'", + "/response/docs/[2]/id=='3'", + "/response/docs/[3]/id=='9'" + ); + } +} From 55ab50ab117c6097aec624ad5a367c1f5cac90b9 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Thu, 10 Oct 2024 21:51:12 +0100 Subject: [PATCH 09/65] package description fixed --- .../org/apache/solr/llm/embedding/package-info.java | 11 ++--------- .../java/org/apache/solr/llm/search/package-info.java | 4 ++-- .../java/org/apache/solr/llm/store/package-info.java | 2 +- .../org/apache/solr/llm/store/rest/package-info.java | 2 +- .../solr/llm/update/processor/package-info.java | 4 ++-- solr/modules/llm/src/java/overview.html | 2 +- 6 files changed, 9 insertions(+), 16 deletions(-) diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/package-info.java b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/package-info.java index 07590e7eb05..2ee3a566b99 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/package-info.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/package-info.java @@ -15,12 +15,5 @@ * limitations under the License. */ -/** - * A {@link org.apache.solr.handler.component.SearchComponent} for dynamic, unsupervised grouping of - * search results based on the content of their text fields or contextual snippets around - * query-matching regions. - * - *

The default implementation uses clustering algorithms from the Carrot2 project. - */ -package java.org.apache.solr.llm.embedding; +/** APIs and classes for implementing embedding logic. */ +package org.apache.solr.llm.embedding; diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/search/package-info.java b/solr/modules/llm/src/java/org/apache/solr/llm/search/package-info.java index 6b43d541cf5..1cc706fc433 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/search/package-info.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/search/package-info.java @@ -15,5 +15,5 @@ * limitations under the License. */ -/** APIs and classes for implementing Neural (Dense Retrieval) QueryParsers. */ -package java.org.apache.solr.llm.search; +/** APIs and classes for implementing embedding QueryParsers. */ +package org.apache.solr.llm.search; diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/package-info.java b/solr/modules/llm/src/java/org/apache/solr/llm/store/package-info.java index 42a7a4c6710..9813a3f1ec6 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/store/package-info.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/store/package-info.java @@ -16,4 +16,4 @@ */ /** Contains feature and model store related classes. */ -package java.org.apache.solr.llm.store; +package org.apache.solr.llm.store; diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/package-info.java b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/package-info.java index 65d0caa4103..fd691657d74 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/package-info.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/package-info.java @@ -19,4 +19,4 @@ * Contains the {@link org.apache.solr.rest.ManagedResource} that encapsulate the feature and the * model stores. */ -package java.org.apache.solr.llm.store.rest; +package org.apache.solr.llm.store.rest; diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/package-info.java b/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/package-info.java index 96757069175..713f927d540 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/package-info.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/package-info.java @@ -15,5 +15,5 @@ * limitations under the License. */ -/** APIs and classes for implementing Neural (Dense Retrieval) QueryParsers. */ -package java.org.apache.solr.llm.update.processor; +/** APIs and classes for implementing embedding update processors. */ +package org.apache.solr.llm.update.processor; diff --git a/solr/modules/llm/src/java/overview.html b/solr/modules/llm/src/java/overview.html index bfa75cdd277..88667ef55f3 100644 --- a/solr/modules/llm/src/java/overview.html +++ b/solr/modules/llm/src/java/overview.html @@ -16,6 +16,6 @@ --> -Apache Solr Search Server: text clustering module +Apache Solr Search Server: text embedding module From 6b22cf93014d82dc3677188094bf1c97b12ef08b Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Sun, 27 Oct 2024 13:04:13 +0900 Subject: [PATCH 10/65] first documentation draft --- .../pages/dense-vector-search.adoc | 38 ++++++++++++++++++- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/solr/solr-ref-guide/modules/query-guide/pages/dense-vector-search.adoc b/solr/solr-ref-guide/modules/query-guide/pages/dense-vector-search.adoc index 63f5b016a04..37f9f0e2836 100644 --- a/solr/solr-ref-guide/modules/query-guide/pages/dense-vector-search.adoc +++ b/solr/solr-ref-guide/modules/query-guide/pages/dense-vector-search.adoc @@ -242,9 +242,9 @@ client.add(Arrays.asList(d1, d2)); == Query Time -Apache Solr provides two query parsers that work with dense vector fields, that each support different ways of matching documents based on vector similarity: The `knn` query parser, and the `vectorSimilarity` query parser. +Apache Solr provides three query parsers that work with dense vector fields, that each support different ways of matching documents based on vector similarity: The `knn` query parser, the `vectorSimilarity` query parser and the `embed` query parser. -Both parsers return scores for retrieved documents that are the approximate distance to the target vector (defined by the similarityFunction configured at indexing time) and both support "Pre-Filtering" the document graph to reduce the number of candidate vectors evaluated (with out needing to compute their vector similarity distances). +All parsers return scores for retrieved documents that are the approximate distance to the target vector (defined by the similarityFunction configured at indexing time) and both support "Pre-Filtering" the document graph to reduce the number of candidate vectors evaluated (without needing to compute their vector similarity distances). Common parameters for both query parsers are: @@ -308,6 +308,40 @@ Here's an example of a simple `knn` search: The search results retrieved are the k=10 nearest documents to the vector in input `[1.0, 2.0, 3.0, 4.0]`, ranked by the `similarityFunction` configured at indexing time. + +=== embed Query Parser + +The `embed` query parser encode a textual query to a vector using a dedicated Large Language Model(fine tuned for the task of encoding text to vector for sentence similarity) and matches k-nearest neighbours documents to such query vector. + +In addition to the parameters in common with the other dense-retrieval query parsers, it takes the following: + +`model`:: ++ +[%autowidth,frame=none] +|=== +s|Required |Default: none +|=== ++ +The model to use to encode the text to a vector. Must reference an existing model loaded into the `/schema/embedding-model-store`. + +`topK`:: ++ +[%autowidth,frame=none] +|=== +|Optional |Default: 10 +|=== ++ +How many k-nearest results to return. + +Here's an example of a simple `embed` search: + +[source,text] +?q={!embed model=a-model f=vector topK=10}hello world query + +The search results retrieved are the k=10 nearest documents to the vector encoded from the query `hello world query`, using the model `a-model`. + +For more details on how to work with embedding text in Apache Solr, please refer to the dedicated page: xref:embedding-text.adoc[Embedding Text] + === vectorSimilarity Query Parser The `vectorSimilarity` vector similarity query parser matches documents whose similarity with the target vector is a above a minimum threshold. From f5a387c8d8ecf9ae4ea1c234c98fb7233fd3526c Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Sun, 27 Oct 2024 14:18:26 +0900 Subject: [PATCH 11/65] second documentation draft --- .../TextEmbedderUpdateProcessor.java | 160 ++++------ .../TextEmbedderUpdateProcessorFactory.java | 252 ++++++++-------- .../solr/collection1/conf/solrconfig-llm.xml | 17 +- .../test/org/apache/solr/llm/TestLlmBase.java | 40 +++ ...extEmbedderUpdateProcessorFactoryTest.java | 60 ++++ .../query-guide/pages/embedding-text.adoc | 280 ++++++++++++++++++ 6 files changed, 586 insertions(+), 223 deletions(-) create mode 100644 solr/modules/llm/src/test/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessorFactoryTest.java create mode 100644 solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessor.java b/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessor.java index 83f37826df4..dc75165e16b 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessor.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessor.java @@ -1,104 +1,56 @@ -///* -// * Licensed to the Apache Software Foundation (ASF) under one or more -// * contributor license agreements. See the NOTICE file distributed with -// * this work for additional information regarding copyright ownership. -// * The ASF licenses this file to You under the Apache License, Version 2.0 -// * (the "License"); you may not use this file except in compliance with -// * the License. You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ -// -//package java.org.apache.solr.llm.update.processor; -// -//import org.apache.lucene.analysis.Analyzer; -//import org.apache.lucene.document.Document; -//import org.apache.lucene.index.IndexReader; -//import org.apache.lucene.index.VectorEncoding; -//import org.apache.lucene.util.BytesRef; -//import org.apache.solr.common.SolrException; -//import org.apache.solr.common.SolrInputDocument; -//import org.apache.solr.schema.DenseVectorField; -//import org.apache.solr.schema.IndexSchema; -//import org.apache.solr.schema.SchemaField; -//import org.apache.solr.update.AddUpdateCommand; -//import org.apache.solr.update.DocumentBuilder; -//import org.apache.solr.update.processor.ClassificationUpdateProcessorFactory.Algorithm; -//import org.apache.solr.update.processor.ClassificationUpdateProcessorParams; -//import org.apache.solr.update.processor.UpdateRequestProcessor; -// -//import java.io.IOException; -//import java.org.apache.solr.llm.embedding.EmbeddingModel; -//import java.util.HashMap; -//import java.util.Map; -// -//class TextEmbedderUpdateProcessor extends UpdateRequestProcessor { -///* -// private final String inputField; -// private final String outputField; -// private EmbeddingModel embedder; -// -// /** -// * Sole constructor -// * -// * @param classificationParams classification advanced params -// * @param next next update processor in the chain -// * @param indexReader index reader -// * @param schema schema -// */ -// public TextEmbedderUpdateProcessor( -// String modelName, -// String inputField, -// String outputField, -// UpdateRequestProcessor next, -// IndexReader indexReader, -// IndexSchema schema) { -// super(next); -// this.inputField = inputField; -// this.outputField = outputField; -// final SchemaField schemaField = schema.getField(outputField); -// final DenseVectorField denseVectorType = getCheckedFieldType(schemaField); -// -// embedder = new EmbeddingModel();// retrieve the embedderModel by name -// -// final DenseVectorField denseVectorType = getCheckedFieldType(schemaField); -// VectorEncoding vectorEncoding = denseVectorType.getVectorEncoding(); -// } -// -// public TextEmbedderUpdateProcessor(String inputField, String outputField, EmbeddingModel embedder, UpdateRequestProcessor next) { -// super(); -// } -// -// /** -// * @param cmd the update command in input containing the Document to classify -// * @throws IOException If there is a low-level I/O error -// */ -// @Override -// public void processAdd(AddUpdateCommand cmd) throws IOException { -// SolrInputDocument doc = cmd.getSolrInputDocument(); -// Object textToEmbed = doc.getFieldValue(inputField); -// embedder. -// doc.addField(outputField, assignedClass); -// -// if (documentClass == null) { -// Document luceneDocument = -// DocumentBuilder.toDocument(doc, cmd.getReq().getSchema(), false, true); -// List> assignedClassifications = -// classifier.getClasses(luceneDocument, maxOutputClasses); -// if (assignedClassifications != null) { -// for (ClassificationResult singleClassification : assignedClassifications) { -// String assignedClass = singleClassification.getAssignedClass().utf8ToString(); -// doc.addField(predictedClassField, assignedClass); -// } -// } -// } -// super.processAdd(cmd); -// } -// */ -//} +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.solr.llm.update.processor; + +import org.apache.solr.common.SolrInputDocument; +import org.apache.solr.llm.embedding.SolrEmbeddingModel; +import org.apache.solr.update.AddUpdateCommand; +import org.apache.solr.update.processor.UpdateRequestProcessor; + +import java.io.IOException; + +class TextEmbedderUpdateProcessor extends UpdateRequestProcessor { + private final String inputField; + private final String outputField; + private SolrEmbeddingModel embedder; + + + public TextEmbedderUpdateProcessor( + String inputField, + String outputField, + SolrEmbeddingModel embedder, + UpdateRequestProcessor next) { + super(next); + this.inputField = inputField; + this.outputField = outputField; + this.embedder = embedder; + } + + /** + * @param cmd the update command in input containing the Document to classify + * @throws IOException If there is a low-level I/O error + */ + @Override + public void processAdd(AddUpdateCommand cmd) throws IOException { + SolrInputDocument doc = cmd.getSolrInputDocument(); + String textToEmbed = doc.get(inputField).toString(); + float[] vector = embedder.vectorise(textToEmbed); + doc.addField(outputField, vector); + super.processAdd(cmd); + } +} diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessorFactory.java b/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessorFactory.java index 6a4d94f1737..0a0bf3c720a 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessorFactory.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessorFactory.java @@ -1,118 +1,134 @@ -///* -// * Licensed to the Apache Software Foundation (ASF) under one or more -// * contributor license agreements. See the NOTICE file distributed with -// * this work for additional information regarding copyright ownership. -// * The ASF licenses this file to You under the Apache License, Version 2.0 -// * (the "License"); you may not use this file except in compliance with -// * the License. You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ -// -//package java.org.apache.solr.llm.update.processor; -// -//import org.apache.lucene.index.IndexReader; -//import org.apache.lucene.search.Query; -//import org.apache.solr.common.SolrException; -//import org.apache.solr.common.cloud.SolrClassLoader; -//import org.apache.solr.common.params.SolrParams; -//import org.apache.solr.common.util.NamedList; -//import org.apache.solr.core.SolrCore; -//import org.apache.solr.core.SolrResourceLoader; -//import org.apache.solr.request.SolrQueryRequest; -//import org.apache.solr.response.SolrQueryResponse; -//import org.apache.solr.schema.DenseVectorField; -//import org.apache.solr.schema.FieldType; -//import org.apache.solr.schema.IndexSchema; -//import org.apache.solr.schema.SchemaField; -//import org.apache.solr.search.LuceneQParser; -//import org.apache.solr.search.SyntaxError; -//import org.apache.solr.update.processor.ClassificationUpdateProcessorParams; -//import org.apache.solr.update.processor.UpdateRequestProcessor; -//import org.apache.solr.update.processor.UpdateRequestProcessorFactory; -//import org.apache.solr.util.plugin.SolrCoreAware; -// -//import java.io.IOException; -//import java.org.apache.solr.llm.embedding.EmbeddingModel; -//import java.util.Locale; -// -///** -// * This class implements an UpdateProcessorFactory for the Classification Update Processor. It takes -// * in input a series of parameter that will be necessary to instantiate and use the Classifier -// * -// * @since 6.1.0 -// */ -//public class TextEmbedderUpdateProcessorFactory extends UpdateRequestProcessorFactory implements SolrCoreAware { -// private SolrResourceLoader solrResourceLoader = null; -// private static final String INPUT_FIELD_PARAM = "inputField"; -// private static final String OUTPUT_FIELD_PARAM = "outputField"; -// private static final String MODEl_NAME_PARAM = "model"; -// -// private String inputField; -// private final String outputField; -// private final String modelName; -// -// private EmbeddingModel embedder = null; -// private SolrParams params; -// -// @Override -// public void init(final NamedList args) { -// if (args != null) { -// params = args.toSolrParams(); -// inputField = -// params.get(INPUT_FIELD_PARAM); // must be a comma separated list of fields -// checkNotNull(INPUT_FIELD_PARAM, inputField); -// -// outputField = (params.get(OUTPUT_FIELD_PARAM)); -// solrResourceLoader.getCoreContainer(). -// SolrClassLoader schemaLoader = solrResourceLoader.getSchemaLoader(); -// schemaLoader. -// IndexSchema schema = req.getSchema(); -// SchemaField schemaField = schema.getField(outputField); -// final DenseVectorField denseVectorType = checkFieldType(schemaField); -// -// String modelName = params.get(MODEl_NAME_PARAM); -// solrResourceLoader.getSolrConfig(). -// } -// } -// -// private void checkNotNull(String paramName, Object param) { -// if (param == null) { -// throw new SolrException( -// SolrException.ErrorCode.SERVER_ERROR, -// "Text Embedder UpdateProcessor '" + paramName + "' can not be null"); -// } -// } -// -// @Override -// public UpdateRequestProcessor getInstance( -// SolrQueryRequest req, SolrQueryResponse rsp, UpdateRequestProcessor next) { -// -// IndexSchema schema = req.getSchema(); -// IndexReader indexReader = req.getSearcher().getIndexReader(); -// -// return new TextEmbedderUpdateProcessor(inputField, outputField, embedder, next); -// } -// -// -// protected static DenseVectorField checkFieldType(SchemaField schemaField) { -// FieldType fieldType = schemaField.getType(); -// if (!(fieldType instanceof DenseVectorField)) { -// throw new SolrException( -// SolrException.ErrorCode.BAD_REQUEST, -// "only DenseVectorField is compatible to store vectors"); -// } -// return (DenseVectorField) fieldType; -// } -// -// @Override -// public void inform(SolrCore core) { -// solrResourceLoader = core.getResourceLoader(); -// } -//} +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.solr.llm.update.processor; + +import org.apache.lucene.util.ResourceLoader; +import org.apache.lucene.util.ResourceLoaderAware; +import org.apache.solr.common.SolrException; +import org.apache.solr.common.params.SolrParams; +import org.apache.solr.common.util.NamedList; +import org.apache.solr.core.SolrResourceLoader; +import org.apache.solr.llm.embedding.SolrEmbeddingModel; +import org.apache.solr.llm.store.rest.ManagedEmbeddingModelStore; +import org.apache.solr.request.SolrQueryRequest; +import org.apache.solr.response.SolrQueryResponse; +import org.apache.solr.rest.ManagedResource; +import org.apache.solr.rest.ManagedResourceObserver; +import org.apache.solr.schema.DenseVectorField; +import org.apache.solr.schema.FieldType; +import org.apache.solr.schema.SchemaField; +import org.apache.solr.update.processor.UpdateRequestProcessor; +import org.apache.solr.update.processor.UpdateRequestProcessorFactory; + +import java.io.IOException; + +/** + * This class implements an UpdateProcessorFactory for the Text Embedder Update Processor. It takes + * in input a series of parameter that will be necessary to instantiate and use the embedder + * + */ +public class TextEmbedderUpdateProcessorFactory extends UpdateRequestProcessorFactory implements ResourceLoaderAware, ManagedResourceObserver { + private static final String INPUT_FIELD_PARAM = "inputField"; + private static final String OUTPUT_FIELD_PARAM = "outputField"; + private static final String EMBEDDING_MODEl_NAME_PARAM = "model"; + + private String inputField; + private String outputField; + private String embeddingModelName; + private ManagedEmbeddingModelStore modelStore = null; + private SolrEmbeddingModel embedder; + private SolrParams params; + + @Override + public void inform(ResourceLoader loader){ + final SolrResourceLoader solrResourceLoader = (SolrResourceLoader) loader; + ManagedEmbeddingModelStore.registerManagedEmbeddingModelStore(solrResourceLoader, this); + } + + @Override + public void onManagedResourceInitialized(NamedList args, ManagedResource res) + throws SolrException { + if (res instanceof ManagedEmbeddingModelStore) { + modelStore = (ManagedEmbeddingModelStore) res; + } + if (modelStore != null) { + modelStore.loadStoredModels(); + } + } + + @Override + public void init(final NamedList args) { + if (args != null) { + params = args.toSolrParams(); + inputField = params.get(INPUT_FIELD_PARAM); + checkNotNull(INPUT_FIELD_PARAM, inputField); + + outputField = params.get(OUTPUT_FIELD_PARAM); + checkNotNull(OUTPUT_FIELD_PARAM, outputField); + + embeddingModelName = params.get(EMBEDDING_MODEl_NAME_PARAM); + checkNotNull(EMBEDDING_MODEl_NAME_PARAM, embeddingModelName); + embedder = modelStore.getModel(embeddingModelName); + if (embedder == null) { + throw new SolrException( + SolrException.ErrorCode.BAD_REQUEST, + "The model requested '" + embeddingModelName + "' can't be found in the store: " + ManagedEmbeddingModelStore.REST_END_POINT); + } + } + } + + private void checkNotNull(String paramName, Object param) { + if (param == null) { + throw new SolrException( + SolrException.ErrorCode.SERVER_ERROR, + "Text Embedder UpdateProcessor '" + paramName + "' can not be null"); + } + } + + @Override + public UpdateRequestProcessor getInstance( + SolrQueryRequest req, SolrQueryResponse rsp, UpdateRequestProcessor next) { + + final SchemaField schemaField = req.getCore().getLatestSchema().getField(outputField); + getCheckedFieldType(schemaField); + + return new TextEmbedderUpdateProcessor(inputField, outputField, embedder, next); + } + + protected static DenseVectorField getCheckedFieldType(SchemaField schemaField) { + FieldType fieldType = schemaField.getType(); + if (!(fieldType instanceof DenseVectorField)) { + throw new SolrException( + SolrException.ErrorCode.BAD_REQUEST, + "only DenseVectorField is compatible with Vector Query Parsers"); + } + return (DenseVectorField) fieldType; + } + + public String getInputField() { + return inputField; + } + + public String getOutputField() { + return outputField; + } + + public SolrEmbeddingModel getEmbedder() { + return embedder; + } +} diff --git a/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml b/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml index 6a267ef099a..5286c90a198 100644 --- a/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml +++ b/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml @@ -44,7 +44,13 @@ - + + + embedding + + +=dedupe + @@ -55,4 +61,13 @@ + + + string_field + vector + dummy-1 + + + + diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java b/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java index 958abc47b39..551d0a15f08 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java @@ -55,6 +55,7 @@ public class TestLlmBase extends RestTestBase { protected static Path embeddingModelStoreFile = null; protected static String IDField = "id"; + protected static String stringField = "string_field"; protected static String vectorField = "vector"; protected static String vectorField2 = "vector2"; protected static String vectorFieldByteEncoding = "vector_byte_encoding"; @@ -268,4 +269,43 @@ private static List prepareDocs() { return docs; } + + protected static void indexWithEmbeddingGeneration() throws Exception { + List docsToIndex = prepareTextualDocs(); + for (SolrInputDocument doc : docsToIndex) { + assertU(adoc(doc)); + } + + assertU(commit()); + } + + private static List prepareTextualDocs() { + int docsCount = 5; + List docs = new ArrayList<>(docsCount); + for (int i = 1; i < docsCount + 1; i++) { + SolrInputDocument doc = new SolrInputDocument(); + doc.addField(IDField, i); + docs.add(doc); + } + + docs.get(0) + .addField(stringField, "Vegeta is the prince of all saiyans"); // cosine distance vector1= 1.0 + docs.get(1) + .addField( + stringField, "Goku is a saiyan raised on earth"); // cosine distance vector1= 0.998 + docs.get(2) + .addField( + stringField, + "Gohan is a saiyaman, son of Goku"); + docs.get(3) + .addField( + stringField, + "Goten is a saiyaman, second son son of Goku"); + docs.get(4) + .addField( + stringField, + "Trunks is a saiyaman, second son son of Vegeta"); + + return docs; + } } diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessorFactoryTest.java b/solr/modules/llm/src/test/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessorFactoryTest.java new file mode 100644 index 00000000000..e02838ee756 --- /dev/null +++ b/solr/modules/llm/src/test/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessorFactoryTest.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.solr.llm.update.processor; + +import org.apache.solr.SolrTestCaseJ4; +import org.apache.solr.common.SolrException; +import org.apache.solr.common.util.NamedList; +import org.apache.solr.llm.TestLlmBase; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + + +/** Tests for {@link TextEmbedderUpdateProcessorFactory} */ +public class TextEmbedderUpdateProcessorFactoryTest extends TestLlmBase { + @BeforeClass + public static void init() throws Exception { + setuptest(true); + loadModels("dummy-model.json"); + } + + private TextEmbedderUpdateProcessorFactory cFactoryToTest = + new TextEmbedderUpdateProcessorFactory(); + private NamedList args = new NamedList<>(); + + @Before + public void initArgs() { + args.add("inputField", "text"); + args.add("outputField", "vector"); + args.add("model", "dummy-1"); + } + + @Test + public void init_fullArgs_shouldInitFullParams() { + cFactoryToTest.init(args); + assertEquals(cFactoryToTest.getInputField(), "text"); + } + + @Test + public void init_emptyInputFields_shouldThrowExceptionWithDetailedMessage() { + args.removeAll("inputFields"); + SolrException e = assertThrows(SolrException.class, () -> cFactoryToTest.init(args)); + assertEquals("Classification UpdateProcessor 'inputFields' can not be null", e.getMessage()); + } + +} diff --git a/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc b/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc new file mode 100644 index 00000000000..2b0aa8f2b8b --- /dev/null +++ b/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc @@ -0,0 +1,280 @@ += Embedding Text +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +With the *Large Language Model* (or *LLM* for short) module you can interact with Large Language Models in Solr to encode text to vectors at indexing and query time. + + +== Text Embedding Concepts + +=== From Text to Vector + +The task of sentence similarity aims to encode text to vector in a way that sentences semantically similar are encoded to vectors close in a vector space (using a vector distance metric). + + +=== Large Language Models + +Large Language Models can be fine-tuned for such task. +The resulting model is able to encode text to a numerical vector. + +For additional information you can refer to this https://sease.io/2021/12/using-bert-to-improve-search-relevance.html[blog post]. + +==== Embedding Services + +Training, fine-tuning and operating such Large Language Models is expensive. + +Many companies focus on this aspect and let users access APIs to encode the text (at the price of a license fee). + +Apache Solr uses LangChain4j (add link here) to connect to such apis. + +[IMPORTANT] +==== +At the moment a subset of the embedding models supported by LangChain4j is supported by Solr. + +*Disclaimer*: Apache Solr is *in no way* affiliated to any of these corporations or services. + +If you want to add support for additional services or improve the support for the existing ones, feel free to contribute: + +* https://github.com/apache/solr/blob/main/CONTRIBUTING.md[Contributing to Solr] +==== + +== Module + +This is provided via the `llm` xref:configuration-guide:solr-modules.adoc[Solr Module] that needs to be enabled before use. + +At the moment the only supported way to interact with Large Language Models is via embedding text. + +In the future additional components to empower Solr with LLM will be added. + +== Installation of LLM + +The llm module requires the `modules/ltr/lib/solr-llm-*.jar` JARs. + +== LLM Configuration + +Large-Language-Model is a module and therefore its plugins must be configured in `solrconfig.xml`. + +=== Minimum Requirements + +* Include the required module JARs. +Note that by default paths are relative to the Solr core, so they may need adjustments to your configuration, or an explicit specification of the `$solr.install.dir`. ++ +[source,xml] +---- + +---- + +* Declaration of the `embed` query parser. ++ +[source,xml] +---- + +---- + +== Text Embedding Lifecycle + + +=== Models + +* A model encodes text to a vector. +* A model in Solr is a reference to an external API that runs the Large Language Model responsible for text embedding. + +*N.B.* the Solr embedding model specifies the parameters to access the APIs, the model doesn't run internally in Solr + + +A model is described by these parameters: + + +`class`:: ++ +[%autowidth,frame=none] +|=== +s|Required |Default: none +|=== ++ +The model implementation. +Accepted values: + +* `dev.langchain4j.model.huggingface.HuggingFaceEmbeddingModel`. +* `dev.langchain4j.model.mistralai.MistralAiEmbeddingModel`. +* `dev.langchain4j.model.openai.OpenAiEmbeddingModel`. +* `dev.langchain4j.model.cohere.CohereEmbeddingModel`. + + +`name`:: ++ +[%autowidth,frame=none] +|=== +s|Required |Default: none +|=== ++ +The identifier of your model, this is used by any component that intends to use the model (`embed` query parser). + +`params`:: ++ +[%autowidth,frame=none] +|=== +|Optional |Default: none +|=== ++ +Each model class has potentially different params. +Many are shared but for the full set of parameters of the model you are interested in please refer to the official documentation of the LangChain4j version included in Solr (link to langChain). + + +=== Supported Models +Apache Solr uses LangChain4j (add link here) to support text embedding. +The models currently supported are: + +[tabs#supported-models] +====== +Hugging Face:: ++ +==== + +[source,json] +---- +{ + "class": "dev.langchain4j.model.huggingface.HuggingFaceEmbeddingModel", + "name": "", + "params": { + "accessToken": "", + "modelId": "" + } +} +---- +==== + +MistralAI:: ++ +==== +[source,json] +---- +{ + "class": "dev.langchain4j.model.mistralai.MistralAiEmbeddingModel", + "name": "", + "params": { + "baseUrl": "https://api.mistral.ai/v1", + "apiKey": "", + "modelName": "", + "timeout": 60, + "logRequests": true, + "logResponses": true, + "maxRetries": 5 + } +} +---- +==== + +OpenAI:: ++ +==== +[source,json] +---- +{ + "class": "dev.langchain4j.model.openai.OpenAiEmbeddingModel", + "name": "", + "params": { + "baseUrl": "https://api.openai.com/v1", + "apiKey": "", + "modelName": "", + "timeout": 60, + "logRequests": true, + "logResponses": true, + "maxRetries": 5 + } +} +---- +==== + +Cohere:: ++ +==== +[source,json] +---- +{ + "class": "dev.langchain4j.model.cohere.CohereEmbeddingModel", + "name": "", + "params": { + "baseUrl": "https://api.cohere.ai/v1/", + "apiKey": "", + "modelName": "", + "inputType": "search_document", + "timeout": 60, + "logRequests": true, + "logResponses": true + } +} +---- +==== +====== + +=== Uploading a Model + +To upload the model in a `/path/myModel.json` file, please run: + +[source,bash] +---- +curl -XPUT 'http://localhost:8983/solr/techproducts/schema/embedding-model-store' --data-binary "@/path/myModel.json" -H 'Content-type:application/json' +---- + + +To view all models: + +[source,text] +http://localhost:8983/solr/techproducts/schema/embedding-model-store + +To delete the `currentModel` model: + +[source,bash] +---- +curl -XDELETE 'http://localhost:8983/solr/techproducts/schema/embedding-model-store/currentModel' +---- + + +To view the model you just uploaded please open the following URL in a browser: + +[source,text] +http://localhost:8983/solr/techproducts/schema/embedding-model-store + +.Example: /path/myModel.json +[source,json] +---- +{ + "class": "dev.langchain4j.model.openai.OpenAiEmbeddingModel", + "name": "openai-1", + "params": { + "baseUrl": "https://api.openai.com/v1", + "apiKey": "apiKey-openAI", + "modelName": "text-embedding-3-small", + "timeout": 60, + "logRequests": true, + "logResponses": true, + "maxRetries": 5 + } +} + +---- + +=== Running an embedding Query +To run a query that embeds your query text, using a model you previously uploaded is simple: + +[source,text] +?q={!embed model=a-model f=vector topK=10}hello world query + +The search results retrieved are the k=10 nearest documents to the vector encoded from the query `hello world query`, using the model `a-model`. + +For more details on how to work with vector search query parsers in Apache Solr, please refer to the dedicated page: xref:dense-vector-search.adoc[Dense Vector Search] \ No newline at end of file From aedc2c15478c275ca41ea91add263fff313854eb Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Sun, 27 Oct 2024 14:19:50 +0900 Subject: [PATCH 12/65] remove update request processor --- .../TextEmbedderUpdateProcessor.java | 56 -------- .../TextEmbedderUpdateProcessorFactory.java | 134 ------------------ .../llm/update/processor/package-info.java | 19 --- .../solr/collection1/conf/solrconfig-llm.xml | 7 - ...extEmbedderUpdateProcessorFactoryTest.java | 60 -------- 5 files changed, 276 deletions(-) delete mode 100644 solr/modules/llm/src/java/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessor.java delete mode 100644 solr/modules/llm/src/java/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessorFactory.java delete mode 100644 solr/modules/llm/src/java/org/apache/solr/llm/update/processor/package-info.java delete mode 100644 solr/modules/llm/src/test/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessorFactoryTest.java diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessor.java b/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessor.java deleted file mode 100644 index dc75165e16b..00000000000 --- a/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessor.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.solr.llm.update.processor; - -import org.apache.solr.common.SolrInputDocument; -import org.apache.solr.llm.embedding.SolrEmbeddingModel; -import org.apache.solr.update.AddUpdateCommand; -import org.apache.solr.update.processor.UpdateRequestProcessor; - -import java.io.IOException; - -class TextEmbedderUpdateProcessor extends UpdateRequestProcessor { - private final String inputField; - private final String outputField; - private SolrEmbeddingModel embedder; - - - public TextEmbedderUpdateProcessor( - String inputField, - String outputField, - SolrEmbeddingModel embedder, - UpdateRequestProcessor next) { - super(next); - this.inputField = inputField; - this.outputField = outputField; - this.embedder = embedder; - } - - /** - * @param cmd the update command in input containing the Document to classify - * @throws IOException If there is a low-level I/O error - */ - @Override - public void processAdd(AddUpdateCommand cmd) throws IOException { - SolrInputDocument doc = cmd.getSolrInputDocument(); - String textToEmbed = doc.get(inputField).toString(); - float[] vector = embedder.vectorise(textToEmbed); - doc.addField(outputField, vector); - super.processAdd(cmd); - } -} diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessorFactory.java b/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessorFactory.java deleted file mode 100644 index 0a0bf3c720a..00000000000 --- a/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessorFactory.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.solr.llm.update.processor; - -import org.apache.lucene.util.ResourceLoader; -import org.apache.lucene.util.ResourceLoaderAware; -import org.apache.solr.common.SolrException; -import org.apache.solr.common.params.SolrParams; -import org.apache.solr.common.util.NamedList; -import org.apache.solr.core.SolrResourceLoader; -import org.apache.solr.llm.embedding.SolrEmbeddingModel; -import org.apache.solr.llm.store.rest.ManagedEmbeddingModelStore; -import org.apache.solr.request.SolrQueryRequest; -import org.apache.solr.response.SolrQueryResponse; -import org.apache.solr.rest.ManagedResource; -import org.apache.solr.rest.ManagedResourceObserver; -import org.apache.solr.schema.DenseVectorField; -import org.apache.solr.schema.FieldType; -import org.apache.solr.schema.SchemaField; -import org.apache.solr.update.processor.UpdateRequestProcessor; -import org.apache.solr.update.processor.UpdateRequestProcessorFactory; - -import java.io.IOException; - -/** - * This class implements an UpdateProcessorFactory for the Text Embedder Update Processor. It takes - * in input a series of parameter that will be necessary to instantiate and use the embedder - * - */ -public class TextEmbedderUpdateProcessorFactory extends UpdateRequestProcessorFactory implements ResourceLoaderAware, ManagedResourceObserver { - private static final String INPUT_FIELD_PARAM = "inputField"; - private static final String OUTPUT_FIELD_PARAM = "outputField"; - private static final String EMBEDDING_MODEl_NAME_PARAM = "model"; - - private String inputField; - private String outputField; - private String embeddingModelName; - private ManagedEmbeddingModelStore modelStore = null; - private SolrEmbeddingModel embedder; - private SolrParams params; - - @Override - public void inform(ResourceLoader loader){ - final SolrResourceLoader solrResourceLoader = (SolrResourceLoader) loader; - ManagedEmbeddingModelStore.registerManagedEmbeddingModelStore(solrResourceLoader, this); - } - - @Override - public void onManagedResourceInitialized(NamedList args, ManagedResource res) - throws SolrException { - if (res instanceof ManagedEmbeddingModelStore) { - modelStore = (ManagedEmbeddingModelStore) res; - } - if (modelStore != null) { - modelStore.loadStoredModels(); - } - } - - @Override - public void init(final NamedList args) { - if (args != null) { - params = args.toSolrParams(); - inputField = params.get(INPUT_FIELD_PARAM); - checkNotNull(INPUT_FIELD_PARAM, inputField); - - outputField = params.get(OUTPUT_FIELD_PARAM); - checkNotNull(OUTPUT_FIELD_PARAM, outputField); - - embeddingModelName = params.get(EMBEDDING_MODEl_NAME_PARAM); - checkNotNull(EMBEDDING_MODEl_NAME_PARAM, embeddingModelName); - embedder = modelStore.getModel(embeddingModelName); - if (embedder == null) { - throw new SolrException( - SolrException.ErrorCode.BAD_REQUEST, - "The model requested '" + embeddingModelName + "' can't be found in the store: " + ManagedEmbeddingModelStore.REST_END_POINT); - } - } - } - - private void checkNotNull(String paramName, Object param) { - if (param == null) { - throw new SolrException( - SolrException.ErrorCode.SERVER_ERROR, - "Text Embedder UpdateProcessor '" + paramName + "' can not be null"); - } - } - - @Override - public UpdateRequestProcessor getInstance( - SolrQueryRequest req, SolrQueryResponse rsp, UpdateRequestProcessor next) { - - final SchemaField schemaField = req.getCore().getLatestSchema().getField(outputField); - getCheckedFieldType(schemaField); - - return new TextEmbedderUpdateProcessor(inputField, outputField, embedder, next); - } - - protected static DenseVectorField getCheckedFieldType(SchemaField schemaField) { - FieldType fieldType = schemaField.getType(); - if (!(fieldType instanceof DenseVectorField)) { - throw new SolrException( - SolrException.ErrorCode.BAD_REQUEST, - "only DenseVectorField is compatible with Vector Query Parsers"); - } - return (DenseVectorField) fieldType; - } - - public String getInputField() { - return inputField; - } - - public String getOutputField() { - return outputField; - } - - public SolrEmbeddingModel getEmbedder() { - return embedder; - } -} diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/package-info.java b/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/package-info.java deleted file mode 100644 index 713f927d540..00000000000 --- a/solr/modules/llm/src/java/org/apache/solr/llm/update/processor/package-info.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** APIs and classes for implementing embedding update processors. */ -package org.apache.solr.llm.update.processor; diff --git a/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml b/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml index 5286c90a198..4f3880d991b 100644 --- a/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml +++ b/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml @@ -43,13 +43,6 @@ ${solr.data.dir:} - - - - embedding - - -=dedupe diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessorFactoryTest.java b/solr/modules/llm/src/test/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessorFactoryTest.java deleted file mode 100644 index e02838ee756..00000000000 --- a/solr/modules/llm/src/test/org/apache/solr/llm/update/processor/TextEmbedderUpdateProcessorFactoryTest.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.solr.llm.update.processor; - -import org.apache.solr.SolrTestCaseJ4; -import org.apache.solr.common.SolrException; -import org.apache.solr.common.util.NamedList; -import org.apache.solr.llm.TestLlmBase; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - - -/** Tests for {@link TextEmbedderUpdateProcessorFactory} */ -public class TextEmbedderUpdateProcessorFactoryTest extends TestLlmBase { - @BeforeClass - public static void init() throws Exception { - setuptest(true); - loadModels("dummy-model.json"); - } - - private TextEmbedderUpdateProcessorFactory cFactoryToTest = - new TextEmbedderUpdateProcessorFactory(); - private NamedList args = new NamedList<>(); - - @Before - public void initArgs() { - args.add("inputField", "text"); - args.add("outputField", "vector"); - args.add("model", "dummy-1"); - } - - @Test - public void init_fullArgs_shouldInitFullParams() { - cFactoryToTest.init(args); - assertEquals(cFactoryToTest.getInputField(), "text"); - } - - @Test - public void init_emptyInputFields_shouldThrowExceptionWithDetailedMessage() { - args.removeAll("inputFields"); - SolrException e = assertThrows(SolrException.class, () -> cFactoryToTest.init(args)); - assertEquals("Classification UpdateProcessor 'inputFields' can not be null", e.getMessage()); - } - -} From 9e0c11ba24fb4c95387f444e3c5fa1ddbd48bc18 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Sun, 27 Oct 2024 14:25:47 +0900 Subject: [PATCH 13/65] first polishing, next step is to clean up a bit the documentation link and it's ready for a first pull request --- solr/modules/llm/README.md | 4 ++-- .../java/org/apache/solr/llm/store/EmbeddingModelStore.java | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/solr/modules/llm/README.md b/solr/modules/llm/README.md index 5a291f55bce..10194f5816e 100644 --- a/solr/modules/llm/README.md +++ b/solr/modules/llm/README.md @@ -16,6 +16,6 @@ --> The Large Language Model module for Solr provides a set of mechanisms for plugging in third party LLM implementations. -It currently provides embedding models and text vectorisation through langChain4j +It currently provides embedding models and text vectorisation through langChain4j. -See https://solr.apache.org/guide/solr/latest/query-guide/result-clustering.html for how to get started. +See https://solr.apache.org/guide/solr/latest/query-guide/result-clustering.html (change the link) for how to get started. diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java b/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java index 1a7843ef401..6b1dcdc1144 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java @@ -16,9 +16,6 @@ */ package org.apache.solr.llm.store; - - - import org.apache.solr.llm.embedding.SolrEmbeddingModel; import java.util.ArrayList; import java.util.Collections; From c49f2c192bbf0363e3956441c959aeccdb6531ac Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Tue, 29 Oct 2024 12:32:32 +0100 Subject: [PATCH 14/65] licenses and deps after check --- .../solr/llm/embedding/SolrEmbeddingModel.java | 16 ++++++++++++++++ .../solr/llm/embedding/DummyEmbeddingModel.java | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java index c5f84955cb9..aebd20c7c95 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.solr.llm.embedding; import dev.langchain4j.data.embedding.Embedding; diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModel.java b/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModel.java index 2e6ae5dbf13..a739a20d2ad 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModel.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModel.java @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.solr.llm.embedding; import dev.langchain4j.data.embedding.Embedding; From 8cf7882257ba8ca7df113fabbb02fb94958e3545 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Tue, 29 Oct 2024 13:28:24 +0100 Subject: [PATCH 15/65] licenses after check --- .../apache/solr/schema/DenseVectorField.java | 17 +- .../converter-jackson-LICENSE-ASL.txt | 202 +++++ solr/licenses/converter-jackson-NOTICE.txt | 13 + solr/licenses/jtokkit-LICENSE-MIT.txt | 21 + solr/licenses/langchain4j-LICENSE-ASL.txt | 202 +++++ solr/licenses/langchain4j-LICENSE-ASL.txt, | 202 +++++ solr/licenses/langchain4j-NOTICE.txt | 13 + .../langchain4j-cohere-LICENSE-ASL.txt | 202 +++++ solr/licenses/langchain4j-cohere-NOTICE.txt | 13 + .../langchain4j-hugging-face-LICENSE-ASL.txt | 202 +++++ .../langchain4j-hugging-face-NOTICE.txt | 13 + .../langchain4j-mistral-ai-LICENSE-ASL.txt | 202 +++++ .../langchain4j-open-ai-LICENSE-ASL.txt | 202 +++++ solr/licenses/langchain4j-open-ai-NOTICE.txt | 13 + solr/licenses/openai4j-LICENSE-ASL.txt | 201 +++++ solr/licenses/openai4j-NOTICE.txt | 11 + solr/licenses/retrofit-LICENSE-ASL.txt | 202 +++++ solr/licenses/retrofit-NOTICE.txt | 13 + .../llm/embedding/SolrEmbeddingModel.java | 222 +++--- .../llm/search/TextEmbedderQParserPlugin.java | 150 ++-- .../solr/llm/store/EmbeddingModelStore.java | 5 +- .../rest/ManagedEmbeddingModelStore.java | 27 +- .../test/org/apache/solr/llm/TestLlmBase.java | 114 ++- .../llm/embedding/DummyEmbeddingModel.java | 64 +- .../llm/search/TextEmbedderQParserTest.java | 728 +++++++++--------- .../solr/llm/store/rest/TestModelManager.java | 118 +-- .../rest/TestModelManagerPersistence.java | 80 +- 27 files changed, 2701 insertions(+), 751 deletions(-) create mode 100644 solr/licenses/converter-jackson-LICENSE-ASL.txt create mode 100644 solr/licenses/converter-jackson-NOTICE.txt create mode 100644 solr/licenses/jtokkit-LICENSE-MIT.txt create mode 100644 solr/licenses/langchain4j-LICENSE-ASL.txt create mode 100644 solr/licenses/langchain4j-LICENSE-ASL.txt, create mode 100644 solr/licenses/langchain4j-NOTICE.txt create mode 100644 solr/licenses/langchain4j-cohere-LICENSE-ASL.txt create mode 100644 solr/licenses/langchain4j-cohere-NOTICE.txt create mode 100644 solr/licenses/langchain4j-hugging-face-LICENSE-ASL.txt create mode 100644 solr/licenses/langchain4j-hugging-face-NOTICE.txt create mode 100644 solr/licenses/langchain4j-mistral-ai-LICENSE-ASL.txt create mode 100644 solr/licenses/langchain4j-open-ai-LICENSE-ASL.txt create mode 100644 solr/licenses/langchain4j-open-ai-NOTICE.txt create mode 100644 solr/licenses/openai4j-LICENSE-ASL.txt create mode 100644 solr/licenses/openai4j-NOTICE.txt create mode 100644 solr/licenses/retrofit-LICENSE-ASL.txt create mode 100644 solr/licenses/retrofit-NOTICE.txt diff --git a/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java b/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java index d8cd0f1925b..825b362118f 100644 --- a/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java +++ b/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java @@ -364,26 +364,23 @@ public ValueSource getValueSource(SchemaField field, QParser parser) { } public Query getKnnVectorQuery( - String fieldName, byte[] vectorToSearch, int topK, Query filterQuery) { + String fieldName, byte[] vectorToSearch, int topK, Query filterQuery) { DenseVectorParser vectorBuilder = - getVectorBuilder(vectorToSearch, DenseVectorParser.BuilderPhase.QUERY); + getVectorBuilder(vectorToSearch, DenseVectorParser.BuilderPhase.QUERY); - - return new KnnByteVectorQuery(fieldName, vectorToSearch, topK, filterQuery); - } + return new KnnByteVectorQuery(fieldName, vectorToSearch, topK, filterQuery); + } public Query getKnnVectorQuery( - String fieldName, float[] vectorToSearch, int topK, Query filterQuery) { + String fieldName, float[] vectorToSearch, int topK, Query filterQuery) { DenseVectorParser vectorBuilder = - getVectorBuilder(vectorToSearch, DenseVectorParser.BuilderPhase.QUERY); - + getVectorBuilder(vectorToSearch, DenseVectorParser.BuilderPhase.QUERY); return new KnnFloatVectorQuery(fieldName, vectorToSearch, topK, filterQuery); } - - + public Query getKnnVectorQuery( String fieldName, String vectorToSearch, int topK, Query filterQuery) { diff --git a/solr/licenses/converter-jackson-LICENSE-ASL.txt b/solr/licenses/converter-jackson-LICENSE-ASL.txt new file mode 100644 index 00000000000..7a4a3ea2424 --- /dev/null +++ b/solr/licenses/converter-jackson-LICENSE-ASL.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/solr/licenses/converter-jackson-NOTICE.txt b/solr/licenses/converter-jackson-NOTICE.txt new file mode 100644 index 00000000000..25fdd5926ad --- /dev/null +++ b/solr/licenses/converter-jackson-NOTICE.txt @@ -0,0 +1,13 @@ +Copyright 2013 Square, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/solr/licenses/jtokkit-LICENSE-MIT.txt b/solr/licenses/jtokkit-LICENSE-MIT.txt new file mode 100644 index 00000000000..9409cee80de --- /dev/null +++ b/solr/licenses/jtokkit-LICENSE-MIT.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Knuddels, Philip Müller + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/solr/licenses/langchain4j-LICENSE-ASL.txt b/solr/licenses/langchain4j-LICENSE-ASL.txt new file mode 100644 index 00000000000..a12e3073373 --- /dev/null +++ b/solr/licenses/langchain4j-LICENSE-ASL.txt @@ -0,0 +1,202 @@ +Apache License + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/solr/licenses/langchain4j-LICENSE-ASL.txt, b/solr/licenses/langchain4j-LICENSE-ASL.txt, new file mode 100644 index 00000000000..a12e3073373 --- /dev/null +++ b/solr/licenses/langchain4j-LICENSE-ASL.txt, @@ -0,0 +1,202 @@ +Apache License + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/solr/licenses/langchain4j-NOTICE.txt b/solr/licenses/langchain4j-NOTICE.txt new file mode 100644 index 00000000000..be32f8a2f46 --- /dev/null +++ b/solr/licenses/langchain4j-NOTICE.txt @@ -0,0 +1,13 @@ +The goal of LangChain4j is to simplify integrating LLMs into Java applications. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/solr/licenses/langchain4j-cohere-LICENSE-ASL.txt b/solr/licenses/langchain4j-cohere-LICENSE-ASL.txt new file mode 100644 index 00000000000..a12e3073373 --- /dev/null +++ b/solr/licenses/langchain4j-cohere-LICENSE-ASL.txt @@ -0,0 +1,202 @@ +Apache License + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/solr/licenses/langchain4j-cohere-NOTICE.txt b/solr/licenses/langchain4j-cohere-NOTICE.txt new file mode 100644 index 00000000000..be32f8a2f46 --- /dev/null +++ b/solr/licenses/langchain4j-cohere-NOTICE.txt @@ -0,0 +1,13 @@ +The goal of LangChain4j is to simplify integrating LLMs into Java applications. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/solr/licenses/langchain4j-hugging-face-LICENSE-ASL.txt b/solr/licenses/langchain4j-hugging-face-LICENSE-ASL.txt new file mode 100644 index 00000000000..a12e3073373 --- /dev/null +++ b/solr/licenses/langchain4j-hugging-face-LICENSE-ASL.txt @@ -0,0 +1,202 @@ +Apache License + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/solr/licenses/langchain4j-hugging-face-NOTICE.txt b/solr/licenses/langchain4j-hugging-face-NOTICE.txt new file mode 100644 index 00000000000..be32f8a2f46 --- /dev/null +++ b/solr/licenses/langchain4j-hugging-face-NOTICE.txt @@ -0,0 +1,13 @@ +The goal of LangChain4j is to simplify integrating LLMs into Java applications. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/solr/licenses/langchain4j-mistral-ai-LICENSE-ASL.txt b/solr/licenses/langchain4j-mistral-ai-LICENSE-ASL.txt new file mode 100644 index 00000000000..a12e3073373 --- /dev/null +++ b/solr/licenses/langchain4j-mistral-ai-LICENSE-ASL.txt @@ -0,0 +1,202 @@ +Apache License + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/solr/licenses/langchain4j-open-ai-LICENSE-ASL.txt b/solr/licenses/langchain4j-open-ai-LICENSE-ASL.txt new file mode 100644 index 00000000000..a12e3073373 --- /dev/null +++ b/solr/licenses/langchain4j-open-ai-LICENSE-ASL.txt @@ -0,0 +1,202 @@ +Apache License + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/solr/licenses/langchain4j-open-ai-NOTICE.txt b/solr/licenses/langchain4j-open-ai-NOTICE.txt new file mode 100644 index 00000000000..be32f8a2f46 --- /dev/null +++ b/solr/licenses/langchain4j-open-ai-NOTICE.txt @@ -0,0 +1,13 @@ +The goal of LangChain4j is to simplify integrating LLMs into Java applications. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/solr/licenses/openai4j-LICENSE-ASL.txt b/solr/licenses/openai4j-LICENSE-ASL.txt new file mode 100644 index 00000000000..f49a4e16e68 --- /dev/null +++ b/solr/licenses/openai4j-LICENSE-ASL.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/solr/licenses/openai4j-NOTICE.txt b/solr/licenses/openai4j-NOTICE.txt new file mode 100644 index 00000000000..60508a114b6 --- /dev/null +++ b/solr/licenses/openai4j-NOTICE.txt @@ -0,0 +1,11 @@ +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/solr/licenses/retrofit-LICENSE-ASL.txt b/solr/licenses/retrofit-LICENSE-ASL.txt new file mode 100644 index 00000000000..7a4a3ea2424 --- /dev/null +++ b/solr/licenses/retrofit-LICENSE-ASL.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/solr/licenses/retrofit-NOTICE.txt b/solr/licenses/retrofit-NOTICE.txt new file mode 100644 index 00000000000..25fdd5926ad --- /dev/null +++ b/solr/licenses/retrofit-NOTICE.txt @@ -0,0 +1,13 @@ +Copyright 2013 Square, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java index aebd20c7c95..4d07b38197b 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java @@ -19,129 +19,139 @@ import dev.langchain4j.data.embedding.Embedding; import dev.langchain4j.model.embedding.DimensionAwareEmbeddingModel; import dev.langchain4j.model.embedding.EmbeddingModel; -import org.apache.lucene.util.Accountable; -import org.apache.lucene.util.RamUsageEstimator; -import org.apache.solr.llm.store.EmbeddingModelException; - import java.time.Duration; import java.util.Map; import java.util.Objects; - +import org.apache.lucene.util.Accountable; +import org.apache.lucene.util.RamUsageEstimator; +import org.apache.solr.llm.store.EmbeddingModelException; public class SolrEmbeddingModel implements Accountable { - private static final long BASE_RAM_BYTES = - RamUsageEstimator.shallowSizeOfInstance(SolrEmbeddingModel.class); - public static final String TIMEOUT_PARAM = "timeout"; - public static final String LOG_REQUESTS_PARAM = "logRequests"; - public static final String LOG_RESPONSES_PARAM = "logResponses"; - public static final String MAX_SEGMENTS_PER_BATCH_PARAM = "maxSegmentsPerBatch"; - public static final String MAX_RETRIES_PARAM = "maxRetries"; + private static final long BASE_RAM_BYTES = + RamUsageEstimator.shallowSizeOfInstance(SolrEmbeddingModel.class); + public static final String TIMEOUT_PARAM = "timeout"; + public static final String LOG_REQUESTS_PARAM = "logRequests"; + public static final String LOG_RESPONSES_PARAM = "logResponses"; + public static final String MAX_SEGMENTS_PER_BATCH_PARAM = "maxSegmentsPerBatch"; + public static final String MAX_RETRIES_PARAM = "maxRetries"; - protected final String name; - private final Map params; - private EmbeddingModel embedder; - private Integer hashCode; + protected final String name; + private final Map params; + private EmbeddingModel embedder; + private Integer hashCode; - public static SolrEmbeddingModel getInstance( - String className, - String name, - Map params) - throws EmbeddingModelException { - try { - EmbeddingModel embedder; - Class modelClass = Class.forName(className); - var builder = modelClass.getMethod("builder").invoke(null); - if (params != null) { - for (String paramName : params.keySet()) { - switch (paramName) { - case TIMEOUT_PARAM: - Duration timeOut = Duration.ofSeconds((Long) params.get(paramName)); - builder.getClass().getMethod(paramName, Duration.class).invoke(builder, timeOut); - break; - case LOG_REQUESTS_PARAM: - builder.getClass().getMethod(paramName, Boolean.class).invoke(builder, params.get(paramName)); - break; - case LOG_RESPONSES_PARAM: - builder.getClass().getMethod(paramName, Boolean.class).invoke(builder, params.get(paramName)); - break; - case MAX_SEGMENTS_PER_BATCH_PARAM: - builder.getClass().getMethod(paramName, Integer.class).invoke(builder, ((Long) params.get(paramName)).intValue()); - break; - case MAX_RETRIES_PARAM: - builder.getClass().getMethod(paramName, Integer.class).invoke(builder, ((Long) params.get(paramName)).intValue()); - break; - default: - builder.getClass().getMethod(paramName, String.class).invoke(builder, params.get(paramName)); - } - } - } - embedder = (EmbeddingModel) builder.getClass().getMethod("build").invoke(builder); - return new SolrEmbeddingModel(name, embedder, params); - } catch (final Exception e) { - throw new EmbeddingModelException("Model loading failed for " + className, e); + public static SolrEmbeddingModel getInstance( + String className, String name, Map params) throws EmbeddingModelException { + try { + EmbeddingModel embedder; + Class modelClass = Class.forName(className); + var builder = modelClass.getMethod("builder").invoke(null); + if (params != null) { + for (String paramName : params.keySet()) { + switch (paramName) { + case TIMEOUT_PARAM: + Duration timeOut = Duration.ofSeconds((Long) params.get(paramName)); + builder.getClass().getMethod(paramName, Duration.class).invoke(builder, timeOut); + break; + case LOG_REQUESTS_PARAM: + builder + .getClass() + .getMethod(paramName, Boolean.class) + .invoke(builder, params.get(paramName)); + break; + case LOG_RESPONSES_PARAM: + builder + .getClass() + .getMethod(paramName, Boolean.class) + .invoke(builder, params.get(paramName)); + break; + case MAX_SEGMENTS_PER_BATCH_PARAM: + builder + .getClass() + .getMethod(paramName, Integer.class) + .invoke(builder, ((Long) params.get(paramName)).intValue()); + break; + case MAX_RETRIES_PARAM: + builder + .getClass() + .getMethod(paramName, Integer.class) + .invoke(builder, ((Long) params.get(paramName)).intValue()); + break; + default: + builder + .getClass() + .getMethod(paramName, String.class) + .invoke(builder, params.get(paramName)); + } } + } + embedder = (EmbeddingModel) builder.getClass().getMethod("build").invoke(builder); + return new SolrEmbeddingModel(name, embedder, params); + } catch (final Exception e) { + throw new EmbeddingModelException("Model loading failed for " + className, e); } - - public SolrEmbeddingModel(String name, EmbeddingModel embedder, Map params) { - this.name = name; - this.embedder = embedder; - this.params = params; - } + } - public float[] vectorise(String text){ - Embedding vector = embedder.embed(text).content(); - return vector.vector(); - } + public SolrEmbeddingModel(String name, EmbeddingModel embedder, Map params) { + this.name = name; + this.embedder = embedder; + this.params = params; + } - @Override - public String toString() { - return getClass().getSimpleName() + "(name=" + getName() + ")"; - } + public float[] vectorise(String text) { + Embedding vector = embedder.embed(text).content(); + return vector.vector(); + } - @Override - public long ramBytesUsed() { - return BASE_RAM_BYTES - + RamUsageEstimator.sizeOfObject(name) - + RamUsageEstimator.sizeOfObject(embedder); - } - @Override - public int hashCode() { - if (hashCode == null) { - hashCode = calculateHashCode(); - } - return hashCode; - } + @Override + public String toString() { + return getClass().getSimpleName() + "(name=" + getName() + ")"; + } - private int calculateHashCode() { - final int prime = 31; - int result = 1; - result = (prime * result) + Objects.hashCode(name); - result = (prime * result) + Objects.hashCode(embedder); - return result; - } + @Override + public long ramBytesUsed() { + return BASE_RAM_BYTES + + RamUsageEstimator.sizeOfObject(name) + + RamUsageEstimator.sizeOfObject(embedder); + } - @Override - public boolean equals(Object obj) { - if (this == obj) return true; - if (!(obj instanceof SolrEmbeddingModel)) return false; - final SolrEmbeddingModel other = (SolrEmbeddingModel) obj; - return Objects.equals(embedder, other.embedder) - && Objects.equals(name, other.name); + @Override + public int hashCode() { + if (hashCode == null) { + hashCode = calculateHashCode(); } + return hashCode; + } - public String getName() { - return name; - } + private int calculateHashCode() { + final int prime = 31; + int result = 1; + result = (prime * result) + Objects.hashCode(name); + result = (prime * result) + Objects.hashCode(embedder); + return result; + } - public EmbeddingModel getEmbedder() { - return embedder; - } + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (!(obj instanceof SolrEmbeddingModel)) return false; + final SolrEmbeddingModel other = (SolrEmbeddingModel) obj; + return Objects.equals(embedder, other.embedder) && Objects.equals(name, other.name); + } - public void setEmbedder(DimensionAwareEmbeddingModel embedder) { - this.embedder = embedder; - } + public String getName() { + return name; + } - public Map getParams() { - return params; - } + public EmbeddingModel getEmbedder() { + return embedder; + } + + public void setEmbedder(DimensionAwareEmbeddingModel embedder) { + this.embedder = embedder; + } + + public Map getParams() { + return params; + } } diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/search/TextEmbedderQParserPlugin.java b/solr/modules/llm/src/java/org/apache/solr/llm/search/TextEmbedderQParserPlugin.java index 61088f34f4e..030962ed30c 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/search/TextEmbedderQParserPlugin.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/search/TextEmbedderQParserPlugin.java @@ -16,6 +16,7 @@ */ package org.apache.solr.llm.search; +import java.io.IOException; import org.apache.lucene.index.VectorEncoding; import org.apache.lucene.search.Query; import org.apache.lucene.util.ResourceLoader; @@ -35,100 +36,101 @@ import org.apache.solr.search.QParserPlugin; import org.apache.solr.search.SyntaxError; import org.apache.solr.search.neural.KnnQParser; -import java.io.IOException; /** - * A neural query parser that embed the query and then run K-nearest neighbors search on Dense Vector fields. See Wiki page + * A neural query parser that embed the query and then run K-nearest neighbors search on Dense + * Vector fields. See Wiki page * https://solr.apache.org/guide/solr/latest/query-guide/dense-vector-search.html */ public class TextEmbedderQParserPlugin extends QParserPlugin - implements ResourceLoaderAware, ManagedResourceObserver { - public static final String EMBEDDING_MODEL_PARAM = "model"; - private ManagedEmbeddingModelStore modelStore = null; + implements ResourceLoaderAware, ManagedResourceObserver { + public static final String EMBEDDING_MODEL_PARAM = "model"; + private ManagedEmbeddingModelStore modelStore = null; + @Override + public QParser createParser( + String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) { + return new TextEmbedderQParser(qstr, localParams, params, req); + } - @Override - public QParser createParser( - String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) { - return new TextEmbedderQParser(qstr, localParams, params, req); - } + @Override + public void inform(ResourceLoader loader) throws IOException { + final SolrResourceLoader solrResourceLoader = (SolrResourceLoader) loader; + ManagedEmbeddingModelStore.registerManagedEmbeddingModelStore(solrResourceLoader, this); + } - @Override - public void inform(ResourceLoader loader) throws IOException { - final SolrResourceLoader solrResourceLoader = (SolrResourceLoader) loader; - ManagedEmbeddingModelStore.registerManagedEmbeddingModelStore(solrResourceLoader, this); + @Override + public void onManagedResourceInitialized(NamedList args, ManagedResource res) + throws SolrException { + if (res instanceof ManagedEmbeddingModelStore) { + modelStore = (ManagedEmbeddingModelStore) res; } - - @Override - public void onManagedResourceInitialized(NamedList args, ManagedResource res) - throws SolrException { - if (res instanceof ManagedEmbeddingModelStore) { - modelStore = (ManagedEmbeddingModelStore) res; - } - if (modelStore != null) { - // now we can safely load the models - modelStore.loadStoredModels(); - } + if (modelStore != null) { + // now we can safely load the models + modelStore.loadStoredModels(); } + } - public class TextEmbedderQParser extends KnnQParser { + public class TextEmbedderQParser extends KnnQParser { - public TextEmbedderQParser( - String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) { - super(qstr, localParams, params, req); - } + public TextEmbedderQParser( + String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) { + super(qstr, localParams, params, req); + } - @Override - public Query parse() throws SyntaxError { - checkParam(qstr, "Query string is empty, nothing to embed"); - final String embeddingModelName = localParams.get(EMBEDDING_MODEL_PARAM); - checkParam(embeddingModelName, "The 'model' parameter is missing"); - SolrEmbeddingModel embedder = modelStore.getModel(embeddingModelName); + @Override + public Query parse() throws SyntaxError { + checkParam(qstr, "Query string is empty, nothing to embed"); + final String embeddingModelName = localParams.get(EMBEDDING_MODEL_PARAM); + checkParam(embeddingModelName, "The 'model' parameter is missing"); + SolrEmbeddingModel embedder = modelStore.getModel(embeddingModelName); - if (embedder != null) { - final SchemaField schemaField = req.getCore().getLatestSchema().getField(getFieldName()); - final DenseVectorField denseVectorType = getCheckedFieldType(schemaField); - int fieldDimensions = denseVectorType.getDimension(); - VectorEncoding vectorEncoding = denseVectorType.getVectorEncoding(); - final int topK = localParams.getInt(TOP_K, DEFAULT_TOP_K); + if (embedder != null) { + final SchemaField schemaField = req.getCore().getLatestSchema().getField(getFieldName()); + final DenseVectorField denseVectorType = getCheckedFieldType(schemaField); + int fieldDimensions = denseVectorType.getDimension(); + VectorEncoding vectorEncoding = denseVectorType.getVectorEncoding(); + final int topK = localParams.getInt(TOP_K, DEFAULT_TOP_K); - switch (vectorEncoding) { - case FLOAT32: { - float[] vectorToSearch = embedder.vectorise(qstr); - checkVectorDimension(vectorToSearch.length, fieldDimensions); - return denseVectorType.getKnnVectorQuery( - schemaField.getName(), vectorToSearch, topK, getFilterQuery()); - } - default: - throw new SolrException( - SolrException.ErrorCode.SERVER_ERROR, - "Vector Encoding not supported in automatic text embedding: " + vectorEncoding); - } - } else { - throw new SolrException( - SolrException.ErrorCode.BAD_REQUEST, - "The model requested '" + embeddingModelName + "' can't be found in the store: " + ManagedEmbeddingModelStore.REST_END_POINT); + switch (vectorEncoding) { + case FLOAT32: + { + float[] vectorToSearch = embedder.vectorise(qstr); + checkVectorDimension(vectorToSearch.length, fieldDimensions); + return denseVectorType.getKnnVectorQuery( + schemaField.getName(), vectorToSearch, topK, getFilterQuery()); } + default: + throw new SolrException( + SolrException.ErrorCode.SERVER_ERROR, + "Vector Encoding not supported in automatic text embedding: " + vectorEncoding); } + } else { + throw new SolrException( + SolrException.ErrorCode.BAD_REQUEST, + "The model requested '" + + embeddingModelName + + "' can't be found in the store: " + + ManagedEmbeddingModelStore.REST_END_POINT); + } } + } - private void checkVectorDimension(int inputVectorDimension, int fieldVectorDimension) { - if (inputVectorDimension != fieldVectorDimension) { - throw new SolrException( - SolrException.ErrorCode.BAD_REQUEST, - "incorrect vector dimension." - + " The vector value has size " - + inputVectorDimension - + " while it is expected a vector with size " - + fieldVectorDimension); - } + private void checkVectorDimension(int inputVectorDimension, int fieldVectorDimension) { + if (inputVectorDimension != fieldVectorDimension) { + throw new SolrException( + SolrException.ErrorCode.BAD_REQUEST, + "incorrect vector dimension." + + " The vector value has size " + + inputVectorDimension + + " while it is expected a vector with size " + + fieldVectorDimension); } + } - private void checkParam(String value, String message) { - if (value == null || value.isBlank()) { - throw new SolrException( - SolrException.ErrorCode.BAD_REQUEST, - message); - } + private void checkParam(String value, String message) { + if (value == null || value.isBlank()) { + throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, message); } + } } diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java b/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java index 6b1dcdc1144..c3aa29eb5b5 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java @@ -16,12 +16,12 @@ */ package org.apache.solr.llm.store; -import org.apache.solr.llm.embedding.SolrEmbeddingModel; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import org.apache.solr.llm.embedding.SolrEmbeddingModel; public class EmbeddingModelStore { @@ -57,7 +57,8 @@ public SolrEmbeddingModel delete(String modelName) { public synchronized void addModel(SolrEmbeddingModel modeldata) throws EmbeddingModelException { final String name = modeldata.getName(); if (availableModels.containsKey(name)) { - throw new EmbeddingModelException("model '" + name + "' already exists. Please use a different name"); + throw new EmbeddingModelException( + "model '" + name + "' already exists. Please use a different name"); } availableModels.put(modeldata.getName(), modeldata); } diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java index a2a32026b9f..8ed0620c5a2 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java @@ -16,6 +16,11 @@ */ package org.apache.solr.llm.store.rest; +import java.lang.invoke.MethodHandles; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; import org.apache.solr.common.SolrException; import org.apache.solr.common.util.NamedList; import org.apache.solr.core.SolrCore; @@ -31,12 +36,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.lang.invoke.MethodHandles; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - /** Managed resource for storing a model */ public class ManagedEmbeddingModelStore extends ManagedResource implements ManagedResource.ChildResourceSupport { @@ -45,7 +44,8 @@ public static void registerManagedEmbeddingModelStore( SolrResourceLoader solrResourceLoader, ManagedResourceObserver managedResourceObserver) { solrResourceLoader .getManagedResourceRegistry() - .registerManagedResource(REST_END_POINT, ManagedEmbeddingModelStore.class, managedResourceObserver); + .registerManagedResource( + REST_END_POINT, ManagedEmbeddingModelStore.class, managedResourceObserver); } public static ManagedEmbeddingModelStore getManagedModelStore(SolrCore core) { @@ -54,15 +54,19 @@ public static ManagedEmbeddingModelStore getManagedModelStore(SolrCore core) { /** the model store rest endpoint */ public static final String REST_END_POINT = "/schema/embedding-model-store"; + /** Managed model store: the name of the attribute containing all the models of a model store */ private static final String MODELS_JSON_FIELD = "models"; + /** name of the attribute containing a class */ static final String CLASS_KEY = "class"; + /** name of the attribute containing a name */ static final String NAME_KEY = "name"; + /** name of the attribute containing parameters */ static final String PARAMS_KEY = "params"; - + private final EmbeddingModelStore store; private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); @@ -79,7 +83,7 @@ protected ManagedResourceStorage createStorage( ManagedResourceStorage.StorageIO storageIO, SolrResourceLoader loader) throws SolrException { return new ManagedResourceStorage.JsonStorage(storageIO, loader, -1); } - + private Object managedData; @Override @@ -181,10 +185,9 @@ private static List modelsAsManagedResources(List mo } @SuppressWarnings("unchecked") - public static SolrEmbeddingModel fromEmbeddingModelMap( - Map embeddingModel) { + public static SolrEmbeddingModel fromEmbeddingModelMap(Map embeddingModel) { final SolrEmbeddingModel embedder = - SolrEmbeddingModel.getInstance( + SolrEmbeddingModel.getInstance( (String) embeddingModel.get(CLASS_KEY), // modelClassName (String) embeddingModel.get(NAME_KEY), // modelName (Map) embeddingModel.get(PARAMS_KEY)); diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java b/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java index 551d0a15f08..5d08b3b9ead 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java @@ -16,6 +16,15 @@ */ package org.apache.solr.llm; +import java.lang.invoke.MethodHandles; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; import org.apache.commons.io.file.PathUtils; import org.apache.solr.common.SolrInputDocument; import org.apache.solr.common.util.Utils; @@ -28,16 +37,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.lang.invoke.MethodHandles; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; - public class TestLlmBase extends RestTestBase { private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); @@ -59,7 +58,7 @@ public class TestLlmBase extends RestTestBase { protected static String vectorField = "vector"; protected static String vectorField2 = "vector2"; protected static String vectorFieldByteEncoding = "vector_byte_encoding"; - + protected static void setuptest(boolean bulkIndex) throws Exception { setuptest("solrconfig-llm.xml", "schema.xml"); if (bulkIndex) prepareIndex(); @@ -88,7 +87,7 @@ protected static void setupTestInit(String solrconfig, String schema, boolean is if (isPersistent) { embeddingModelStoreFile = mstore; } - + if (Files.exists(mstore)) { if (log.isInfoEnabled()) { log.info("remove model store config file in {}", mstore.toAbsolutePath()); @@ -144,8 +143,7 @@ public static void makeRestTestHarnessNull() { } /** produces a model encoded in json * */ - public static String getModelInJson( - String name, String className, String params) { + public static String getModelInJson(String name, String className, String params) { final StringBuilder sb = new StringBuilder(); sb.append("{\n"); sb.append("\"name\":").append('"').append(name).append('"').append(",\n"); @@ -158,8 +156,7 @@ public static String getModelInJson( return sb.toString(); } - protected static void loadModel( - String name, String className, String params) throws Exception { + protected static void loadModel(String name, String className, String params) throws Exception { final String model = getModelInJson(name, className, params); log.info("loading model \n{} ", model); assertJPut(ManagedEmbeddingModelStore.REST_END_POINT, model, "/responseHeader/status==0"); @@ -169,18 +166,16 @@ public static void loadModels(String fileName) throws Exception { final URL url = TestLlmBase.class.getResource("/modelExamples/" + fileName); final String multipleModels = Files.readString(Path.of(url.toURI()), StandardCharsets.UTF_8); - assertJPut(ManagedEmbeddingModelStore.REST_END_POINT, multipleModels, "/responseHeader/status==0"); + assertJPut( + ManagedEmbeddingModelStore.REST_END_POINT, multipleModels, "/responseHeader/status==0"); } - public static SolrEmbeddingModel createModelFromFiles(String modelFileName, String featureFileName) - throws EmbeddingModelException, Exception { - return createModelFromFiles( - modelFileName, featureFileName); + public static SolrEmbeddingModel createModelFromFiles( + String modelFileName, String featureFileName) throws EmbeddingModelException, Exception { + return createModelFromFiles(modelFileName, featureFileName); } - public static SolrEmbeddingModel createModelFromFiles( - String modelFileName) - throws Exception { + public static SolrEmbeddingModel createModelFromFiles(String modelFileName) throws Exception { URL url = TestLlmBase.class.getResource("/modelExamples/" + modelFileName); final String modelJson = Files.readString(Path.of(url.toURI()), StandardCharsets.UTF_8); final ManagedEmbeddingModelStore ms = getManagedModelStore(); @@ -202,7 +197,6 @@ private static Map mapFromJson(String json) throws EmbeddingMode return (Map) parsedJson; } - protected static void prepareIndex() throws Exception { List docsToIndex = prepareDocs(); for (SolrInputDocument doc : docsToIndex) { @@ -222,41 +216,41 @@ private static List prepareDocs() { } docs.get(0) - .addField(vectorField, Arrays.asList(1f, 2f, 3f, 4f)); // cosine distance vector1= 1.0 + .addField(vectorField, Arrays.asList(1f, 2f, 3f, 4f)); // cosine distance vector1= 1.0 docs.get(1) - .addField( - vectorField, Arrays.asList(1.5f, 2.5f, 3.5f, 4.5f)); // cosine distance vector1= 0.998 + .addField( + vectorField, Arrays.asList(1.5f, 2.5f, 3.5f, 4.5f)); // cosine distance vector1= 0.998 docs.get(2) - .addField( - vectorField, - Arrays.asList(7.5f, 15.5f, 17.5f, 22.5f)); // cosine distance vector1= 0.992 + .addField( + vectorField, + Arrays.asList(7.5f, 15.5f, 17.5f, 22.5f)); // cosine distance vector1= 0.992 docs.get(3) - .addField( - vectorField, Arrays.asList(1.4f, 2.4f, 3.4f, 4.4f)); // cosine distance vector1= 0.999 + .addField( + vectorField, Arrays.asList(1.4f, 2.4f, 3.4f, 4.4f)); // cosine distance vector1= 0.999 docs.get(4) - .addField(vectorField, Arrays.asList(30f, 22f, 35f, 20f)); // cosine distance vector1= 0.862 + .addField(vectorField, Arrays.asList(30f, 22f, 35f, 20f)); // cosine distance vector1= 0.862 docs.get(5) - .addField(vectorField, Arrays.asList(40f, 1f, 1f, 200f)); // cosine distance vector1= 0.756 + .addField(vectorField, Arrays.asList(40f, 1f, 1f, 200f)); // cosine distance vector1= 0.756 docs.get(6) - .addField(vectorField, Arrays.asList(5f, 10f, 20f, 40f)); // cosine distance vector1= 0.970 + .addField(vectorField, Arrays.asList(5f, 10f, 20f, 40f)); // cosine distance vector1= 0.970 docs.get(7) - .addField( - vectorField, Arrays.asList(120f, 60f, 30f, 15f)); // cosine distance vector1= 0.515 + .addField( + vectorField, Arrays.asList(120f, 60f, 30f, 15f)); // cosine distance vector1= 0.515 docs.get(8) - .addField( - vectorField, Arrays.asList(200f, 50f, 100f, 25f)); // cosine distance vector1= 0.554 + .addField( + vectorField, Arrays.asList(200f, 50f, 100f, 25f)); // cosine distance vector1= 0.554 docs.get(9) - .addField( - vectorField, Arrays.asList(1.8f, 2.5f, 3.7f, 4.9f)); // cosine distance vector1= 0.997 + .addField( + vectorField, Arrays.asList(1.8f, 2.5f, 3.7f, 4.9f)); // cosine distance vector1= 0.997 docs.get(10) - .addField(vectorField2, Arrays.asList(1f, 2f, 3f, 4f)); // cosine distance vector2= 1 + .addField(vectorField2, Arrays.asList(1f, 2f, 3f, 4f)); // cosine distance vector2= 1 docs.get(11) - .addField( - vectorField2, - Arrays.asList(7.5f, 15.5f, 17.5f, 22.5f)); // cosine distance vector2= 0.992 + .addField( + vectorField2, + Arrays.asList(7.5f, 15.5f, 17.5f, 22.5f)); // cosine distance vector2= 0.992 docs.get(12) - .addField( - vectorField2, Arrays.asList(1.5f, 2.5f, 3.5f, 4.5f)); // cosine distance vector2= 0.998 + .addField( + vectorField2, Arrays.asList(1.5f, 2.5f, 3.5f, 4.5f)); // cosine distance vector2= 0.998 docs.get(0).addField(vectorFieldByteEncoding, Arrays.asList(1, 2, 3, 4)); docs.get(1).addField(vectorFieldByteEncoding, Arrays.asList(2, 2, 1, 4)); @@ -278,7 +272,7 @@ protected static void indexWithEmbeddingGeneration() throws Exception { assertU(commit()); } - + private static List prepareTextualDocs() { int docsCount = 5; List docs = new ArrayList<>(docsCount); @@ -289,22 +283,14 @@ private static List prepareTextualDocs() { } docs.get(0) - .addField(stringField, "Vegeta is the prince of all saiyans"); // cosine distance vector1= 1.0 + .addField( + stringField, "Vegeta is the prince of all saiyans"); // cosine distance vector1= 1.0 docs.get(1) - .addField( - stringField, "Goku is a saiyan raised on earth"); // cosine distance vector1= 0.998 - docs.get(2) - .addField( - stringField, - "Gohan is a saiyaman, son of Goku"); - docs.get(3) - .addField( - stringField, - "Goten is a saiyaman, second son son of Goku"); - docs.get(4) - .addField( - stringField, - "Trunks is a saiyaman, second son son of Vegeta"); + .addField( + stringField, "Goku is a saiyan raised on earth"); // cosine distance vector1= 0.998 + docs.get(2).addField(stringField, "Gohan is a saiyaman, son of Goku"); + docs.get(3).addField(stringField, "Goten is a saiyaman, second son son of Goku"); + docs.get(4).addField(stringField, "Trunks is a saiyaman, second son son of Vegeta"); return docs; } diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModel.java b/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModel.java index a739a20d2ad..98ffa9e6d97 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModel.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModel.java @@ -20,46 +20,42 @@ import dev.langchain4j.data.segment.TextSegment; import dev.langchain4j.model.embedding.EmbeddingModel; import dev.langchain4j.model.output.Response; - import java.util.List; public class DummyEmbeddingModel implements EmbeddingModel { - public DummyEmbeddingModel() { - } + public DummyEmbeddingModel() {} - @Override - public Response embed(String text) { - Embedding dummy = new Embedding(new float[]{1.0f,2.0f,3.0f,4.0f}); - return new Response(dummy); - } + @Override + public Response embed(String text) { + Embedding dummy = new Embedding(new float[] {1.0f, 2.0f, 3.0f, 4.0f}); + return new Response(dummy); + } - @Override - public Response embed(TextSegment textSegment) { - Embedding dummy = new Embedding(new float[]{1.0f,2.0f,3.0f,4.0f}); - return new Response(dummy); - } + @Override + public Response embed(TextSegment textSegment) { + Embedding dummy = new Embedding(new float[] {1.0f, 2.0f, 3.0f, 4.0f}); + return new Response(dummy); + } - @Override - public Response> embedAll(List textSegments) { - return null; - } + @Override + public Response> embedAll(List textSegments) { + return null; + } - @Override - public int dimension() { - return 4; - } - - public static DummyEmbeddingModelBuilder builder(){ - return new DummyEmbeddingModelBuilder(); - } - - public static class DummyEmbeddingModelBuilder{ - public DummyEmbeddingModelBuilder() { - } - - public DummyEmbeddingModel build(){ - return new DummyEmbeddingModel(); - } + @Override + public int dimension() { + return 4; + } + + public static DummyEmbeddingModelBuilder builder() { + return new DummyEmbeddingModelBuilder(); + } + + public static class DummyEmbeddingModelBuilder { + public DummyEmbeddingModelBuilder() {} + + public DummyEmbeddingModel build() { + return new DummyEmbeddingModel(); } - + } } diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/search/TextEmbedderQParserTest.java b/solr/modules/llm/src/test/org/apache/solr/llm/search/TextEmbedderQParserTest.java index 750b6b6126a..fdc774c0b35 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/search/TextEmbedderQParserTest.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/search/TextEmbedderQParserTest.java @@ -16,384 +16,368 @@ */ package org.apache.solr.llm.search; +import java.util.Arrays; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.llm.TestLlmBase; import org.junit.BeforeClass; import org.junit.Test; -import java.util.Arrays; - public class TextEmbedderQParserTest extends TestLlmBase { - @BeforeClass - public static void init() throws Exception { - setuptest(true); - loadModels("dummy-model.json"); - } - - @Test - public void notExistentModel_shouldThrowException() throws Exception { - final String solrQuery = "{!embed model=not-exist f=vector topK=5}hello world"; - final SolrQuery query = new SolrQuery(); - query.setQuery(solrQuery); - query.add("fl", "id"); - - assertJQ( - "/query" + query.toQueryString(), - "/error/msg=='The model requested \\'not-exist\\' can\\'t be found in the store: /schema/embedding-model-store'", - "/error/code==400" - ); - } - - @Test - public void missingModelParam_shouldThrowException() throws Exception { - final String solrQuery = "{!embed f=vector topK=5}hello world"; - final SolrQuery query = new SolrQuery(); - query.setQuery(solrQuery); - query.add("fl", "id"); - - assertJQ( - "/query" + query.toQueryString(), - "/error/msg=='The \\'model\\' parameter is missing'", - "/error/code==400" - ); - } - - @Test - public void incorrectVectorFieldType_shouldThrowException() throws Exception { - final String solrQuery = "{!embed model=dummy-1 f=id topK=5}hello world"; - final SolrQuery query = new SolrQuery(); - query.setQuery(solrQuery); - query.add("fl", "id"); - - assertJQ( - "/query" + query.toQueryString(), - "/error/msg=='only DenseVectorField is compatible with Vector Query Parsers'", - "/error/code==400" - ); - } - - @Test - public void undefinedVectorField_shouldThrowException() throws Exception { - final String solrQuery = "{!embed model=dummy-1 f=notExistent topK=5}hello world"; - final SolrQuery query = new SolrQuery(); - query.setQuery(solrQuery); - query.add("fl", "id"); - - assertJQ( - "/query" + query.toQueryString(), - "/error/msg=='undefined field: \"notExistent\"'", - "/error/code==400" - ); - } - - @Test - public void missingVectorFieldParam_shouldThrowException() throws Exception { - final String solrQuery = "{!embed model=dummy-1 topK=5}hello world"; - final SolrQuery query = new SolrQuery(); - query.setQuery(solrQuery); - query.add("fl", "id"); - - assertJQ( - "/query" + query.toQueryString(), - "/error/msg=='the Dense Vector field \\'f\\' is missing'", - "/error/code==400" - ); - } - - @Test - public void vectorByteEncodingField_shouldRaiseException() throws Exception { - final String solrQuery = "{!embed model=dummy-1 f=vector_byte_encoding topK=5}hello world"; - final SolrQuery query = new SolrQuery(); - query.setQuery(solrQuery); - query.add("fl", "id"); - - assertJQ( - "/query" + query.toQueryString(), - "/error/msg=='Vector Encoding not supported in automatic text embedding: BYTE'", - "/error/code==500" - ); - } - - @Test - public void missingQueryToEmbed_shouldThrowException() throws Exception { - final String solrQuery = "{!embed model=dummy-1 f=vector topK=5}"; - final SolrQuery query = new SolrQuery(); - query.setQuery(solrQuery); - query.add("fl", "id"); - - assertJQ( - "/query" + query.toQueryString(), - "/error/msg=='Query string is empty, nothing to embed'", - "/error/code==400"); - } - - @Test - public void incorrectVectorToSearchDimension_shouldThrowException() throws Exception { - final String solrQuery = "{!embed model=dummy-1 f=2048_float_vector topK=5}hello world"; - final SolrQuery query = new SolrQuery(); - query.setQuery(solrQuery); - query.add("fl", "id"); - - assertJQ( - "/query" + query.toQueryString(), - "/error/msg=='incorrect vector dimension. The vector value has size 4 while it is expected a vector with size 2048'", - "/error/code==400"); - } - - - @Test - public void topK_shouldEmbedAndReturnOnlyTopKResults() throws Exception { - final String solrQuery = "{!embed model=dummy-1 f=vector topK=5}hello world"; - final SolrQuery query = new SolrQuery(); - query.setQuery(solrQuery); - query.add("fl", "id"); - - assertJQ( - "/query" + query.toQueryString(), - "/response/numFound==5]", - "/response/docs/[0]/id=='1'", - "/response/docs/[1]/id=='4'", - "/response/docs/[2]/id=='2'", - "/response/docs/[3]/id=='10'", - "/response/docs/[4]/id=='3'" - ); - } - - @Test - public void vectorFieldParam_shouldSearchOnThatField() throws Exception { - final String solrQuery = "{!embed model=dummy-1 f=vector2 topK=5}hello world"; - final SolrQuery query = new SolrQuery(); - query.setQuery(solrQuery); - query.add("fl", "id"); - - assertJQ( - "/query" + query.toQueryString(), - "/response/numFound==3]", - "/response/docs/[0]/id=='11'", - "/response/docs/[1]/id=='13'", - "/response/docs/[2]/id=='12'" - ); + @BeforeClass + public static void init() throws Exception { + setuptest(true); + loadModels("dummy-model.json"); + } + + @Test + public void notExistentModel_shouldThrowException() throws Exception { + final String solrQuery = "{!embed model=not-exist f=vector topK=5}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/error/msg=='The model requested \\'not-exist\\' can\\'t be found in the store: /schema/embedding-model-store'", + "/error/code==400"); + } + + @Test + public void missingModelParam_shouldThrowException() throws Exception { + final String solrQuery = "{!embed f=vector topK=5}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/error/msg=='The \\'model\\' parameter is missing'", + "/error/code==400"); + } + + @Test + public void incorrectVectorFieldType_shouldThrowException() throws Exception { + final String solrQuery = "{!embed model=dummy-1 f=id topK=5}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/error/msg=='only DenseVectorField is compatible with Vector Query Parsers'", + "/error/code==400"); + } + + @Test + public void undefinedVectorField_shouldThrowException() throws Exception { + final String solrQuery = "{!embed model=dummy-1 f=notExistent topK=5}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/error/msg=='undefined field: \"notExistent\"'", + "/error/code==400"); + } + + @Test + public void missingVectorFieldParam_shouldThrowException() throws Exception { + final String solrQuery = "{!embed model=dummy-1 topK=5}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/error/msg=='the Dense Vector field \\'f\\' is missing'", + "/error/code==400"); + } + + @Test + public void vectorByteEncodingField_shouldRaiseException() throws Exception { + final String solrQuery = "{!embed model=dummy-1 f=vector_byte_encoding topK=5}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/error/msg=='Vector Encoding not supported in automatic text embedding: BYTE'", + "/error/code==500"); + } + + @Test + public void missingQueryToEmbed_shouldThrowException() throws Exception { + final String solrQuery = "{!embed model=dummy-1 f=vector topK=5}"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/error/msg=='Query string is empty, nothing to embed'", + "/error/code==400"); + } + + @Test + public void incorrectVectorToSearchDimension_shouldThrowException() throws Exception { + final String solrQuery = "{!embed model=dummy-1 f=2048_float_vector topK=5}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/error/msg=='incorrect vector dimension. The vector value has size 4 while it is expected a vector with size 2048'", + "/error/code==400"); + } + + @Test + public void topK_shouldEmbedAndReturnOnlyTopKResults() throws Exception { + final String solrQuery = "{!embed model=dummy-1 f=vector topK=5}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/response/numFound==5]", + "/response/docs/[0]/id=='1'", + "/response/docs/[1]/id=='4'", + "/response/docs/[2]/id=='2'", + "/response/docs/[3]/id=='10'", + "/response/docs/[4]/id=='3'"); + } + + @Test + public void vectorFieldParam_shouldSearchOnThatField() throws Exception { + final String solrQuery = "{!embed model=dummy-1 f=vector2 topK=5}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/response/numFound==3]", + "/response/docs/[0]/id=='11'", + "/response/docs/[1]/id=='13'", + "/response/docs/[2]/id=='12'"); + } + + @Test + public void embeddedQuery_shouldRankBySimilarityFunction() throws Exception { + final String solrQuery = "{!embed model=dummy-1 f=vector topK=10}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/response/numFound==10]", + "/response/docs/[0]/id=='1'", + "/response/docs/[1]/id=='4'", + "/response/docs/[2]/id=='2'", + "/response/docs/[3]/id=='10'", + "/response/docs/[4]/id=='3'", + "/response/docs/[5]/id=='7'", + "/response/docs/[6]/id=='5'", + "/response/docs/[7]/id=='6'", + "/response/docs/[8]/id=='9'", + "/response/docs/[9]/id=='8'"); + } + + @Test + public void embeddedQueryUsedInFilter_shouldFilterResultsBeforeTheQueryExecution() + throws Exception { + final String solrQuery = "{!embed model=dummy-1 f=vector topK=4}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery("id:(3 4 9 2)"); + query.setFilterQueries(solrQuery); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/response/numFound==2]", + "/response/docs/[0]/id=='2'", + "/response/docs/[1]/id=='4'"); + } + + @Test + public void embeddedQueryUsedInFilters_shouldFilterResultsBeforeTheQueryExecution() + throws Exception { + final String solrQuery = "{!embed model=dummy-1 f=vector topK=4}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery("id:(3 4 9 2)"); + query.setFilterQueries(solrQuery, "id:(4 20 9)"); + query.add("fl", "id"); + + // topK=4 -> 1,4,2,10 + assertJQ( + "/query" + query.toQueryString(), "/response/numFound==1]", "/response/docs/[0]/id=='4'"); + } + + @Test + public void embeddedQueryUsedInFiltersWithPreFilter_shouldFilterResultsBeforeTheQueryExecution() + throws Exception { + final String solrQuery = + "{!embed model=dummy-1 f=vector topK=4 preFilter='id:(1 4 7 8 9)'}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery("id:(3 4 9 2)"); + query.setFilterQueries(solrQuery, "id:(4 20 9)"); + query.add("fl", "id"); + + // topK=4 w/localparam preFilter -> 1,4,7,9 + assertJQ( + "/query" + query.toQueryString(), + "/response/numFound==2]", + "/response/docs/[0]/id=='4'", + "/response/docs/[1]/id=='9'"); + } + + @Test + public void embeddedQueryUsedInFilters_rejectIncludeExclude() throws Exception { + for (String fq : + Arrays.asList( + "{!embed model=dummy-1 f=vector topK=5 includeTags=xxx}hello world", + "{!embed model=dummy-1 f=vector topK=5 excludeTags=xxx}hello world")) { + final SolrQuery query = new SolrQuery(); + query.setQuery("*:*"); + query.setFilterQueries(fq); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/error/msg=='Knn Query Parser used as a filter does not support includeTags or excludeTags localparams'", + "/error/code==400"); } - - @Test - public void embeddedQuery_shouldRankBySimilarityFunction() throws Exception { - final String solrQuery = "{!embed model=dummy-1 f=vector topK=10}hello world"; - final SolrQuery query = new SolrQuery(); - query.setQuery(solrQuery); - query.add("fl", "id"); - - assertJQ( - "/query" + query.toQueryString(), - "/response/numFound==10]", - "/response/docs/[0]/id=='1'", - "/response/docs/[1]/id=='4'", - "/response/docs/[2]/id=='2'", - "/response/docs/[3]/id=='10'", - "/response/docs/[4]/id=='3'", - "/response/docs/[5]/id=='7'", - "/response/docs/[6]/id=='5'", - "/response/docs/[7]/id=='6'", - "/response/docs/[8]/id=='9'", - "/response/docs/[9]/id=='8'" - ); - } - - @Test - public void embeddedQueryUsedInFilter_shouldFilterResultsBeforeTheQueryExecution() throws Exception { - final String solrQuery = "{!embed model=dummy-1 f=vector topK=4}hello world"; - final SolrQuery query = new SolrQuery(); - query.setQuery("id:(3 4 9 2)"); - query.setFilterQueries(solrQuery); - query.add("fl", "id"); - - assertJQ( - "/query" + query.toQueryString(), - "/response/numFound==2]", - "/response/docs/[0]/id=='2'", - "/response/docs/[1]/id=='4'" - ); - - } - - @Test - public void embeddedQueryUsedInFilters_shouldFilterResultsBeforeTheQueryExecution() throws Exception { - final String solrQuery = "{!embed model=dummy-1 f=vector topK=4}hello world"; - final SolrQuery query = new SolrQuery(); - query.setQuery("id:(3 4 9 2)"); - query.setFilterQueries(solrQuery, "id:(4 20 9)"); - query.add("fl", "id"); - - // topK=4 -> 1,4,2,10 - assertJQ( - "/query" + query.toQueryString(), - "/response/numFound==1]", - "/response/docs/[0]/id=='4'" - ); - } - - @Test - public void embeddedQueryUsedInFiltersWithPreFilter_shouldFilterResultsBeforeTheQueryExecution() throws Exception { - final String solrQuery = "{!embed model=dummy-1 f=vector topK=4 preFilter='id:(1 4 7 8 9)'}hello world"; - final SolrQuery query = new SolrQuery(); - query.setQuery("id:(3 4 9 2)"); - query.setFilterQueries(solrQuery, "id:(4 20 9)"); - query.add("fl", "id"); - - // topK=4 w/localparam preFilter -> 1,4,7,9 - assertJQ( - "/query" + query.toQueryString(), - "/response/numFound==2]", - "/response/docs/[0]/id=='4'", - "/response/docs/[1]/id=='9'" - ); - } - - @Test - public void embeddedQueryUsedInFilters_rejectIncludeExclude() throws Exception { - for (String fq : - Arrays.asList( - "{!embed model=dummy-1 f=vector topK=5 includeTags=xxx}hello world", - "{!embed model=dummy-1 f=vector topK=5 excludeTags=xxx}hello world")) { - final SolrQuery query = new SolrQuery(); - query.setQuery("*:*"); - query.setFilterQueries(fq); - query.add("fl", "id"); - - assertJQ( - "/query" + query.toQueryString(), - "/error/msg=='Knn Query Parser used as a filter does not support includeTags or excludeTags localparams'", - "/error/code==400"); - } - } - - @Test - public void embeddedQueryAsSubQuery() throws Exception { - final String solrQuery = "*:* AND {!embed model=dummy-1 f=vector topK=5 v='hello world'}"; - final SolrQuery query = new SolrQuery(); - query.setQuery(solrQuery); - query.setFilterQueries("id:(2 4 7 9 8 20 3)"); - query.add("fl", "id"); - - // When knn parser is a subquery, it should not pre-filter on any global fq params - // topK -> 1,4,2,10,3 -> fq -> 4,2,3 - assertJQ( - "/query" + query.toQueryString(), - "/response/numFound==3]", - "/response/docs/[0]/id=='4'", - "/response/docs/[1]/id=='2'", - "/response/docs/[2]/id=='3'" - ); - } - - @Test - public void embeddedQueryAsSubQuery_withPreFilter() throws Exception { - final String solrQuery = "*:* AND {!embed model=dummy-1 f=vector topK=5 preFilter='id:(2 4 7 9 8 20 3)' v='hello world'}"; - final SolrQuery query = new SolrQuery(); - query.setQuery(solrQuery); - query.add("fl", "id"); - - // knn subquery should still accept `preFilter` local param - // filt -> topK -> 4,2,3,7,9 - assertJQ( - "/query" + query.toQueryString(), - "/response/numFound==5]", - "/response/docs/[0]/id=='4'", - "/response/docs/[1]/id=='2'", - "/response/docs/[2]/id=='3'", - "/response/docs/[3]/id=='7'", - "/response/docs/[4]/id=='9'" - ); - } - - @Test - public void embeddedQueryAsSubQuery_rejectIncludeExclude() throws Exception { - for (String q : - Arrays.asList( - "{!embed model=dummy-1 f=vector topK=5 includeTags=xxx}hello world", - "{!embed model=dummy-1 f=vector topK=5 excludeTags=xxx}hello world")) { - final SolrQuery query = new SolrQuery(); - query.setQuery("*:* OR " + q); - query.add("fl", "id"); - - assertJQ( - "/query" + query.toQueryString(), - "/error/msg=='Knn Query Parser used as a sub-query does not support includeTags or excludeTags localparams'", - "/error/code==400"); - } - } - - @Test - public void embeddedQueryWithCostlyFq_shouldPerformKnnSearchWithPostFilter() throws Exception { - final String solrQuery = "{!embed model=dummy-1 f=vector topK=10}hello world"; - final SolrQuery query = new SolrQuery(); - query.setQuery(solrQuery); - query.setFilterQueries("{!frange cache=false l=0.99}$q"); - query.add("fl", "id"); - - assertJQ( - "/query" + query.toQueryString(), - "/response/numFound==5]", - "/response/docs/[0]/id=='1'", - "/response/docs/[1]/id=='4'", - "/response/docs/[2]/id=='2'", - "/response/docs/[3]/id=='10'", - "/response/docs/[4]/id=='3'" - ); - } - - @Test - public void embeddedQueryWithFilterQueries_shouldPerformKnnSearchWithPreFiltersAndPostFilters() throws Exception { - final String solrQuery = "{!embed model=dummy-1 f=vector topK=4}hello world"; - final SolrQuery query = new SolrQuery(); - query.setQuery(solrQuery); - query.setFilterQueries("id:(3 4 9 2)", "{!frange cache=false l=0.99}$q"); - query.add("fl", "id"); - - assertJQ( - "/query" + query.toQueryString(), - "/response/numFound==2]", - "/response/docs/[0]/id=='4'", - "/response/docs/[1]/id=='2'" - ); - } - - @Test - public void embeddedQueryWithNegativeFilterQuery_shouldPerformKnnSearchInPreFilteredResults() throws Exception { - final String solrQuery = "{!embed model=dummy-1 f=vector topK=4}hello world"; - final SolrQuery query = new SolrQuery(); - query.setQuery(solrQuery); - query.setFilterQueries("-id:4"); - query.add("fl", "id"); - - assertJQ( - "/query" + query.toQueryString(), - "/response/numFound==4]", - "/response/docs/[0]/id=='1'", - "/response/docs/[1]/id=='2'", - "/response/docs/[2]/id=='10'", - "/response/docs/[3]/id=='3'" - ); - } - - /** - * See {@link org.apache.solr.search.ReRankQParserPlugin.ReRankQueryRescorer#combine(float, - * boolean, float)}} for more details. - */ - @Test - public void embeddedQueryAsRerank_shouldAddSimilarityFunctionScore() throws Exception { - final SolrQuery query = new SolrQuery(); - query.set("rq", "{!rerank reRankQuery=$rqq reRankDocs=4 reRankWeight=1}"); - query.set("rqq", "{!embed model=dummy-1 f=vector topK=4}hello world"); - query.setQuery("id:(3 4 9 2)"); - query.add("fl", "id"); - - assertJQ( - "/query" + query.toQueryString(), - "/response/numFound==4]", - "/response/docs/[0]/id=='4'", - "/response/docs/[1]/id=='2'", - "/response/docs/[2]/id=='3'", - "/response/docs/[3]/id=='9'" - ); + } + + @Test + public void embeddedQueryAsSubQuery() throws Exception { + final String solrQuery = "*:* AND {!embed model=dummy-1 f=vector topK=5 v='hello world'}"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.setFilterQueries("id:(2 4 7 9 8 20 3)"); + query.add("fl", "id"); + + // When knn parser is a subquery, it should not pre-filter on any global fq params + // topK -> 1,4,2,10,3 -> fq -> 4,2,3 + assertJQ( + "/query" + query.toQueryString(), + "/response/numFound==3]", + "/response/docs/[0]/id=='4'", + "/response/docs/[1]/id=='2'", + "/response/docs/[2]/id=='3'"); + } + + @Test + public void embeddedQueryAsSubQuery_withPreFilter() throws Exception { + final String solrQuery = + "*:* AND {!embed model=dummy-1 f=vector topK=5 preFilter='id:(2 4 7 9 8 20 3)' v='hello world'}"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.add("fl", "id"); + + // knn subquery should still accept `preFilter` local param + // filt -> topK -> 4,2,3,7,9 + assertJQ( + "/query" + query.toQueryString(), + "/response/numFound==5]", + "/response/docs/[0]/id=='4'", + "/response/docs/[1]/id=='2'", + "/response/docs/[2]/id=='3'", + "/response/docs/[3]/id=='7'", + "/response/docs/[4]/id=='9'"); + } + + @Test + public void embeddedQueryAsSubQuery_rejectIncludeExclude() throws Exception { + for (String q : + Arrays.asList( + "{!embed model=dummy-1 f=vector topK=5 includeTags=xxx}hello world", + "{!embed model=dummy-1 f=vector topK=5 excludeTags=xxx}hello world")) { + final SolrQuery query = new SolrQuery(); + query.setQuery("*:* OR " + q); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/error/msg=='Knn Query Parser used as a sub-query does not support includeTags or excludeTags localparams'", + "/error/code==400"); } + } + + @Test + public void embeddedQueryWithCostlyFq_shouldPerformKnnSearchWithPostFilter() throws Exception { + final String solrQuery = "{!embed model=dummy-1 f=vector topK=10}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.setFilterQueries("{!frange cache=false l=0.99}$q"); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/response/numFound==5]", + "/response/docs/[0]/id=='1'", + "/response/docs/[1]/id=='4'", + "/response/docs/[2]/id=='2'", + "/response/docs/[3]/id=='10'", + "/response/docs/[4]/id=='3'"); + } + + @Test + public void embeddedQueryWithFilterQueries_shouldPerformKnnSearchWithPreFiltersAndPostFilters() + throws Exception { + final String solrQuery = "{!embed model=dummy-1 f=vector topK=4}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.setFilterQueries("id:(3 4 9 2)", "{!frange cache=false l=0.99}$q"); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/response/numFound==2]", + "/response/docs/[0]/id=='4'", + "/response/docs/[1]/id=='2'"); + } + + @Test + public void embeddedQueryWithNegativeFilterQuery_shouldPerformKnnSearchInPreFilteredResults() + throws Exception { + final String solrQuery = "{!embed model=dummy-1 f=vector topK=4}hello world"; + final SolrQuery query = new SolrQuery(); + query.setQuery(solrQuery); + query.setFilterQueries("-id:4"); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/response/numFound==4]", + "/response/docs/[0]/id=='1'", + "/response/docs/[1]/id=='2'", + "/response/docs/[2]/id=='10'", + "/response/docs/[3]/id=='3'"); + } + + /** + * See {@link org.apache.solr.search.ReRankQParserPlugin.ReRankQueryRescorer#combine(float, + * boolean, float)}} for more details. + */ + @Test + public void embeddedQueryAsRerank_shouldAddSimilarityFunctionScore() throws Exception { + final SolrQuery query = new SolrQuery(); + query.set("rq", "{!rerank reRankQuery=$rqq reRankDocs=4 reRankWeight=1}"); + query.set("rqq", "{!embed model=dummy-1 f=vector topK=4}hello world"); + query.setQuery("id:(3 4 9 2)"); + query.add("fl", "id"); + + assertJQ( + "/query" + query.toQueryString(), + "/response/numFound==4]", + "/response/docs/[0]/id=='4'", + "/response/docs/[1]/id=='2'", + "/response/docs/[2]/id=='3'", + "/response/docs/[3]/id=='9'"); + } } diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java index 0d397006341..bd52600b218 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java @@ -20,12 +20,12 @@ import org.apache.solr.common.util.NamedList; import org.apache.solr.core.SolrResourceLoader; import org.apache.solr.llm.TestLlmBase; +import org.apache.solr.llm.search.TextEmbedderQParserPlugin; import org.apache.solr.rest.ManagedResource; import org.apache.solr.rest.ManagedResourceStorage; import org.apache.solr.rest.RestManager; import org.junit.BeforeClass; import org.junit.Test; -import org.apache.solr.llm.search.TextEmbedderQParserPlugin; public class TestModelManager extends TestLlmBase { @@ -41,9 +41,10 @@ public void test() throws Exception { final RestManager.Registry registry = loader.getManagedResourceRegistry(); assertNotNull( "Expected a non-null RestManager.Registry from the SolrResourceLoader!", registry); - + final String resourceId = "/schema/mstore1"; - registry.registerManagedResource(resourceId, ManagedEmbeddingModelStore.class, new TextEmbedderQParserPlugin()); + registry.registerManagedResource( + resourceId, ManagedEmbeddingModelStore.class, new TextEmbedderQParserPlugin()); final NamedList initArgs = new NamedList<>(); @@ -58,48 +59,51 @@ public void test() throws Exception { @Test public void testRestManagerEndpoints() throws Exception { assertJQ("/schema/managed", "/responseHeader/status==0"); - + final String cohereModelClassName = CohereEmbeddingModel.class.getName(); // Add models - String model = - "{ \"name\":\"testModel1\", \"class\":\"" + cohereModelClassName + "\"}"; + String model = "{ \"name\":\"testModel1\", \"class\":\"" + cohereModelClassName + "\"}"; // fails since it does not have params assertJPut(ManagedEmbeddingModelStore.REST_END_POINT, model, "/responseHeader/status==400"); // success model = "{ name:\"testModel2\", class:\"" - + cohereModelClassName + "\"," + - "params:{" + - "baseUrl:\"https://api.cohere.ai/v1/\"," + - "apiKey:\"cohereApiKey2\"," + - "modelName:\"embed-english-light-v3.0\"," + - "inputType:\"search_document\"," + - "logRequests:true," + - "logResponses:false" + - "}}"; + + cohereModelClassName + + "\"," + + "params:{" + + "baseUrl:\"https://api.cohere.ai/v1/\"," + + "apiKey:\"cohereApiKey2\"," + + "modelName:\"embed-english-light-v3.0\"," + + "inputType:\"search_document\"," + + "logRequests:true," + + "logResponses:false" + + "}}"; assertJPut(ManagedEmbeddingModelStore.REST_END_POINT, model, "/responseHeader/status==0"); // success final String multipleModels = "[{ name:\"testModel3\", class:\"" - + cohereModelClassName+"\"," + - "params:{baseUrl:\"https://api.cohere.ai/v1/\"," + - "apiKey:\"cohereApiKey3\"," + - "modelName:\"embed-english-light-v3.0\"," + - "inputType:\"search_document\"," + - "logRequests:true," + - "logResponses:false" + - "}}\n" + + cohereModelClassName + + "\"," + + "params:{baseUrl:\"https://api.cohere.ai/v1/\"," + + "apiKey:\"cohereApiKey3\"," + + "modelName:\"embed-english-light-v3.0\"," + + "inputType:\"search_document\"," + + "logRequests:true," + + "logResponses:false" + + "}}\n" + ",{ name:\"testModel4\", class:\"" - + cohereModelClassName+"\"," + - "params:{baseUrl:\"https://api.cohere.ai/v1/\"," + - "apiKey:\"cohereApiKey4\"," + - "modelName:\"embed-english-light-v3.0\"," + - "inputType:\"search_document\"," + - "logRequests:true," + - "logResponses:false" + - "}}]"; - assertJPut(ManagedEmbeddingModelStore.REST_END_POINT, multipleModels, "/responseHeader/status==0"); + + cohereModelClassName + + "\"," + + "params:{baseUrl:\"https://api.cohere.ai/v1/\"," + + "apiKey:\"cohereApiKey4\"," + + "modelName:\"embed-english-light-v3.0\"," + + "inputType:\"search_document\"," + + "logRequests:true," + + "logResponses:false" + + "}}]"; + assertJPut( + ManagedEmbeddingModelStore.REST_END_POINT, multipleModels, "/responseHeader/status==0"); final String qryResult = JQ(ManagedEmbeddingModelStore.REST_END_POINT); assertTrue( @@ -113,9 +117,7 @@ public void testRestManagerEndpoints() throws Exception { restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/testModel2"); restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/testModel3"); restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/testModel4"); - assertJQ( - ManagedEmbeddingModelStore.REST_END_POINT, - "/models==[]'"); + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models==[]'"); } @Test @@ -124,10 +126,17 @@ public void loadModel_cohere_shouldLoadModelConfig() throws Exception { final String modelName = "cohere-1"; assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/baseUrl=='https://api.cohere.ai/v1/'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-cohere'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/modelName=='embed-english-light-v3.0'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/inputType=='search_document'"); + assertJQ( + ManagedEmbeddingModelStore.REST_END_POINT, + "/models/[0]/params/baseUrl=='https://api.cohere.ai/v1/'"); + assertJQ( + ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-cohere'"); + assertJQ( + ManagedEmbeddingModelStore.REST_END_POINT, + "/models/[0]/params/modelName=='embed-english-light-v3.0'"); + assertJQ( + ManagedEmbeddingModelStore.REST_END_POINT, + "/models/[0]/params/inputType=='search_document'"); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/timeout==60"); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logRequests==true"); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logResponses==true"); @@ -141,9 +150,14 @@ public void loadModel_openAi_shouldLoadModelConfig() throws Exception { final String modelName = "openai-1"; assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/baseUrl=='https://api.openai.com/v1'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-openAI'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/modelName=='text-embedding-3-small'"); + assertJQ( + ManagedEmbeddingModelStore.REST_END_POINT, + "/models/[0]/params/baseUrl=='https://api.openai.com/v1'"); + assertJQ( + ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-openAI'"); + assertJQ( + ManagedEmbeddingModelStore.REST_END_POINT, + "/models/[0]/params/modelName=='text-embedding-3-small'"); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/timeout==60"); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logRequests==true"); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logResponses==true"); @@ -158,14 +172,18 @@ public void loadModel_mistralAi_shouldLoadModelConfig() throws Exception { final String modelName = "mistralai-1"; assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/baseUrl=='https://api.mistral.ai/v1'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-mistralAI'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/modelName=='mistral-embed'"); + assertJQ( + ManagedEmbeddingModelStore.REST_END_POINT, + "/models/[0]/params/baseUrl=='https://api.mistral.ai/v1'"); + assertJQ( + ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-mistralAI'"); + assertJQ( + ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/modelName=='mistral-embed'"); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/timeout==60"); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logRequests==true"); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logResponses==true"); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/maxRetries==5"); - + restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/" + modelName); } @@ -175,8 +193,12 @@ public void loadModel_huggingface_shouldLoadModelConfig() throws Exception { final String modelName = "huggingface-1"; assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/accessToken=='apiKey-huggingface'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/modelId=='sentence-transformers/all-MiniLM-L6-v2'"); + assertJQ( + ManagedEmbeddingModelStore.REST_END_POINT, + "/models/[0]/params/accessToken=='apiKey-huggingface'"); + assertJQ( + ManagedEmbeddingModelStore.REST_END_POINT, + "/models/[0]/params/modelId=='sentence-transformers/all-MiniLM-L6-v2'"); restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/" + modelName); } diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java index bd59840eef1..382042293ee 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java @@ -16,18 +16,17 @@ */ package org.apache.solr.llm.store.rest; +import static java.nio.charset.StandardCharsets.UTF_8; + import dev.langchain4j.model.cohere.CohereEmbeddingModel; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import org.apache.solr.common.util.Utils; import org.apache.solr.llm.TestLlmBase; import org.junit.After; import org.junit.Before; import org.junit.Test; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; - -import static java.nio.charset.StandardCharsets.UTF_8; - public class TestModelManagerPersistence extends TestLlmBase { @Before @@ -44,19 +43,21 @@ public void cleanup() throws Exception { public void testModelAreStoredCompact() throws Exception { loadModel( "cohere1", - CohereEmbeddingModel.class.getName(), - "{" + - "baseUrl:\"https://api.cohere.ai/v1/\"," + - "apiKey:\"cohereApiKey2\"," + - "modelName:\"embed-english-light-v3.0\"," + - "inputType:\"search_document\"," + - "logRequests:true," + - "logResponses:false" + - "}"); - - final String embeddingModelStoreContent = Files.readString(embeddingModelStoreFile, StandardCharsets.UTF_8); + CohereEmbeddingModel.class.getName(), + "{" + + "baseUrl:\"https://api.cohere.ai/v1/\"," + + "apiKey:\"cohereApiKey2\"," + + "modelName:\"embed-english-light-v3.0\"," + + "inputType:\"search_document\"," + + "logRequests:true," + + "logResponses:false" + + "}"); + + final String embeddingModelStoreContent = + Files.readString(embeddingModelStoreFile, StandardCharsets.UTF_8); Object embeddingModelStoreObject = Utils.fromJSONString(embeddingModelStoreContent); - assertEquals(new String(Utils.toJSON(embeddingModelStoreObject, -1), UTF_8), embeddingModelStoreContent); + assertEquals( + new String(Utils.toJSON(embeddingModelStoreObject, -1), UTF_8), embeddingModelStoreContent); } @Test @@ -69,10 +70,17 @@ public void testModelStorePersistence() throws Exception { final String modelName = "cohere-1"; assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/baseUrl=='https://api.cohere.ai/v1/'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-cohere'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/modelName=='embed-english-light-v3.0'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/inputType=='search_document'"); + assertJQ( + ManagedEmbeddingModelStore.REST_END_POINT, + "/models/[0]/params/baseUrl=='https://api.cohere.ai/v1/'"); + assertJQ( + ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-cohere'"); + assertJQ( + ManagedEmbeddingModelStore.REST_END_POINT, + "/models/[0]/params/modelName=='embed-english-light-v3.0'"); + assertJQ( + ManagedEmbeddingModelStore.REST_END_POINT, + "/models/[0]/params/inputType=='search_document'"); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/timeout==60"); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logRequests==true"); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logResponses==true"); @@ -80,10 +88,17 @@ public void testModelStorePersistence() throws Exception { // check persistence after reload restTestHarness.reload(); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/baseUrl=='https://api.cohere.ai/v1/'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-cohere'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/modelName=='embed-english-light-v3.0'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/inputType=='search_document'"); + assertJQ( + ManagedEmbeddingModelStore.REST_END_POINT, + "/models/[0]/params/baseUrl=='https://api.cohere.ai/v1/'"); + assertJQ( + ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-cohere'"); + assertJQ( + ManagedEmbeddingModelStore.REST_END_POINT, + "/models/[0]/params/modelName=='embed-english-light-v3.0'"); + assertJQ( + ManagedEmbeddingModelStore.REST_END_POINT, + "/models/[0]/params/inputType=='search_document'"); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/timeout==60"); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logRequests==true"); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logResponses==true"); @@ -92,10 +107,17 @@ public void testModelStorePersistence() throws Exception { getJetty().stop(); getJetty().start(); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/baseUrl=='https://api.cohere.ai/v1/'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-cohere'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/modelName=='embed-english-light-v3.0'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/inputType=='search_document'"); + assertJQ( + ManagedEmbeddingModelStore.REST_END_POINT, + "/models/[0]/params/baseUrl=='https://api.cohere.ai/v1/'"); + assertJQ( + ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-cohere'"); + assertJQ( + ManagedEmbeddingModelStore.REST_END_POINT, + "/models/[0]/params/modelName=='embed-english-light-v3.0'"); + assertJQ( + ManagedEmbeddingModelStore.REST_END_POINT, + "/models/[0]/params/inputType=='search_document'"); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/timeout==60"); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logRequests==true"); assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logResponses==true"); From bc3e3b18b733ef2e21712433c86e86c5e86adec3 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Wed, 30 Oct 2024 06:35:31 +0100 Subject: [PATCH 16/65] cleaned solr-tests.policy based on review --- gradle/testing/randomization/policies/solr-tests.policy | 6 ------ .../test-files/solr/collection1/conf/solrconfig-llm.xml | 9 --------- 2 files changed, 15 deletions(-) diff --git a/gradle/testing/randomization/policies/solr-tests.policy b/gradle/testing/randomization/policies/solr-tests.policy index 534bd110cb0..2d8b28b1410 100644 --- a/gradle/testing/randomization/policies/solr-tests.policy +++ b/gradle/testing/randomization/policies/solr-tests.policy @@ -61,12 +61,6 @@ grant { permission java.lang.reflect.ReflectPermission "newProxyInPackage.dev.langchain4j.model.cohere"; permission java.lang.reflect.ReflectPermission "newProxyInPackage.dev.ai4j.openai4j"; permission java.lang.reflect.ReflectPermission "newProxyInPackage.dev.langchain4j.model.huggingface"; - permission java.net.SocketPermission "api.cohere.ai", "accept,listen,connect,resolve"; - permission java.net.SocketPermission "api.openai.com", "accept,listen,connect,resolve"; - permission java.net.SocketPermission "api.mistral.ai", "accept,listen,connect,resolve"; - permission java.net.SocketPermission "api-inference.huggingface.co", "accept,listen,connect,resolve"; - permission java.net.SocketPermission "langchain4j.dev", "accept,listen,connect,resolve"; - permission java.lang.RuntimePermission "accessDeclaredMembers"; // needed by certain tests to redirect sysout/syserr: permission java.lang.RuntimePermission "setIO"; diff --git a/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml b/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml index 4f3880d991b..e9e1dd6b635 100644 --- a/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml +++ b/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml @@ -54,13 +54,4 @@ - - - string_field - vector - dummy-1 - - - - From 016e8a054fa15b9bfd232005030148834381c66b Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Thu, 31 Oct 2024 08:09:11 +0100 Subject: [PATCH 17/65] removed synonyms and stopwors, not necessary for tests --- .../solr/collection1/conf/schema.xml | 3 -- .../solr/collection1/conf/stopwords.txt | 16 ----------- .../solr/collection1/conf/synonyms.txt | 28 ------------------- 3 files changed, 47 deletions(-) delete mode 100644 solr/modules/llm/src/test-files/solr/collection1/conf/stopwords.txt delete mode 100644 solr/modules/llm/src/test-files/solr/collection1/conf/synonyms.txt diff --git a/solr/modules/llm/src/test-files/solr/collection1/conf/schema.xml b/solr/modules/llm/src/test-files/solr/collection1/conf/schema.xml index 3f320eddfb0..6699fa60d62 100644 --- a/solr/modules/llm/src/test-files/solr/collection1/conf/schema.xml +++ b/solr/modules/llm/src/test-files/solr/collection1/conf/schema.xml @@ -40,13 +40,10 @@ - - - diff --git a/solr/modules/llm/src/test-files/solr/collection1/conf/stopwords.txt b/solr/modules/llm/src/test-files/solr/collection1/conf/stopwords.txt deleted file mode 100644 index eabae3b7c0d..00000000000 --- a/solr/modules/llm/src/test-files/solr/collection1/conf/stopwords.txt +++ /dev/null @@ -1,16 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -a diff --git a/solr/modules/llm/src/test-files/solr/collection1/conf/synonyms.txt b/solr/modules/llm/src/test-files/solr/collection1/conf/synonyms.txt deleted file mode 100644 index 461ed4df6e4..00000000000 --- a/solr/modules/llm/src/test-files/solr/collection1/conf/synonyms.txt +++ /dev/null @@ -1,28 +0,0 @@ -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -#----------------------------------------------------------------------- -#some test synonym mappings unlikely to appear in real input text -aaafoo => aaabar -bbbfoo => bbbfoo bbbbar -cccfoo => cccbar cccbaz -fooaaa,baraaa,bazaaa - -# Some synonym groups specific to this example -GB,gib,gigabyte,gigabytes -MB,mib,megabyte,megabytes -Television, Televisions, TV, TVs -#notice we use "gib" instead of "GiB" so any WordDelimiterGraphFilter coming -#after us won't split it into two words. - -# Synonym mappings can be used for spelling correction too -pixima => pixma From cf9cebc5742aea9ca5068fd50c7a6672d2542cfb Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Thu, 31 Oct 2024 08:32:03 +0100 Subject: [PATCH 18/65] clean up of tests (not finished) --- .../test/org/apache/solr/llm/TestLlmBase.java | 52 ++++--------------- .../llm/search/TextEmbedderQParserTest.java | 2 +- .../solr/llm/store/rest/TestModelManager.java | 2 +- .../rest/TestModelManagerPersistence.java | 2 +- 4 files changed, 14 insertions(+), 44 deletions(-) diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java b/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java index 5d08b3b9ead..75986df5cca 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java @@ -29,7 +29,6 @@ import org.apache.solr.common.SolrInputDocument; import org.apache.solr.common.util.Utils; import org.apache.solr.core.SolrCore; -import org.apache.solr.core.SolrResourceLoader; import org.apache.solr.llm.embedding.SolrEmbeddingModel; import org.apache.solr.llm.store.EmbeddingModelException; import org.apache.solr.llm.store.rest.ManagedEmbeddingModelStore; @@ -41,9 +40,6 @@ public class TestLlmBase extends RestTestBase { private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); - protected static final SolrResourceLoader solrResourceLoader = - new SolrResourceLoader(Path.of("").toAbsolutePath()); - protected static Path tmpSolrHome; protected static Path tmpConfDir; @@ -59,14 +55,9 @@ public class TestLlmBase extends RestTestBase { protected static String vectorField2 = "vector2"; protected static String vectorFieldByteEncoding = "vector_byte_encoding"; - protected static void setuptest(boolean bulkIndex) throws Exception { - setuptest("solrconfig-llm.xml", "schema.xml"); - if (bulkIndex) prepareIndex(); - } - - protected static void setupPersistenttest(boolean bulkIndex) throws Exception { - setupPersistentTest("solrconfig-llm.xml", "schema.xml"); - if (bulkIndex) prepareIndex(); + protected static void setupTest(boolean buildIndex, boolean persistent) throws Exception { + setupTest("solrconfig-llm.xml", "schema.xml", persistent); + if (buildIndex) prepareIndex(); } public static ManagedEmbeddingModelStore getManagedModelStore() { @@ -75,52 +66,31 @@ public static ManagedEmbeddingModelStore getManagedModelStore() { } } - protected static void setupTestInit(String solrconfig, String schema, boolean isPersistent) + protected static void setupTestInit(boolean isPersistent) throws Exception { tmpSolrHome = createTempDir(); tmpConfDir = tmpSolrHome.resolve(CONF_DIR); tmpConfDir.toFile().deleteOnExit(); PathUtils.copyDirectory(TEST_PATH(), tmpSolrHome.toAbsolutePath()); - final Path mstore = tmpConfDir.resolve(MODEL_FILE_NAME); + final Path modelStore = tmpConfDir.resolve(MODEL_FILE_NAME); if (isPersistent) { - embeddingModelStoreFile = mstore; + embeddingModelStoreFile = modelStore; } - if (Files.exists(mstore)) { + if (Files.exists(modelStore)) { if (log.isInfoEnabled()) { - log.info("remove model store config file in {}", mstore.toAbsolutePath()); + log.info("remove model store config file in {}", modelStore.toAbsolutePath()); } - Files.delete(mstore); - } - if (!solrconfig.equals("solrconfig-llm.xml")) { - Files.copy( - tmpSolrHome.resolve(CONF_DIR).resolve(solrconfig), - tmpSolrHome.resolve(CONF_DIR).resolve("solrconfig-llm.xml")); - } - if (!schema.equals("schema.xml")) { - Files.copy( - tmpSolrHome.resolve(CONF_DIR).resolve(schema), - tmpSolrHome.resolve(CONF_DIR).resolve("schema.xml")); + Files.delete(modelStore); } System.setProperty("managed.schema.mutable", "true"); } - public static void setuptest(String solrconfig, String schema) throws Exception { - - setupTestInit(solrconfig, schema, false); - System.setProperty("enable.update.log", "false"); - - createJettyAndHarness( - tmpSolrHome.toAbsolutePath().toString(), solrconfig, schema, "/solr", true, null); - } - - public static void setupPersistentTest(String solrconfig, String schema) throws Exception { - - setupTestInit(solrconfig, schema, true); - + public static void setupTest(String solrconfig, String schema, boolean persistent) throws Exception { + setupTestInit(persistent); createJettyAndHarness( tmpSolrHome.toAbsolutePath().toString(), solrconfig, schema, "/solr", true, null); } diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/search/TextEmbedderQParserTest.java b/solr/modules/llm/src/test/org/apache/solr/llm/search/TextEmbedderQParserTest.java index fdc774c0b35..bb8382db37c 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/search/TextEmbedderQParserTest.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/search/TextEmbedderQParserTest.java @@ -25,7 +25,7 @@ public class TextEmbedderQParserTest extends TestLlmBase { @BeforeClass public static void init() throws Exception { - setuptest(true); + setupTest(true, false); loadModels("dummy-model.json"); } diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java index bd52600b218..edeeef3ad71 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java @@ -31,7 +31,7 @@ public class TestModelManager extends TestLlmBase { @BeforeClass public static void init() throws Exception { - setuptest(false); + setupTest(false, false); } @Test diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java index 382042293ee..98ca80fd002 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java @@ -31,7 +31,7 @@ public class TestModelManagerPersistence extends TestLlmBase { @Before public void init() throws Exception { - setupPersistenttest(true); + setupTest(false, true); } @After From 083503beb8e90b2be67f8163b07a8d676fd05a80 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Wed, 6 Nov 2024 11:08:08 +0000 Subject: [PATCH 19/65] clean up of tests after review --- .../test/org/apache/solr/llm/TestLlmBase.java | 16 ++++++---------- .../solr/llm/search/TextEmbedderQParserTest.java | 2 +- .../solr/llm/store/rest/TestModelManager.java | 2 +- .../store/rest/TestModelManagerPersistence.java | 4 ++-- 4 files changed, 10 insertions(+), 14 deletions(-) diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java b/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java index 75986df5cca..3e2eb67bc8b 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java @@ -55,8 +55,10 @@ public class TestLlmBase extends RestTestBase { protected static String vectorField2 = "vector2"; protected static String vectorFieldByteEncoding = "vector_byte_encoding"; - protected static void setupTest(boolean buildIndex, boolean persistent) throws Exception { - setupTest("solrconfig-llm.xml", "schema.xml", persistent); + public static void setupTest(String solrconfig, String schema, boolean buildIndex, boolean persistModelStore) throws Exception { + initFolders(persistModelStore); + createJettyAndHarness( + tmpSolrHome.toAbsolutePath().toString(), solrconfig, schema, "/solr", true, null); if (buildIndex) prepareIndex(); } @@ -66,7 +68,7 @@ public static ManagedEmbeddingModelStore getManagedModelStore() { } } - protected static void setupTestInit(boolean isPersistent) + protected static void initFolders(boolean isPersistent) throws Exception { tmpSolrHome = createTempDir(); tmpConfDir = tmpSolrHome.resolve(CONF_DIR); @@ -89,13 +91,7 @@ protected static void setupTestInit(boolean isPersistent) System.setProperty("managed.schema.mutable", "true"); } - public static void setupTest(String solrconfig, String schema, boolean persistent) throws Exception { - setupTestInit(persistent); - createJettyAndHarness( - tmpSolrHome.toAbsolutePath().toString(), solrconfig, schema, "/solr", true, null); - } - - protected static void aftertest() throws Exception { + protected static void afterTest() throws Exception { if (null != restTestHarness) { restTestHarness.close(); restTestHarness = null; diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/search/TextEmbedderQParserTest.java b/solr/modules/llm/src/test/org/apache/solr/llm/search/TextEmbedderQParserTest.java index bb8382db37c..ce870c16b10 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/search/TextEmbedderQParserTest.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/search/TextEmbedderQParserTest.java @@ -25,7 +25,7 @@ public class TextEmbedderQParserTest extends TestLlmBase { @BeforeClass public static void init() throws Exception { - setupTest(true, false); + setupTest("solrconfig-llm.xml", "schema.xml", true, false); loadModels("dummy-model.json"); } diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java index edeeef3ad71..3f4d527142c 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java @@ -31,7 +31,7 @@ public class TestModelManager extends TestLlmBase { @BeforeClass public static void init() throws Exception { - setupTest(false, false); + setupTest("solrconfig-llm.xml", "schema.xml", false, false); } @Test diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java index 98ca80fd002..d5305eeb475 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java @@ -31,12 +31,12 @@ public class TestModelManagerPersistence extends TestLlmBase { @Before public void init() throws Exception { - setupTest(false, true); + setupTest("solrconfig-llm.xml", "schema.xml", false, true); } @After public void cleanup() throws Exception { - aftertest(); + afterTest(); } @Test From f3bbe53e7dee9880b229a395fffecddedfdc2987 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Wed, 6 Nov 2024 11:15:15 +0000 Subject: [PATCH 20/65] Update settings.gradle Co-authored-by: Christine Poerschke --- settings.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle b/settings.gradle index 2bb10796251..fe21a217836 100644 --- a/settings.gradle +++ b/settings.gradle @@ -52,8 +52,8 @@ include "solr:modules:hadoop-auth" include "solr:modules:hdfs" include "solr:modules:jwt-auth" include "solr:modules:langid" -include "solr:modules:ltr" include "solr:modules:llm" +include "solr:modules:ltr" include "solr:modules:s3-repository" include "solr:modules:scripting" include "solr:modules:sql" From 340fc55dc7c7e0051833d228c20352f66e0be5ef Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Wed, 6 Nov 2024 11:16:06 +0000 Subject: [PATCH 21/65] Update solr/core/src/java/org/apache/solr/schema/DenseVectorField.java Co-authored-by: Christine Poerschke --- .../src/java/org/apache/solr/schema/DenseVectorField.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java b/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java index 825b362118f..59983118cb0 100644 --- a/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java +++ b/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java @@ -365,10 +365,6 @@ public ValueSource getValueSource(SchemaField field, QParser parser) { public Query getKnnVectorQuery( String fieldName, byte[] vectorToSearch, int topK, Query filterQuery) { - - DenseVectorParser vectorBuilder = - getVectorBuilder(vectorToSearch, DenseVectorParser.BuilderPhase.QUERY); - return new KnnByteVectorQuery(fieldName, vectorToSearch, topK, filterQuery); } From 46e013313325bdf3b42dea4a066f8b29b7aabdc1 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Wed, 6 Nov 2024 11:18:10 +0000 Subject: [PATCH 22/65] Update solr/core/src/java/org/apache/solr/schema/DenseVectorField.java Co-authored-by: Christine Poerschke --- .../src/java/org/apache/solr/schema/DenseVectorField.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java b/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java index 59983118cb0..25dfb797477 100644 --- a/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java +++ b/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java @@ -370,10 +370,6 @@ public Query getKnnVectorQuery( public Query getKnnVectorQuery( String fieldName, float[] vectorToSearch, int topK, Query filterQuery) { - - DenseVectorParser vectorBuilder = - getVectorBuilder(vectorToSearch, DenseVectorParser.BuilderPhase.QUERY); - return new KnnFloatVectorQuery(fieldName, vectorToSearch, topK, filterQuery); } From 43372a314453f70993dee6478d7fae71e33c48f3 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Wed, 6 Nov 2024 11:18:38 +0000 Subject: [PATCH 23/65] Update solr/modules/llm/src/java/org/apache/solr/llm/store/package-info.java Co-authored-by: Christine Poerschke --- .../llm/src/java/org/apache/solr/llm/store/package-info.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/package-info.java b/solr/modules/llm/src/java/org/apache/solr/llm/store/package-info.java index 9813a3f1ec6..c5da1c50aa2 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/store/package-info.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/store/package-info.java @@ -15,5 +15,5 @@ * limitations under the License. */ -/** Contains feature and model store related classes. */ +/** Contains model store related classes. */ package org.apache.solr.llm.store; From 34fc6f2b162881ecda93fed5b149a8029b7627aa Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Wed, 6 Nov 2024 11:19:07 +0000 Subject: [PATCH 24/65] Update solr/modules/llm/src/java/org/apache/solr/llm/store/rest/package-info.java Co-authored-by: Christine Poerschke --- .../src/java/org/apache/solr/llm/store/rest/package-info.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/package-info.java b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/package-info.java index fd691657d74..13861aa3227 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/package-info.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/package-info.java @@ -16,7 +16,7 @@ */ /** - * Contains the {@link org.apache.solr.rest.ManagedResource} that encapsulate the feature and the + * Contains the {@link org.apache.solr.rest.ManagedResource} that encapsulate the * model stores. */ package org.apache.solr.llm.store.rest; From f62d2704f049c69034ae29cbaa6aa447ded592ff Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Wed, 6 Nov 2024 11:20:52 +0000 Subject: [PATCH 25/65] Update solr/modules/llm/build.gradle Co-authored-by: Christine Poerschke --- solr/modules/llm/build.gradle | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/solr/modules/llm/build.gradle b/solr/modules/llm/build.gradle index 286ba041a3c..65df6cd5a01 100644 --- a/solr/modules/llm/build.gradle +++ b/solr/modules/llm/build.gradle @@ -25,11 +25,11 @@ dependencies { implementation 'org.apache.lucene:lucene-core' - implementation 'dev.langchain4j:langchain4j-hugging-face:0.35.0' - implementation 'dev.langchain4j:langchain4j-mistral-ai:0.35.0' - implementation 'dev.langchain4j:langchain4j-open-ai:0.35.0' - implementation 'dev.langchain4j:langchain4j-cohere:0.35.0' - implementation 'dev.langchain4j:langchain4j:0.35.0' + implementation 'dev.langchain4j:langchain4j-hugging-face' + implementation 'dev.langchain4j:langchain4j-mistral-ai' + implementation 'dev.langchain4j:langchain4j-open-ai' + implementation 'dev.langchain4j:langchain4j-cohere' + implementation 'dev.langchain4j:langchain4j' implementation 'org.slf4j:slf4j-api' From 66edb3dfb5745cae7068f3befcc8f89b4be0e77a Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Thu, 7 Nov 2024 11:27:21 +0000 Subject: [PATCH 26/65] added 'which one to use' section after review comments --- .../pages/dense-vector-search.adoc | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/solr/solr-ref-guide/modules/query-guide/pages/dense-vector-search.adoc b/solr/solr-ref-guide/modules/query-guide/pages/dense-vector-search.adoc index 37f9f0e2836..1a97e74da2d 100644 --- a/solr/solr-ref-guide/modules/query-guide/pages/dense-vector-search.adoc +++ b/solr/solr-ref-guide/modules/query-guide/pages/dense-vector-search.adoc @@ -375,6 +375,42 @@ Here's an example of a simple `vectorSimilarity` search: The search results retrieved are all documents whose similarity with the input vector `[1.0, 2.0, 3.0, 4.0]` is at least `0.7` based on the `similarityFunction` configured at indexing time +=== Which one to use? + +Let's see when to use each of the dense retrieval query parsers available: + +== knn Query Parser + +You should use the `knn` query parser when: + +* you search for the top-K closest vectors to a query vector +* you work directly with vectors (no text encoding is involved) +* you want to a have a fine-grained control over the way you encode text to vector and prefer to do it outside of Apache Solr + + +== embed Query Parser + +You should use the `embed` query parser when: + +* you search for the top-K closest vectors to a query text +* you work directly with text and want Solr to handle the encoding to vector behind the scenes +* you are building demos/prototypes + +[IMPORTANT] +==== +Apache Solr uses https://github.com/langchain4j/langchain4j[LangChain4j] to interact with Large Language Models. +The integration is experimental and we are going to improve our stress-test and benchmarking coverage of this query parser in future iterations: if you care about raw performance you may prefer to encode the text outside of Solr +==== + +== vectorSimilarity Query Parser + +You should use the `vectorSimilarity` query parser when: + +* you search for the closest vectors to a query vector within a similarity threshold +* you work directly with vectors (no text encoding is involved) +* you want to a have a fine-grained control over the way you encode text to vector and prefer to do it outside of Apache Solr + + === Graph Pre-Filtering Pre-Filtering the set of candidate documents considered when walking the graph can be specified either explicitly, or implicitly (based on existing `fq` params) depending on how and when these dense vector query parsers are used. From 1c8f24860a1b21d0301e792afbef180951d8ade5 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Thu, 7 Nov 2024 11:44:52 +0000 Subject: [PATCH 27/65] removed documentation errata --- .../modules/query-guide/pages/embedding-text.adoc | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc b/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc index 2b0aa8f2b8b..a01695f5e20 100644 --- a/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc +++ b/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc @@ -39,7 +39,7 @@ Training, fine-tuning and operating such Large Language Models is expensive. Many companies focus on this aspect and let users access APIs to encode the text (at the price of a license fee). -Apache Solr uses LangChain4j (add link here) to connect to such apis. +Apache Solr uses https://github.com/langchain4j/langchain4j[LangChain4j] to connect to such apis. [IMPORTANT] ==== @@ -60,9 +60,6 @@ At the moment the only supported way to interact with Large Language Models is v In the future additional components to empower Solr with LLM will be added. -== Installation of LLM - -The llm module requires the `modules/ltr/lib/solr-llm-*.jar` JARs. == LLM Configuration @@ -70,14 +67,6 @@ Large-Language-Model is a module and therefore its plugins must be configured in === Minimum Requirements -* Include the required module JARs. -Note that by default paths are relative to the Solr core, so they may need adjustments to your configuration, or an explicit specification of the `$solr.install.dir`. -+ -[source,xml] ----- - ----- - * Declaration of the `embed` query parser. + [source,xml] From cf117a3ce3bcd21dd34e9bf7228d5996fe661f1f Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Thu, 7 Nov 2024 11:50:06 +0000 Subject: [PATCH 28/65] added links to documentation --- .../modules/query-guide/pages/embedding-text.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc b/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc index a01695f5e20..fec95645d8c 100644 --- a/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc +++ b/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc @@ -121,11 +121,11 @@ The identifier of your model, this is used by any component that intends to use |=== + Each model class has potentially different params. -Many are shared but for the full set of parameters of the model you are interested in please refer to the official documentation of the LangChain4j version included in Solr (link to langChain). +Many are shared but for the full set of parameters of the model you are interested in please refer to the official documentation of the LangChain4j version included in Solr: https://docs.langchain4j.dev/category/embedding-models[Embedding Models in LangChain4j]. === Supported Models -Apache Solr uses LangChain4j (add link here) to support text embedding. +Apache Solr uses https://github.com/langchain4j/langchain4j[LangChain4j] to support text embedding. The models currently supported are: [tabs#supported-models] From d833795036fb3c799513ca3c7b2c3c0c7033f154 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Thu, 7 Nov 2024 11:53:06 +0000 Subject: [PATCH 29/65] Update solr/modules/llm/src/java/org/apache/solr/llm/search/TextEmbedderQParserPlugin.java Co-authored-by: Christine Poerschke --- .../org/apache/solr/llm/search/TextEmbedderQParserPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/search/TextEmbedderQParserPlugin.java b/solr/modules/llm/src/java/org/apache/solr/llm/search/TextEmbedderQParserPlugin.java index 030962ed30c..f10cfc48a4b 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/search/TextEmbedderQParserPlugin.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/search/TextEmbedderQParserPlugin.java @@ -97,7 +97,7 @@ public Query parse() throws SyntaxError { { float[] vectorToSearch = embedder.vectorise(qstr); checkVectorDimension(vectorToSearch.length, fieldDimensions); - return denseVectorType.getKnnVectorQuery( + return new KnnFloatVectorQuery( schemaField.getName(), vectorToSearch, topK, getFilterQuery()); } default: From 841784bc5da7cc7966c2941abfa54de150caf055 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Thu, 7 Nov 2024 11:55:45 +0000 Subject: [PATCH 30/65] review comment addressed --- .../java/org/apache/solr/schema/DenseVectorField.java | 10 ---------- .../solr/llm/search/TextEmbedderQParserPlugin.java | 1 + 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java b/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java index 25dfb797477..4d528361dd4 100644 --- a/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java +++ b/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java @@ -363,16 +363,6 @@ public ValueSource getValueSource(SchemaField field, QParser parser) { SolrException.ErrorCode.BAD_REQUEST, "Vector encoding not supported for function queries."); } - public Query getKnnVectorQuery( - String fieldName, byte[] vectorToSearch, int topK, Query filterQuery) { - return new KnnByteVectorQuery(fieldName, vectorToSearch, topK, filterQuery); - } - - public Query getKnnVectorQuery( - String fieldName, float[] vectorToSearch, int topK, Query filterQuery) { - return new KnnFloatVectorQuery(fieldName, vectorToSearch, topK, filterQuery); - } - public Query getKnnVectorQuery( String fieldName, String vectorToSearch, int topK, Query filterQuery) { diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/search/TextEmbedderQParserPlugin.java b/solr/modules/llm/src/java/org/apache/solr/llm/search/TextEmbedderQParserPlugin.java index f10cfc48a4b..f7ed48660df 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/search/TextEmbedderQParserPlugin.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/search/TextEmbedderQParserPlugin.java @@ -18,6 +18,7 @@ import java.io.IOException; import org.apache.lucene.index.VectorEncoding; +import org.apache.lucene.search.KnnFloatVectorQuery; import org.apache.lucene.search.Query; import org.apache.lucene.util.ResourceLoader; import org.apache.lucene.util.ResourceLoaderAware; From 7de51176f907ced6072c4c9905e754ccb8448d6c Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Thu, 7 Nov 2024 16:41:20 +0000 Subject: [PATCH 31/65] gradle tidy --- .../org/apache/solr/llm/store/rest/package-info.java | 5 +---- .../llm/src/test/org/apache/solr/llm/TestLlmBase.java | 9 +++++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/package-info.java b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/package-info.java index 13861aa3227..be6ec479768 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/package-info.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/package-info.java @@ -15,8 +15,5 @@ * limitations under the License. */ -/** - * Contains the {@link org.apache.solr.rest.ManagedResource} that encapsulate the - * model stores. - */ +/** Contains the {@link org.apache.solr.rest.ManagedResource} that encapsulate the model stores. */ package org.apache.solr.llm.store.rest; diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java b/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java index 3e2eb67bc8b..c776abe32b6 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java @@ -55,10 +55,12 @@ public class TestLlmBase extends RestTestBase { protected static String vectorField2 = "vector2"; protected static String vectorFieldByteEncoding = "vector_byte_encoding"; - public static void setupTest(String solrconfig, String schema, boolean buildIndex, boolean persistModelStore) throws Exception { + public static void setupTest( + String solrconfig, String schema, boolean buildIndex, boolean persistModelStore) + throws Exception { initFolders(persistModelStore); createJettyAndHarness( - tmpSolrHome.toAbsolutePath().toString(), solrconfig, schema, "/solr", true, null); + tmpSolrHome.toAbsolutePath().toString(), solrconfig, schema, "/solr", true, null); if (buildIndex) prepareIndex(); } @@ -68,8 +70,7 @@ public static ManagedEmbeddingModelStore getManagedModelStore() { } } - protected static void initFolders(boolean isPersistent) - throws Exception { + protected static void initFolders(boolean isPersistent) throws Exception { tmpSolrHome = createTempDir(); tmpConfDir = tmpSolrHome.resolve(CONF_DIR); tmpConfDir.toFile().deleteOnExit(); From c34ca75e1c34c7a725587b5b09f3aff30d6e8521 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Thu, 7 Nov 2024 17:27:25 +0000 Subject: [PATCH 32/65] followed Christine suggestion to simplify instantiation of embedder model --- .../llm/embedding/SolrEmbeddingModel.java | 34 +++++++------ .../test-files/modelExamples/dummy-model.json | 5 +- .../llm/embedding/DummyEmbeddingModel.java | 25 ++++++++-- .../embedding/DummyEmbeddingModelTest.java | 48 +++++++++++++++++++ 4 files changed, 88 insertions(+), 24 deletions(-) create mode 100644 solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModelTest.java diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java index 4d07b38197b..b7ca7d1cc52 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java @@ -19,7 +19,9 @@ import dev.langchain4j.data.embedding.Embedding; import dev.langchain4j.model.embedding.DimensionAwareEmbeddingModel; import dev.langchain4j.model.embedding.EmbeddingModel; +import java.lang.reflect.Method; import java.time.Duration; +import java.util.ArrayList; import java.util.Map; import java.util.Objects; import org.apache.lucene.util.Accountable; @@ -30,8 +32,6 @@ public class SolrEmbeddingModel implements Accountable { private static final long BASE_RAM_BYTES = RamUsageEstimator.shallowSizeOfInstance(SolrEmbeddingModel.class); public static final String TIMEOUT_PARAM = "timeout"; - public static final String LOG_REQUESTS_PARAM = "logRequests"; - public static final String LOG_RESPONSES_PARAM = "logResponses"; public static final String MAX_SEGMENTS_PER_BATCH_PARAM = "maxSegmentsPerBatch"; public static final String MAX_RETRIES_PARAM = "maxRetries"; @@ -53,18 +53,6 @@ public static SolrEmbeddingModel getInstance( Duration timeOut = Duration.ofSeconds((Long) params.get(paramName)); builder.getClass().getMethod(paramName, Duration.class).invoke(builder, timeOut); break; - case LOG_REQUESTS_PARAM: - builder - .getClass() - .getMethod(paramName, Boolean.class) - .invoke(builder, params.get(paramName)); - break; - case LOG_RESPONSES_PARAM: - builder - .getClass() - .getMethod(paramName, Boolean.class) - .invoke(builder, params.get(paramName)); - break; case MAX_SEGMENTS_PER_BATCH_PARAM: builder .getClass() @@ -78,10 +66,20 @@ public static SolrEmbeddingModel getInstance( .invoke(builder, ((Long) params.get(paramName)).intValue()); break; default: - builder - .getClass() - .getMethod(paramName, String.class) - .invoke(builder, params.get(paramName)); + ArrayList methods = new ArrayList<>(); + for (var method : builder.getClass().getMethods()) { + if (paramName.equals(method.getName()) && method.getParameterCount() == 1) { + methods.add(method); + } + } + if (methods.size() == 1) { + methods.get(0).invoke(builder, params.get(paramName)); + } else { + builder + .getClass() + .getMethod(paramName, String.class) + .invoke(builder, params.get(paramName)); + } } } } diff --git a/solr/modules/llm/src/test-files/modelExamples/dummy-model.json b/solr/modules/llm/src/test-files/modelExamples/dummy-model.json index 3de81640d10..8e850643456 100644 --- a/solr/modules/llm/src/test-files/modelExamples/dummy-model.json +++ b/solr/modules/llm/src/test-files/modelExamples/dummy-model.json @@ -1,4 +1,7 @@ { "class": "org.apache.solr.llm.embedding.DummyEmbeddingModel", - "name": "dummy-1" + "name": "dummy-1", + "params": { + "embedding": [1,2,3,4] + } } diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModel.java b/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModel.java index 98ffa9e6d97..d2effb4393a 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModel.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModel.java @@ -20,20 +20,25 @@ import dev.langchain4j.data.segment.TextSegment; import dev.langchain4j.model.embedding.EmbeddingModel; import dev.langchain4j.model.output.Response; +import java.util.ArrayList; import java.util.List; public class DummyEmbeddingModel implements EmbeddingModel { - public DummyEmbeddingModel() {} + final float[] embedding; + + public DummyEmbeddingModel(int[] embedding) { + this.embedding = new float[] {embedding[0], embedding[1], embedding[2], embedding[3]}; + } @Override public Response embed(String text) { - Embedding dummy = new Embedding(new float[] {1.0f, 2.0f, 3.0f, 4.0f}); + Embedding dummy = new Embedding(embedding); return new Response(dummy); } @Override public Response embed(TextSegment textSegment) { - Embedding dummy = new Embedding(new float[] {1.0f, 2.0f, 3.0f, 4.0f}); + Embedding dummy = new Embedding(embedding); return new Response(dummy); } @@ -44,7 +49,7 @@ public Response> embedAll(List textSegments) { @Override public int dimension() { - return 4; + return embedding.length; } public static DummyEmbeddingModelBuilder builder() { @@ -52,10 +57,20 @@ public static DummyEmbeddingModelBuilder builder() { } public static class DummyEmbeddingModelBuilder { + private int[] builderEmbeddings; + public DummyEmbeddingModelBuilder() {} + public DummyEmbeddingModelBuilder embedding(ArrayList embeddings) { + this.builderEmbeddings = new int[embeddings.size()]; + for (int i = 0; i < embeddings.size(); i++) { + this.builderEmbeddings[i] = embeddings.get(i).intValue(); + } + return this; + } + public DummyEmbeddingModel build() { - return new DummyEmbeddingModel(); + return new DummyEmbeddingModel(this.builderEmbeddings); } } } diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModelTest.java b/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModelTest.java new file mode 100644 index 00000000000..d020d50d430 --- /dev/null +++ b/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModelTest.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.solr.llm.embedding; + +import org.apache.solr.SolrTestCase; +import org.junit.Test; + +public class DummyEmbeddingModelTest extends SolrTestCase { + + @Test + public void constructAndEmbed() throws Exception { + assertEquals( + "[1.0, 2.0, 3.0, 4.0]", + new DummyEmbeddingModel(new int[] {1, 2, 3, 4}) + .embed("hello") + .content() + .vectorAsList() + .toString()); + assertEquals( + "[8.0, 7.0, 6.0, 5.0]", + new DummyEmbeddingModel(new int[] {8, 7, 6, 5}) + .embed("world") + .content() + .vectorAsList() + .toString()); + assertEquals( + "[0.0, 0.0, 4.0, 2.0]", + new DummyEmbeddingModel(new int[] {0, 0, 4, 2}) + .embed("answer") + .content() + .vectorAsList() + .toString()); + } +} From bbcb46340f2781ebccac8c9a1499f88a940850a6 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Thu, 7 Nov 2024 17:32:24 +0000 Subject: [PATCH 33/65] Update solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java Co-authored-by: Christine Poerschke --- .../java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java | 1 + 1 file changed, 1 insertion(+) diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java index b7ca7d1cc52..c120cceef3f 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java @@ -94,6 +94,7 @@ public SolrEmbeddingModel(String name, EmbeddingModel embedder, Map Date: Thu, 7 Nov 2024 17:34:11 +0000 Subject: [PATCH 34/65] followed Christine suggestion to simplify it --- .../org/apache/solr/llm/embedding/SolrEmbeddingModel.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java index c120cceef3f..d93282ed267 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java @@ -37,7 +37,7 @@ public class SolrEmbeddingModel implements Accountable { protected final String name; private final Map params; - private EmbeddingModel embedder; + private final EmbeddingModel embedder; private Integer hashCode; public static SolrEmbeddingModel getInstance( @@ -145,11 +145,7 @@ public String getName() { public EmbeddingModel getEmbedder() { return embedder; } - - public void setEmbedder(DimensionAwareEmbeddingModel embedder) { - this.embedder = embedder; - } - + public Map getParams() { return params; } From b0b88f88dd64685908a376e6def5f51ab7e6f0e0 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Tue, 12 Nov 2024 16:05:12 +0000 Subject: [PATCH 35/65] Update solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java Co-authored-by: Christine Poerschke --- .../java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java index d93282ed267..22abc3f3070 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java @@ -116,9 +116,6 @@ public long ramBytesUsed() { @Override public int hashCode() { - if (hashCode == null) { - hashCode = calculateHashCode(); - } return hashCode; } From eb8fb305048e0c1c5cdaae944b52186b8a7baaf8 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Tue, 12 Nov 2024 16:05:41 +0000 Subject: [PATCH 36/65] Update solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java Co-authored-by: Christine Poerschke --- .../java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java index 22abc3f3070..4cc03d8b0be 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java @@ -38,7 +38,7 @@ public class SolrEmbeddingModel implements Accountable { protected final String name; private final Map params; private final EmbeddingModel embedder; - private Integer hashCode; + private final Integer hashCode; public static SolrEmbeddingModel getInstance( String className, String name, Map params) throws EmbeddingModelException { From 1a0146526f7a893984559a9a90e906aa615d885d Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Tue, 12 Nov 2024 16:05:59 +0000 Subject: [PATCH 37/65] Update solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java Co-authored-by: Christine Poerschke --- .../org/apache/solr/llm/embedding/SolrEmbeddingModel.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java index 4cc03d8b0be..dbf1c6c5201 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java @@ -31,9 +31,9 @@ public class SolrEmbeddingModel implements Accountable { private static final long BASE_RAM_BYTES = RamUsageEstimator.shallowSizeOfInstance(SolrEmbeddingModel.class); - public static final String TIMEOUT_PARAM = "timeout"; - public static final String MAX_SEGMENTS_PER_BATCH_PARAM = "maxSegmentsPerBatch"; - public static final String MAX_RETRIES_PARAM = "maxRetries"; + private static final String TIMEOUT_PARAM = "timeout"; + private static final String MAX_SEGMENTS_PER_BATCH_PARAM = "maxSegmentsPerBatch"; + private static final String MAX_RETRIES_PARAM = "maxRetries"; protected final String name; private final Map params; From 944e8f81f1b7aa560ab389183f815c7ac8213f97 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Tue, 12 Nov 2024 16:06:22 +0000 Subject: [PATCH 38/65] Update solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java Co-authored-by: Christine Poerschke --- .../java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java index dbf1c6c5201..788c74ea2d3 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java @@ -35,7 +35,7 @@ public class SolrEmbeddingModel implements Accountable { private static final String MAX_SEGMENTS_PER_BATCH_PARAM = "maxSegmentsPerBatch"; private static final String MAX_RETRIES_PARAM = "maxRetries"; - protected final String name; + private final String name; private final Map params; private final EmbeddingModel embedder; private final Integer hashCode; From e3490d55a261de4b25d27ec59e285481cd1da07d Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Tue, 12 Nov 2024 16:07:24 +0000 Subject: [PATCH 39/65] Update solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java Co-authored-by: Christine Poerschke --- .../org/apache/solr/llm/embedding/SolrEmbeddingModel.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java index 788c74ea2d3..ca96183c6b1 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java @@ -139,8 +139,8 @@ public String getName() { return name; } - public EmbeddingModel getEmbedder() { - return embedder; + public String getEmbedderClassName() { + return embedder.getClass().getName(); } public Map getParams() { From 66c19514f8f3cde32350f20bf9f9c4b22b465b25 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Tue, 12 Nov 2024 16:07:42 +0000 Subject: [PATCH 40/65] Update solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java Co-authored-by: Christine Poerschke --- .../java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java | 1 - 1 file changed, 1 deletion(-) diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java index ca96183c6b1..70a580935bb 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java @@ -17,7 +17,6 @@ package org.apache.solr.llm.embedding; import dev.langchain4j.data.embedding.Embedding; -import dev.langchain4j.model.embedding.DimensionAwareEmbeddingModel; import dev.langchain4j.model.embedding.EmbeddingModel; import java.lang.reflect.Method; import java.time.Duration; From cb9defdf9e18f38ada6ca3403f666d5b46aeb092 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Tue, 12 Nov 2024 16:13:19 +0000 Subject: [PATCH 41/65] review comments --- .../rest/ManagedEmbeddingModelStore.java | 2 +- .../test-files/modelExamples/dummy-model.json | 2 +- .../llm/embedding/DummyEmbeddingModel.java | 14 +++---- .../embedding/DummyEmbeddingModelTest.java | 38 +++++++++---------- 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java index 8ed0620c5a2..4b5f5ff1ed7 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java @@ -197,7 +197,7 @@ public static SolrEmbeddingModel fromEmbeddingModelMap(Map embed private static LinkedHashMap toEmbeddingModelMap(SolrEmbeddingModel model) { final LinkedHashMap modelMap = new LinkedHashMap<>(5, 1.0f); modelMap.put(NAME_KEY, model.getName()); - modelMap.put(CLASS_KEY, model.getEmbedder().getClass().getName()); + modelMap.put(CLASS_KEY, model.getEmbedderClassName()); modelMap.put(PARAMS_KEY, model.getParams()); return modelMap; } diff --git a/solr/modules/llm/src/test-files/modelExamples/dummy-model.json b/solr/modules/llm/src/test-files/modelExamples/dummy-model.json index 8e850643456..527b86db5f2 100644 --- a/solr/modules/llm/src/test-files/modelExamples/dummy-model.json +++ b/solr/modules/llm/src/test-files/modelExamples/dummy-model.json @@ -2,6 +2,6 @@ "class": "org.apache.solr.llm.embedding.DummyEmbeddingModel", "name": "dummy-1", "params": { - "embedding": [1,2,3,4] + "embedding": [1.0, 2.0, 3.0, 4.0] } } diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModel.java b/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModel.java index d2effb4393a..53d8dd882b9 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModel.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModel.java @@ -26,8 +26,8 @@ public class DummyEmbeddingModel implements EmbeddingModel { final float[] embedding; - public DummyEmbeddingModel(int[] embedding) { - this.embedding = new float[] {embedding[0], embedding[1], embedding[2], embedding[3]}; + public DummyEmbeddingModel(float[] embedding) { + this.embedding = embedding; } @Override @@ -57,14 +57,14 @@ public static DummyEmbeddingModelBuilder builder() { } public static class DummyEmbeddingModelBuilder { - private int[] builderEmbeddings; + private float[] builderEmbeddings; public DummyEmbeddingModelBuilder() {} - public DummyEmbeddingModelBuilder embedding(ArrayList embeddings) { - this.builderEmbeddings = new int[embeddings.size()]; + public DummyEmbeddingModelBuilder embedding(ArrayList embeddings) { + this.builderEmbeddings = new float[embeddings.size()]; for (int i = 0; i < embeddings.size(); i++) { - this.builderEmbeddings[i] = embeddings.get(i).intValue(); + this.builderEmbeddings[i] = embeddings.get(i).floatValue(); } return this; } @@ -73,4 +73,4 @@ public DummyEmbeddingModel build() { return new DummyEmbeddingModel(this.builderEmbeddings); } } -} +} \ No newline at end of file diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModelTest.java b/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModelTest.java index d020d50d430..e3f5c85cadf 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModelTest.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModelTest.java @@ -24,25 +24,25 @@ public class DummyEmbeddingModelTest extends SolrTestCase { @Test public void constructAndEmbed() throws Exception { assertEquals( - "[1.0, 2.0, 3.0, 4.0]", - new DummyEmbeddingModel(new int[] {1, 2, 3, 4}) - .embed("hello") - .content() - .vectorAsList() - .toString()); + "[1.0, 2.0, 3.0, 4.0]", + new DummyEmbeddingModel(new float[] {1, 2, 3, 4}) + .embed("hello") + .content() + .vectorAsList() + .toString()); assertEquals( - "[8.0, 7.0, 6.0, 5.0]", - new DummyEmbeddingModel(new int[] {8, 7, 6, 5}) - .embed("world") - .content() - .vectorAsList() - .toString()); + "[8.0, 7.0, 6.0, 5.0]", + new DummyEmbeddingModel(new float[] {8, 7, 6, 5}) + .embed("world") + .content() + .vectorAsList() + .toString()); assertEquals( - "[0.0, 0.0, 4.0, 2.0]", - new DummyEmbeddingModel(new int[] {0, 0, 4, 2}) - .embed("answer") - .content() - .vectorAsList() - .toString()); + "[0.0, 0.0, 4.0, 2.0]", + new DummyEmbeddingModel(new float[] {0, 0, 4, 2}) + .embed("answer") + .content() + .vectorAsList() + .toString()); } -} +} \ No newline at end of file From c41781b8d4c8b39bf516187afd0042c388bb88cf Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Tue, 12 Nov 2024 16:19:15 +0000 Subject: [PATCH 42/65] query parser rename --- .../solr/collection1/conf/solrconfig-llm.xml | 2 +- .../llm/search/TextEmbedderQParserTest.java | 48 +++++++++---------- .../pages/dense-vector-search.adoc | 2 +- .../query-guide/pages/embedding-text.adoc | 2 +- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml b/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml index e9e1dd6b635..17278b44c1c 100644 --- a/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml +++ b/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml @@ -22,7 +22,7 @@ - diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/search/TextEmbedderQParserTest.java b/solr/modules/llm/src/test/org/apache/solr/llm/search/TextEmbedderQParserTest.java index ce870c16b10..10df9998aa2 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/search/TextEmbedderQParserTest.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/search/TextEmbedderQParserTest.java @@ -31,7 +31,7 @@ public static void init() throws Exception { @Test public void notExistentModel_shouldThrowException() throws Exception { - final String solrQuery = "{!embed model=not-exist f=vector topK=5}hello world"; + final String solrQuery = "{!text_embedder model=not-exist f=vector topK=5}hello world"; final SolrQuery query = new SolrQuery(); query.setQuery(solrQuery); query.add("fl", "id"); @@ -44,7 +44,7 @@ public void notExistentModel_shouldThrowException() throws Exception { @Test public void missingModelParam_shouldThrowException() throws Exception { - final String solrQuery = "{!embed f=vector topK=5}hello world"; + final String solrQuery = "{!text_embedder f=vector topK=5}hello world"; final SolrQuery query = new SolrQuery(); query.setQuery(solrQuery); query.add("fl", "id"); @@ -57,7 +57,7 @@ public void missingModelParam_shouldThrowException() throws Exception { @Test public void incorrectVectorFieldType_shouldThrowException() throws Exception { - final String solrQuery = "{!embed model=dummy-1 f=id topK=5}hello world"; + final String solrQuery = "{!text_embedder model=dummy-1 f=id topK=5}hello world"; final SolrQuery query = new SolrQuery(); query.setQuery(solrQuery); query.add("fl", "id"); @@ -70,7 +70,7 @@ public void incorrectVectorFieldType_shouldThrowException() throws Exception { @Test public void undefinedVectorField_shouldThrowException() throws Exception { - final String solrQuery = "{!embed model=dummy-1 f=notExistent topK=5}hello world"; + final String solrQuery = "{!text_embedder model=dummy-1 f=notExistent topK=5}hello world"; final SolrQuery query = new SolrQuery(); query.setQuery(solrQuery); query.add("fl", "id"); @@ -83,7 +83,7 @@ public void undefinedVectorField_shouldThrowException() throws Exception { @Test public void missingVectorFieldParam_shouldThrowException() throws Exception { - final String solrQuery = "{!embed model=dummy-1 topK=5}hello world"; + final String solrQuery = "{!text_embedder model=dummy-1 topK=5}hello world"; final SolrQuery query = new SolrQuery(); query.setQuery(solrQuery); query.add("fl", "id"); @@ -96,7 +96,7 @@ public void missingVectorFieldParam_shouldThrowException() throws Exception { @Test public void vectorByteEncodingField_shouldRaiseException() throws Exception { - final String solrQuery = "{!embed model=dummy-1 f=vector_byte_encoding topK=5}hello world"; + final String solrQuery = "{!text_embedder model=dummy-1 f=vector_byte_encoding topK=5}hello world"; final SolrQuery query = new SolrQuery(); query.setQuery(solrQuery); query.add("fl", "id"); @@ -109,7 +109,7 @@ public void vectorByteEncodingField_shouldRaiseException() throws Exception { @Test public void missingQueryToEmbed_shouldThrowException() throws Exception { - final String solrQuery = "{!embed model=dummy-1 f=vector topK=5}"; + final String solrQuery = "{!text_embedder model=dummy-1 f=vector topK=5}"; final SolrQuery query = new SolrQuery(); query.setQuery(solrQuery); query.add("fl", "id"); @@ -122,7 +122,7 @@ public void missingQueryToEmbed_shouldThrowException() throws Exception { @Test public void incorrectVectorToSearchDimension_shouldThrowException() throws Exception { - final String solrQuery = "{!embed model=dummy-1 f=2048_float_vector topK=5}hello world"; + final String solrQuery = "{!text_embedder model=dummy-1 f=2048_float_vector topK=5}hello world"; final SolrQuery query = new SolrQuery(); query.setQuery(solrQuery); query.add("fl", "id"); @@ -135,7 +135,7 @@ public void incorrectVectorToSearchDimension_shouldThrowException() throws Excep @Test public void topK_shouldEmbedAndReturnOnlyTopKResults() throws Exception { - final String solrQuery = "{!embed model=dummy-1 f=vector topK=5}hello world"; + final String solrQuery = "{!text_embedder model=dummy-1 f=vector topK=5}hello world"; final SolrQuery query = new SolrQuery(); query.setQuery(solrQuery); query.add("fl", "id"); @@ -152,7 +152,7 @@ public void topK_shouldEmbedAndReturnOnlyTopKResults() throws Exception { @Test public void vectorFieldParam_shouldSearchOnThatField() throws Exception { - final String solrQuery = "{!embed model=dummy-1 f=vector2 topK=5}hello world"; + final String solrQuery = "{!text_embedder model=dummy-1 f=vector2 topK=5}hello world"; final SolrQuery query = new SolrQuery(); query.setQuery(solrQuery); query.add("fl", "id"); @@ -167,7 +167,7 @@ public void vectorFieldParam_shouldSearchOnThatField() throws Exception { @Test public void embeddedQuery_shouldRankBySimilarityFunction() throws Exception { - final String solrQuery = "{!embed model=dummy-1 f=vector topK=10}hello world"; + final String solrQuery = "{!text_embedder model=dummy-1 f=vector topK=10}hello world"; final SolrQuery query = new SolrQuery(); query.setQuery(solrQuery); query.add("fl", "id"); @@ -190,7 +190,7 @@ public void embeddedQuery_shouldRankBySimilarityFunction() throws Exception { @Test public void embeddedQueryUsedInFilter_shouldFilterResultsBeforeTheQueryExecution() throws Exception { - final String solrQuery = "{!embed model=dummy-1 f=vector topK=4}hello world"; + final String solrQuery = "{!text_embedder model=dummy-1 f=vector topK=4}hello world"; final SolrQuery query = new SolrQuery(); query.setQuery("id:(3 4 9 2)"); query.setFilterQueries(solrQuery); @@ -206,7 +206,7 @@ public void embeddedQueryUsedInFilter_shouldFilterResultsBeforeTheQueryExecution @Test public void embeddedQueryUsedInFilters_shouldFilterResultsBeforeTheQueryExecution() throws Exception { - final String solrQuery = "{!embed model=dummy-1 f=vector topK=4}hello world"; + final String solrQuery = "{!text_embedder model=dummy-1 f=vector topK=4}hello world"; final SolrQuery query = new SolrQuery(); query.setQuery("id:(3 4 9 2)"); query.setFilterQueries(solrQuery, "id:(4 20 9)"); @@ -221,7 +221,7 @@ public void embeddedQueryUsedInFilters_shouldFilterResultsBeforeTheQueryExecutio public void embeddedQueryUsedInFiltersWithPreFilter_shouldFilterResultsBeforeTheQueryExecution() throws Exception { final String solrQuery = - "{!embed model=dummy-1 f=vector topK=4 preFilter='id:(1 4 7 8 9)'}hello world"; + "{!text_embedder model=dummy-1 f=vector topK=4 preFilter='id:(1 4 7 8 9)'}hello world"; final SolrQuery query = new SolrQuery(); query.setQuery("id:(3 4 9 2)"); query.setFilterQueries(solrQuery, "id:(4 20 9)"); @@ -239,8 +239,8 @@ public void embeddedQueryUsedInFiltersWithPreFilter_shouldFilterResultsBeforeThe public void embeddedQueryUsedInFilters_rejectIncludeExclude() throws Exception { for (String fq : Arrays.asList( - "{!embed model=dummy-1 f=vector topK=5 includeTags=xxx}hello world", - "{!embed model=dummy-1 f=vector topK=5 excludeTags=xxx}hello world")) { + "{!text_embedder model=dummy-1 f=vector topK=5 includeTags=xxx}hello world", + "{!text_embedder model=dummy-1 f=vector topK=5 excludeTags=xxx}hello world")) { final SolrQuery query = new SolrQuery(); query.setQuery("*:*"); query.setFilterQueries(fq); @@ -255,7 +255,7 @@ public void embeddedQueryUsedInFilters_rejectIncludeExclude() throws Exception { @Test public void embeddedQueryAsSubQuery() throws Exception { - final String solrQuery = "*:* AND {!embed model=dummy-1 f=vector topK=5 v='hello world'}"; + final String solrQuery = "*:* AND {!text_embedder model=dummy-1 f=vector topK=5 v='hello world'}"; final SolrQuery query = new SolrQuery(); query.setQuery(solrQuery); query.setFilterQueries("id:(2 4 7 9 8 20 3)"); @@ -274,7 +274,7 @@ public void embeddedQueryAsSubQuery() throws Exception { @Test public void embeddedQueryAsSubQuery_withPreFilter() throws Exception { final String solrQuery = - "*:* AND {!embed model=dummy-1 f=vector topK=5 preFilter='id:(2 4 7 9 8 20 3)' v='hello world'}"; + "*:* AND {!text_embedder model=dummy-1 f=vector topK=5 preFilter='id:(2 4 7 9 8 20 3)' v='hello world'}"; final SolrQuery query = new SolrQuery(); query.setQuery(solrQuery); query.add("fl", "id"); @@ -295,8 +295,8 @@ public void embeddedQueryAsSubQuery_withPreFilter() throws Exception { public void embeddedQueryAsSubQuery_rejectIncludeExclude() throws Exception { for (String q : Arrays.asList( - "{!embed model=dummy-1 f=vector topK=5 includeTags=xxx}hello world", - "{!embed model=dummy-1 f=vector topK=5 excludeTags=xxx}hello world")) { + "{!text_embedder model=dummy-1 f=vector topK=5 includeTags=xxx}hello world", + "{!text_embedder model=dummy-1 f=vector topK=5 excludeTags=xxx}hello world")) { final SolrQuery query = new SolrQuery(); query.setQuery("*:* OR " + q); query.add("fl", "id"); @@ -310,7 +310,7 @@ public void embeddedQueryAsSubQuery_rejectIncludeExclude() throws Exception { @Test public void embeddedQueryWithCostlyFq_shouldPerformKnnSearchWithPostFilter() throws Exception { - final String solrQuery = "{!embed model=dummy-1 f=vector topK=10}hello world"; + final String solrQuery = "{!text_embedder model=dummy-1 f=vector topK=10}hello world"; final SolrQuery query = new SolrQuery(); query.setQuery(solrQuery); query.setFilterQueries("{!frange cache=false l=0.99}$q"); @@ -329,7 +329,7 @@ public void embeddedQueryWithCostlyFq_shouldPerformKnnSearchWithPostFilter() thr @Test public void embeddedQueryWithFilterQueries_shouldPerformKnnSearchWithPreFiltersAndPostFilters() throws Exception { - final String solrQuery = "{!embed model=dummy-1 f=vector topK=4}hello world"; + final String solrQuery = "{!text_embedder model=dummy-1 f=vector topK=4}hello world"; final SolrQuery query = new SolrQuery(); query.setQuery(solrQuery); query.setFilterQueries("id:(3 4 9 2)", "{!frange cache=false l=0.99}$q"); @@ -345,7 +345,7 @@ public void embeddedQueryWithFilterQueries_shouldPerformKnnSearchWithPreFiltersA @Test public void embeddedQueryWithNegativeFilterQuery_shouldPerformKnnSearchInPreFilteredResults() throws Exception { - final String solrQuery = "{!embed model=dummy-1 f=vector topK=4}hello world"; + final String solrQuery = "{!text_embedder model=dummy-1 f=vector topK=4}hello world"; final SolrQuery query = new SolrQuery(); query.setQuery(solrQuery); query.setFilterQueries("-id:4"); @@ -368,7 +368,7 @@ public void embeddedQueryWithNegativeFilterQuery_shouldPerformKnnSearchInPreFilt public void embeddedQueryAsRerank_shouldAddSimilarityFunctionScore() throws Exception { final SolrQuery query = new SolrQuery(); query.set("rq", "{!rerank reRankQuery=$rqq reRankDocs=4 reRankWeight=1}"); - query.set("rqq", "{!embed model=dummy-1 f=vector topK=4}hello world"); + query.set("rqq", "{!text_embedder model=dummy-1 f=vector topK=4}hello world"); query.setQuery("id:(3 4 9 2)"); query.add("fl", "id"); diff --git a/solr/solr-ref-guide/modules/query-guide/pages/dense-vector-search.adoc b/solr/solr-ref-guide/modules/query-guide/pages/dense-vector-search.adoc index 1a97e74da2d..726f9383b24 100644 --- a/solr/solr-ref-guide/modules/query-guide/pages/dense-vector-search.adoc +++ b/solr/solr-ref-guide/modules/query-guide/pages/dense-vector-search.adoc @@ -336,7 +336,7 @@ How many k-nearest results to return. Here's an example of a simple `embed` search: [source,text] -?q={!embed model=a-model f=vector topK=10}hello world query +?q={!text_embedder model=a-model f=vector topK=10}hello world query The search results retrieved are the k=10 nearest documents to the vector encoded from the query `hello world query`, using the model `a-model`. diff --git a/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc b/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc index fec95645d8c..5a6e513744e 100644 --- a/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc +++ b/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc @@ -262,7 +262,7 @@ http://localhost:8983/solr/techproducts/schema/embedding-model-store To run a query that embeds your query text, using a model you previously uploaded is simple: [source,text] -?q={!embed model=a-model f=vector topK=10}hello world query +?q={!text_embedder model=a-model f=vector topK=10}hello world query The search results retrieved are the k=10 nearest documents to the vector encoded from the query `hello world query`, using the model `a-model`. From 3a7543fc803014f77fec46db11a62529bc6e4f30 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Mon, 18 Nov 2024 09:23:39 +0000 Subject: [PATCH 43/65] added comments to make cleare the inversion of control part + gradle tidy --- .../llm/embedding/SolrEmbeddingModel.java | 22 ++++++++--- .../llm/embedding/DummyEmbeddingModel.java | 2 +- .../embedding/DummyEmbeddingModelTest.java | 38 +++++++++---------- .../llm/search/TextEmbedderQParserTest.java | 6 ++- 4 files changed, 41 insertions(+), 27 deletions(-) diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java index 70a580935bb..dbac1ba23b1 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java @@ -42,10 +42,22 @@ public class SolrEmbeddingModel implements Accountable { public static SolrEmbeddingModel getInstance( String className, String name, Map params) throws EmbeddingModelException { try { + /* + * The idea herea is to build a {@link dev.langchain4j.model.embedding.EmbeddingModel} using inversion + * of control. + * Each model has its own list of parameters we don't know beforehand, but each {@link dev.langchain4j.model.embedding.EmbeddingModel} class + * has its own builder that uses setters with the same name of the parameter in input. + * */ EmbeddingModel embedder; Class modelClass = Class.forName(className); var builder = modelClass.getMethod("builder").invoke(null); if (params != null) { + /** + * Some {@link dev.langchain4j.model.embedding.EmbeddingModel} classes have params of + * specific types that must be constructed, for primitive types we can resort to the + * default. N.B. when adding support to new models, pay attention to all the parameters they + * support, some of them may require to be handled in here as separate switch cases + */ for (String paramName : params.keySet()) { switch (paramName) { case TIMEOUT_PARAM: @@ -65,14 +77,14 @@ public static SolrEmbeddingModel getInstance( .invoke(builder, ((Long) params.get(paramName)).intValue()); break; default: - ArrayList methods = new ArrayList<>(); + ArrayList paramNameMatches = new ArrayList<>(); for (var method : builder.getClass().getMethods()) { if (paramName.equals(method.getName()) && method.getParameterCount() == 1) { - methods.add(method); + paramNameMatches.add(method); } } - if (methods.size() == 1) { - methods.get(0).invoke(builder, params.get(paramName)); + if (paramNameMatches.size() == 1) { + paramNameMatches.get(0).invoke(builder, params.get(paramName)); } else { builder .getClass() @@ -141,7 +153,7 @@ public String getName() { public String getEmbedderClassName() { return embedder.getClass().getName(); } - + public Map getParams() { return params; } diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModel.java b/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModel.java index 53d8dd882b9..1076f5d0bbf 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModel.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModel.java @@ -73,4 +73,4 @@ public DummyEmbeddingModel build() { return new DummyEmbeddingModel(this.builderEmbeddings); } } -} \ No newline at end of file +} diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModelTest.java b/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModelTest.java index e3f5c85cadf..3aca97d7e42 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModelTest.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModelTest.java @@ -24,25 +24,25 @@ public class DummyEmbeddingModelTest extends SolrTestCase { @Test public void constructAndEmbed() throws Exception { assertEquals( - "[1.0, 2.0, 3.0, 4.0]", - new DummyEmbeddingModel(new float[] {1, 2, 3, 4}) - .embed("hello") - .content() - .vectorAsList() - .toString()); + "[1.0, 2.0, 3.0, 4.0]", + new DummyEmbeddingModel(new float[] {1, 2, 3, 4}) + .embed("hello") + .content() + .vectorAsList() + .toString()); assertEquals( - "[8.0, 7.0, 6.0, 5.0]", - new DummyEmbeddingModel(new float[] {8, 7, 6, 5}) - .embed("world") - .content() - .vectorAsList() - .toString()); + "[8.0, 7.0, 6.0, 5.0]", + new DummyEmbeddingModel(new float[] {8, 7, 6, 5}) + .embed("world") + .content() + .vectorAsList() + .toString()); assertEquals( - "[0.0, 0.0, 4.0, 2.0]", - new DummyEmbeddingModel(new float[] {0, 0, 4, 2}) - .embed("answer") - .content() - .vectorAsList() - .toString()); + "[0.0, 0.0, 4.0, 2.0]", + new DummyEmbeddingModel(new float[] {0, 0, 4, 2}) + .embed("answer") + .content() + .vectorAsList() + .toString()); } -} \ No newline at end of file +} diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/search/TextEmbedderQParserTest.java b/solr/modules/llm/src/test/org/apache/solr/llm/search/TextEmbedderQParserTest.java index 10df9998aa2..b82463bec05 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/search/TextEmbedderQParserTest.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/search/TextEmbedderQParserTest.java @@ -96,7 +96,8 @@ public void missingVectorFieldParam_shouldThrowException() throws Exception { @Test public void vectorByteEncodingField_shouldRaiseException() throws Exception { - final String solrQuery = "{!text_embedder model=dummy-1 f=vector_byte_encoding topK=5}hello world"; + final String solrQuery = + "{!text_embedder model=dummy-1 f=vector_byte_encoding topK=5}hello world"; final SolrQuery query = new SolrQuery(); query.setQuery(solrQuery); query.add("fl", "id"); @@ -255,7 +256,8 @@ public void embeddedQueryUsedInFilters_rejectIncludeExclude() throws Exception { @Test public void embeddedQueryAsSubQuery() throws Exception { - final String solrQuery = "*:* AND {!text_embedder model=dummy-1 f=vector topK=5 v='hello world'}"; + final String solrQuery = + "*:* AND {!text_embedder model=dummy-1 f=vector topK=5 v='hello world'}"; final SolrQuery query = new SolrQuery(); query.setQuery(solrQuery); query.setFilterQueries("id:(2 4 7 9 8 20 3)"); From 55d1e2c8b3754826d905e4181101f63efc94a15d Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Mon, 18 Nov 2024 11:11:27 +0000 Subject: [PATCH 44/65] renaming around to make it clearer --- .../llm/embedding/SolrEmbeddingModel.java | 26 ++++----- ...in.java => TextToVectorQParserPlugin.java} | 25 +++++---- .../rest/ManagedEmbeddingModelStore.java | 2 +- .../solr/collection1/conf/solrconfig-llm.xml | 4 +- ...Test.java => TextToVectorQParserTest.java} | 53 ++++++++++--------- .../solr/llm/store/rest/TestModelManager.java | 4 +- .../pages/dense-vector-search.adoc | 14 ++--- .../query-guide/pages/embedding-text.adoc | 8 +-- 8 files changed, 68 insertions(+), 68 deletions(-) rename solr/modules/llm/src/java/org/apache/solr/llm/search/{TextEmbedderQParserPlugin.java => TextToVectorQParserPlugin.java} (86%) rename solr/modules/llm/src/test/org/apache/solr/llm/search/{TextEmbedderQParserTest.java => TextToVectorQParserTest.java} (83%) diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java index dbac1ba23b1..6c8b0faa726 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java @@ -36,19 +36,19 @@ public class SolrEmbeddingModel implements Accountable { private final String name; private final Map params; - private final EmbeddingModel embedder; + private final EmbeddingModel textToVector; private final Integer hashCode; public static SolrEmbeddingModel getInstance( String className, String name, Map params) throws EmbeddingModelException { try { /* - * The idea herea is to build a {@link dev.langchain4j.model.embedding.EmbeddingModel} using inversion + * The idea here is to build a {@link dev.langchain4j.model.embedding.EmbeddingModel} using inversion * of control. * Each model has its own list of parameters we don't know beforehand, but each {@link dev.langchain4j.model.embedding.EmbeddingModel} class * has its own builder that uses setters with the same name of the parameter in input. * */ - EmbeddingModel embedder; + EmbeddingModel textToVector; Class modelClass = Class.forName(className); var builder = modelClass.getMethod("builder").invoke(null); if (params != null) { @@ -94,22 +94,22 @@ public static SolrEmbeddingModel getInstance( } } } - embedder = (EmbeddingModel) builder.getClass().getMethod("build").invoke(builder); - return new SolrEmbeddingModel(name, embedder, params); + textToVector = (EmbeddingModel) builder.getClass().getMethod("build").invoke(builder); + return new SolrEmbeddingModel(name, textToVector, params); } catch (final Exception e) { throw new EmbeddingModelException("Model loading failed for " + className, e); } } - public SolrEmbeddingModel(String name, EmbeddingModel embedder, Map params) { + public SolrEmbeddingModel(String name, EmbeddingModel textToVector, Map params) { this.name = name; - this.embedder = embedder; + this.textToVector = textToVector; this.params = params; this.hashCode = calculateHashCode(); } public float[] vectorise(String text) { - Embedding vector = embedder.embed(text).content(); + Embedding vector = textToVector.embed(text).content(); return vector.vector(); } @@ -122,7 +122,7 @@ public String toString() { public long ramBytesUsed() { return BASE_RAM_BYTES + RamUsageEstimator.sizeOfObject(name) - + RamUsageEstimator.sizeOfObject(embedder); + + RamUsageEstimator.sizeOfObject(textToVector); } @Override @@ -134,7 +134,7 @@ private int calculateHashCode() { final int prime = 31; int result = 1; result = (prime * result) + Objects.hashCode(name); - result = (prime * result) + Objects.hashCode(embedder); + result = (prime * result) + Objects.hashCode(textToVector); return result; } @@ -143,15 +143,15 @@ public boolean equals(Object obj) { if (this == obj) return true; if (!(obj instanceof SolrEmbeddingModel)) return false; final SolrEmbeddingModel other = (SolrEmbeddingModel) obj; - return Objects.equals(embedder, other.embedder) && Objects.equals(name, other.name); + return Objects.equals(textToVector, other.textToVector) && Objects.equals(name, other.name); } public String getName() { return name; } - public String getEmbedderClassName() { - return embedder.getClass().getName(); + public String getEmbeddingModelClassName() { + return textToVector.getClass().getName(); } public Map getParams() { diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/search/TextEmbedderQParserPlugin.java b/solr/modules/llm/src/java/org/apache/solr/llm/search/TextToVectorQParserPlugin.java similarity index 86% rename from solr/modules/llm/src/java/org/apache/solr/llm/search/TextEmbedderQParserPlugin.java rename to solr/modules/llm/src/java/org/apache/solr/llm/search/TextToVectorQParserPlugin.java index f7ed48660df..7a85f3fc53e 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/search/TextEmbedderQParserPlugin.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/search/TextToVectorQParserPlugin.java @@ -39,11 +39,11 @@ import org.apache.solr.search.neural.KnnQParser; /** - * A neural query parser that embed the query and then run K-nearest neighbors search on Dense - * Vector fields. See Wiki page + * A neural query parser that encode the query to a vector and then run K-nearest neighbors search + * on Dense Vector fields. See Wiki page * https://solr.apache.org/guide/solr/latest/query-guide/dense-vector-search.html */ -public class TextEmbedderQParserPlugin extends QParserPlugin +public class TextToVectorQParserPlugin extends QParserPlugin implements ResourceLoaderAware, ManagedResourceObserver { public static final String EMBEDDING_MODEL_PARAM = "model"; private ManagedEmbeddingModelStore modelStore = null; @@ -51,7 +51,7 @@ public class TextEmbedderQParserPlugin extends QParserPlugin @Override public QParser createParser( String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) { - return new TextEmbedderQParser(qstr, localParams, params, req); + return new TextToVectorQParser(qstr, localParams, params, req); } @Override @@ -67,26 +67,25 @@ public void onManagedResourceInitialized(NamedList args, ManagedResource res) modelStore = (ManagedEmbeddingModelStore) res; } if (modelStore != null) { - // now we can safely load the models modelStore.loadStoredModels(); } } - public class TextEmbedderQParser extends KnnQParser { + public class TextToVectorQParser extends KnnQParser { - public TextEmbedderQParser( - String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) { - super(qstr, localParams, params, req); + public TextToVectorQParser( + String queryString, SolrParams localParams, SolrParams params, SolrQueryRequest req) { + super(queryString, localParams, params, req); } @Override public Query parse() throws SyntaxError { - checkParam(qstr, "Query string is empty, nothing to embed"); + checkParam(qstr, "Query string is empty, nothing to vectorise"); final String embeddingModelName = localParams.get(EMBEDDING_MODEL_PARAM); checkParam(embeddingModelName, "The 'model' parameter is missing"); - SolrEmbeddingModel embedder = modelStore.getModel(embeddingModelName); + SolrEmbeddingModel textToVector = modelStore.getModel(embeddingModelName); - if (embedder != null) { + if (textToVector != null) { final SchemaField schemaField = req.getCore().getLatestSchema().getField(getFieldName()); final DenseVectorField denseVectorType = getCheckedFieldType(schemaField); int fieldDimensions = denseVectorType.getDimension(); @@ -96,7 +95,7 @@ public Query parse() throws SyntaxError { switch (vectorEncoding) { case FLOAT32: { - float[] vectorToSearch = embedder.vectorise(qstr); + float[] vectorToSearch = textToVector.vectorise(qstr); checkVectorDimension(vectorToSearch.length, fieldDimensions); return new KnnFloatVectorQuery( schemaField.getName(), vectorToSearch, topK, getFilterQuery()); diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java index 4b5f5ff1ed7..f25a7a43f41 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java @@ -197,7 +197,7 @@ public static SolrEmbeddingModel fromEmbeddingModelMap(Map embed private static LinkedHashMap toEmbeddingModelMap(SolrEmbeddingModel model) { final LinkedHashMap modelMap = new LinkedHashMap<>(5, 1.0f); modelMap.put(NAME_KEY, model.getName()); - modelMap.put(CLASS_KEY, model.getEmbedderClassName()); + modelMap.put(CLASS_KEY, model.getEmbeddingModelClassName()); modelMap.put(PARAMS_KEY, model.getParams()); return modelMap; } diff --git a/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml b/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml index 17278b44c1c..030b312b049 100644 --- a/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml +++ b/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml @@ -22,8 +22,8 @@ - + initArgs = new NamedList<>(); diff --git a/solr/solr-ref-guide/modules/query-guide/pages/dense-vector-search.adoc b/solr/solr-ref-guide/modules/query-guide/pages/dense-vector-search.adoc index 726f9383b24..08f3e80007c 100644 --- a/solr/solr-ref-guide/modules/query-guide/pages/dense-vector-search.adoc +++ b/solr/solr-ref-guide/modules/query-guide/pages/dense-vector-search.adoc @@ -242,7 +242,7 @@ client.add(Arrays.asList(d1, d2)); == Query Time -Apache Solr provides three query parsers that work with dense vector fields, that each support different ways of matching documents based on vector similarity: The `knn` query parser, the `vectorSimilarity` query parser and the `embed` query parser. +Apache Solr provides three query parsers that work with dense vector fields, that each support different ways of matching documents based on vector similarity: The `knn` query parser, the `vectorSimilarity` query parser and the `text_to_vector` query parser. All parsers return scores for retrieved documents that are the approximate distance to the target vector (defined by the similarityFunction configured at indexing time) and both support "Pre-Filtering" the document graph to reduce the number of candidate vectors evaluated (without needing to compute their vector similarity distances). @@ -309,9 +309,9 @@ Here's an example of a simple `knn` search: The search results retrieved are the k=10 nearest documents to the vector in input `[1.0, 2.0, 3.0, 4.0]`, ranked by the `similarityFunction` configured at indexing time. -=== embed Query Parser +=== text_to_vector Query Parser -The `embed` query parser encode a textual query to a vector using a dedicated Large Language Model(fine tuned for the task of encoding text to vector for sentence similarity) and matches k-nearest neighbours documents to such query vector. +The `text_to_vector` query parser encode a textual query to a vector using a dedicated Large Language Model(fine tuned for the task of encoding text to vector for sentence similarity) and matches k-nearest neighbours documents to such query vector. In addition to the parameters in common with the other dense-retrieval query parsers, it takes the following: @@ -333,10 +333,10 @@ The model to use to encode the text to a vector. Must reference an existing mode + How many k-nearest results to return. -Here's an example of a simple `embed` search: +Here's an example of a simple `text_to_vector` search: [source,text] -?q={!text_embedder model=a-model f=vector topK=10}hello world query +?q={!text_to_vector model=a-model f=vector topK=10}hello world query The search results retrieved are the k=10 nearest documents to the vector encoded from the query `hello world query`, using the model `a-model`. @@ -388,9 +388,9 @@ You should use the `knn` query parser when: * you want to a have a fine-grained control over the way you encode text to vector and prefer to do it outside of Apache Solr -== embed Query Parser +== text_to_vector Query Parser -You should use the `embed` query parser when: +You should use the `text_to_vector` query parser when: * you search for the top-K closest vectors to a query text * you work directly with text and want Solr to handle the encoding to vector behind the scenes diff --git a/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc b/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc index 5a6e513744e..a2388d65d94 100644 --- a/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc +++ b/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc @@ -67,11 +67,11 @@ Large-Language-Model is a module and therefore its plugins must be configured in === Minimum Requirements -* Declaration of the `embed` query parser. +* Declaration of the `text_to_vector` query parser. + [source,xml] ---- - + ---- == Text Embedding Lifecycle @@ -111,7 +111,7 @@ Accepted values: s|Required |Default: none |=== + -The identifier of your model, this is used by any component that intends to use the model (`embed` query parser). +The identifier of your model, this is used by any component that intends to use the model (`text_to_vector` query parser). `params`:: + @@ -262,7 +262,7 @@ http://localhost:8983/solr/techproducts/schema/embedding-model-store To run a query that embeds your query text, using a model you previously uploaded is simple: [source,text] -?q={!text_embedder model=a-model f=vector topK=10}hello world query +?q={!text_to_vector model=a-model f=vector topK=10}hello world query The search results retrieved are the k=10 nearest documents to the vector encoded from the query `hello world query`, using the model `a-model`. From 23b0513766b148dea6ed1614f7bca0e2c8a382b8 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Mon, 18 Nov 2024 11:41:13 +0000 Subject: [PATCH 45/65] sync map based on review comments --- .../java/org/apache/solr/llm/store/EmbeddingModelStore.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java b/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java index c3aa29eb5b5..6426ea6aab7 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java @@ -28,10 +28,10 @@ public class EmbeddingModelStore { private final Map availableModels; public EmbeddingModelStore() { - availableModels = new LinkedHashMap<>(); + availableModels = Collections.synchronizedMap(new LinkedHashMap<>()); } - public synchronized SolrEmbeddingModel getModel(String name) { + public SolrEmbeddingModel getModel(String name) { return availableModels.get(name); } @@ -54,7 +54,7 @@ public SolrEmbeddingModel delete(String modelName) { return availableModels.remove(modelName); } - public synchronized void addModel(SolrEmbeddingModel modeldata) throws EmbeddingModelException { + public void addModel(SolrEmbeddingModel modeldata) throws EmbeddingModelException { final String name = modeldata.getName(); if (availableModels.containsKey(name)) { throw new EmbeddingModelException( From a4fa6ae0d8bbc151dae04e7ee99e33da986d5838 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Mon, 18 Nov 2024 11:46:44 +0000 Subject: [PATCH 46/65] minor clean up --- .../solr/llm/store/rest/ManagedEmbeddingModelStore.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java index f25a7a43f41..de3d89312a9 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java @@ -107,8 +107,7 @@ public void loadStoredModels() { private void addModelFromMap(Map modelMap) { try { - final SolrEmbeddingModel embedder = fromEmbeddingModelMap(modelMap); - addModel(embedder); + addModel(fromEmbeddingModelMap(modelMap)); } catch (final EmbeddingModelException e) { throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, e); } @@ -186,12 +185,10 @@ private static List modelsAsManagedResources(List mo @SuppressWarnings("unchecked") public static SolrEmbeddingModel fromEmbeddingModelMap(Map embeddingModel) { - final SolrEmbeddingModel embedder = - SolrEmbeddingModel.getInstance( + return SolrEmbeddingModel.getInstance( (String) embeddingModel.get(CLASS_KEY), // modelClassName (String) embeddingModel.get(NAME_KEY), // modelName (Map) embeddingModel.get(PARAMS_KEY)); - return embedder; } private static LinkedHashMap toEmbeddingModelMap(SolrEmbeddingModel model) { From cbcc8f98805f26341adfece0c991d81c8d3adaa3 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Mon, 18 Nov 2024 11:54:56 +0000 Subject: [PATCH 47/65] static fields clean up --- .../rest/ManagedEmbeddingModelStore.java | 104 ++++++++---------- 1 file changed, 48 insertions(+), 56 deletions(-) diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java index de3d89312a9..be6bd30ffe1 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java @@ -39,53 +39,77 @@ /** Managed resource for storing a model */ public class ManagedEmbeddingModelStore extends ManagedResource implements ManagedResource.ChildResourceSupport { - - public static void registerManagedEmbeddingModelStore( - SolrResourceLoader solrResourceLoader, ManagedResourceObserver managedResourceObserver) { - solrResourceLoader - .getManagedResourceRegistry() - .registerManagedResource( - REST_END_POINT, ManagedEmbeddingModelStore.class, managedResourceObserver); - } - - public static ManagedEmbeddingModelStore getManagedModelStore(SolrCore core) { - return (ManagedEmbeddingModelStore) core.getRestManager().getManagedResource(REST_END_POINT); - } - + private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); /** the model store rest endpoint */ public static final String REST_END_POINT = "/schema/embedding-model-store"; - /** Managed model store: the name of the attribute containing all the models of a model store */ private static final String MODELS_JSON_FIELD = "models"; - /** name of the attribute containing a class */ static final String CLASS_KEY = "class"; - /** name of the attribute containing a name */ static final String NAME_KEY = "name"; - /** name of the attribute containing parameters */ static final String PARAMS_KEY = "params"; - private final EmbeddingModelStore store; + public static void registerManagedEmbeddingModelStore( + SolrResourceLoader solrResourceLoader, ManagedResourceObserver managedResourceObserver) { + solrResourceLoader + .getManagedResourceRegistry() + .registerManagedResource( + REST_END_POINT, ManagedEmbeddingModelStore.class, managedResourceObserver); + } - private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + public static ManagedEmbeddingModelStore getManagedModelStore(SolrCore core) { + return (ManagedEmbeddingModelStore) core.getRestManager().getManagedResource(REST_END_POINT); + } + + /** + * Returns the available models as a list of Maps objects. After an update the managed resources + * needs to return the resources in this format in order to store in json somewhere (zookeeper, + * disk...) + * + * @return the available models as a list of Maps objects + */ + private static List modelsAsManagedResources(List models) { + final List list = new ArrayList<>(models.size()); + for (final SolrEmbeddingModel model : models) { + list.add(toEmbeddingModelMap(model)); + } + return list; + } + + @SuppressWarnings("unchecked") + public static SolrEmbeddingModel fromEmbeddingModelMap(Map embeddingModel) { + return SolrEmbeddingModel.getInstance( + (String) embeddingModel.get(CLASS_KEY), // modelClassName + (String) embeddingModel.get(NAME_KEY), // modelName + (Map) embeddingModel.get(PARAMS_KEY)); + } + private static LinkedHashMap toEmbeddingModelMap(SolrEmbeddingModel model) { + final LinkedHashMap modelMap = new LinkedHashMap<>(5, 1.0f); + modelMap.put(NAME_KEY, model.getName()); + modelMap.put(CLASS_KEY, model.getEmbeddingModelClassName()); + modelMap.put(PARAMS_KEY, model.getParams()); + return modelMap; + } + + private final EmbeddingModelStore store; + private Object managedData; + public ManagedEmbeddingModelStore( String resourceId, SolrResourceLoader loader, ManagedResourceStorage.StorageIO storageIO) throws SolrException { super(resourceId, loader, storageIO); store = new EmbeddingModelStore(); } - + @Override protected ManagedResourceStorage createStorage( ManagedResourceStorage.StorageIO storageIO, SolrResourceLoader loader) throws SolrException { return new ManagedResourceStorage.JsonStorage(storageIO, loader, -1); } - private Object managedData; - @Override protected void onManagedDataLoadedFromStorage(NamedList managedInitArgs, Object managedData) throws SolrException { @@ -113,7 +137,7 @@ private void addModelFromMap(Map modelMap) { } } - public synchronized void addModel(SolrEmbeddingModel model) throws EmbeddingModelException { + public void addModel(SolrEmbeddingModel model) throws EmbeddingModelException { try { if (log.isInfoEnabled()) { log.info("adding model {}", model.getName()); @@ -143,7 +167,7 @@ protected Object applyUpdatesToManagedData(Object updates) { } @Override - public synchronized void doDeleteChild(BaseSolrResource endpoint, String childId) { + public void doDeleteChild(BaseSolrResource endpoint, String childId) { store.delete(childId); storeManagedData(applyUpdatesToManagedData(null)); } @@ -154,7 +178,6 @@ public synchronized void doDeleteChild(BaseSolrResource endpoint, String childId */ @Override public void doGet(BaseSolrResource endpoint, String childId) { - final SolrQueryResponse response = endpoint.getSolrResponse(); response.add(MODELS_JSON_FIELD, modelsAsManagedResources(store.getModels())); } @@ -167,35 +190,4 @@ public SolrEmbeddingModel getModel(String modelName) { public String toString() { return "ManagedModelStore [store=" + store + "]"; } - - /** - * Returns the available models as a list of Maps objects. After an update the managed resources - * needs to return the resources in this format in order to store in json somewhere (zookeeper, - * disk...) - * - * @return the available models as a list of Maps objects - */ - private static List modelsAsManagedResources(List models) { - final List list = new ArrayList<>(models.size()); - for (final SolrEmbeddingModel model : models) { - list.add(toEmbeddingModelMap(model)); - } - return list; - } - - @SuppressWarnings("unchecked") - public static SolrEmbeddingModel fromEmbeddingModelMap(Map embeddingModel) { - return SolrEmbeddingModel.getInstance( - (String) embeddingModel.get(CLASS_KEY), // modelClassName - (String) embeddingModel.get(NAME_KEY), // modelName - (Map) embeddingModel.get(PARAMS_KEY)); - } - - private static LinkedHashMap toEmbeddingModelMap(SolrEmbeddingModel model) { - final LinkedHashMap modelMap = new LinkedHashMap<>(5, 1.0f); - modelMap.put(NAME_KEY, model.getName()); - modelMap.put(CLASS_KEY, model.getEmbeddingModelClassName()); - modelMap.put(PARAMS_KEY, model.getParams()); - return modelMap; - } } From 0fc2de6a9cf2c9c641d6e71ab3d227557a2db365 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Mon, 18 Nov 2024 12:20:13 +0000 Subject: [PATCH 48/65] moving to java streams --- .../rest/ManagedEmbeddingModelStore.java | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java index be6bd30ffe1..59897a2f1cc 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java @@ -17,10 +17,10 @@ package org.apache.solr.llm.store.rest; import java.lang.invoke.MethodHandles; -import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import org.apache.solr.common.SolrException; import org.apache.solr.common.util.NamedList; import org.apache.solr.core.SolrCore; @@ -40,23 +40,28 @@ public class ManagedEmbeddingModelStore extends ManagedResource implements ManagedResource.ChildResourceSupport { private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + /** the model store rest endpoint */ public static final String REST_END_POINT = "/schema/embedding-model-store"; + /** Managed model store: the name of the attribute containing all the models of a model store */ private static final String MODELS_JSON_FIELD = "models"; + /** name of the attribute containing a class */ static final String CLASS_KEY = "class"; + /** name of the attribute containing a name */ static final String NAME_KEY = "name"; + /** name of the attribute containing parameters */ static final String PARAMS_KEY = "params"; public static void registerManagedEmbeddingModelStore( - SolrResourceLoader solrResourceLoader, ManagedResourceObserver managedResourceObserver) { + SolrResourceLoader solrResourceLoader, ManagedResourceObserver managedResourceObserver) { solrResourceLoader - .getManagedResourceRegistry() - .registerManagedResource( - REST_END_POINT, ManagedEmbeddingModelStore.class, managedResourceObserver); + .getManagedResourceRegistry() + .registerManagedResource( + REST_END_POINT, ManagedEmbeddingModelStore.class, managedResourceObserver); } public static ManagedEmbeddingModelStore getManagedModelStore(SolrCore core) { @@ -71,19 +76,17 @@ public static ManagedEmbeddingModelStore getManagedModelStore(SolrCore core) { * @return the available models as a list of Maps objects */ private static List modelsAsManagedResources(List models) { - final List list = new ArrayList<>(models.size()); - for (final SolrEmbeddingModel model : models) { - list.add(toEmbeddingModelMap(model)); - } - return list; + return models.stream() + .map(ManagedEmbeddingModelStore::toEmbeddingModelMap) + .collect(Collectors.toList()); } @SuppressWarnings("unchecked") public static SolrEmbeddingModel fromEmbeddingModelMap(Map embeddingModel) { return SolrEmbeddingModel.getInstance( - (String) embeddingModel.get(CLASS_KEY), // modelClassName - (String) embeddingModel.get(NAME_KEY), // modelName - (Map) embeddingModel.get(PARAMS_KEY)); + (String) embeddingModel.get(CLASS_KEY), // modelClassName + (String) embeddingModel.get(NAME_KEY), // modelName + (Map) embeddingModel.get(PARAMS_KEY)); } private static LinkedHashMap toEmbeddingModelMap(SolrEmbeddingModel model) { @@ -96,14 +99,14 @@ private static LinkedHashMap toEmbeddingModelMap(SolrEmbeddingMo private final EmbeddingModelStore store; private Object managedData; - + public ManagedEmbeddingModelStore( String resourceId, SolrResourceLoader loader, ManagedResourceStorage.StorageIO storageIO) throws SolrException { super(resourceId, loader, storageIO); store = new EmbeddingModelStore(); } - + @Override protected ManagedResourceStorage createStorage( ManagedResourceStorage.StorageIO storageIO, SolrResourceLoader loader) throws SolrException { From 65b386bdeb74a59f2ab176f72e1350b5e272d039 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Tue, 19 Nov 2024 07:41:34 +0000 Subject: [PATCH 49/65] additional documentation --- solr/modules/llm/build.gradle | 1 + .../org/apache/solr/llm/embedding/SolrEmbeddingModel.java | 5 +++++ .../java/org/apache/solr/llm/store/EmbeddingModelStore.java | 1 + .../solr/llm/store/rest/ManagedEmbeddingModelStore.java | 4 +++- 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/solr/modules/llm/build.gradle b/solr/modules/llm/build.gradle index 65df6cd5a01..aeb0e4979ea 100644 --- a/solr/modules/llm/build.gradle +++ b/solr/modules/llm/build.gradle @@ -20,6 +20,7 @@ apply plugin: 'java-library' description = 'Indexing/Query time integration with LLM' dependencies { + compileOnly 'com.github.stephenc.jcip:jcip-annotations' implementation project(':solr:core') implementation project(':solr:solrj') diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java index 6c8b0faa726..1efbf02d7b1 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java @@ -26,7 +26,12 @@ import org.apache.lucene.util.Accountable; import org.apache.lucene.util.RamUsageEstimator; import org.apache.solr.llm.store.EmbeddingModelException; +import org.apache.solr.llm.store.rest.ManagedEmbeddingModelStore; +/** + * This object wraps a {@link dev.langchain4j.model.embedding.EmbeddingModel} to encode text to + * vector. It's meant to be used as a managed resource with the {@link ManagedEmbeddingModelStore} + */ public class SolrEmbeddingModel implements Accountable { private static final long BASE_RAM_BYTES = RamUsageEstimator.shallowSizeOfInstance(SolrEmbeddingModel.class); diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java b/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java index 6426ea6aab7..b6897d91d29 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java @@ -23,6 +23,7 @@ import java.util.Map; import org.apache.solr.llm.embedding.SolrEmbeddingModel; +/** Simple store to manage CRUD operations on the {@link SolrEmbeddingModel} */ public class EmbeddingModelStore { private final Map availableModels; diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java index 59897a2f1cc..916703355ab 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java @@ -21,6 +21,7 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import net.jcip.annotations.ThreadSafe; import org.apache.solr.common.SolrException; import org.apache.solr.common.util.NamedList; import org.apache.solr.core.SolrCore; @@ -36,7 +37,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -/** Managed resource for storing a model */ +/** Managed Resource wrapper for the the {@link EmbeddingModelStore} to expose it via REST */ +@ThreadSafe public class ManagedEmbeddingModelStore extends ManagedResource implements ManagedResource.ChildResourceSupport { private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); From cc973e9e92eefecb867111435533999f0612376c Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Tue, 19 Nov 2024 08:01:54 +0000 Subject: [PATCH 50/65] solr resource loader + cleanup --- .../llm/embedding/SolrEmbeddingModel.java | 9 ++- .../rest/ManagedEmbeddingModelStore.java | 6 +- .../test/org/apache/solr/llm/TestLlmBase.java | 77 +------------------ .../llm/search/TextToVectorQParserTest.java | 2 +- .../solr/llm/store/rest/TestModelManager.java | 8 +- .../rest/TestModelManagerPersistence.java | 2 +- 6 files changed, 19 insertions(+), 85 deletions(-) diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java index 1efbf02d7b1..b24395b3800 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java @@ -25,6 +25,7 @@ import java.util.Objects; import org.apache.lucene.util.Accountable; import org.apache.lucene.util.RamUsageEstimator; +import org.apache.solr.core.SolrResourceLoader; import org.apache.solr.llm.store.EmbeddingModelException; import org.apache.solr.llm.store.rest.ManagedEmbeddingModelStore; @@ -45,7 +46,11 @@ public class SolrEmbeddingModel implements Accountable { private final Integer hashCode; public static SolrEmbeddingModel getInstance( - String className, String name, Map params) throws EmbeddingModelException { + SolrResourceLoader solrResourceLoader, + String className, + String name, + Map params) + throws EmbeddingModelException { try { /* * The idea here is to build a {@link dev.langchain4j.model.embedding.EmbeddingModel} using inversion @@ -54,7 +59,7 @@ public static SolrEmbeddingModel getInstance( * has its own builder that uses setters with the same name of the parameter in input. * */ EmbeddingModel textToVector; - Class modelClass = Class.forName(className); + Class modelClass = solrResourceLoader.findClass(className, EmbeddingModel.class); var builder = modelClass.getMethod("builder").invoke(null); if (params != null) { /** diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java index 916703355ab..ce4cad9a269 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java @@ -84,8 +84,10 @@ private static List modelsAsManagedResources(List mo } @SuppressWarnings("unchecked") - public static SolrEmbeddingModel fromEmbeddingModelMap(Map embeddingModel) { + public static SolrEmbeddingModel fromEmbeddingModelMap( + SolrResourceLoader solrResourceLoader, Map embeddingModel) { return SolrEmbeddingModel.getInstance( + solrResourceLoader, (String) embeddingModel.get(CLASS_KEY), // modelClassName (String) embeddingModel.get(NAME_KEY), // modelName (Map) embeddingModel.get(PARAMS_KEY)); @@ -136,7 +138,7 @@ public void loadStoredModels() { private void addModelFromMap(Map modelMap) { try { - addModel(fromEmbeddingModelMap(modelMap)); + addModel(fromEmbeddingModelMap(solrResourceLoader, modelMap)); } catch (final EmbeddingModelException e) { throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, e); } diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java b/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java index c776abe32b6..779056d64f0 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java @@ -24,13 +24,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Map; import org.apache.commons.io.file.PathUtils; import org.apache.solr.common.SolrInputDocument; -import org.apache.solr.common.util.Utils; -import org.apache.solr.core.SolrCore; -import org.apache.solr.llm.embedding.SolrEmbeddingModel; -import org.apache.solr.llm.store.EmbeddingModelException; import org.apache.solr.llm.store.rest.ManagedEmbeddingModelStore; import org.apache.solr.util.RestTestBase; import org.slf4j.Logger; @@ -55,7 +50,7 @@ public class TestLlmBase extends RestTestBase { protected static String vectorField2 = "vector2"; protected static String vectorFieldByteEncoding = "vector_byte_encoding"; - public static void setupTest( + protected static void setupTest( String solrconfig, String schema, boolean buildIndex, boolean persistModelStore) throws Exception { initFolders(persistModelStore); @@ -64,12 +59,6 @@ public static void setupTest( if (buildIndex) prepareIndex(); } - public static ManagedEmbeddingModelStore getManagedModelStore() { - try (SolrCore core = solrClientTestRule.getCoreContainer().getCore(DEFAULT_TEST_CORENAME)) { - return ManagedEmbeddingModelStore.getManagedModelStore(core); - } - } - protected static void initFolders(boolean isPersistent) throws Exception { tmpSolrHome = createTempDir(); tmpConfDir = tmpSolrHome.resolve(CONF_DIR); @@ -105,10 +94,6 @@ protected static void afterTest() throws Exception { System.clearProperty("managed.schema.mutable"); } - public static void makeRestTestHarnessNull() { - restTestHarness = null; - } - /** produces a model encoded in json * */ public static String getModelInJson(String name, String className, String params) { final StringBuilder sb = new StringBuilder(); @@ -129,7 +114,7 @@ protected static void loadModel(String name, String className, String params) th assertJPut(ManagedEmbeddingModelStore.REST_END_POINT, model, "/responseHeader/status==0"); } - public static void loadModels(String fileName) throws Exception { + public static void loadModel(String fileName) throws Exception { final URL url = TestLlmBase.class.getResource("/modelExamples/" + fileName); final String multipleModels = Files.readString(Path.of(url.toURI()), StandardCharsets.UTF_8); @@ -137,33 +122,6 @@ public static void loadModels(String fileName) throws Exception { ManagedEmbeddingModelStore.REST_END_POINT, multipleModels, "/responseHeader/status==0"); } - public static SolrEmbeddingModel createModelFromFiles( - String modelFileName, String featureFileName) throws EmbeddingModelException, Exception { - return createModelFromFiles(modelFileName, featureFileName); - } - - public static SolrEmbeddingModel createModelFromFiles(String modelFileName) throws Exception { - URL url = TestLlmBase.class.getResource("/modelExamples/" + modelFileName); - final String modelJson = Files.readString(Path.of(url.toURI()), StandardCharsets.UTF_8); - final ManagedEmbeddingModelStore ms = getManagedModelStore(); - - final SolrEmbeddingModel model = - ManagedEmbeddingModelStore.fromEmbeddingModelMap(mapFromJson(modelJson)); - ms.addModel(model); - return model; - } - - @SuppressWarnings("unchecked") - private static Map mapFromJson(String json) throws EmbeddingModelException { - Object parsedJson = null; - try { - parsedJson = Utils.fromJSONString(json); - } catch (final Exception ioExc) { - throw new EmbeddingModelException("ObjectBuilder failed parsing json", ioExc); - } - return (Map) parsedJson; - } - protected static void prepareIndex() throws Exception { List docsToIndex = prepareDocs(); for (SolrInputDocument doc : docsToIndex) { @@ -230,35 +188,4 @@ private static List prepareDocs() { return docs; } - - protected static void indexWithEmbeddingGeneration() throws Exception { - List docsToIndex = prepareTextualDocs(); - for (SolrInputDocument doc : docsToIndex) { - assertU(adoc(doc)); - } - - assertU(commit()); - } - - private static List prepareTextualDocs() { - int docsCount = 5; - List docs = new ArrayList<>(docsCount); - for (int i = 1; i < docsCount + 1; i++) { - SolrInputDocument doc = new SolrInputDocument(); - doc.addField(IDField, i); - docs.add(doc); - } - - docs.get(0) - .addField( - stringField, "Vegeta is the prince of all saiyans"); // cosine distance vector1= 1.0 - docs.get(1) - .addField( - stringField, "Goku is a saiyan raised on earth"); // cosine distance vector1= 0.998 - docs.get(2).addField(stringField, "Gohan is a saiyaman, son of Goku"); - docs.get(3).addField(stringField, "Goten is a saiyaman, second son son of Goku"); - docs.get(4).addField(stringField, "Trunks is a saiyaman, second son son of Vegeta"); - - return docs; - } } diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/search/TextToVectorQParserTest.java b/solr/modules/llm/src/test/org/apache/solr/llm/search/TextToVectorQParserTest.java index da3fa9ff722..73e9090a3e7 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/search/TextToVectorQParserTest.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/search/TextToVectorQParserTest.java @@ -26,7 +26,7 @@ public class TextToVectorQParserTest extends TestLlmBase { @BeforeClass public static void init() throws Exception { setupTest("solrconfig-llm.xml", "schema.xml", true, false); - loadModels("dummy-model.json"); + loadModel("dummy-model.json"); } @Test diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java index 4f5a61510a8..9e784153e1d 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java @@ -122,7 +122,7 @@ public void testRestManagerEndpoints() throws Exception { @Test public void loadModel_cohere_shouldLoadModelConfig() throws Exception { - loadModels("cohere-model.json"); + loadModel("cohere-model.json"); final String modelName = "cohere-1"; assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); @@ -146,7 +146,7 @@ public void loadModel_cohere_shouldLoadModelConfig() throws Exception { @Test public void loadModel_openAi_shouldLoadModelConfig() throws Exception { - loadModels("openai-model.json"); + loadModel("openai-model.json"); final String modelName = "openai-1"; assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); @@ -168,7 +168,7 @@ public void loadModel_openAi_shouldLoadModelConfig() throws Exception { @Test public void loadModel_mistralAi_shouldLoadModelConfig() throws Exception { - loadModels("mistralai-model.json"); + loadModel("mistralai-model.json"); final String modelName = "mistralai-1"; assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); @@ -189,7 +189,7 @@ public void loadModel_mistralAi_shouldLoadModelConfig() throws Exception { @Test public void loadModel_huggingface_shouldLoadModelConfig() throws Exception { - loadModels("huggingface-model.json"); + loadModel("huggingface-model.json"); final String modelName = "huggingface-1"; assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java index d5305eeb475..9daa1bb90e1 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java @@ -66,7 +66,7 @@ public void testModelStorePersistence() throws Exception { assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/==[]"); // load models and features from files - loadModels("cohere-model.json"); + loadModel("cohere-model.json"); final String modelName = "cohere-1"; assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); From c9d38acb0135bf9025888e9440a2a4e5163019cd Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Tue, 19 Nov 2024 08:50:18 +0000 Subject: [PATCH 51/65] attempted new dependency approach --- gradle/libs.versions.toml | 6 ++++++ solr/modules/llm/build.gradle | 27 ++++++++++++++------------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5bfb64e36d8..b63d5fb0939 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -142,6 +142,7 @@ jersey-containers = "2.39.1" # @keep for version alignment joda-time = "2.8.1" junit = "4.13.2" +langchain4j = "0.35.0" # @keep Link checker version used in ref-guide link-checker = "1.4.2" littlerobots-versioncatalogupdate = "0.8.4" @@ -407,6 +408,11 @@ jersey-media-jsonjackson = { module = "org.glassfish.jersey.media:jersey-media-j # @keep transitive dependency for version alignment jodatime-jodatime = { module = "joda-time:joda-time", version.ref = "joda-time" } junit-junit = { module = "junit:junit", version.ref = "junit" } +langchain4j = { module = "dev.langchain4j:langchain4j", version.ref = "langchain4j" } +langchain4j-cohere = { module = "dev.langchain4j:langchain4j-cohere", version.ref = "langchain4j" } +langchain4j-hugging-face = { module = "dev.langchain4j:langchain4j-hugging-face", version.ref = "langchain4j" } +langchain4j-mistral-ai = { module = "dev.langchain4j:langchain4j-mistral-ai", version.ref = "langchain4j" } +langchain4j-open-ai = { module = "dev.langchain4j:langchain4j-open-ai", version.ref = "langchain4j" } lmax-disruptor = { module = "com.lmax:disruptor", version.ref = "lmax-disruptor" } locationtech-spatial4j = { module = "org.locationtech.spatial4j:spatial4j", version.ref = "spatial4j" } mockito-core = { module = "org.mockito:mockito-core", version.ref = "mockito" } diff --git a/solr/modules/llm/build.gradle b/solr/modules/llm/build.gradle index aeb0e4979ea..cdb408a64bb 100644 --- a/solr/modules/llm/build.gradle +++ b/solr/modules/llm/build.gradle @@ -24,18 +24,19 @@ dependencies { implementation project(':solr:core') implementation project(':solr:solrj') - implementation 'org.apache.lucene:lucene-core' - - implementation 'dev.langchain4j:langchain4j-hugging-face' - implementation 'dev.langchain4j:langchain4j-mistral-ai' - implementation 'dev.langchain4j:langchain4j-open-ai' - implementation 'dev.langchain4j:langchain4j-cohere' - implementation 'dev.langchain4j:langchain4j' - - implementation 'org.slf4j:slf4j-api' + implementation libs.apache.lucene.core + + implementation libs.langchain4j + implementation libs.langchain4j.cohere + implementation libs.langchain4j.hugging.face + implementation libs.langchain4j.mistral.ai + implementation libs.langchain4j.open.ai - testImplementation project(':solr:test-framework') - testImplementation 'junit:junit' - testImplementation 'org.hamcrest:hamcrest' - testImplementation 'commons-io:commons-io' + implementation libs.slf4j.api + + testImplementation libs.apache.solr.testframework + testImplementation libs.junit.junit + testImplementation libs.hamcrest.hamcrest + testImplementation libs.commonsio.commonsio + } From acf64b80b776afdcafeb02f84e9548914cd9cfdf Mon Sep 17 00:00:00 2001 From: Christos Malliaridis Date: Tue, 19 Nov 2024 17:53:55 +0100 Subject: [PATCH 52/65] Remove invalid license file --- solr/licenses/langchain4j-LICENSE-ASL.txt, | 202 --------------------- 1 file changed, 202 deletions(-) delete mode 100644 solr/licenses/langchain4j-LICENSE-ASL.txt, diff --git a/solr/licenses/langchain4j-LICENSE-ASL.txt, b/solr/licenses/langchain4j-LICENSE-ASL.txt, deleted file mode 100644 index a12e3073373..00000000000 --- a/solr/licenses/langchain4j-LICENSE-ASL.txt, +++ /dev/null @@ -1,202 +0,0 @@ -Apache License - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file From ad5fa997f5d7cd77ff5113e3c384957f2ad2845d Mon Sep 17 00:00:00 2001 From: Christos Malliaridis Date: Tue, 19 Nov 2024 17:59:45 +0100 Subject: [PATCH 53/65] Update references to dependencies --- gradle/libs.versions.toml | 2 +- solr/modules/llm/build.gradle | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b63d5fb0939..67ca7f63551 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -408,8 +408,8 @@ jersey-media-jsonjackson = { module = "org.glassfish.jersey.media:jersey-media-j # @keep transitive dependency for version alignment jodatime-jodatime = { module = "joda-time:joda-time", version.ref = "joda-time" } junit-junit = { module = "junit:junit", version.ref = "junit" } -langchain4j = { module = "dev.langchain4j:langchain4j", version.ref = "langchain4j" } langchain4j-cohere = { module = "dev.langchain4j:langchain4j-cohere", version.ref = "langchain4j" } +langchain4j-core = { module = "dev.langchain4j:langchain4j", version.ref = "langchain4j" } langchain4j-hugging-face = { module = "dev.langchain4j:langchain4j-hugging-face", version.ref = "langchain4j" } langchain4j-mistral-ai = { module = "dev.langchain4j:langchain4j-mistral-ai", version.ref = "langchain4j" } langchain4j-open-ai = { module = "dev.langchain4j:langchain4j-open-ai", version.ref = "langchain4j" } diff --git a/solr/modules/llm/build.gradle b/solr/modules/llm/build.gradle index cdb408a64bb..0d07861f115 100644 --- a/solr/modules/llm/build.gradle +++ b/solr/modules/llm/build.gradle @@ -20,13 +20,13 @@ apply plugin: 'java-library' description = 'Indexing/Query time integration with LLM' dependencies { - compileOnly 'com.github.stephenc.jcip:jcip-annotations' + compileOnly libs.stephenc.jcip.annotations implementation project(':solr:core') implementation project(':solr:solrj') implementation libs.apache.lucene.core - implementation libs.langchain4j + implementation libs.langchain4j.core implementation libs.langchain4j.cohere implementation libs.langchain4j.hugging.face implementation libs.langchain4j.mistral.ai @@ -34,9 +34,8 @@ dependencies { implementation libs.slf4j.api - testImplementation libs.apache.solr.testframework + testImplementation project(':solr:test-framework') testImplementation libs.junit.junit testImplementation libs.hamcrest.hamcrest testImplementation libs.commonsio.commonsio - } From b8b015a77fae2fb58e8652ec719d2d9e74815f6b Mon Sep 17 00:00:00 2001 From: Christos Malliaridis Date: Tue, 19 Nov 2024 18:16:18 +0100 Subject: [PATCH 54/65] Write locks and update checksums --- .../licenses/converter-jackson-2.9.0.jar.sha1 | 1 + solr/licenses/jtokkit-1.1.0.jar.sha1 | 1 + solr/licenses/langchain4j-0.35.0.jar.sha1 | 1 + .../langchain4j-cohere-0.35.0.jar.sha1 | 1 + .../licenses/langchain4j-core-0.35.0.jar.sha1 | 1 + .../langchain4j-hugging-face-0.35.0.jar.sha1 | 1 + .../langchain4j-mistral-ai-0.35.0.jar.sha1 | 1 + .../langchain4j-open-ai-0.35.0.jar.sha1 | 1 + solr/licenses/okhttp-sse-4.12.0.jar.sha1 | 1 + solr/licenses/openai4j-0.22.0.jar.sha1 | 1 + solr/licenses/retrofit-2.9.0.jar.sha1 | 1 + versions.lock | 11097 +++++++++------- 12 files changed, 6030 insertions(+), 5078 deletions(-) create mode 100644 solr/licenses/converter-jackson-2.9.0.jar.sha1 create mode 100644 solr/licenses/jtokkit-1.1.0.jar.sha1 create mode 100644 solr/licenses/langchain4j-0.35.0.jar.sha1 create mode 100644 solr/licenses/langchain4j-cohere-0.35.0.jar.sha1 create mode 100644 solr/licenses/langchain4j-core-0.35.0.jar.sha1 create mode 100644 solr/licenses/langchain4j-hugging-face-0.35.0.jar.sha1 create mode 100644 solr/licenses/langchain4j-mistral-ai-0.35.0.jar.sha1 create mode 100644 solr/licenses/langchain4j-open-ai-0.35.0.jar.sha1 create mode 100644 solr/licenses/okhttp-sse-4.12.0.jar.sha1 create mode 100644 solr/licenses/openai4j-0.22.0.jar.sha1 create mode 100644 solr/licenses/retrofit-2.9.0.jar.sha1 diff --git a/solr/licenses/converter-jackson-2.9.0.jar.sha1 b/solr/licenses/converter-jackson-2.9.0.jar.sha1 new file mode 100644 index 00000000000..20ab4394574 --- /dev/null +++ b/solr/licenses/converter-jackson-2.9.0.jar.sha1 @@ -0,0 +1 @@ +19b4010914e747601e26f46c6a403044bbe0b2bf diff --git a/solr/licenses/jtokkit-1.1.0.jar.sha1 b/solr/licenses/jtokkit-1.1.0.jar.sha1 new file mode 100644 index 00000000000..a86a8ae6804 --- /dev/null +++ b/solr/licenses/jtokkit-1.1.0.jar.sha1 @@ -0,0 +1 @@ +b7370f801db3eb8c7c6a2c2c06231909ac6de0b0 diff --git a/solr/licenses/langchain4j-0.35.0.jar.sha1 b/solr/licenses/langchain4j-0.35.0.jar.sha1 new file mode 100644 index 00000000000..2199fe110d3 --- /dev/null +++ b/solr/licenses/langchain4j-0.35.0.jar.sha1 @@ -0,0 +1 @@ +f739eae706dcfd090c56c2a470e1b6bd8d60e175 diff --git a/solr/licenses/langchain4j-cohere-0.35.0.jar.sha1 b/solr/licenses/langchain4j-cohere-0.35.0.jar.sha1 new file mode 100644 index 00000000000..a2a66c77142 --- /dev/null +++ b/solr/licenses/langchain4j-cohere-0.35.0.jar.sha1 @@ -0,0 +1 @@ +737ebd43f49e1820b17b18b6e3154bf94e0b2853 diff --git a/solr/licenses/langchain4j-core-0.35.0.jar.sha1 b/solr/licenses/langchain4j-core-0.35.0.jar.sha1 new file mode 100644 index 00000000000..04931abbf53 --- /dev/null +++ b/solr/licenses/langchain4j-core-0.35.0.jar.sha1 @@ -0,0 +1 @@ +1ac1bf8b9aa2864ac3fcae7d46a5d9f80a582b30 diff --git a/solr/licenses/langchain4j-hugging-face-0.35.0.jar.sha1 b/solr/licenses/langchain4j-hugging-face-0.35.0.jar.sha1 new file mode 100644 index 00000000000..789b74e63dc --- /dev/null +++ b/solr/licenses/langchain4j-hugging-face-0.35.0.jar.sha1 @@ -0,0 +1 @@ +4eb72d70b9e26473d3e02f9199ccdf3a9bc24cbf diff --git a/solr/licenses/langchain4j-mistral-ai-0.35.0.jar.sha1 b/solr/licenses/langchain4j-mistral-ai-0.35.0.jar.sha1 new file mode 100644 index 00000000000..f37eb1b33db --- /dev/null +++ b/solr/licenses/langchain4j-mistral-ai-0.35.0.jar.sha1 @@ -0,0 +1 @@ +4f1165e6ee19430dcadc6cb260d798a40fd49ef0 diff --git a/solr/licenses/langchain4j-open-ai-0.35.0.jar.sha1 b/solr/licenses/langchain4j-open-ai-0.35.0.jar.sha1 new file mode 100644 index 00000000000..35cdfb38385 --- /dev/null +++ b/solr/licenses/langchain4j-open-ai-0.35.0.jar.sha1 @@ -0,0 +1 @@ +d77645377c517e18fd5e0ca2ca56d4a38e21495a diff --git a/solr/licenses/okhttp-sse-4.12.0.jar.sha1 b/solr/licenses/okhttp-sse-4.12.0.jar.sha1 new file mode 100644 index 00000000000..60d422fb2c6 --- /dev/null +++ b/solr/licenses/okhttp-sse-4.12.0.jar.sha1 @@ -0,0 +1 @@ +eca9c68c54ae7fd18d465beba65d80a44e9667e4 diff --git a/solr/licenses/openai4j-0.22.0.jar.sha1 b/solr/licenses/openai4j-0.22.0.jar.sha1 new file mode 100644 index 00000000000..506a2fd66b4 --- /dev/null +++ b/solr/licenses/openai4j-0.22.0.jar.sha1 @@ -0,0 +1 @@ +a9c8a0cdbf43cd31a08ee7ce957ab84991b67427 diff --git a/solr/licenses/retrofit-2.9.0.jar.sha1 b/solr/licenses/retrofit-2.9.0.jar.sha1 new file mode 100644 index 00000000000..8939819d52c --- /dev/null +++ b/solr/licenses/retrofit-2.9.0.jar.sha1 @@ -0,0 +1 @@ +d8fdfbd5da952141a665a403348b74538efc05ff diff --git a/versions.lock b/versions.lock index b2bec0363ed..09c881f8299 100644 --- a/versions.lock +++ b/versions.lock @@ -12,33 +12,33 @@ "com.amazonaws:aws-java-sdk-s3:1.12.501" : "1e12e466,refs=2", "com.amazonaws:jmespath-java:1.12.501" : "1e12e466,refs=2", "com.beust:jcommander:1.82" : "50a667d1,refs=5", - "com.carrotsearch.randomizedtesting:randomizedtesting-runner:2.8.1" : "06ca9183,refs=52", - "com.carrotsearch:hppc:0.10.0" : "3ff3bc39,refs=81", + "com.carrotsearch.randomizedtesting:randomizedtesting-runner:2.8.1" : "51ad5028,refs=54", + "com.carrotsearch:hppc:0.10.0" : "3e18f104,refs=85", "com.cybozu.labs:langdetect:1.1-20120112" : "69bf1b73,refs=5", "com.epam:parso:2.0.14" : "50a667d1,refs=5", - "com.fasterxml.jackson.core:jackson-annotations:2.18.0" : "4ce82561,refs=99", - "com.fasterxml.jackson.core:jackson-core:2.18.0" : "6a8501ec,refs=100", - "com.fasterxml.jackson.core:jackson-databind:2.18.0" : "f83d8628,refs=96", - "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.18.0" : "8b517977,refs=81", + "com.fasterxml.jackson.core:jackson-annotations:2.18.0" : "1f3ee334,refs=105", + "com.fasterxml.jackson.core:jackson-core:2.18.0" : "2bc8eb7f,refs=106", + "com.fasterxml.jackson.core:jackson-databind:2.18.0" : "ac0452bb,refs=102", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.18.0" : "17ba760c,refs=85", "com.fasterxml.jackson.dataformat:jackson-dataformat-csv:2.18.0" : "4bf37e93,refs=3", - "com.fasterxml.jackson.dataformat:jackson-dataformat-smile:2.18.0" : "ad8f08d7,refs=79", + "com.fasterxml.jackson.dataformat:jackson-dataformat-smile:2.18.0" : "9de0bea2,refs=83", "com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.18.0" : "1e12e466,refs=2", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.18.0" : "3b210678,refs=5", "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.18.0" : "1e12e466,refs=2", - "com.fasterxml.jackson.module:jackson-module-jakarta-xmlbind-annotations:2.18.0" : "ad8f08d7,refs=79", + "com.fasterxml.jackson.module:jackson-module-jakarta-xmlbind-annotations:2.18.0" : "9de0bea2,refs=83", "com.fasterxml.jackson.module:jackson-module-kotlin:2.18.0" : "c77c5ec7,refs=1", "com.fasterxml.jackson.module:jackson-module-parameter-names:2.18.0" : "1e12e466,refs=2", "com.fasterxml.jackson.module:jackson-module-scala_2.13:2.18.0" : "4bf37e93,refs=3", - "com.fasterxml.jackson:jackson-bom:2.18.0" : "100652ac,refs=104", - "com.fasterxml.woodstox:woodstox-core:7.0.0" : "7bb67147,refs=82", - "com.github.ben-manes.caffeine:caffeine:3.1.8" : "5b2db4f4,refs=111", + "com.fasterxml.jackson:jackson-bom:2.18.0" : "8bbaac3f,refs=110", + "com.fasterxml.woodstox:woodstox-core:7.0.0" : "da3f05dc,refs=86", + "com.github.ben-manes.caffeine:caffeine:3.1.8" : "60d0b5a8,refs=116", "com.github.jai-imageio:jai-imageio-core:1.4.0" : "50a667d1,refs=5", "com.github.junrar:junrar:7.5.3" : "50a667d1,refs=5", - "com.github.kevinstern:software-and-algorithms:1.0" : "e5b524d7,refs=26", + "com.github.kevinstern:software-and-algorithms:1.0" : "f7d7775a,refs=27", "com.github.luben:zstd-jni:1.5.6-3" : "f493e7bb,refs=7", "com.github.openjson:openjson:1.0.12" : "50a667d1,refs=5", "com.github.spotbugs:spotbugs-annotations:4.8.6" : "761c3c3c,refs=5", - "com.github.stephenc.jcip:jcip-annotations:1.0-1" : "e9990913,refs=4", + "com.github.stephenc.jcip:jcip-annotations:1.0-1" : "1d598fff,refs=5", "com.github.virtuald:curvesapi:1.07" : "50a667d1,refs=5", "com.google.android:annotations:4.1.1.4" : "dd724fae,refs=6", "com.google.api-client:google-api-client:2.6.0" : "784a94ea,refs=5", @@ -54,33 +54,33 @@ "com.google.apis:google-api-services-storage:v1-rev20240621-2.0.0" : "784a94ea,refs=5", "com.google.auth:google-auth-library-credentials:1.23.0" : "784a94ea,refs=5", "com.google.auth:google-auth-library-oauth2-http:1.23.0" : "784a94ea,refs=5", - "com.google.auto.service:auto-service-annotations:1.0.1" : "e5b524d7,refs=26", - "com.google.auto.value:auto-value-annotations:1.10.4" : "322f4a3c,refs=31", - "com.google.auto:auto-common:1.2.2" : "e5b524d7,refs=26", + "com.google.auto.service:auto-service-annotations:1.0.1" : "f7d7775a,refs=27", + "com.google.auto.value:auto-value-annotations:1.10.4" : "3aa1fe95,refs=32", + "com.google.auto:auto-common:1.2.2" : "f7d7775a,refs=27", "com.google.cloud:google-cloud-bom:0.224.0" : "784a94ea,refs=5", "com.google.cloud:google-cloud-core:2.40.0" : "784a94ea,refs=5", "com.google.cloud:google-cloud-core-grpc:2.40.0" : "784a94ea,refs=5", "com.google.cloud:google-cloud-core-http:2.40.0" : "784a94ea,refs=5", "com.google.cloud:google-cloud-nio:0.127.20" : "aa7a59c6,refs=2", "com.google.cloud:google-cloud-storage:2.40.1" : "784a94ea,refs=5", - "com.google.code.findbugs:jsr305:3.0.2" : "e5b524d7,refs=26", - "com.google.code.gson:gson:2.11.0" : "0a82b27c,refs=16", - "com.google.errorprone:error_prone_annotation:2.31.0" : "e5b524d7,refs=26", - "com.google.errorprone:error_prone_annotations:2.31.0" : "e80f7a3a,refs=149", - "com.google.errorprone:error_prone_check_api:2.31.0" : "e5b524d7,refs=26", - "com.google.errorprone:error_prone_core:2.31.0" : "e5b524d7,refs=26", - "com.google.errorprone:error_prone_type_annotations:2.31.0" : "e5b524d7,refs=26", - "com.google.guava:failureaccess:1.0.2" : "e80f7a3a,refs=149", - "com.google.guava:guava:33.1.0-jre" : "e80f7a3a,refs=149", - "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava" : "e80f7a3a,refs=149", + "com.google.code.findbugs:jsr305:3.0.2" : "f7d7775a,refs=27", + "com.google.code.gson:gson:2.11.0" : "3230a61e,refs=21", + "com.google.errorprone:error_prone_annotation:2.31.0" : "f7d7775a,refs=27", + "com.google.errorprone:error_prone_annotations:2.31.0" : "474dc824,refs=156", + "com.google.errorprone:error_prone_check_api:2.31.0" : "f7d7775a,refs=27", + "com.google.errorprone:error_prone_core:2.31.0" : "f7d7775a,refs=27", + "com.google.errorprone:error_prone_type_annotations:2.31.0" : "f7d7775a,refs=27", + "com.google.guava:failureaccess:1.0.2" : "474dc824,refs=156", + "com.google.guava:guava:33.1.0-jre" : "474dc824,refs=156", + "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava" : "474dc824,refs=156", "com.google.http-client:google-http-client:1.44.2" : "784a94ea,refs=5", "com.google.http-client:google-http-client-apache-v2:1.44.2" : "784a94ea,refs=5", "com.google.http-client:google-http-client-appengine:1.44.2" : "784a94ea,refs=5", "com.google.http-client:google-http-client-gson:1.44.2" : "784a94ea,refs=5", "com.google.http-client:google-http-client-jackson2:1.44.2" : "784a94ea,refs=5", - "com.google.j2objc:j2objc-annotations:3.0.0" : "a05ffa28,refs=49", + "com.google.j2objc:j2objc-annotations:3.0.0" : "558af7f6,refs=51", "com.google.oauth-client:google-oauth-client:1.36.0" : "784a94ea,refs=5", - "com.google.protobuf:protobuf-java:3.25.3" : "7498dc3d,refs=48", + "com.google.protobuf:protobuf-java:3.25.3" : "6481fe6a,refs=49", "com.google.protobuf:protobuf-java-util:3.25.3" : "a7f96198,refs=8", "com.google.re2j:re2j:1.7" : "a5b348ef,refs=6", "com.googlecode.json-simple:json-simple:1.1.1" : "8d0cef4c,refs=11", @@ -90,9 +90,10 @@ "com.healthmarketscience.jackcess:jackcess-encrypt:4.0.1" : "50a667d1,refs=5", "com.helger:profiler:1.1.1" : "0769b123,refs=5", "com.ibm.icu:icu4j:74.2" : "b4755bf3,refs=9", - "com.j256.simplemagic:simplemagic:1.17" : "ad8f08d7,refs=79", - "com.jayway.jsonpath:json-path:2.9.0" : "ad8f08d7,refs=79", - "com.lmax:disruptor:3.4.4" : "6ac4140f,refs=27", + "com.j256.simplemagic:simplemagic:1.17" : "9de0bea2,refs=83", + "com.jayway.jsonpath:json-path:2.9.0" : "9de0bea2,refs=83", + "com.knuddels:jtokkit:1.1.0" : "8a8ebb15,refs=5", + "com.lmax:disruptor:3.4.4" : "088a25a2,refs=28", "com.mchange:c3p0:0.9.5.5" : "50a667d1,refs=5", "com.mchange:mchange-commons-java:0.2.19" : "50a667d1,refs=5", "com.nimbusds:content-type:2.2" : "4f81d786,refs=2", @@ -103,41 +104,51 @@ "com.rometools:rome:1.18.0" : "50a667d1,refs=5", "com.rometools:rome-utils:1.18.0" : "50a667d1,refs=5", "com.squareup.okhttp3:mockwebserver:4.11.0" : "4f81d786,refs=2", - "com.squareup.okhttp3:okhttp:4.12.0" : "b6a343e2,refs=5", - "com.squareup.okio:okio:3.6.0" : "b6a343e2,refs=5", - "com.squareup.okio:okio-jvm:3.6.0" : "b6a343e2,refs=5", + "com.squareup.okhttp3:okhttp:4.12.0" : "36d10478,refs=10", + "com.squareup.okhttp3:okhttp-sse:4.12.0" : "8a8ebb15,refs=5", + "com.squareup.okio:okio:3.6.0" : "36d10478,refs=10", + "com.squareup.okio:okio-jvm:3.6.0" : "36d10478,refs=10", + "com.squareup.retrofit2:converter-jackson:2.9.0" : "8a8ebb15,refs=5", + "com.squareup.retrofit2:retrofit:2.9.0" : "8a8ebb15,refs=5", "com.sun.activation:jakarta.activation:1.2.2" : "e2f3f42e,refs=4", "com.sun.istack:istack-commons-runtime:3.0.12" : "debe9836,refs=7", - "com.tdunning:t-digest:3.3" : "ad8f08d7,refs=79", + "com.tdunning:t-digest:3.3" : "9de0bea2,refs=83", "com.thoughtworks.paranamer:paranamer:2.8" : "4bf37e93,refs=3", "com.typesafe.scala-logging:scala-logging_2.13:3.9.4" : "4bf37e93,refs=3", "com.yammer.metrics:metrics-core:2.2.0" : "4bf37e93,refs=3", "com.zaxxer:SparseBitSet:1.2" : "50a667d1,refs=5", "commons-beanutils:commons-beanutils:1.9.4" : "4bf37e93,refs=3", - "commons-cli:commons-cli:1.9.0" : "e19ba4dc,refs=87", - "commons-codec:commons-codec:1.17.1" : "fed35e7f,refs=107", + "commons-cli:commons-cli:1.9.0" : "8285d027,refs=91", + "commons-codec:commons-codec:1.17.1" : "3cbf4a8a,refs=111", "commons-collections:commons-collections:3.2.2" : "acc31ef6,refs=6", "commons-digester:commons-digester:2.1" : "4bf37e93,refs=3", - "commons-io:commons-io:2.15.1" : "7413b098,refs=124", + "commons-io:commons-io:2.15.1" : "d1cd69a5,refs=130", "commons-validator:commons-validator:1.7" : "4bf37e93,refs=3", "de.l3s.boilerpipe:boilerpipe:1.1.0" : "50a667d1,refs=5", + "dev.ai4j:openai4j:0.22.0" : "8a8ebb15,refs=5", + "dev.langchain4j:langchain4j:0.35.0" : "8a8ebb15,refs=5", + "dev.langchain4j:langchain4j-cohere:0.35.0" : "8a8ebb15,refs=5", + "dev.langchain4j:langchain4j-core:0.35.0" : "8a8ebb15,refs=5", + "dev.langchain4j:langchain4j-hugging-face:0.35.0" : "8a8ebb15,refs=5", + "dev.langchain4j:langchain4j-mistral-ai:0.35.0" : "8a8ebb15,refs=5", + "dev.langchain4j:langchain4j-open-ai:0.35.0" : "8a8ebb15,refs=5", "edu.ucar:cdm:4.5.5" : "50a667d1,refs=5", "edu.ucar:grib:4.5.5" : "50a667d1,refs=5", "edu.ucar:httpservices:4.5.5" : "50a667d1,refs=5", "edu.ucar:netcdf4:4.5.5" : "50a667d1,refs=5", "edu.ucar:udunits:4.5.5" : "50a667d1,refs=5", "edu.usc.ir:sentiment-analysis-parser:0.1" : "50a667d1,refs=5", - "io.dropwizard.metrics:metrics-annotation:4.2.26" : "1f5bde05,refs=47", - "io.dropwizard.metrics:metrics-core:4.2.26" : "87cd582a,refs=121", - "io.dropwizard.metrics:metrics-graphite:4.2.26" : "27f62655,refs=81", + "io.dropwizard.metrics:metrics-annotation:4.2.26" : "ded3e8b1,refs=49", + "io.dropwizard.metrics:metrics-core:4.2.26" : "d2bb9bb7,refs=127", + "io.dropwizard.metrics:metrics-graphite:4.2.26" : "2c60ed20,refs=85", "io.dropwizard.metrics:metrics-healthchecks:4.2.26" : "0769b123,refs=5", - "io.dropwizard.metrics:metrics-jetty10:4.2.26" : "1f5bde05,refs=47", - "io.dropwizard.metrics:metrics-jmx:4.2.26" : "27f62655,refs=81", + "io.dropwizard.metrics:metrics-jetty10:4.2.26" : "ded3e8b1,refs=49", + "io.dropwizard.metrics:metrics-jmx:4.2.26" : "2c60ed20,refs=85", "io.dropwizard.metrics:metrics-json:4.2.26" : "0769b123,refs=5", - "io.dropwizard.metrics:metrics-jvm:4.2.26" : "dc28f153,refs=83", + "io.dropwizard.metrics:metrics-jvm:4.2.26" : "a41a091e,refs=87", "io.dropwizard.metrics:metrics-servlets:4.2.26" : "0769b123,refs=5", - "io.github.eisop:dataflow-errorprone:3.41.0-eisop1" : "e5b524d7,refs=26", - "io.github.java-diff-utils:java-diff-utils:4.12" : "e5b524d7,refs=26", + "io.github.eisop:dataflow-errorprone:3.41.0-eisop1" : "f7d7775a,refs=27", + "io.github.java-diff-utils:java-diff-utils:4.12" : "f7d7775a,refs=27", "io.github.microutils:kotlin-logging:3.0.5" : "c77c5ec7,refs=1", "io.github.microutils:kotlin-logging-jvm:3.0.5" : "c77c5ec7,refs=1", "io.grpc:grpc-alts:1.65.1" : "784a94ea,refs=5", @@ -160,28 +171,28 @@ "io.grpc:grpc-xds:1.65.1" : "6fb73f3a,refs=3", "io.micrometer:micrometer-core:1.9.12" : "1e12e466,refs=2", "io.netty:netty-bom:4.1.114.Final" : "0d28f997,refs=5", - "io.netty:netty-buffer:4.1.114.Final" : "7413b098,refs=124", - "io.netty:netty-codec:4.1.114.Final" : "7413b098,refs=124", + "io.netty:netty-buffer:4.1.114.Final" : "d1cd69a5,refs=130", + "io.netty:netty-codec:4.1.114.Final" : "d1cd69a5,refs=130", "io.netty:netty-codec-http:4.1.114.Final" : "c1e4e901,refs=4", "io.netty:netty-codec-http2:4.1.114.Final" : "5fcc0587,refs=3", "io.netty:netty-codec-socks:4.1.114.Final" : "5fcc0587,refs=3", - "io.netty:netty-common:4.1.114.Final" : "7413b098,refs=124", - "io.netty:netty-handler:4.1.114.Final" : "7413b098,refs=124", + "io.netty:netty-common:4.1.114.Final" : "d1cd69a5,refs=130", + "io.netty:netty-handler:4.1.114.Final" : "d1cd69a5,refs=130", "io.netty:netty-handler-proxy:4.1.114.Final" : "5fcc0587,refs=3", - "io.netty:netty-resolver:4.1.114.Final" : "7413b098,refs=124", - "io.netty:netty-tcnative-boringssl-static:2.0.66.Final" : "7413b098,refs=124", - "io.netty:netty-tcnative-classes:2.0.66.Final" : "7413b098,refs=124", - "io.netty:netty-transport:4.1.114.Final" : "7413b098,refs=124", - "io.netty:netty-transport-classes-epoll:4.1.114.Final" : "7413b098,refs=124", - "io.netty:netty-transport-native-epoll:4.1.114.Final" : "7413b098,refs=124", - "io.netty:netty-transport-native-unix-common:4.1.114.Final" : "7413b098,refs=124", + "io.netty:netty-resolver:4.1.114.Final" : "d1cd69a5,refs=130", + "io.netty:netty-tcnative-boringssl-static:2.0.66.Final" : "d1cd69a5,refs=130", + "io.netty:netty-tcnative-classes:2.0.66.Final" : "d1cd69a5,refs=130", + "io.netty:netty-transport:4.1.114.Final" : "d1cd69a5,refs=130", + "io.netty:netty-transport-classes-epoll:4.1.114.Final" : "d1cd69a5,refs=130", + "io.netty:netty-transport-native-epoll:4.1.114.Final" : "d1cd69a5,refs=130", + "io.netty:netty-transport-native-unix-common:4.1.114.Final" : "d1cd69a5,refs=130", "io.opencensus:opencensus-api:0.31.1" : "784a94ea,refs=5", "io.opencensus:opencensus-contrib-http-util:0.31.1" : "784a94ea,refs=5", "io.opencensus:opencensus-proto:0.2.0" : "6fb73f3a,refs=3", - "io.opentelemetry:opentelemetry-api:1.40.0" : "17e13daa,refs=119", + "io.opentelemetry:opentelemetry-api:1.40.0" : "2ead6137,refs=125", "io.opentelemetry:opentelemetry-api-incubator:1.40.0-alpha" : "5fcc0587,refs=3", "io.opentelemetry:opentelemetry-bom:1.40.0" : "0d28f997,refs=5", - "io.opentelemetry:opentelemetry-context:1.40.0" : "17e13daa,refs=119", + "io.opentelemetry:opentelemetry-context:1.40.0" : "2ead6137,refs=125", "io.opentelemetry:opentelemetry-exporter-common:1.40.0" : "5fcc0587,refs=3", "io.opentelemetry:opentelemetry-exporter-otlp:1.40.0" : "5fcc0587,refs=3", "io.opentelemetry:opentelemetry-exporter-otlp-common:1.40.0" : "5fcc0587,refs=3", @@ -195,25 +206,25 @@ "io.opentelemetry:opentelemetry-sdk-testing:1.40.0" : "015c5766,refs=2", "io.opentelemetry:opentelemetry-sdk-trace:1.40.0" : "0d28f997,refs=5", "io.perfmark:perfmark-api:0.27.0" : "dd724fae,refs=6", - "io.prometheus:prometheus-metrics-exposition-formats:1.1.0" : "ad8f08d7,refs=79", - "io.prometheus:prometheus-metrics-model:1.1.0" : "ad8f08d7,refs=79", + "io.prometheus:prometheus-metrics-exposition-formats:1.1.0" : "9de0bea2,refs=83", + "io.prometheus:prometheus-metrics-model:1.1.0" : "9de0bea2,refs=83", "io.prometheus:simpleclient:0.16.0" : "fa7556ff,refs=5", "io.prometheus:simpleclient_common:0.16.0" : "fa7556ff,refs=5", "io.prometheus:simpleclient_httpserver:0.16.0" : "fa7556ff,refs=5", - "io.sgr:s2-geometry-library-java:1.0.0" : "ad8f08d7,refs=79", - "io.swagger.core.v3:swagger-annotations-jakarta:2.2.22" : "420fd813,refs=130", + "io.sgr:s2-geometry-library-java:1.0.0" : "9de0bea2,refs=83", + "io.swagger.core.v3:swagger-annotations-jakarta:2.2.22" : "b06ec8e0,refs=136", "jakarta.activation:jakarta.activation-api:1.2.2" : "50a667d1,refs=5", - "jakarta.annotation:jakarta.annotation-api:2.1.1" : "78dd58c9,refs=80", - "jakarta.inject:jakarta.inject-api:2.0.1" : "ad8f08d7,refs=79", + "jakarta.annotation:jakarta.annotation-api:2.1.1" : "92c25c5e,refs=84", + "jakarta.inject:jakarta.inject-api:2.0.1" : "9de0bea2,refs=83", "jakarta.servlet:jakarta.servlet-api:4.0.4" : "1e12e466,refs=2", - "jakarta.validation:jakarta.validation-api:3.0.2" : "ad8f08d7,refs=79", + "jakarta.validation:jakarta.validation-api:3.0.2" : "9de0bea2,refs=83", "jakarta.websocket:jakarta.websocket-api:1.1.2" : "1e12e466,refs=2", - "jakarta.ws.rs:jakarta.ws.rs-api:3.1.0" : "76db8e26,refs=87", + "jakarta.ws.rs:jakarta.ws.rs-api:3.1.0" : "37bc0471,refs=91", "jakarta.xml.bind:jakarta.xml.bind-api:2.3.3" : "debe9836,refs=7", - "javax.inject:javax.inject:1" : "a9dcee72,refs=28", + "javax.inject:javax.inject:1" : "b8a8e11f,refs=29", "javax.measure:unit-api:1.0" : "50a667d1,refs=5", "joda-time:joda-time:2.8.1" : "debe9836,refs=7", - "junit:junit:4.13.2" : "06ca9183,refs=52", + "junit:junit:4.13.2" : "51ad5028,refs=54", "net.arnx:jsonic:1.2.7" : "69bf1b73,refs=5", "net.bytebuddy:byte-buddy:1.14.15" : "5f62bd8e,refs=18", "net.bytebuddy:byte-buddy-agent:1.14.15" : "23e8a2eb,refs=4", @@ -225,7 +236,7 @@ "net.sourceforge.argparse4j:argparse4j:0.7.0" : "4bf37e93,refs=3", "net.thisptr:jackson-jq:0.0.13" : "fa7556ff,refs=5", "no.nav.security:mock-oauth2-server:0.5.10" : "4f81d786,refs=2", - "org.antlr:antlr4-runtime:4.11.1" : "ebd3db47,refs=77", + "org.antlr:antlr4-runtime:4.11.1" : "af96d912,refs=81", "org.apache.calcite.avatica:avatica-core:1.25.0" : "93acde90,refs=6", "org.apache.calcite.avatica:avatica-metrics:1.25.0" : "93acde90,refs=6", "org.apache.calcite:calcite-core:1.37.0" : "93acde90,refs=6", @@ -234,14 +245,14 @@ "org.apache.commons:commons-compress:1.26.1" : "515616b6,refs=7", "org.apache.commons:commons-configuration2:2.11.0" : "280cfec8,refs=3", "org.apache.commons:commons-csv:1.9.0" : "50a667d1,refs=5", - "org.apache.commons:commons-exec:1.4.0" : "5b11e899,refs=81", - "org.apache.commons:commons-lang3:3.15.0" : "36393977,refs=83", - "org.apache.commons:commons-math3:3.6.1" : "21136b15,refs=87", + "org.apache.commons:commons-exec:1.4.0" : "0b89ed64,refs=85", + "org.apache.commons:commons-lang3:3.15.0" : "6ec19f42,refs=87", + "org.apache.commons:commons-math3:3.6.1" : "17cdd1e0,refs=91", "org.apache.commons:commons-text:1.12.0" : "a6a1e3c5,refs=7", - "org.apache.curator:curator-client:5.7.1" : "703dff64,refs=123", - "org.apache.curator:curator-framework:5.7.1" : "703dff64,refs=123", + "org.apache.curator:curator-client:5.7.1" : "d3fc6f71,refs=129", + "org.apache.curator:curator-framework:5.7.1" : "d3fc6f71,refs=129", "org.apache.curator:curator-recipes:5.7.1" : "280cfec8,refs=3", - "org.apache.curator:curator-test:5.7.1" : "3c9a199e,refs=29", + "org.apache.curator:curator-test:5.7.1" : "4aa0cebf,refs=30", "org.apache.hadoop.thirdparty:hadoop-shaded-guava:1.2.0" : "e972cbed,refs=5", "org.apache.hadoop:hadoop-annotations:3.4.0" : "bf04d2b8,refs=5", "org.apache.hadoop:hadoop-auth:3.4.0" : "bf04d2b8,refs=5", @@ -254,9 +265,9 @@ "org.apache.httpcomponents.client5:httpclient5:5.2.1" : "20f1e0e0,refs=4", "org.apache.httpcomponents.core5:httpcore5:5.2.3" : "20f1e0e0,refs=4", "org.apache.httpcomponents.core5:httpcore5-h2:5.2" : "20f1e0e0,refs=4", - "org.apache.httpcomponents:httpclient:4.5.14" : "1b72eeae,refs=128", - "org.apache.httpcomponents:httpcore:4.4.16" : "1b72eeae,refs=128", - "org.apache.httpcomponents:httpmime:4.5.14" : "1b72eeae,refs=128", + "org.apache.httpcomponents:httpclient:4.5.14" : "840f3f3b,refs=134", + "org.apache.httpcomponents:httpcore:4.4.16" : "840f3f3b,refs=134", + "org.apache.httpcomponents:httpmime:4.5.14" : "840f3f3b,refs=134", "org.apache.james:apache-mime4j-core:0.8.4" : "50a667d1,refs=5", "org.apache.james:apache-mime4j-dom:0.8.4" : "50a667d1,refs=5", "org.apache.kafka:kafka-clients:3.7.1" : "c6acb8a9,refs=11", @@ -283,39 +294,39 @@ "org.apache.kerby:kerby-config:2.0.3" : "1643ad05,refs=4", "org.apache.kerby:kerby-pkix:2.0.3" : "1643ad05,refs=4", "org.apache.kerby:kerby-util:2.0.3" : "1643ad05,refs=4", - "org.apache.logging.log4j:log4j-1.2-api:2.21.0" : "1640bbba,refs=20", - "org.apache.logging.log4j:log4j-api:2.21.0" : "bc8e8214,refs=87", - "org.apache.logging.log4j:log4j-core:2.21.0" : "72c9c512,refs=85", - "org.apache.logging.log4j:log4j-layout-template-json:2.21.0" : "6351de37,refs=19", - "org.apache.logging.log4j:log4j-slf4j2-impl:2.21.0" : "08ef8dc6,refs=81", - "org.apache.logging.log4j:log4j-web:2.21.0" : "6351de37,refs=19", - "org.apache.lucene:lucene-analysis-common:9.11.1" : "17e13daa,refs=119", + "org.apache.logging.log4j:log4j-1.2-api:2.21.0" : "cca27357,refs=21", + "org.apache.logging.log4j:log4j-api:2.21.0" : "c1d7515f,refs=91", + "org.apache.logging.log4j:log4j-core:2.21.0" : "929ce55d,refs=89", + "org.apache.logging.log4j:log4j-layout-template-json:2.21.0" : "21b5a07a,refs=20", + "org.apache.logging.log4j:log4j-slf4j2-impl:2.21.0" : "9a873411,refs=85", + "org.apache.logging.log4j:log4j-web:2.21.0" : "21b5a07a,refs=20", + "org.apache.lucene:lucene-analysis-common:9.11.1" : "2ead6137,refs=125", "org.apache.lucene:lucene-analysis-icu:9.11.1" : "b4755bf3,refs=9", - "org.apache.lucene:lucene-analysis-kuromoji:9.11.1" : "ebd3db47,refs=77", + "org.apache.lucene:lucene-analysis-kuromoji:9.11.1" : "af96d912,refs=81", "org.apache.lucene:lucene-analysis-morfologik:9.11.1" : "727aea63,refs=7", - "org.apache.lucene:lucene-analysis-nori:9.11.1" : "ebd3db47,refs=77", + "org.apache.lucene:lucene-analysis-nori:9.11.1" : "af96d912,refs=81", "org.apache.lucene:lucene-analysis-opennlp:9.11.1" : "b4755bf3,refs=9", - "org.apache.lucene:lucene-analysis-phonetic:9.11.1" : "ebd3db47,refs=77", + "org.apache.lucene:lucene-analysis-phonetic:9.11.1" : "af96d912,refs=81", "org.apache.lucene:lucene-analysis-smartcn:9.11.1" : "727aea63,refs=7", "org.apache.lucene:lucene-analysis-stempel:9.11.1" : "727aea63,refs=7", - "org.apache.lucene:lucene-backward-codecs:9.11.1" : "ad8f08d7,refs=79", - "org.apache.lucene:lucene-classification:9.11.1" : "ad8f08d7,refs=79", - "org.apache.lucene:lucene-codecs:9.11.1" : "ad8f08d7,refs=79", - "org.apache.lucene:lucene-core:9.11.1" : "17e13daa,refs=119", - "org.apache.lucene:lucene-expressions:9.11.1" : "ad8f08d7,refs=79", - "org.apache.lucene:lucene-grouping:9.11.1" : "ad8f08d7,refs=79", - "org.apache.lucene:lucene-highlighter:9.11.1" : "ad8f08d7,refs=79", - "org.apache.lucene:lucene-join:9.11.1" : "ad8f08d7,refs=79", - "org.apache.lucene:lucene-memory:9.11.1" : "ebd3db47,refs=77", - "org.apache.lucene:lucene-misc:9.11.1" : "ad8f08d7,refs=79", - "org.apache.lucene:lucene-queries:9.11.1" : "17e13daa,refs=119", - "org.apache.lucene:lucene-queryparser:9.11.1" : "ad8f08d7,refs=79", - "org.apache.lucene:lucene-sandbox:9.11.1" : "ad8f08d7,refs=79", - "org.apache.lucene:lucene-spatial-extras:9.11.1" : "ad8f08d7,refs=79", - "org.apache.lucene:lucene-spatial3d:9.11.1" : "ad8f08d7,refs=79", - "org.apache.lucene:lucene-suggest:9.11.1" : "b3b7541b,refs=81", - "org.apache.lucene:lucene-test-framework:9.11.1" : "06ca9183,refs=52", - "org.apache.opennlp:opennlp-tools:1.9.4" : "e6d93f27,refs=19", + "org.apache.lucene:lucene-backward-codecs:9.11.1" : "9de0bea2,refs=83", + "org.apache.lucene:lucene-classification:9.11.1" : "9de0bea2,refs=83", + "org.apache.lucene:lucene-codecs:9.11.1" : "9de0bea2,refs=83", + "org.apache.lucene:lucene-core:9.11.1" : "2ead6137,refs=125", + "org.apache.lucene:lucene-expressions:9.11.1" : "9de0bea2,refs=83", + "org.apache.lucene:lucene-grouping:9.11.1" : "9de0bea2,refs=83", + "org.apache.lucene:lucene-highlighter:9.11.1" : "9de0bea2,refs=83", + "org.apache.lucene:lucene-join:9.11.1" : "9de0bea2,refs=83", + "org.apache.lucene:lucene-memory:9.11.1" : "af96d912,refs=81", + "org.apache.lucene:lucene-misc:9.11.1" : "9de0bea2,refs=83", + "org.apache.lucene:lucene-queries:9.11.1" : "2ead6137,refs=125", + "org.apache.lucene:lucene-queryparser:9.11.1" : "9de0bea2,refs=83", + "org.apache.lucene:lucene-sandbox:9.11.1" : "9de0bea2,refs=83", + "org.apache.lucene:lucene-spatial-extras:9.11.1" : "9de0bea2,refs=83", + "org.apache.lucene:lucene-spatial3d:9.11.1" : "9de0bea2,refs=83", + "org.apache.lucene:lucene-suggest:9.11.1" : "74a9c7e6,refs=85", + "org.apache.lucene:lucene-test-framework:9.11.1" : "51ad5028,refs=54", + "org.apache.opennlp:opennlp-tools:1.9.4" : "1b1446cf,refs=24", "org.apache.pdfbox:fontbox:2.0.26" : "50a667d1,refs=5", "org.apache.pdfbox:jbig2-imageio:3.0.4" : "50a667d1,refs=5", "org.apache.pdfbox:jempbox:1.8.16" : "50a667d1,refs=5", @@ -338,9 +349,9 @@ "org.apache.tomcat.embed:tomcat-embed-el:9.0.76" : "1e12e466,refs=2", "org.apache.tomcat:annotations-api:6.0.53" : "781655d3,refs=1", "org.apache.xmlbeans:xmlbeans:5.0.3" : "50a667d1,refs=5", - "org.apache.zookeeper:zookeeper:3.9.2" : "7413b098,refs=124", - "org.apache.zookeeper:zookeeper-jute:3.9.2" : "7413b098,refs=124", - "org.apiguardian:apiguardian-api:1.1.2" : "5d98342f,refs=33", + "org.apache.zookeeper:zookeeper:3.9.2" : "d1cd69a5,refs=130", + "org.apache.zookeeper:zookeeper-jute:3.9.2" : "d1cd69a5,refs=130", + "org.apiguardian:apiguardian-api:1.1.2" : "f10d70d0,refs=34", "org.bitbucket.b_c:jose4j:0.9.6" : "9bcc8206,refs=8", "org.bouncycastle:bcmail-jdk15on:1.70" : "50a667d1,refs=5", "org.bouncycastle:bcpkix-jdk15on:1.70" : "8ba2f0f7,refs=6", @@ -355,75 +366,75 @@ "org.carrot2:morfologik-polish:2.1.9" : "727aea63,refs=7", "org.carrot2:morfologik-stemming:2.1.9" : "727aea63,refs=7", "org.ccil.cowan.tagsoup:tagsoup:1.2.1" : "50a667d1,refs=5", - "org.checkerframework:checker-qual:3.44.0" : "e80f7a3a,refs=149", + "org.checkerframework:checker-qual:3.44.0" : "474dc824,refs=156", "org.codehaus.janino:commons-compiler:3.1.11" : "20f1e0e0,refs=4", "org.codehaus.janino:janino:3.1.11" : "20f1e0e0,refs=4", - "org.codehaus.woodstox:stax2-api:4.2.2" : "5b11e899,refs=81", + "org.codehaus.woodstox:stax2-api:4.2.2" : "0b89ed64,refs=85", "org.codelibs:jhighlight:1.1.0" : "50a667d1,refs=5", "org.conscrypt:conscrypt-openjdk-uber:2.5.2" : "784a94ea,refs=5", - "org.eclipse.jetty.http2:http2-client:10.0.22" : "1b72eeae,refs=128", - "org.eclipse.jetty.http2:http2-common:10.0.22" : "84afbb60,refs=130", - "org.eclipse.jetty.http2:http2-hpack:10.0.22" : "84afbb60,refs=130", - "org.eclipse.jetty.http2:http2-http-client-transport:10.0.22" : "f9ff6c21,refs=84", - "org.eclipse.jetty.http2:http2-server:10.0.22" : "5967e690,refs=32", - "org.eclipse.jetty.toolchain:jetty-servlet-api:4.0.6" : "5e82f1c0,refs=109", - "org.eclipse.jetty:jetty-alpn-client:10.0.22" : "1b72eeae,refs=128", - "org.eclipse.jetty:jetty-alpn-java-client:10.0.22" : "f9ff6c21,refs=84", - "org.eclipse.jetty:jetty-alpn-java-server:10.0.22" : "1069c1cc,refs=30", - "org.eclipse.jetty:jetty-alpn-server:10.0.22" : "5967e690,refs=32", - "org.eclipse.jetty:jetty-client:10.0.22" : "7f2dd9d5,refs=90", + "org.eclipse.jetty.http2:http2-client:10.0.22" : "840f3f3b,refs=134", + "org.eclipse.jetty.http2:http2-common:10.0.22" : "4f983e6d,refs=136", + "org.eclipse.jetty.http2:http2-hpack:10.0.22" : "4f983e6d,refs=136", + "org.eclipse.jetty.http2:http2-http-client-transport:10.0.22" : "a97a6cec,refs=88", + "org.eclipse.jetty.http2:http2-server:10.0.22" : "c78ca00d,refs=33", + "org.eclipse.jetty.toolchain:jetty-servlet-api:4.0.6" : "806155b7,refs=114", + "org.eclipse.jetty:jetty-alpn-client:10.0.22" : "840f3f3b,refs=134", + "org.eclipse.jetty:jetty-alpn-java-client:10.0.22" : "a97a6cec,refs=88", + "org.eclipse.jetty:jetty-alpn-java-server:10.0.22" : "f0c62c51,refs=31", + "org.eclipse.jetty:jetty-alpn-server:10.0.22" : "c78ca00d,refs=33", + "org.eclipse.jetty:jetty-client:10.0.22" : "f192e0a0,refs=94", "org.eclipse.jetty:jetty-deploy:10.0.22" : "24396a00,refs=4", - "org.eclipse.jetty:jetty-http:10.0.22" : "84afbb60,refs=130", - "org.eclipse.jetty:jetty-io:10.0.22" : "84afbb60,refs=130", + "org.eclipse.jetty:jetty-http:10.0.22" : "4f983e6d,refs=136", + "org.eclipse.jetty:jetty-io:10.0.22" : "4f983e6d,refs=136", "org.eclipse.jetty:jetty-jmx:10.0.22" : "24396a00,refs=4", - "org.eclipse.jetty:jetty-rewrite:10.0.22" : "5967e690,refs=32", - "org.eclipse.jetty:jetty-security:10.0.22" : "0e779887,refs=59", - "org.eclipse.jetty:jetty-server:10.0.22" : "d008b72a,refs=107", - "org.eclipse.jetty:jetty-servlet:10.0.22" : "0e779887,refs=59", + "org.eclipse.jetty:jetty-rewrite:10.0.22" : "c78ca00d,refs=33", + "org.eclipse.jetty:jetty-security:10.0.22" : "2234a62c,refs=61", + "org.eclipse.jetty:jetty-server:10.0.22" : "1990628d,refs=112", + "org.eclipse.jetty:jetty-servlet:10.0.22" : "2234a62c,refs=61", "org.eclipse.jetty:jetty-servlets:10.0.22" : "24396a00,refs=4", - "org.eclipse.jetty:jetty-util:10.0.22" : "84afbb60,refs=130", + "org.eclipse.jetty:jetty-util:10.0.22" : "4f983e6d,refs=136", "org.eclipse.jetty:jetty-webapp:10.0.22" : "062c26b4,refs=7", "org.eclipse.jetty:jetty-xml:10.0.22" : "062c26b4,refs=7", "org.freemarker:freemarker:2.3.32" : "c77c5ec7,refs=1", "org.gagravarr:vorbis-java-core:0.8" : "50a667d1,refs=5", "org.gagravarr:vorbis-java-tika:0.8" : "50a667d1,refs=5", - "org.glassfish.hk2.external:aopalliance-repackaged:3.1.1" : "ad8f08d7,refs=79", - "org.glassfish.hk2:hk2-api:3.1.1" : "ad8f08d7,refs=79", - "org.glassfish.hk2:hk2-locator:3.1.1" : "ad8f08d7,refs=79", - "org.glassfish.hk2:hk2-utils:3.1.1" : "ad8f08d7,refs=79", - "org.glassfish.hk2:osgi-resource-locator:1.0.3" : "ad8f08d7,refs=79", + "org.glassfish.hk2.external:aopalliance-repackaged:3.1.1" : "9de0bea2,refs=83", + "org.glassfish.hk2:hk2-api:3.1.1" : "9de0bea2,refs=83", + "org.glassfish.hk2:hk2-locator:3.1.1" : "9de0bea2,refs=83", + "org.glassfish.hk2:hk2-utils:3.1.1" : "9de0bea2,refs=83", + "org.glassfish.hk2:osgi-resource-locator:1.0.3" : "9de0bea2,refs=83", "org.glassfish.jaxb:jaxb-runtime:2.3.8" : "debe9836,refs=7", "org.glassfish.jaxb:txw2:2.3.8" : "debe9836,refs=7", - "org.glassfish.jersey.containers:jersey-container-jetty-http:2.39.1" : "ad8f08d7,refs=79", - "org.glassfish.jersey.core:jersey-client:3.1.9" : "ad8f08d7,refs=79", - "org.glassfish.jersey.core:jersey-common:3.1.9" : "ad8f08d7,refs=79", - "org.glassfish.jersey.core:jersey-server:3.1.9" : "ad8f08d7,refs=79", - "org.glassfish.jersey.ext:jersey-entity-filtering:3.1.9" : "ad8f08d7,refs=79", - "org.glassfish.jersey.inject:jersey-hk2:3.1.9" : "ad8f08d7,refs=79", - "org.glassfish.jersey.media:jersey-media-json-jackson:3.1.9" : "ad8f08d7,refs=79", - "org.hamcrest:hamcrest:3.0" : "06ca9183,refs=52", + "org.glassfish.jersey.containers:jersey-container-jetty-http:2.39.1" : "9de0bea2,refs=83", + "org.glassfish.jersey.core:jersey-client:3.1.9" : "9de0bea2,refs=83", + "org.glassfish.jersey.core:jersey-common:3.1.9" : "9de0bea2,refs=83", + "org.glassfish.jersey.core:jersey-server:3.1.9" : "9de0bea2,refs=83", + "org.glassfish.jersey.ext:jersey-entity-filtering:3.1.9" : "9de0bea2,refs=83", + "org.glassfish.jersey.inject:jersey-hk2:3.1.9" : "9de0bea2,refs=83", + "org.glassfish.jersey.media:jersey-media-json-jackson:3.1.9" : "9de0bea2,refs=83", + "org.hamcrest:hamcrest:3.0" : "51ad5028,refs=54", "org.hdrhistogram:HdrHistogram:2.1.12" : "1e12e466,refs=2", "org.hsqldb:hsqldb:2.7.2" : "970f2ee7,refs=1", "org.immutables:value-annotations:2.10.1" : "d3d191b2,refs=1", "org.itadaki:bzip2:0.9.1" : "50a667d1,refs=5", - "org.javassist:javassist:3.30.2-GA" : "ad8f08d7,refs=79", + "org.javassist:javassist:3.30.2-GA" : "9de0bea2,refs=83", "org.jctools:jctools-core:4.0.5" : "52ada00b,refs=4", "org.jdom:jdom2:2.0.6.1" : "50a667d1,refs=5", "org.jetbrains.kotlin:kotlin-reflect:1.8.22" : "c77c5ec7,refs=1", - "org.jetbrains.kotlin:kotlin-stdlib:1.9.10" : "b6a343e2,refs=5", - "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.10" : "b6a343e2,refs=5", - "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.10" : "b6a343e2,refs=5", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.10" : "b6a343e2,refs=5", - "org.jetbrains:annotations:13.0" : "b6a343e2,refs=5", - "org.jspecify:jspecify:1.0.0" : "e5b524d7,refs=26", - "org.junit.jupiter:junit-jupiter-api:5.6.2" : "3c9a199e,refs=29", - "org.junit.platform:junit-platform-commons:1.6.2" : "3c9a199e,refs=29", - "org.junit:junit-bom:5.6.2" : "3c9a199e,refs=29", + "org.jetbrains.kotlin:kotlin-stdlib:1.9.10" : "36d10478,refs=10", + "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.10" : "36d10478,refs=10", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.10" : "36d10478,refs=10", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.10" : "36d10478,refs=10", + "org.jetbrains:annotations:13.0" : "36d10478,refs=10", + "org.jspecify:jspecify:1.0.0" : "f7d7775a,refs=27", + "org.junit.jupiter:junit-jupiter-api:5.6.2" : "4aa0cebf,refs=30", + "org.junit.platform:junit-platform-commons:1.6.2" : "4aa0cebf,refs=30", + "org.junit:junit-bom:5.6.2" : "4aa0cebf,refs=30", "org.latencyutils:LatencyUtils:2.0.3" : "7df0e72e,refs=1", "org.locationtech.jts.io:jts-io-common:1.19.0" : "93acde90,refs=6", "org.locationtech.jts:jts-core:1.19.0" : "93acde90,refs=6", "org.locationtech.proj4j:proj4j:1.2.2" : "93acde90,refs=6", - "org.locationtech.spatial4j:spatial4j:0.8" : "ad8f08d7,refs=79", + "org.locationtech.spatial4j:spatial4j:0.8" : "9de0bea2,refs=83", "org.lz4:lz4-java:1.8.0" : "f493e7bb,refs=7", "org.mockito:mockito-core:5.12.0" : "5f62bd8e,refs=18", "org.mockito:mockito-subclass:5.12.0" : "ef8aea8b,refs=7", @@ -431,15 +442,15 @@ "org.opengis:geoapi:3.0.1" : "50a667d1,refs=5", "org.openjdk.jmh:jmh-core:1.37" : "c718e885,refs=5", "org.openjdk.jmh:jmh-generator-annprocess:1.37" : "2d06957b,refs=1", - "org.opentest4j:opentest4j:1.2.0" : "3c9a199e,refs=29", + "org.opentest4j:opentest4j:1.2.0" : "4aa0cebf,refs=30", "org.osgi:org.osgi.resource:1.0.0" : "5fc760f2,refs=1", "org.osgi:org.osgi.service.serviceloader:1.0.0" : "5fc760f2,refs=1", "org.osgi:osgi.annotation:8.1.0" : "5fc760f2,refs=1", - "org.ow2.asm:asm:9.3" : "ddc123c8,refs=80", - "org.ow2.asm:asm-analysis:7.2" : "ebd3db47,refs=77", - "org.ow2.asm:asm-commons:7.2" : "ebd3db47,refs=77", - "org.ow2.asm:asm-tree:7.2" : "ebd3db47,refs=77", - "org.pcollections:pcollections:4.0.1" : "bddbe009,refs=29", + "org.ow2.asm:asm:9.3" : "e0b9f913,refs=84", + "org.ow2.asm:asm-analysis:7.2" : "af96d912,refs=81", + "org.ow2.asm:asm-commons:7.2" : "af96d912,refs=81", + "org.ow2.asm:asm-tree:7.2" : "af96d912,refs=81", + "org.pcollections:pcollections:4.0.1" : "24882268,refs=30", "org.quicktheories:quicktheories:0.26" : "52ada00b,refs=4", "org.reactivestreams:reactive-streams:1.0.4" : "87cc13ff,refs=5", "org.rocksdb:rocksdbjni:7.9.2" : "934e1fc5,refs=4", @@ -447,10 +458,10 @@ "org.scala-lang.modules:scala-java8-compat_2.13:1.0.2" : "4bf37e93,refs=3", "org.scala-lang:scala-library:2.13.15" : "4bf37e93,refs=3", "org.scala-lang:scala-reflect:2.13.12" : "4bf37e93,refs=3", - "org.semver4j:semver4j:5.3.0" : "b57e9bf6,refs=85", - "org.slf4j:jcl-over-slf4j:2.0.13" : "a6fb6a35,refs=86", - "org.slf4j:jul-to-slf4j:2.0.13" : "58171492,refs=26", - "org.slf4j:slf4j-api:2.0.13" : "5fb053e8,refs=132", + "org.semver4j:semver4j:5.3.0" : "2f83aa41,refs=89", + "org.slf4j:jcl-over-slf4j:2.0.13" : "5d614100,refs=90", + "org.slf4j:jul-to-slf4j:2.0.13" : "cf56dae9,refs=27", + "org.slf4j:slf4j-api:2.0.13" : "b81650f5,refs=138", "org.springframework.boot:spring-boot:2.7.13" : "1e12e466,refs=2", "org.springframework.boot:spring-boot-actuator:2.7.13" : "1e12e466,refs=2", "org.springframework.boot:spring-boot-actuator-autoconfigure:2.7.13" : "1e12e466,refs=2", @@ -475,7 +486,7 @@ "org.tallison:metadata-extractor:2.17.1.0" : "50a667d1,refs=5", "org.threeten:threetenbp:1.6.9" : "784a94ea,refs=5", "org.tukaani:xz:1.9" : "50a667d1,refs=5", - "org.xerial.snappy:snappy-java:1.1.10.5" : "99b82a6c,refs=82", + "org.xerial.snappy:snappy-java:1.1.10.5" : "26c50db7,refs=86", "org.yaml:snakeyaml:1.30" : "1e12e466,refs=2", "software.amazon.awssdk:annotations:2.26.19" : "87cc13ff,refs=5", "software.amazon.awssdk:apache-client:2.26.19" : "87cc13ff,refs=5", @@ -554,38 +565,18 @@ "projectPath" : ":solr:modules:s3-repository" } ], - "06ca9183" : [ - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:api" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:api" - }, + "0769b123" : [ { "configuration" : "compileClasspath", - "projectPath" : ":solr:benchmark" + "projectPath" : ":solr:cross-dc-manager" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:benchmark" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:benchmark" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:benchmark" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:core" + "projectPath" : ":solr:cross-dc-manager" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:core" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:cross-dc-manager" }, { "configuration" : "testCompileClasspath", @@ -594,199 +585,123 @@ { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" - }, + } + ], + "088a25a2" : [ { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:prometheus-exporter" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:benchmark" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:prometheus-exporter" + "projectPath" : ":solr:benchmark" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solr-ref-guide" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:cross-dc-manager" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solr-ref-guide" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:cross-dc-manager" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:cross-dc-manager" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj" + "projectPath" : ":solr:cross-dc-manager" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj-streaming" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:prometheus-exporter" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj-streaming" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:prometheus-exporter" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj-zookeeper" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:prometheus-exporter" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj-zookeeper" + "projectPath" : ":solr:prometheus-exporter" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:test-framework" + "configuration" : "libExt", + "projectPath" : ":solr:server" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:test-framework" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:test-framework" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:test-framework" + "projectPath" : ":solr:server" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:analysis-extras" + "configuration" : "serverLib", + "projectPath" : ":solr:webapp" }, { - "configuration" : "testRuntimeClasspath", + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:analysis-extras" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:clustering" - }, - { - "configuration" : "testRuntimeClasspath", + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:clustering" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:cross-dc" - }, - { - "configuration" : "testRuntimeClasspath", + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:cross-dc" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:extraction" - }, - { - "configuration" : "testRuntimeClasspath", + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:extraction" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, - { - "configuration" : "testRuntimeClasspath", + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:gcs-repository" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hadoop-auth" - }, - { - "configuration" : "testRuntimeClasspath", + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hadoop-auth" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hdfs" - }, - { - "configuration" : "testRuntimeClasspath", + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hdfs" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:jwt-auth" - }, - { - "configuration" : "testRuntimeClasspath", + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:jwt-auth" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:langid" - }, - { - "configuration" : "testRuntimeClasspath", + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:langid" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:ltr" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" }, { - "configuration" : "testRuntimeClasspath", + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:ltr" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:opentelemetry" - }, - { - "configuration" : "testRuntimeClasspath", + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:opentelemetry" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, - { - "configuration" : "testRuntimeClasspath", + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:s3-repository" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:scripting" - }, - { - "configuration" : "testRuntimeClasspath", + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:scripting" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:sql" - }, - { - "configuration" : "testRuntimeClasspath", + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:sql" } ], - "0769b123" : [ - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:cross-dc-manager" - } - ], - "08ef8dc6" : [ + "0b89ed64" : [ { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:api" @@ -799,6 +714,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:benchmark" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:core" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:core" @@ -807,6 +726,10 @@ "configuration" : "runtimeLibs", "projectPath" : ":solr:core" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:core" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:core" @@ -827,14 +750,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:prometheus-exporter" - }, { "configuration" : "solrPlatformLibs", "projectPath" : ":solr:prometheus-exporter" @@ -843,10 +758,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:prometheus-exporter" }, - { - "configuration" : "libExt", - "projectPath" : ":solr:server" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:server" @@ -879,10 +790,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:test-framework" }, - { - "configuration" : "serverLib", - "projectPath" : ":solr:webapp" - }, { "configuration" : "solrCore", "projectPath" : ":solr:webapp" @@ -935,6 +842,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:cross-dc" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:extraction" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:extraction" @@ -947,6 +858,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:extraction" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:extraction" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:extraction" @@ -1031,6 +946,22 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:ltr" @@ -1112,118 +1043,70 @@ "projectPath" : ":solr:modules:sql" } ], - "0a82b27c" : [ + "0d28f997" : [ + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:opentelemetry" + }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:opentelemetry" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:opentelemetry" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:cross-dc-manager" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:opentelemetry" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:extraction" - }, + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:opentelemetry" + } + ], + "1643ad05" : [ { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:extraction" + "projectPath" : ":solr:modules:hadoop-auth" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:extraction" + "projectPath" : ":solr:modules:hadoop-auth" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:extraction" + "projectPath" : ":solr:modules:hadoop-auth" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:extraction" - }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:gcs-repository" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:opentelemetry" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:modules:hadoop-auth" } ], - "0d28f997" : [ + "17ba760c" : [ { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:opentelemetry" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:api" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:opentelemetry" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:opentelemetry" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" - } - ], - "0e779887" : [ - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:api" + "projectPath" : ":solr:benchmark" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:api" + "projectPath" : ":solr:benchmark" }, { "configuration" : "compileClasspath", - "projectPath" : ":solr:benchmark" + "projectPath" : ":solr:core" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:benchmark" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:benchmark" + "projectPath" : ":solr:core" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:benchmark" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:core" }, { "configuration" : "testCompileClasspath", @@ -1233,10 +1116,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:core" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:cross-dc-manager" @@ -1249,16 +1128,12 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:cross-dc-manager" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" }, { - "configuration" : "testCompileClasspath", + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:prometheus-exporter" }, { @@ -1270,13 +1145,9 @@ "projectPath" : ":solr:server" }, { - "configuration" : "serverLib", + "configuration" : "solrCore", "projectPath" : ":solr:server" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solr-ref-guide" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solr-ref-guide" @@ -1289,44 +1160,36 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj-streaming" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-streaming" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj-zookeeper" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-zookeeper" }, { - "configuration" : "compileClasspath", + "configuration" : "runtimeClasspath", "projectPath" : ":solr:test-framework" }, { - "configuration" : "runtimeClasspath", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:test-framework" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:test-framework" + "configuration" : "solrCore", + "projectPath" : ":solr:webapp" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:test-framework" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:analysis-extras" }, { - "configuration" : "serverLib", - "projectPath" : ":solr:webapp" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:analysis-extras" }, { - "configuration" : "testCompileClasspath", + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:analysis-extras" }, { @@ -1334,7 +1197,15 @@ "projectPath" : ":solr:modules:analysis-extras" }, { - "configuration" : "testCompileClasspath", + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:clustering" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:clustering" + }, + { + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:clustering" }, { @@ -1342,7 +1213,15 @@ "projectPath" : ":solr:modules:clustering" }, { - "configuration" : "testCompileClasspath", + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:cross-dc" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:cross-dc" + }, + { + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:cross-dc" }, { @@ -1350,7 +1229,15 @@ "projectPath" : ":solr:modules:cross-dc" }, { - "configuration" : "testCompileClasspath", + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:extraction" }, { @@ -1358,218 +1245,286 @@ "projectPath" : ":solr:modules:extraction" }, { - "configuration" : "testCompileClasspath", + "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:gcs-repository" }, { - "configuration" : "testRuntimeClasspath", + "configuration" : "runtimeLibs", "projectPath" : ":solr:modules:gcs-repository" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hadoop-auth" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:gcs-repository" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" + "projectPath" : ":solr:modules:gcs-repository" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hdfs" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:hadoop-auth" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hdfs" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:hadoop-auth" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:jwt-auth" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:hadoop-auth" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:jwt-auth" + "projectPath" : ":solr:modules:hadoop-auth" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:langid" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:hdfs" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:langid" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:hdfs" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:ltr" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:hdfs" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:ltr" + "projectPath" : ":solr:modules:hdfs" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:opentelemetry" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:jwt-auth" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:jwt-auth" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:s3-repository" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:jwt-auth" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:s3-repository" + "projectPath" : ":solr:modules:jwt-auth" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:scripting" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:langid" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:scripting" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:langid" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:sql" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:langid" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:sql" - } - ], - "100652ac" : [ - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:api" + "projectPath" : ":solr:modules:langid" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:api" + "projectPath" : ":solr:modules:llm" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:api" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:api" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:benchmark" + "projectPath" : ":solr:modules:ltr" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:benchmark" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:ltr" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:core" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:ltr" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:ltr" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:core" + "projectPath" : ":solr:modules:opentelemetry" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:core" + "projectPath" : ":solr:modules:opentelemetry" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:core" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:opentelemetry" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:core" - }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:opentelemetry" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:s3-repository" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:s3-repository" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:s3-repository" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:s3-repository" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:s3-repository" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:prometheus-exporter" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:scripting" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:scripting" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:scripting" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:scripting" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:prometheus-exporter" + "projectPath" : ":solr:modules:sql" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:prometheus-exporter" + "projectPath" : ":solr:modules:sql" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:prometheus-exporter" + "projectPath" : ":solr:modules:sql" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:sql" + } + ], + "17cdd1e0" : [ { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:prometheus-exporter" + "projectPath" : ":solr:api" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:benchmark" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:benchmark" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:server" + "projectPath" : ":solr:benchmark" }, { - "configuration" : "solrCore", - "projectPath" : ":solr:server" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:benchmark" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solr-ref-guide" + "projectPath" : ":solr:benchmark" }, { "configuration" : "compileClasspath", - "projectPath" : ":solr:solrj" + "projectPath" : ":solr:core" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:solrj" + "projectPath" : ":solr:core" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:core" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj" + "projectPath" : ":solr:core" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj" + "projectPath" : ":solr:core" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:solrj-streaming" + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:prometheus-exporter" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:server" + }, + { + "configuration" : "solrCore", + "projectPath" : ":solr:server" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solr-ref-guide" }, { "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solrj" + }, + { + "configuration" : "compileClasspath", "projectPath" : ":solr:solrj-streaming" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:solrj-zookeeper" + "projectPath" : ":solr:solrj-streaming" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj-streaming" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solrj-streaming" }, { "configuration" : "testRuntimeClasspath", @@ -1659,10 +1614,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:extraction" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:gcs-repository" @@ -1675,18 +1626,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:gcs-repository" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:gcs-repository" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:hadoop-auth" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" @@ -1699,10 +1642,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hadoop-auth" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hadoop-auth" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" @@ -1723,10 +1662,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hdfs" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:jwt-auth" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:jwt-auth" @@ -1739,10 +1674,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:jwt-auth" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:jwt-auth" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:jwt-auth" @@ -1763,6 +1694,22 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:ltr" @@ -1807,10 +1754,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:s3-repository" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:s3-repository" @@ -1831,10 +1774,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:scripting" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:sql" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:sql" @@ -1847,40 +1786,88 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:sql" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:sql" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:sql" } ], - "1069c1cc" : [ + "1990628d" : [ + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:api" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:api" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:benchmark" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:benchmark" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:benchmark" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:benchmark" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:core" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:core" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:core" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:core" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:core" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:cross-dc-manager" + }, { "configuration" : "solrPlatformLibs", "projectPath" : ":solr:cross-dc-manager" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:prometheus-exporter" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:prometheus-exporter" @@ -1893,26 +1880,54 @@ "configuration" : "serverLib", "projectPath" : ":solr:server" }, + { + "configuration" : "solrCore", + "projectPath" : ":solr:server" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solr-ref-guide" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solr-ref-guide" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj-streaming" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-streaming" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj-zookeeper" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-zookeeper" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:test-framework" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:test-framework" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:test-framework" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:test-framework" @@ -1922,302 +1937,314 @@ "projectPath" : ":solr:webapp" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:analysis-extras" + "configuration" : "solrCore", + "projectPath" : ":solr:webapp" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:clustering" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:analysis-extras" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:cross-dc" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:analysis-extras" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:extraction" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:analysis-extras" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:analysis-extras" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" + "projectPath" : ":solr:modules:analysis-extras" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hdfs" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:clustering" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:jwt-auth" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:clustering" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:langid" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:clustering" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:ltr" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:clustering" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:modules:clustering" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:s3-repository" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:cross-dc" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:scripting" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:cross-dc" }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:sql" - } - ], - "1640bbba" : [ { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:cross-dc" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:prometheus-exporter" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:cross-dc" }, { - "configuration" : "libExt", - "projectPath" : ":solr:server" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:cross-dc" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:server" - }, - { - "configuration" : "serverLib", - "projectPath" : ":solr:webapp" + "projectPath" : ":solr:modules:extraction" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:analysis-extras" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:extraction" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:clustering" + "projectPath" : ":solr:modules:extraction" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:cross-dc" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:extraction" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:extraction" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:gcs-repository" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:hadoop-auth" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:gcs-repository" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:hdfs" + "projectPath" : ":solr:modules:gcs-repository" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hdfs" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:gcs-repository" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:jwt-auth" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:gcs-repository" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:langid" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:hadoop-auth" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:ltr" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:hadoop-auth" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:modules:hadoop-auth" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:s3-repository" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:hadoop-auth" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:scripting" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:hadoop-auth" }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:sql" - } - ], - "1643ad05" : [ { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" + "projectPath" : ":solr:modules:hdfs" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:hadoop-auth" + "projectPath" : ":solr:modules:hdfs" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hadoop-auth" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:hdfs" }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" - } - ], - "17e13daa" : [ { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:api" + "projectPath" : ":solr:modules:hdfs" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:api" + "projectPath" : ":solr:modules:hdfs" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:benchmark" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:jwt-auth" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:benchmark" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:jwt-auth" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:benchmark" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:jwt-auth" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:benchmark" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:jwt-auth" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:core" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:jwt-auth" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:core" + "projectPath" : ":solr:modules:langid" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:core" + "projectPath" : ":solr:modules:langid" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:core" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:langid" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:core" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:langid" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:cross-dc-manager" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:langid" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:ltr" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:ltr" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:prometheus-exporter" + "projectPath" : ":solr:modules:ltr" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:prometheus-exporter" + "projectPath" : ":solr:modules:ltr" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:prometheus-exporter" + "projectPath" : ":solr:modules:ltr" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:server" + "projectPath" : ":solr:modules:opentelemetry" }, { - "configuration" : "solrCore", - "projectPath" : ":solr:server" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:opentelemetry" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:opentelemetry" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solr-ref-guide" + "projectPath" : ":solr:modules:opentelemetry" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solr-ref-guide" + "projectPath" : ":solr:modules:opentelemetry" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:s3-repository" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:s3-repository" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:s3-repository" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj-streaming" + "projectPath" : ":solr:modules:s3-repository" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj-streaming" + "projectPath" : ":solr:modules:s3-repository" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:scripting" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:scripting" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:scripting" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj-zookeeper" + "projectPath" : ":solr:modules:scripting" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj-zookeeper" + "projectPath" : ":solr:modules:scripting" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:test-framework" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:sql" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:test-framework" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:sql" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:sql" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:test-framework" + "projectPath" : ":solr:modules:sql" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:test-framework" - }, + "projectPath" : ":solr:modules:sql" + } + ], + "1b1446cf" : [ { - "configuration" : "solrCore", - "projectPath" : ":solr:webapp" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:core" }, { "configuration" : "compileClasspath", @@ -2231,10 +2258,6 @@ "configuration" : "runtimeLibs", "projectPath" : ":solr:modules:analysis-extras" }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:analysis-extras" - }, { "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:analysis-extras" @@ -2245,893 +2268,731 @@ }, { "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:clustering" + "projectPath" : ":solr:modules:extraction" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:clustering" + "projectPath" : ":solr:modules:extraction" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:clustering" + "projectPath" : ":solr:modules:extraction" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:clustering" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:extraction" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:clustering" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:extraction" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:clustering" + "projectPath" : ":solr:modules:hadoop-auth" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:hdfs" }, { "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:cross-dc" + "projectPath" : ":solr:modules:langid" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:cross-dc" + "projectPath" : ":solr:modules:langid" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:cross-dc" - }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:cross-dc" + "projectPath" : ":solr:modules:langid" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:cross-dc" + "projectPath" : ":solr:modules:langid" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:cross-dc" + "projectPath" : ":solr:modules:langid" }, { "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:extraction" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:extraction" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:extraction" - }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:extraction" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:extraction" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:extraction" + "projectPath" : ":solr:modules:llm" }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:sql" + } + ], + "1d598fff" : [ { "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:gcs-repository" + "projectPath" : ":solr:core" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" + "configuration" : "compileClasspath", + "projectPath" : ":solr:solrj" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:gcs-repository" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:jwt-auth" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:gcs-repository" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:jwt-auth" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:llm" + } + ], + "1e12e466" : [ { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:gcs-repository" + "projectPath" : ":solr:modules:s3-repository" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, + "projectPath" : ":solr:modules:s3-repository" + } + ], + "1f3ee334" : [ { "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:hadoop-auth" + "projectPath" : ":solr:api" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" + "projectPath" : ":solr:api" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:hadoop-auth" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:api" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:hadoop-auth" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:api" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hadoop-auth" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:benchmark" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" + "projectPath" : ":solr:benchmark" }, { "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:hdfs" + "projectPath" : ":solr:core" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:hdfs" + "projectPath" : ":solr:core" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:hdfs" - }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:hdfs" + "projectPath" : ":solr:core" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hdfs" + "projectPath" : ":solr:core" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hdfs" + "projectPath" : ":solr:core" }, { "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:jwt-auth" + "projectPath" : ":solr:cross-dc-manager" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:jwt-auth" + "projectPath" : ":solr:cross-dc-manager" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:jwt-auth" + "projectPath" : ":solr:cross-dc-manager" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:jwt-auth" + "projectPath" : ":solr:cross-dc-manager" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:jwt-auth" + "projectPath" : ":solr:cross-dc-manager" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:jwt-auth" + "projectPath" : ":solr:cross-dc-manager" }, { "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:langid" + "projectPath" : ":solr:prometheus-exporter" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:langid" + "projectPath" : ":solr:prometheus-exporter" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:langid" + "projectPath" : ":solr:prometheus-exporter" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:langid" + "projectPath" : ":solr:prometheus-exporter" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:langid" + "projectPath" : ":solr:prometheus-exporter" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:langid" + "projectPath" : ":solr:prometheus-exporter" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:ltr" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:server" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:ltr" + "configuration" : "solrCore", + "projectPath" : ":solr:server" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:ltr" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solr-ref-guide" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:ltr" + "configuration" : "compileClasspath", + "projectPath" : ":solr:solrj" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:solrj" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:ltr" + "projectPath" : ":solr:solrj" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:ltr" + "projectPath" : ":solr:solrj" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:opentelemetry" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:solrj-streaming" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solrj-streaming" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:opentelemetry" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:solrj-zookeeper" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:opentelemetry" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solrj-zookeeper" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:opentelemetry" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:test-framework" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:test-framework" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:s3-repository" + "configuration" : "solrCore", + "projectPath" : ":solr:webapp" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:s3-repository" + "projectPath" : ":solr:modules:analysis-extras" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:s3-repository" + "projectPath" : ":solr:modules:analysis-extras" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:s3-repository" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:s3-repository" + "projectPath" : ":solr:modules:analysis-extras" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:scripting" + "projectPath" : ":solr:modules:analysis-extras" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:scripting" + "projectPath" : ":solr:modules:clustering" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:scripting" + "projectPath" : ":solr:modules:clustering" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:scripting" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:scripting" + "projectPath" : ":solr:modules:clustering" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:scripting" - }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:sql" + "projectPath" : ":solr:modules:clustering" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:sql" + "projectPath" : ":solr:modules:cross-dc" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:sql" + "projectPath" : ":solr:modules:cross-dc" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:sql" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:sql" + "projectPath" : ":solr:modules:cross-dc" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:sql" - } - ], - "1b72eeae" : [ + "projectPath" : ":solr:modules:cross-dc" + }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:api" + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:extraction" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:api" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:extraction" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:benchmark" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:extraction" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:benchmark" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:extraction" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:benchmark" + "projectPath" : ":solr:modules:extraction" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:benchmark" - }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:core" + "projectPath" : ":solr:modules:extraction" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:core" + "projectPath" : ":solr:modules:gcs-repository" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:core" + "projectPath" : ":solr:modules:gcs-repository" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:core" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:gcs-repository" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:core" - }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:gcs-repository" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:hadoop-auth" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:hadoop-auth" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:hadoop-auth" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:cross-dc-manager" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:hadoop-auth" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:cross-dc-manager" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:hdfs" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:prometheus-exporter" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:hdfs" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:hdfs" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:hdfs" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:prometheus-exporter" + "projectPath" : ":solr:modules:jwt-auth" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:prometheus-exporter" + "projectPath" : ":solr:modules:jwt-auth" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:prometheus-exporter" + "projectPath" : ":solr:modules:jwt-auth" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:prometheus-exporter" + "projectPath" : ":solr:modules:jwt-auth" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:prometheus-exporter" + "projectPath" : ":solr:modules:jwt-auth" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:server" + "projectPath" : ":solr:modules:langid" }, { - "configuration" : "solrCore", - "projectPath" : ":solr:server" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:langid" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solr-ref-guide" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:langid" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solr-ref-guide" + "projectPath" : ":solr:modules:langid" }, { "configuration" : "compileClasspath", - "projectPath" : ":solr:solrj" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:solrj" + "projectPath" : ":solr:modules:llm" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:solrj-streaming" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:solrj-streaming" + "projectPath" : ":solr:modules:ltr" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj-streaming" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:ltr" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj-streaming" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:ltr" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:solrj-zookeeper" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:ltr" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:solrj-zookeeper" + "projectPath" : ":solr:modules:opentelemetry" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj-zookeeper" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:opentelemetry" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj-zookeeper" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:opentelemetry" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:test-framework" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:opentelemetry" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:test-framework" + "projectPath" : ":solr:modules:s3-repository" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:test-framework" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:s3-repository" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:test-framework" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:s3-repository" }, { - "configuration" : "solrCore", - "projectPath" : ":solr:webapp" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:s3-repository" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:analysis-extras" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:s3-repository" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:analysis-extras" + "projectPath" : ":solr:modules:scripting" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:analysis-extras" + "projectPath" : ":solr:modules:scripting" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:analysis-extras" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:analysis-extras" + "projectPath" : ":solr:modules:scripting" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:analysis-extras" + "projectPath" : ":solr:modules:scripting" }, { "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:clustering" + "projectPath" : ":solr:modules:sql" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:clustering" + "projectPath" : ":solr:modules:sql" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:clustering" + "projectPath" : ":solr:modules:sql" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:clustering" + "projectPath" : ":solr:modules:sql" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:clustering" + "projectPath" : ":solr:modules:sql" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:clustering" - }, + "projectPath" : ":solr:modules:sql" + } + ], + "20f1e0e0" : [ { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:cross-dc" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solrj-streaming" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:cross-dc" + "projectPath" : ":solr:modules:sql" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:cross-dc" + "projectPath" : ":solr:modules:sql" }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:sql" + } + ], + "21b5a07a" : [ { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:cross-dc" + "projectPath" : ":solr:cross-dc-manager" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:cross-dc" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:prometheus-exporter" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:cross-dc" + "configuration" : "libExt", + "projectPath" : ":solr:server" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:extraction" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:server" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:extraction" + "configuration" : "serverLib", + "projectPath" : ":solr:webapp" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:extraction" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:analysis-extras" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:extraction" + "projectPath" : ":solr:modules:clustering" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:extraction" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:cross-dc" }, { - "configuration" : "testRuntimeClasspath", + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:extraction" }, { - "configuration" : "compileClasspath", + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:gcs-repository" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:hadoop-auth" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:gcs-repository" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:hdfs" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:gcs-repository" + "projectPath" : ":solr:modules:jwt-auth" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:gcs-repository" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:langid" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:hadoop-auth" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:ltr" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:opentelemetry" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:hadoop-auth" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:s3-repository" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:hadoop-auth" + "projectPath" : ":solr:modules:scripting" }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:sql" + } + ], + "2234a62c" : [ { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hadoop-auth" + "projectPath" : ":solr:api" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" + "projectPath" : ":solr:api" }, { "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:hdfs" + "projectPath" : ":solr:benchmark" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:hdfs" + "projectPath" : ":solr:benchmark" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:hdfs" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:benchmark" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:hdfs" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:benchmark" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hdfs" + "projectPath" : ":solr:core" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hdfs" + "projectPath" : ":solr:core" }, { "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:jwt-auth" + "projectPath" : ":solr:cross-dc-manager" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:jwt-auth" + "projectPath" : ":solr:cross-dc-manager" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:jwt-auth" + "projectPath" : ":solr:cross-dc-manager" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:jwt-auth" + "projectPath" : ":solr:cross-dc-manager" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:jwt-auth" + "projectPath" : ":solr:cross-dc-manager" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:jwt-auth" + "projectPath" : ":solr:cross-dc-manager" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:langid" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:langid" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:langid" - }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:langid" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:langid" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:langid" - }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:ltr" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:ltr" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:ltr" - }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:ltr" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:ltr" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:prometheus-exporter" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:ltr" - }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:prometheus-exporter" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:server" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:opentelemetry" + "configuration" : "serverLib", + "projectPath" : ":solr:server" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:solr-ref-guide" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" - }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:s3-repository" - }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:s3-repository" + "projectPath" : ":solr:solr-ref-guide" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:s3-repository" + "projectPath" : ":solr:solrj" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:scripting" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:scripting" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:scripting" - }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:scripting" + "projectPath" : ":solr:solrj" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:scripting" + "projectPath" : ":solr:solrj-streaming" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:scripting" - }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:sql" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:sql" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:sql" - }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:sql" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:sql" + "projectPath" : ":solr:solrj-streaming" }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:sql" - } - ], - "1e12e466" : [ { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:s3-repository" - } - ], - "1f5bde05" : [ - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:api" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:benchmark" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:benchmark" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:core" - }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:prometheus-exporter" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, - { - "configuration" : "libExt", - "projectPath" : ":solr:server" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:server" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solr-ref-guide" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj-streaming" + "projectPath" : ":solr:solrj-zookeeper" }, { "configuration" : "testRuntimeClasspath", @@ -3158,7 +3019,7 @@ "projectPath" : ":solr:webapp" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:analysis-extras" }, { @@ -3166,7 +3027,7 @@ "projectPath" : ":solr:modules:analysis-extras" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:clustering" }, { @@ -3174,7 +3035,7 @@ "projectPath" : ":solr:modules:clustering" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:cross-dc" }, { @@ -3182,7 +3043,7 @@ "projectPath" : ":solr:modules:cross-dc" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:extraction" }, { @@ -3190,7 +3051,7 @@ "projectPath" : ":solr:modules:extraction" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:gcs-repository" }, { @@ -3198,7 +3059,7 @@ "projectPath" : ":solr:modules:gcs-repository" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:hadoop-auth" }, { @@ -3206,7 +3067,7 @@ "projectPath" : ":solr:modules:hadoop-auth" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:hdfs" }, { @@ -3214,7 +3075,7 @@ "projectPath" : ":solr:modules:hdfs" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:jwt-auth" }, { @@ -3222,7 +3083,7 @@ "projectPath" : ":solr:modules:jwt-auth" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:langid" }, { @@ -3230,7 +3091,15 @@ "projectPath" : ":solr:modules:langid" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:ltr" }, { @@ -3238,7 +3107,7 @@ "projectPath" : ":solr:modules:ltr" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:opentelemetry" }, { @@ -3246,7 +3115,7 @@ "projectPath" : ":solr:modules:opentelemetry" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:s3-repository" }, { @@ -3254,7 +3123,7 @@ "projectPath" : ":solr:modules:s3-repository" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:scripting" }, { @@ -3262,7 +3131,7 @@ "projectPath" : ":solr:modules:scripting" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:sql" }, { @@ -3270,27 +3139,45 @@ "projectPath" : ":solr:modules:sql" } ], - "20f1e0e0" : [ + "23e8a2eb" : [ + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj-streaming" + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:cross-dc" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:cross-dc" + } + ], + "24396a00" : [ + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:cross-dc-manager" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:sql" + "projectPath" : ":solr:server" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:sql" + "configuration" : "serverLib", + "projectPath" : ":solr:server" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:sql" + "configuration" : "serverLib", + "projectPath" : ":solr:webapp" } ], - "21136b15" : [ + "24882268" : [ { - "configuration" : "testRuntimeClasspath", + "configuration" : "annotationProcessor", "projectPath" : ":solr:api" }, { @@ -3298,24 +3185,144 @@ "projectPath" : ":solr:benchmark" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:benchmark" - }, + "configuration" : "annotationProcessor", + "projectPath" : ":solr:core" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:cross-dc-manager" + }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:benchmark" + "projectPath" : ":solr:cross-dc-manager" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:benchmark" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:prometheus-exporter" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:server" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:solr-ref-guide" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:solrj" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:solrj-streaming" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:solrj-zookeeper" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:test-framework" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:webapp" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:analysis-extras" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:clustering" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:cross-dc" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:hadoop-auth" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:hdfs" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:jwt-auth" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:langid" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:ltr" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:opentelemetry" }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:s3-repository" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:scripting" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:sql" + } + ], + "26b9da63" : [ + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:hdfs" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:hdfs" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:hdfs" + } + ], + "26c50db7" : [ { "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:api" + }, + { + "configuration" : "runtimeClasspath", "projectPath" : ":solr:benchmark" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:core" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:benchmark" }, { "configuration" : "runtimeClasspath", @@ -3373,18 +3380,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:solrj-streaming" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:solrj-streaming" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj-streaming" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-streaming" @@ -3393,10 +3388,18 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-zookeeper" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:test-framework" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:test-framework" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:test-framework" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:test-framework" @@ -3453,10 +3456,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:cross-dc" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:extraction" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:extraction" @@ -3469,10 +3468,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:extraction" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:extraction" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:extraction" @@ -3509,6 +3504,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:hdfs" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hdfs" @@ -3521,6 +3520,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hdfs" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:hdfs" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hdfs" @@ -3557,6 +3560,22 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:ltr" @@ -3638,57 +3657,21 @@ "projectPath" : ":solr:modules:sql" } ], - "23e8a2eb" : [ - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:cross-dc" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:cross-dc" - } - ], - "24396a00" : [ - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:server" - }, - { - "configuration" : "serverLib", - "projectPath" : ":solr:server" - }, - { - "configuration" : "serverLib", - "projectPath" : ":solr:webapp" - } - ], - "26b9da63" : [ + "280cfec8" : [ { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:hdfs" + "projectPath" : ":solr:modules:hadoop-auth" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:hdfs" + "projectPath" : ":solr:modules:hadoop-auth" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hdfs" + "projectPath" : ":solr:modules:hadoop-auth" } ], - "27f62655" : [ + "2bc8eb7f" : [ { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:api" @@ -3721,6 +3704,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:core" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:cross-dc-manager" @@ -3733,21 +3720,37 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:cross-dc-manager" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:prometheus-exporter" + }, { "configuration" : "solrPlatformLibs", "projectPath" : ":solr:prometheus-exporter" }, { - "configuration" : "testRuntimeClasspath", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:prometheus-exporter" }, { - "configuration" : "libExt", - "projectPath" : ":solr:server" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:prometheus-exporter" }, { "configuration" : "runtimeClasspath", @@ -3762,28 +3765,44 @@ "projectPath" : ":solr:solr-ref-guide" }, { - "configuration" : "testRuntimeClasspath", + "configuration" : "compileClasspath", "projectPath" : ":solr:solrj" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj-streaming" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:solrj" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj-zookeeper" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solrj" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:test-framework" + "projectPath" : ":solr:solrj-streaming" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solrj-streaming" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:solrj-zookeeper" }, { "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solrj-zookeeper" + }, + { + "configuration" : "runtimeClasspath", "projectPath" : ":solr:test-framework" }, { - "configuration" : "serverLib", - "projectPath" : ":solr:webapp" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:test-framework" }, { "configuration" : "solrCore", @@ -3837,6 +3856,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:cross-dc" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:extraction" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:extraction" @@ -3849,10 +3872,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:extraction" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:extraction" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:extraction" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:gcs-repository" @@ -3865,10 +3896,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:gcs-repository" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:gcs-repository" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:hadoop-auth" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" @@ -3881,6 +3920,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hadoop-auth" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:hadoop-auth" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" @@ -3913,6 +3956,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:jwt-auth" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:jwt-auth" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:jwt-auth" @@ -3933,6 +3980,30 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:ltr" @@ -3977,6 +4048,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:s3-repository" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:s3-repository" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:s3-repository" @@ -3998,169 +4073,31 @@ "projectPath" : ":solr:modules:scripting" }, { - "configuration" : "runtimeClasspath", + "configuration" : "compileClasspath", "projectPath" : ":solr:modules:sql" }, { - "configuration" : "runtimeLibs", + "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:sql" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "runtimeLibs", "projectPath" : ":solr:modules:sql" }, { - "configuration" : "testRuntimeClasspath", + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:sql" - } - ], - "280cfec8" : [ - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:hadoop-auth" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" - } - ], - "2d06957b" : [ - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:benchmark" - } - ], - "322f4a3c" : [ - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:api" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:benchmark" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:core" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:prometheus-exporter" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:server" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:solr-ref-guide" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:solrj" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:solrj-streaming" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:solrj-zookeeper" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:test-framework" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:webapp" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:analysis-extras" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:clustering" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:cross-dc" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:extraction" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:gcs-repository" - }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:gcs-repository" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:gcs-repository" + "projectPath" : ":solr:modules:sql" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:hadoop-auth" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:hdfs" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:jwt-auth" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:langid" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:ltr" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:opentelemetry" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:s3-repository" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:scripting" - }, - { - "configuration" : "annotationProcessor", "projectPath" : ":solr:modules:sql" } ], - "36393977" : [ + "2c60ed20" : [ { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:api" @@ -4217,6 +4154,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:prometheus-exporter" }, + { + "configuration" : "libExt", + "projectPath" : ":solr:server" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:server" @@ -4229,10 +4170,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solr-ref-guide" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj" @@ -4253,6 +4190,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:test-framework" }, + { + "configuration" : "serverLib", + "projectPath" : ":solr:webapp" + }, { "configuration" : "solrCore", "projectPath" : ":solr:webapp" @@ -4305,10 +4246,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:cross-dc" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:extraction" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:extraction" @@ -4321,10 +4258,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:extraction" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:extraction" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:extraction" @@ -4373,10 +4306,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hdfs" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hdfs" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hdfs" @@ -4415,31 +4344,47 @@ }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:ltr" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:ltr" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:ltr" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:ltr" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:modules:ltr" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:modules:ltr" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:modules:ltr" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:ltr" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:opentelemetry" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:opentelemetry" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:opentelemetry" }, { "configuration" : "testRuntimeClasspath", @@ -4494,153 +4439,31 @@ "projectPath" : ":solr:modules:sql" } ], - "3b210678" : [ - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, + "2d06957b" : [ { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:s3-repository" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:benchmark" } ], - "3c9a199e" : [ - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:api" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:benchmark" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:benchmark" - }, + "2ead6137" : [ { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:core" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:core" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solr-ref-guide" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj-streaming" + "projectPath" : ":solr:api" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj-zookeeper" + "projectPath" : ":solr:api" }, { "configuration" : "compileClasspath", - "projectPath" : ":solr:test-framework" + "projectPath" : ":solr:benchmark" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:test-framework" + "projectPath" : ":solr:benchmark" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:test-framework" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:test-framework" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:analysis-extras" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:clustering" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:cross-dc" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:extraction" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hdfs" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:jwt-auth" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:langid" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:ltr" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:scripting" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:sql" - } - ], - "3ff3bc39" : [ - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:api" - }, - { - "configuration" : "runtimeClasspath", "projectPath" : ":solr:benchmark" }, { @@ -4667,6 +4490,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:core" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:cross-dc-manager" @@ -4679,6 +4506,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:cross-dc-manager" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" @@ -4687,6 +4518,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:prometheus-exporter" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:prometheus-exporter" @@ -4699,26 +4534,50 @@ "configuration" : "solrCore", "projectPath" : ":solr:server" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solr-ref-guide" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solr-ref-guide" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj-streaming" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-streaming" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj-zookeeper" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-zookeeper" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:test-framework" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:test-framework" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:test-framework" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:test-framework" @@ -4727,6 +4586,10 @@ "configuration" : "solrCore", "projectPath" : ":solr:webapp" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:analysis-extras" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:analysis-extras" @@ -4739,6 +4602,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:analysis-extras" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:analysis-extras" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:analysis-extras" @@ -4767,6 +4634,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:clustering" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:cross-dc" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:cross-dc" @@ -4779,10 +4650,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:cross-dc" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:cross-dc" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:cross-dc" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:extraction" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:extraction" @@ -4795,10 +4674,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:extraction" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:extraction" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:extraction" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:gcs-repository" @@ -4811,10 +4698,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:gcs-repository" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:gcs-repository" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:hadoop-auth" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" @@ -4827,10 +4722,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hadoop-auth" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:hadoop-auth" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:hdfs" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hdfs" @@ -4843,10 +4746,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hdfs" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:hdfs" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hdfs" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:jwt-auth" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:jwt-auth" @@ -4859,10 +4770,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:jwt-auth" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:jwt-auth" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:jwt-auth" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:langid" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:langid" @@ -4875,26 +4794,66 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:langid" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:llm" + }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:ltr" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:ltr" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:ltr" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:ltr" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:ltr" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:ltr" + }, + { + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:ltr" }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:ltr" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:opentelemetry" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:opentelemetry" @@ -4907,10 +4866,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:opentelemetry" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:opentelemetry" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:opentelemetry" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:s3-repository" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:s3-repository" @@ -4923,10 +4890,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:s3-repository" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:s3-repository" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:s3-repository" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:scripting" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:scripting" @@ -4939,10 +4914,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:scripting" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:scripting" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:scripting" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:sql" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:sql" @@ -4955,12 +4938,16 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:sql" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:sql" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:sql" } ], - "420fd813" : [ + "2f83aa41" : [ { "configuration" : "compileClasspath", "projectPath" : ":solr:api" @@ -4977,26 +4964,14 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:api" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:benchmark" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:benchmark" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:benchmark" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:benchmark" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:core" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:core" @@ -5005,18 +4980,10 @@ "configuration" : "runtimeLibs", "projectPath" : ":solr:core" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:core" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:core" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:cross-dc-manager" @@ -5029,18 +4996,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:cross-dc-manager" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:prometheus-exporter" @@ -5053,10 +5012,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:prometheus-exporter" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:prometheus-exporter" @@ -5069,74 +5024,38 @@ "configuration" : "solrCore", "projectPath" : ":solr:server" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solr-ref-guide" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solr-ref-guide" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:solrj" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:solrj" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:solrj-streaming" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:solrj-streaming" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj-streaming" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-streaming" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:solrj-zookeeper" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:solrj-zookeeper" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj-zookeeper" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-zookeeper" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:test-framework" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:test-framework" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:test-framework" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:test-framework" @@ -5145,10 +5064,6 @@ "configuration" : "solrCore", "projectPath" : ":solr:webapp" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:analysis-extras" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:analysis-extras" @@ -5161,18 +5076,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:analysis-extras" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:analysis-extras" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:analysis-extras" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:clustering" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:clustering" @@ -5185,18 +5092,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:clustering" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:clustering" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:clustering" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:cross-dc" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:cross-dc" @@ -5209,18 +5108,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:cross-dc" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:cross-dc" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:cross-dc" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:extraction" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:extraction" @@ -5233,18 +5124,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:extraction" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:extraction" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:extraction" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:gcs-repository" @@ -5257,18 +5140,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:gcs-repository" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:gcs-repository" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:hadoop-auth" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" @@ -5281,18 +5156,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hadoop-auth" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hadoop-auth" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:hdfs" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hdfs" @@ -5305,18 +5172,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hdfs" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hdfs" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hdfs" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:jwt-auth" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:jwt-auth" @@ -5329,18 +5188,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:jwt-auth" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:jwt-auth" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:jwt-auth" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:langid" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:langid" @@ -5354,16 +5205,24 @@ "projectPath" : ":solr:modules:langid" }, { - "configuration" : "testCompileClasspath", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:langid" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:langid" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:ltr" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" }, { "configuration" : "runtimeClasspath", @@ -5377,18 +5236,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:ltr" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:ltr" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:ltr" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:opentelemetry" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:opentelemetry" @@ -5401,18 +5252,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:opentelemetry" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:opentelemetry" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:opentelemetry" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:s3-repository" @@ -5425,18 +5268,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:s3-repository" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:s3-repository" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:scripting" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:scripting" @@ -5449,18 +5284,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:scripting" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:scripting" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:scripting" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:sql" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:sql" @@ -5473,22 +5300,12 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:sql" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:sql" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:sql" } ], - "4985a322" : [ - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hdfs" - } - ], - "4bf37e93" : [ + "3230a61e" : [ { "configuration" : "runtimeClasspath", "projectPath" : ":solr:cross-dc-manager" @@ -5500,16 +5317,130 @@ { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" - } - ], - "4ce82561" : [ + }, { "configuration" : "compileClasspath", - "projectPath" : ":solr:api" + "projectPath" : ":solr:modules:extraction" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:api" + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:opentelemetry" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:opentelemetry" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:opentelemetry" + } + ], + "36d10478" : [ + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:jwt-auth" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:jwt-auth" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:opentelemetry" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:opentelemetry" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:opentelemetry" + } + ], + "37bc0471" : [ + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:api" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:api" }, { "configuration" : "testCompileClasspath", @@ -5547,10 +5478,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:core" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:cross-dc-manager" @@ -5563,18 +5490,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:cross-dc-manager" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:prometheus-exporter" @@ -5587,10 +5506,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:prometheus-exporter" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:prometheus-exporter" @@ -5607,18 +5522,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solr-ref-guide" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:solrj" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:solrj" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj" @@ -5699,10 +5606,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:cross-dc" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:extraction" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:extraction" @@ -5715,10 +5618,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:extraction" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:extraction" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:extraction" @@ -5783,10 +5682,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:jwt-auth" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:jwt-auth" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:jwt-auth" @@ -5807,6 +5702,22 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:ltr" @@ -5851,10 +5762,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:s3-repository" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:s3-repository" @@ -5875,10 +5782,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:scripting" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:sql" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:sql" @@ -5891,225 +5794,239 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:sql" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:sql" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:sql" } ], - "4f81d786" : [ + "3aa1fe95" : [ { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:jwt-auth" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:api" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:jwt-auth" - } - ], - "50a667d1" : [ + "configuration" : "annotationProcessor", + "projectPath" : ":solr:benchmark" + }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:extraction" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:core" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:extraction" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:cross-dc-manager" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:extraction" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:prometheus-exporter" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:extraction" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:server" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:extraction" - } - ], - "515616b6" : [ + "configuration" : "annotationProcessor", + "projectPath" : ":solr:solr-ref-guide" + }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:extraction" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:solrj" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:extraction" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:solrj-streaming" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:extraction" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:solrj-zookeeper" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:extraction" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:test-framework" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:extraction" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:webapp" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hdfs" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:analysis-extras" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hdfs" - } - ], - "52ada00b" : [ + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:clustering" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:cross-dc" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:gcs-repository" + }, { "configuration" : "compileClasspath", - "projectPath" : ":solr:benchmark" + "projectPath" : ":solr:modules:gcs-repository" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:benchmark" + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:gcs-repository" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:benchmark" + "projectPath" : ":solr:modules:gcs-repository" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:benchmark" - } - ], - "58171492" : [ + "projectPath" : ":solr:modules:gcs-repository" + }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:cross-dc-manager" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:hadoop-auth" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:prometheus-exporter" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:hdfs" }, { - "configuration" : "libExt", - "projectPath" : ":solr:server" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:jwt-auth" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:server" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:langid" }, { - "configuration" : "serverLib", - "projectPath" : ":solr:webapp" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:llm" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:analysis-extras" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:ltr" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:clustering" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:opentelemetry" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:cross-dc" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:s3-repository" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:extraction" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:scripting" }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:sql" + } + ], + "3b210678" : [ { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:extraction" + "projectPath" : ":solr:cross-dc-manager" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:extraction" + "projectPath" : ":solr:cross-dc-manager" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:extraction" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:cross-dc-manager" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:extraction" + "projectPath" : ":solr:modules:s3-repository" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:extraction" - }, + "projectPath" : ":solr:modules:s3-repository" + } + ], + "3cbf4a8a" : [ { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:gcs-repository" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:api" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:hadoop-auth" + "configuration" : "compileClasspath", + "projectPath" : ":solr:benchmark" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:hdfs" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:benchmark" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:jwt-auth" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:benchmark" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:langid" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:benchmark" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:ltr" + "configuration" : "compileClasspath", + "projectPath" : ":solr:core" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:opentelemetry" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:core" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:s3-repository" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:core" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:s3-repository" + "projectPath" : ":solr:core" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:s3-repository" + "projectPath" : ":solr:core" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:scripting" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:cross-dc-manager" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:sql" - } - ], - "5967e690" : [ + "projectPath" : ":solr:cross-dc-manager" + }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:api" + "projectPath" : ":solr:cross-dc-manager" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:benchmark" + "configuration" : "compileClasspath", + "projectPath" : ":solr:prometheus-exporter" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:benchmark" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:prometheus-exporter" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:core" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:prometheus-exporter" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:prometheus-exporter" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:cross-dc-manager" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:prometheus-exporter" }, { "configuration" : "testRuntimeClasspath", @@ -6120,21 +6037,49 @@ "projectPath" : ":solr:server" }, { - "configuration" : "serverLib", + "configuration" : "solrCore", "projectPath" : ":solr:server" }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solr-ref-guide" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:solrj" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:solrj" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:solrj-streaming" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:solrj-streaming" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj-streaming" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-streaming" }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:solrj-zookeeper" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-zookeeper" @@ -6156,310 +6101,212 @@ "projectPath" : ":solr:test-framework" }, { - "configuration" : "serverLib", + "configuration" : "solrCore", "projectPath" : ":solr:webapp" }, { - "configuration" : "testRuntimeClasspath", + "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:analysis-extras" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:clustering" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:analysis-extras" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:cross-dc" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:analysis-extras" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:extraction" + "projectPath" : ":solr:modules:analysis-extras" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:clustering" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:clustering" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hdfs" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:clustering" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:jwt-auth" + "projectPath" : ":solr:modules:clustering" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:langid" + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:cross-dc" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:ltr" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:cross-dc" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:cross-dc" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:s3-repository" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:cross-dc" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:scripting" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:cross-dc" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:sql" - } - ], - "5b11e899" : [ + "projectPath" : ":solr:modules:cross-dc" + }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:api" + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:extraction" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:benchmark" + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:extraction" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:benchmark" + "projectPath" : ":solr:modules:extraction" }, { "configuration" : "compileClasspath", - "projectPath" : ":solr:core" + "projectPath" : ":solr:modules:gcs-repository" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:core" + "projectPath" : ":solr:modules:gcs-repository" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:core" + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:gcs-repository" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:core" + "projectPath" : ":solr:modules:gcs-repository" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:core" + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:hadoop-auth" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:hadoop-auth" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:hadoop-auth" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:prometheus-exporter" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:server" - }, - { - "configuration" : "solrCore", - "projectPath" : ":solr:server" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solr-ref-guide" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj-streaming" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj-zookeeper" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:test-framework" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:test-framework" - }, - { - "configuration" : "solrCore", - "projectPath" : ":solr:webapp" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:analysis-extras" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:analysis-extras" + "projectPath" : ":solr:modules:hadoop-auth" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:analysis-extras" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:hadoop-auth" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:analysis-extras" + "projectPath" : ":solr:modules:hadoop-auth" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:clustering" + "projectPath" : ":solr:modules:hdfs" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:clustering" + "projectPath" : ":solr:modules:hdfs" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:clustering" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:clustering" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:cross-dc" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:cross-dc" + "projectPath" : ":solr:modules:hdfs" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:cross-dc" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:hdfs" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:cross-dc" + "projectPath" : ":solr:modules:hdfs" }, { "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:extraction" + "projectPath" : ":solr:modules:jwt-auth" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:extraction" + "projectPath" : ":solr:modules:jwt-auth" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:extraction" + "projectPath" : ":solr:modules:jwt-auth" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:extraction" + "projectPath" : ":solr:modules:jwt-auth" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:extraction" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:extraction" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:gcs-repository" - }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:gcs-repository" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:hadoop-auth" - }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:hadoop-auth" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:hdfs" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:hdfs" - }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:hdfs" + "projectPath" : ":solr:modules:jwt-auth" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hdfs" + "projectPath" : ":solr:modules:jwt-auth" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:jwt-auth" + "projectPath" : ":solr:modules:langid" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:jwt-auth" + "projectPath" : ":solr:modules:langid" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:jwt-auth" + "projectPath" : ":solr:modules:langid" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:jwt-auth" + "projectPath" : ":solr:modules:langid" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:langid" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:langid" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:langid" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:langid" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "runtimeClasspath", @@ -6493,6 +6340,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:opentelemetry" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:s3-repository" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:s3-repository" @@ -6505,6 +6356,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:s3-repository" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:s3-repository" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:s3-repository" @@ -6542,19 +6397,11 @@ "projectPath" : ":solr:modules:sql" } ], - "5b2db4f4" : [ - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:api" - }, + "3e18f104" : [ { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:api" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:benchmark" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:benchmark" @@ -6563,10 +6410,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:benchmark" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:core" - }, { "configuration" : "compileClasspath", "projectPath" : ":solr:core" @@ -6587,10 +6430,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:core" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:cross-dc-manager" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:cross-dc-manager" @@ -6607,38 +6446,14 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:prometheus-exporter" - }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:prometheus-exporter" - }, { "configuration" : "solrPlatformLibs", "projectPath" : ":solr:prometheus-exporter" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:prometheus-exporter" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:server" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:server" @@ -6647,42 +6462,22 @@ "configuration" : "solrCore", "projectPath" : ":solr:server" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:solr-ref-guide" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solr-ref-guide" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:solrj" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:solrj-streaming" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-streaming" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:solrj-zookeeper" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-zookeeper" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:test-framework" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:test-framework" @@ -6691,18 +6486,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:test-framework" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:webapp" - }, { "configuration" : "solrCore", "projectPath" : ":solr:webapp" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:analysis-extras" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:analysis-extras" @@ -6720,7 +6507,7 @@ "projectPath" : ":solr:modules:analysis-extras" }, { - "configuration" : "annotationProcessor", + "configuration" : "compileClasspath", "projectPath" : ":solr:modules:clustering" }, { @@ -6736,12 +6523,12 @@ "projectPath" : ":solr:modules:clustering" }, { - "configuration" : "testRuntimeClasspath", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:clustering" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:cross-dc" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:clustering" }, { "configuration" : "runtimeClasspath", @@ -6759,10 +6546,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:cross-dc" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:extraction" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:extraction" @@ -6779,10 +6562,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:extraction" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:gcs-repository" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:gcs-repository" @@ -6799,10 +6578,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:gcs-repository" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:hadoop-auth" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" @@ -6819,14 +6594,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:hdfs" - }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:hdfs" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hdfs" @@ -6839,18 +6606,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hdfs" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hdfs" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hdfs" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:jwt-auth" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:jwt-auth" @@ -6867,10 +6626,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:jwt-auth" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:langid" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:langid" @@ -6888,8 +6643,20 @@ "projectPath" : ":solr:modules:langid" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:ltr" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" }, { "configuration" : "runtimeClasspath", @@ -6907,10 +6674,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:ltr" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:opentelemetry" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:opentelemetry" @@ -6927,10 +6690,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:opentelemetry" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:s3-repository" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:s3-repository" @@ -6947,10 +6706,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:s3-repository" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:scripting" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:scripting" @@ -6967,10 +6722,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:scripting" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:sql" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:sql" @@ -6988,148 +6739,22 @@ "projectPath" : ":solr:modules:sql" } ], - "5d98342f" : [ + "474dc824" : [ { - "configuration" : "testRuntimeClasspath", + "configuration" : "annotationProcessor", "projectPath" : ":solr:api" }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:benchmark" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:benchmark" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:core" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:core" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solr-ref-guide" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj-streaming" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj-zookeeper" - }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:test-framework" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:test-framework" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:test-framework" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:test-framework" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:analysis-extras" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:clustering" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:cross-dc" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:extraction" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hdfs" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:jwt-auth" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:langid" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:ltr" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:scripting" - }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:sql" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:sql" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:sql" - }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:sql" + "projectPath" : ":solr:api" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:sql" - } - ], - "5e82f1c0" : [ - { - "configuration" : "testCompileClasspath", "projectPath" : ":solr:api" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:api" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:benchmark" }, { "configuration" : "compileClasspath", @@ -7147,6 +6772,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:benchmark" }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:core" + }, { "configuration" : "compileClasspath", "projectPath" : ":solr:core" @@ -7167,6 +6796,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:core" }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:cross-dc-manager" + }, { "configuration" : "compileClasspath", "projectPath" : ":solr:cross-dc-manager" @@ -7191,6 +6824,18 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:prometheus-exporter" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:prometheus-exporter" + }, { "configuration" : "solrPlatformLibs", "projectPath" : ":solr:prometheus-exporter" @@ -7204,17 +6849,21 @@ "projectPath" : ":solr:prometheus-exporter" }, { - "configuration" : "runtimeClasspath", + "configuration" : "annotationProcessor", "projectPath" : ":solr:server" }, { - "configuration" : "serverLib", + "configuration" : "runtimeClasspath", "projectPath" : ":solr:server" }, { "configuration" : "solrCore", "projectPath" : ":solr:server" }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:solr-ref-guide" + }, { "configuration" : "testCompileClasspath", "projectPath" : ":solr:solr-ref-guide" @@ -7223,6 +6872,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solr-ref-guide" }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:solrj" + }, { "configuration" : "testCompileClasspath", "projectPath" : ":solr:solrj" @@ -7231,6 +6884,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj" }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:solrj-streaming" + }, { "configuration" : "testCompileClasspath", "projectPath" : ":solr:solrj-streaming" @@ -7239,6 +6896,18 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-streaming" }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:solrj-zookeeper" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:solrj-zookeeper" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:solrj-zookeeper" + }, { "configuration" : "testCompileClasspath", "projectPath" : ":solr:solrj-zookeeper" @@ -7247,6 +6916,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-zookeeper" }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:test-framework" + }, { "configuration" : "compileClasspath", "projectPath" : ":solr:test-framework" @@ -7264,13 +6937,21 @@ "projectPath" : ":solr:test-framework" }, { - "configuration" : "serverLib", + "configuration" : "annotationProcessor", "projectPath" : ":solr:webapp" }, { "configuration" : "solrCore", "projectPath" : ":solr:webapp" }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:analysis-extras" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:analysis-extras" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:analysis-extras" @@ -7291,6 +6972,14 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:analysis-extras" }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:clustering" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:clustering" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:clustering" @@ -7312,15 +7001,23 @@ "projectPath" : ":solr:modules:clustering" }, { - "configuration" : "runtimeClasspath", + "configuration" : "annotationProcessor", "projectPath" : ":solr:modules:cross-dc" }, { - "configuration" : "runtimeLibs", + "configuration" : "compileClasspath", "projectPath" : ":solr:modules:cross-dc" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:cross-dc" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:cross-dc" + }, + { + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:cross-dc" }, { @@ -7331,6 +7028,14 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:cross-dc" }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:extraction" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:extraction" @@ -7351,6 +7056,14 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:extraction" }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:gcs-repository" @@ -7371,6 +7084,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:gcs-repository" }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:hadoop-auth" + }, { "configuration" : "compileClasspath", "projectPath" : ":solr:modules:hadoop-auth" @@ -7395,6 +7112,14 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:hdfs" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:hdfs" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hdfs" @@ -7415,6 +7140,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hdfs" }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:jwt-auth" + }, { "configuration" : "compileClasspath", "projectPath" : ":solr:modules:jwt-auth" @@ -7439,6 +7168,14 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:jwt-auth" }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:langid" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:langid" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:langid" @@ -7459,6 +7196,42 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:ltr" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:ltr" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:ltr" @@ -7479,6 +7252,14 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:ltr" }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:opentelemetry" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:opentelemetry" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:opentelemetry" @@ -7499,6 +7280,14 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:opentelemetry" }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:s3-repository" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:s3-repository" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:s3-repository" @@ -7519,6 +7308,14 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:s3-repository" }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:scripting" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:scripting" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:scripting" @@ -7539,6 +7336,14 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:scripting" }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:sql" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:sql" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:sql" @@ -7560,107 +7365,159 @@ "projectPath" : ":solr:modules:sql" } ], - "5f4312f3" : [ + "4985a322" : [ { - "configuration" : "compileClasspath", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hdfs" + } + ], + "4aa0cebf" : [ + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:api" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:hdfs" + "projectPath" : ":solr:benchmark" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:hdfs" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:benchmark" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hdfs" + "projectPath" : ":solr:core" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hdfs" - } - ], - "5f62bd8e" : [ - { - "configuration" : "testCompileClasspath", "projectPath" : ":solr:core" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:core" + "projectPath" : ":solr:cross-dc-manager" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:cross-dc-manager" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:prometheus-exporter" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:solr-ref-guide" }, { - "configuration" : "testCompileClasspath", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj" + "projectPath" : ":solr:solrj-streaming" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solrj-zookeeper" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:test-framework" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:test-framework" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:analysis-extras" + "projectPath" : ":solr:test-framework" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:test-framework" }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:analysis-extras" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:cross-dc" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:clustering" }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:cross-dc" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hadoop-auth" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:gcs-repository" }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:jwt-auth" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:hdfs" }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:jwt-auth" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:ltr" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:langid" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:ltr" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:s3-repository" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:opentelemetry" }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:s3-repository" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:scripting" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:sql" } ], - "5fb053e8" : [ + "4bf37e93" : [ { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:api" + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:cross-dc-manager" + } + ], + "4f81d786" : [ + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:jwt-auth" }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:jwt-auth" + } + ], + "4f983e6d" : [ { "configuration" : "testCompileClasspath", "projectPath" : ":solr:api" @@ -7753,10 +7610,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:prometheus-exporter" }, - { - "configuration" : "libExt", - "projectPath" : ":solr:server" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:server" @@ -8065,6 +7918,30 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" + }, { "configuration" : "compileClasspath", "projectPath" : ":solr:modules:ltr" @@ -8186,127 +8063,501 @@ "projectPath" : ":solr:modules:sql" } ], - "5fc760f2" : [ + "50a667d1" : [ { "configuration" : "compileClasspath", - "projectPath" : ":solr:core" - } - ], - "5fcc0587" : [ + "projectPath" : ":solr:modules:extraction" + }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:modules:extraction" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:modules:extraction" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" - } + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:extraction" + } ], - "6351de37" : [ + "515616b6" : [ { - "configuration" : "solrPlatformLibs", + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:hdfs" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:hdfs" + } + ], + "51ad5028" : [ + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:api" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:api" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:benchmark" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:benchmark" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:benchmark" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:benchmark" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:core" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:core" + }, + { + "configuration" : "testCompileClasspath", "projectPath" : ":solr:cross-dc-manager" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "testCompileClasspath", "projectPath" : ":solr:prometheus-exporter" }, { - "configuration" : "libExt", - "projectPath" : ":solr:server" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solr-ref-guide" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solr-ref-guide" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solrj" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj-streaming" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solrj-streaming" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj-zookeeper" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solrj-zookeeper" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:test-framework" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:server" + "projectPath" : ":solr:test-framework" }, { - "configuration" : "serverLib", - "projectPath" : ":solr:webapp" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:test-framework" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:test-framework" + }, + { + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:analysis-extras" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:analysis-extras" + }, + { + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:clustering" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:clustering" + }, + { + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:cross-dc" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:cross-dc" + }, + { + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:extraction" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:gcs-repository" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:hadoop-auth" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:hadoop-auth" + }, + { + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:hdfs" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:hdfs" + }, + { + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:jwt-auth" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:jwt-auth" + }, + { + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:langid" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:langid" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:ltr" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:ltr" + }, + { + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:opentelemetry" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:opentelemetry" + }, + { + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:s3-repository" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:s3-repository" + }, + { + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:scripting" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:scripting" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:sql" + }, + { + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:sql" } ], - "69bf1b73" : [ + "52ada00b" : [ { "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:langid" + "projectPath" : ":solr:benchmark" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:langid" + "projectPath" : ":solr:benchmark" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:benchmark" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:benchmark" + } + ], + "558af7f6" : [ + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:api" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:benchmark" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:benchmark" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:core" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:core" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solr-ref-guide" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj-streaming" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:solrj-zookeeper" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj-zookeeper" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:test-framework" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:test-framework" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:analysis-extras" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:analysis-extras" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:clustering" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:clustering" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:cross-dc" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:cross-dc" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:gcs-repository" }, { "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:hadoop-auth" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:hadoop-auth" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:hdfs" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:hdfs" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:jwt-auth" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:jwt-auth" + }, + { + "configuration" : "compileClasspath", "projectPath" : ":solr:modules:langid" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:langid" + "projectPath" : ":solr:modules:langid" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:ltr" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:ltr" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:opentelemetry" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:opentelemetry" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:s3-repository" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:s3-repository" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:scripting" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:scripting" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:langid" + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:sql" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:sql" } ], - "6a8501ec" : [ + "5d614100" : [ { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:api" @@ -8319,10 +8570,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:benchmark" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:core" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:core" @@ -8331,18 +8578,10 @@ "configuration" : "runtimeLibs", "projectPath" : ":solr:core" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:core" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:core" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:cross-dc-manager" @@ -8355,18 +8594,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:cross-dc-manager" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:prometheus-exporter" @@ -8380,12 +8611,12 @@ "projectPath" : ":solr:prometheus-exporter" }, { - "configuration" : "testCompileClasspath", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:prometheus-exporter" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:prometheus-exporter" + "configuration" : "libExt", + "projectPath" : ":solr:server" }, { "configuration" : "runtimeClasspath", @@ -8399,18 +8630,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solr-ref-guide" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:solrj" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:solrj" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj" @@ -8439,6 +8662,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:test-framework" }, + { + "configuration" : "serverLib", + "projectPath" : ":solr:webapp" + }, { "configuration" : "solrCore", "projectPath" : ":solr:webapp" @@ -8515,10 +8742,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:extraction" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:gcs-repository" @@ -8531,18 +8754,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:gcs-repository" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:gcs-repository" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:hadoop-auth" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" @@ -8555,10 +8770,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hadoop-auth" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hadoop-auth" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" @@ -8591,10 +8802,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:jwt-auth" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:jwt-auth" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:jwt-auth" @@ -8615,6 +8822,22 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:ltr" @@ -8659,10 +8882,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:s3-repository" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:s3-repository" @@ -8683,10 +8902,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:scripting" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:sql" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:sql" @@ -8699,142 +8914,130 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:sql" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:sql" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:sql" } ], - "6ac4140f" : [ - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:benchmark" - }, + "5f4312f3" : [ { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:benchmark" + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:hdfs" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:hdfs" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:hdfs" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:cross-dc-manager" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:hdfs" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, + "projectPath" : ":solr:modules:hdfs" + } + ], + "5f62bd8e" : [ { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:prometheus-exporter" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:core" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:prometheus-exporter" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:core" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:prometheus-exporter" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:cross-dc-manager" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, - { - "configuration" : "libExt", - "projectPath" : ":solr:server" + "projectPath" : ":solr:cross-dc-manager" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:server" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj" }, { - "configuration" : "serverLib", - "projectPath" : ":solr:webapp" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solrj" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:analysis-extras" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:clustering" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:analysis-extras" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:cross-dc" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:extraction" - }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:gcs-repository" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:cross-dc" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:hadoop-auth" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:hdfs" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:hadoop-auth" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:jwt-auth" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:langid" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:jwt-auth" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:ltr" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:opentelemetry" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:ltr" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:s3-repository" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:scripting" - }, + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:s3-repository" + } + ], + "5fc760f2" : [ { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:sql" + "configuration" : "compileClasspath", + "projectPath" : ":solr:core" } ], - "6fb73f3a" : [ + "5fcc0587" : [ { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" + "projectPath" : ":solr:modules:opentelemetry" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:gcs-repository" + "projectPath" : ":solr:modules:opentelemetry" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" + "projectPath" : ":solr:modules:opentelemetry" } ], - "703dff64" : [ + "60d0b5a8" : [ { - "configuration" : "testCompileClasspath", + "configuration" : "annotationProcessor", "projectPath" : ":solr:api" }, { @@ -8842,7 +9045,7 @@ "projectPath" : ":solr:api" }, { - "configuration" : "compileClasspath", + "configuration" : "annotationProcessor", "projectPath" : ":solr:benchmark" }, { @@ -8850,12 +9053,12 @@ "projectPath" : ":solr:benchmark" }, { - "configuration" : "testCompileClasspath", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:benchmark" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:benchmark" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:core" }, { "configuration" : "compileClasspath", @@ -8878,7 +9081,7 @@ "projectPath" : ":solr:core" }, { - "configuration" : "compileClasspath", + "configuration" : "annotationProcessor", "projectPath" : ":solr:cross-dc-manager" }, { @@ -8894,12 +9097,16 @@ "projectPath" : ":solr:cross-dc-manager" }, { - "configuration" : "testCompileClasspath", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:cross-dc-manager" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:prometheus-exporter" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:prometheus-exporter" }, { "configuration" : "runtimeClasspath", @@ -8921,6 +9128,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:prometheus-exporter" }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:server" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:server" @@ -8930,7 +9141,7 @@ "projectPath" : ":solr:server" }, { - "configuration" : "testCompileClasspath", + "configuration" : "annotationProcessor", "projectPath" : ":solr:solr-ref-guide" }, { @@ -8938,7 +9149,7 @@ "projectPath" : ":solr:solr-ref-guide" }, { - "configuration" : "testCompileClasspath", + "configuration" : "annotationProcessor", "projectPath" : ":solr:solrj" }, { @@ -8946,7 +9157,7 @@ "projectPath" : ":solr:solrj" }, { - "configuration" : "testCompileClasspath", + "configuration" : "annotationProcessor", "projectPath" : ":solr:solrj-streaming" }, { @@ -8954,15 +9165,7 @@ "projectPath" : ":solr:solrj-streaming" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:solrj-zookeeper" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:solrj-zookeeper" - }, - { - "configuration" : "testCompileClasspath", + "configuration" : "annotationProcessor", "projectPath" : ":solr:solrj-zookeeper" }, { @@ -8970,7 +9173,7 @@ "projectPath" : ":solr:solrj-zookeeper" }, { - "configuration" : "compileClasspath", + "configuration" : "annotationProcessor", "projectPath" : ":solr:test-framework" }, { @@ -8978,19 +9181,19 @@ "projectPath" : ":solr:test-framework" }, { - "configuration" : "testCompileClasspath", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:test-framework" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:test-framework" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:webapp" }, { "configuration" : "solrCore", "projectPath" : ":solr:webapp" }, { - "configuration" : "compileClasspath", + "configuration" : "annotationProcessor", "projectPath" : ":solr:modules:analysis-extras" }, { @@ -9005,16 +9208,12 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:analysis-extras" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:analysis-extras" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:analysis-extras" }, { - "configuration" : "compileClasspath", + "configuration" : "annotationProcessor", "projectPath" : ":solr:modules:clustering" }, { @@ -9029,16 +9228,12 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:clustering" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:clustering" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:clustering" }, { - "configuration" : "compileClasspath", + "configuration" : "annotationProcessor", "projectPath" : ":solr:modules:cross-dc" }, { @@ -9053,16 +9248,12 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:cross-dc" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:cross-dc" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:cross-dc" }, { - "configuration" : "compileClasspath", + "configuration" : "annotationProcessor", "projectPath" : ":solr:modules:extraction" }, { @@ -9077,16 +9268,12 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:extraction" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:extraction" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:extraction" }, { - "configuration" : "compileClasspath", + "configuration" : "annotationProcessor", "projectPath" : ":solr:modules:gcs-repository" }, { @@ -9101,16 +9288,12 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:gcs-repository" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:gcs-repository" }, { - "configuration" : "compileClasspath", + "configuration" : "annotationProcessor", "projectPath" : ":solr:modules:hadoop-auth" }, { @@ -9126,12 +9309,12 @@ "projectPath" : ":solr:modules:hadoop-auth" }, { - "configuration" : "testCompileClasspath", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:hdfs" }, { "configuration" : "compileClasspath", @@ -9158,7 +9341,7 @@ "projectPath" : ":solr:modules:hdfs" }, { - "configuration" : "compileClasspath", + "configuration" : "annotationProcessor", "projectPath" : ":solr:modules:jwt-auth" }, { @@ -9173,16 +9356,12 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:jwt-auth" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:jwt-auth" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:jwt-auth" }, { - "configuration" : "compileClasspath", + "configuration" : "annotationProcessor", "projectPath" : ":solr:modules:langid" }, { @@ -9198,15 +9377,31 @@ "projectPath" : ":solr:modules:langid" }, { - "configuration" : "testCompileClasspath", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:langid" + "projectPath" : ":solr:modules:llm" }, { - "configuration" : "compileClasspath", + "configuration" : "annotationProcessor", "projectPath" : ":solr:modules:ltr" }, { @@ -9221,16 +9416,12 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:ltr" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:ltr" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:ltr" }, { - "configuration" : "compileClasspath", + "configuration" : "annotationProcessor", "projectPath" : ":solr:modules:opentelemetry" }, { @@ -9245,16 +9436,12 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:opentelemetry" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:opentelemetry" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:opentelemetry" }, { - "configuration" : "compileClasspath", + "configuration" : "annotationProcessor", "projectPath" : ":solr:modules:s3-repository" }, { @@ -9270,51 +9457,237 @@ "projectPath" : ":solr:modules:s3-repository" }, { - "configuration" : "testCompileClasspath", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:s3-repository" }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:scripting" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:scripting" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:scripting" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:scripting" + }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:s3-repository" + "projectPath" : ":solr:modules:scripting" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:sql" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:sql" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:sql" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:sql" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:sql" + } + ], + "6481fe6a" : [ + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:api" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:benchmark" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:core" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:prometheus-exporter" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:server" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:solr-ref-guide" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:solrj" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:solrj-streaming" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solrj-streaming" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:solrj-zookeeper" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:test-framework" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:webapp" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:analysis-extras" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:clustering" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:cross-dc" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:extraction" }, { "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:scripting" + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:hadoop-auth" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:hdfs" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:jwt-auth" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:langid" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:ltr" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:opentelemetry" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:scripting" + "projectPath" : ":solr:modules:opentelemetry" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:scripting" + "projectPath" : ":solr:modules:opentelemetry" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:scripting" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:opentelemetry" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:scripting" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:s3-repository" }, { - "configuration" : "testRuntimeClasspath", + "configuration" : "annotationProcessor", "projectPath" : ":solr:modules:scripting" }, { - "configuration" : "compileClasspath", + "configuration" : "annotationProcessor", "projectPath" : ":solr:modules:sql" }, { - "configuration" : "runtimeClasspath", + "configuration" : "compileClasspath", "projectPath" : ":solr:modules:sql" }, { - "configuration" : "runtimeLibs", + "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:sql" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "runtimeLibs", "projectPath" : ":solr:modules:sql" }, { @@ -9326,37 +9699,29 @@ "projectPath" : ":solr:modules:sql" } ], - "727aea63" : [ + "69bf1b73" : [ { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:core" + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:langid" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:analysis-extras" + "projectPath" : ":solr:modules:langid" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:analysis-extras" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:analysis-extras" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" + "projectPath" : ":solr:modules:langid" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hdfs" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:langid" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:sql" + "projectPath" : ":solr:modules:langid" } ], - "72c9c512" : [ + "6ec19f42" : [ { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:api" @@ -9405,14 +9770,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:prometheus-exporter" - }, { "configuration" : "solrPlatformLibs", "projectPath" : ":solr:prometheus-exporter" @@ -9421,10 +9778,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:prometheus-exporter" }, - { - "configuration" : "libExt", - "projectPath" : ":solr:server" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:server" @@ -9437,6 +9790,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solr-ref-guide" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj" @@ -9449,26 +9806,14 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-zookeeper" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:test-framework" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:test-framework" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:test-framework" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:test-framework" }, - { - "configuration" : "serverLib", - "projectPath" : ":solr:webapp" - }, { "configuration" : "solrCore", "projectPath" : ":solr:webapp" @@ -9521,6 +9866,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:cross-dc" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:extraction" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:extraction" @@ -9533,6 +9882,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:extraction" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:extraction" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:extraction" @@ -9581,6 +9934,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hdfs" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:hdfs" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hdfs" @@ -9617,6 +9974,22 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:ltr" @@ -9698,25 +10071,57 @@ "projectPath" : ":solr:modules:sql" } ], - "7413b098" : [ + "6fb73f3a" : [ { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:api" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:gcs-repository" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:api" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:gcs-repository" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:benchmark" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:gcs-repository" + } + ], + "727aea63" : [ + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:core" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:benchmark" + "projectPath" : ":solr:modules:analysis-extras" }, { - "configuration" : "testCompileClasspath", + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:analysis-extras" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:analysis-extras" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:hadoop-auth" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:hdfs" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:sql" + } + ], + "74a9c7e6" : [ + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:api" + }, + { + "configuration" : "runtimeClasspath", "projectPath" : ":solr:benchmark" }, { @@ -9743,10 +10148,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:core" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:cross-dc-manager" @@ -9759,34 +10160,14 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:cross-dc-manager" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:prometheus-exporter" - }, { "configuration" : "solrPlatformLibs", "projectPath" : ":solr:prometheus-exporter" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:prometheus-exporter" @@ -9799,42 +10180,18 @@ "configuration" : "solrCore", "projectPath" : ":solr:server" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solr-ref-guide" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solr-ref-guide" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj-streaming" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-streaming" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:solrj-zookeeper" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:solrj-zookeeper" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj-zookeeper" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-zookeeper" @@ -9859,10 +10216,6 @@ "configuration" : "solrCore", "projectPath" : ":solr:webapp" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:analysis-extras" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:analysis-extras" @@ -9875,18 +10228,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:analysis-extras" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:analysis-extras" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:analysis-extras" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:clustering" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:clustering" @@ -9899,18 +10244,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:clustering" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:clustering" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:clustering" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:cross-dc" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:cross-dc" @@ -9923,18 +10260,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:cross-dc" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:cross-dc" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:cross-dc" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:extraction" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:extraction" @@ -9947,18 +10276,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:extraction" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:extraction" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:extraction" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:gcs-repository" @@ -9971,18 +10292,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:gcs-repository" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:gcs-repository" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:hadoop-auth" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" @@ -9995,18 +10308,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hadoop-auth" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hadoop-auth" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:hdfs" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hdfs" @@ -10019,17 +10324,9 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hdfs" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hdfs" - }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hdfs" - }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:jwt-auth" + "projectPath" : ":solr:modules:hdfs" }, { "configuration" : "runtimeClasspath", @@ -10043,18 +10340,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:jwt-auth" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:jwt-auth" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:jwt-auth" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:langid" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:langid" @@ -10068,16 +10357,24 @@ "projectPath" : ":solr:modules:langid" }, { - "configuration" : "testCompileClasspath", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:langid" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:langid" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:ltr" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" }, { "configuration" : "runtimeClasspath", @@ -10091,18 +10388,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:ltr" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:ltr" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:ltr" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:opentelemetry" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:opentelemetry" @@ -10115,18 +10404,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:opentelemetry" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:opentelemetry" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:opentelemetry" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:s3-repository" @@ -10139,18 +10420,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:s3-repository" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:s3-repository" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:scripting" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:scripting" @@ -10163,18 +10436,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:scripting" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:scripting" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:scripting" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:sql" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:sql" @@ -10187,120 +10452,74 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:sql" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:sql" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:sql" } ], - "7498dc3d" : [ - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:api" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:benchmark" - }, + "761c3c3c" : [ { - "configuration" : "annotationProcessor", + "configuration" : "compileClasspath", "projectPath" : ":solr:core" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:prometheus-exporter" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:server" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:solr-ref-guide" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:solrj" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:solrj-streaming" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj-streaming" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:core" }, { - "configuration" : "annotationProcessor", + "configuration" : "compileClasspath", "projectPath" : ":solr:solrj-zookeeper" }, { - "configuration" : "annotationProcessor", + "configuration" : "compileClasspath", "projectPath" : ":solr:test-framework" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:webapp" - }, + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:hadoop-auth" + } + ], + "778d978f" : [ { "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:analysis-extras" + "projectPath" : ":solr:benchmark" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:clustering" + "configuration" : "compileClasspath", + "projectPath" : ":solr:benchmark" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:cross-dc" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:benchmark" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:extraction" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:benchmark" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:extraction" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:benchmark" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:extraction" + "projectPath" : ":solr:cross-dc-manager" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:extraction" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:extraction" + "projectPath" : ":solr:cross-dc-manager" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:extraction" - }, + "projectPath" : ":solr:cross-dc-manager" + } + ], + "781655d3" : [ { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:gcs-repository" - }, + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:opentelemetry" + } + ], + "784a94ea" : [ { "configuration" : "compileClasspath", "projectPath" : ":solr:modules:gcs-repository" @@ -10320,117 +10539,47 @@ { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:gcs-repository" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:hadoop-auth" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:hdfs" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:jwt-auth" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:langid" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:ltr" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:opentelemetry" - }, + } + ], + "7accccef" : [ { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:opentelemetry" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" - }, - { - "configuration" : "annotationProcessor", "projectPath" : ":solr:modules:s3-repository" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:scripting" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:sql" - }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:sql" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:sql" - }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:sql" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:sql" + "projectPath" : ":solr:modules:s3-repository" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:sql" + "projectPath" : ":solr:modules:s3-repository" } ], - "761c3c3c" : [ - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:core" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:core" - }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:solrj-zookeeper" - }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:test-framework" - }, + "7df0e72e" : [ { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hadoop-auth" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:s3-repository" } ], - "76db8e26" : [ + "806155b7" : [ { - "configuration" : "compileClasspath", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:api" }, { - "configuration" : "runtimeClasspath", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:api" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:api" + "configuration" : "compileClasspath", + "projectPath" : ":solr:benchmark" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:api" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:benchmark" }, { - "configuration" : "runtimeClasspath", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:benchmark" }, { @@ -10457,6 +10606,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:core" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:cross-dc-manager" @@ -10470,19 +10623,19 @@ "projectPath" : ":solr:cross-dc-manager" }, { - "configuration" : "testRuntimeClasspath", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:cross-dc-manager" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:prometheus-exporter" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:cross-dc-manager" }, { - "configuration" : "runtimeLibs", + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:prometheus-exporter" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:prometheus-exporter" }, { @@ -10493,16 +10646,24 @@ "configuration" : "runtimeClasspath", "projectPath" : ":solr:server" }, + { + "configuration" : "serverLib", + "projectPath" : ":solr:server" + }, { "configuration" : "solrCore", "projectPath" : ":solr:server" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solr-ref-guide" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solr-ref-guide" }, { - "configuration" : "runtimeClasspath", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:solrj" }, { @@ -10510,7 +10671,7 @@ "projectPath" : ":solr:solrj" }, { - "configuration" : "runtimeClasspath", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:solrj-streaming" }, { @@ -10518,21 +10679,33 @@ "projectPath" : ":solr:solrj-streaming" }, { - "configuration" : "runtimeClasspath", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:solrj-zookeeper" }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-zookeeper" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:test-framework" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:test-framework" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:test-framework" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:test-framework" }, + { + "configuration" : "serverLib", + "projectPath" : ":solr:webapp" + }, { "configuration" : "solrCore", "projectPath" : ":solr:webapp" @@ -10549,6 +10722,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:analysis-extras" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:analysis-extras" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:analysis-extras" @@ -10565,6 +10742,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:clustering" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:clustering" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:clustering" @@ -10581,6 +10762,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:cross-dc" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:cross-dc" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:cross-dc" @@ -10597,6 +10782,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:extraction" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:extraction" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:extraction" @@ -10613,10 +10802,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:gcs-repository" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:gcs-repository" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:hadoop-auth" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" @@ -10629,6 +10826,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hadoop-auth" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:hadoop-auth" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" @@ -10645,10 +10846,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hdfs" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:hdfs" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hdfs" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:jwt-auth" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:jwt-auth" @@ -10661,6 +10870,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:jwt-auth" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:jwt-auth" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:jwt-auth" @@ -10677,10 +10890,34 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:langid" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:ltr" @@ -10693,6 +10930,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:ltr" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:ltr" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:ltr" @@ -10709,6 +10950,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:opentelemetry" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:opentelemetry" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:opentelemetry" @@ -10725,6 +10970,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:s3-repository" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:s3-repository" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:s3-repository" @@ -10741,6 +10990,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:scripting" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:scripting" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:scripting" @@ -10757,74 +11010,16 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:sql" }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:sql" - } - ], - "778d978f" : [ - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:benchmark" - }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:benchmark" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:benchmark" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:benchmark" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:benchmark" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:cross-dc-manager" - } - ], - "781655d3" : [ - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:opentelemetry" - } - ], - "784a94ea" : [ - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:gcs-repository" - }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:gcs-repository" + "projectPath" : ":solr:modules:sql" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" + "projectPath" : ":solr:modules:sql" } ], - "78dd58c9" : [ + "8285d027" : [ { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:api" @@ -10873,10 +11068,26 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:prometheus-exporter" + }, { "configuration" : "solrPlatformLibs", "projectPath" : ":solr:prometheus-exporter" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:prometheus-exporter" @@ -10905,10 +11116,18 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-zookeeper" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:test-framework" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:test-framework" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:test-framework" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:test-framework" @@ -11013,6 +11232,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:hdfs" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hdfs" @@ -11025,6 +11248,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hdfs" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:hdfs" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hdfs" @@ -11061,6 +11288,22 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:ltr" @@ -11105,10 +11348,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:s3-repository" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:s3-repository" @@ -11146,29 +11385,27 @@ "projectPath" : ":solr:modules:sql" } ], - "7accccef" : [ + "840f3f3b" : [ { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:s3-repository" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:api" }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:s3-repository" - } - ], - "7bb67147" : [ { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:api" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:benchmark" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:benchmark" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:benchmark" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:benchmark" @@ -11193,6 +11430,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:core" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:cross-dc-manager" @@ -11205,14 +11446,34 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:cross-dc-manager" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:prometheus-exporter" + }, { "configuration" : "solrPlatformLibs", "projectPath" : ":solr:prometheus-exporter" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:prometheus-exporter" @@ -11225,26 +11486,74 @@ "configuration" : "solrCore", "projectPath" : ":solr:server" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solr-ref-guide" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solr-ref-guide" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:solrj" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:solrj" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:solrj-streaming" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:solrj-streaming" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj-streaming" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-streaming" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:solrj-zookeeper" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:solrj-zookeeper" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj-zookeeper" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-zookeeper" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:test-framework" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:test-framework" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:test-framework" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:test-framework" @@ -11253,6 +11562,10 @@ "configuration" : "solrCore", "projectPath" : ":solr:webapp" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:analysis-extras" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:analysis-extras" @@ -11265,10 +11578,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:analysis-extras" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:analysis-extras" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:analysis-extras" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:clustering" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:clustering" @@ -11281,10 +11602,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:clustering" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:clustering" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:clustering" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:cross-dc" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:cross-dc" @@ -11297,6 +11626,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:cross-dc" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:cross-dc" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:cross-dc" @@ -11325,6 +11658,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:extraction" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:gcs-repository" @@ -11337,10 +11674,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:gcs-repository" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:gcs-repository" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:hadoop-auth" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" @@ -11353,10 +11698,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hadoop-auth" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:hadoop-auth" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:hdfs" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hdfs" @@ -11369,10 +11722,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hdfs" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:hdfs" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hdfs" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:jwt-auth" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:jwt-auth" @@ -11385,10 +11746,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:jwt-auth" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:jwt-auth" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:jwt-auth" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:langid" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:langid" @@ -11401,10 +11770,42 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:langid" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:ltr" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:ltr" @@ -11417,10 +11818,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:ltr" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:ltr" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:ltr" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:opentelemetry" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:opentelemetry" @@ -11433,10 +11842,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:opentelemetry" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:opentelemetry" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:opentelemetry" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:s3-repository" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:s3-repository" @@ -11457,6 +11874,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:s3-repository" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:scripting" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:scripting" @@ -11469,10 +11890,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:scripting" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:scripting" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:scripting" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:sql" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:sql" @@ -11485,18 +11914,98 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:sql" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:sql" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:sql" } ], - "7df0e72e" : [ + "87cc13ff" : [ + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:s3-repository" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:s3-repository" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:s3-repository" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:s3-repository" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:s3-repository" + } + ], + "8a8ebb15" : [ + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" + } + ], + "8ba2f0f7" : [ + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:jwt-auth" + } + ], + "8bbaac3f" : [ + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:api" + }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:s3-repository" - } - ], - "7f2dd9d5" : [ + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:api" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:api" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:api" @@ -11529,6 +12038,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:core" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:cross-dc-manager" @@ -11541,10 +12054,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:cross-dc-manager" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:prometheus-exporter" @@ -11557,6 +12078,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:prometheus-exporter" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:prometheus-exporter" @@ -11665,6 +12190,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:cross-dc" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:extraction" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:extraction" @@ -11677,10 +12206,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:extraction" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:extraction" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:extraction" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:gcs-repository" @@ -11693,6 +12230,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:gcs-repository" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:gcs-repository" @@ -11777,6 +12318,30 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:ltr" @@ -11821,6 +12386,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:s3-repository" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:s3-repository" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:s3-repository" @@ -11841,6 +12410,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:scripting" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:sql" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:sql" @@ -11853,30 +12426,78 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:sql" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:sql" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:sql" } ], - "84afbb60" : [ + "8d0cef4c" : [ + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solrj-streaming" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:extraction" + }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:api" + "projectPath" : ":solr:modules:extraction" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:api" + "projectPath" : ":solr:modules:extraction" }, { "configuration" : "compileClasspath", - "projectPath" : ":solr:benchmark" + "projectPath" : ":solr:modules:sql" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:benchmark" + "projectPath" : ":solr:modules:sql" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:sql" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:sql" }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:sql" + } + ], + "90aa62e6" : [ { "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:hdfs" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:hdfs" + } + ], + "929ce55d" : [ + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:api" + }, + { + "configuration" : "runtimeClasspath", "projectPath" : ":solr:benchmark" }, { @@ -11903,10 +12524,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:core" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:cross-dc-manager" @@ -11919,18 +12536,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:cross-dc-manager" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:prometheus-exporter" @@ -11943,78 +12552,34 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:prometheus-exporter" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:prometheus-exporter" }, { - "configuration" : "runtimeClasspath", + "configuration" : "libExt", "projectPath" : ":solr:server" }, { - "configuration" : "serverLib", + "configuration" : "runtimeClasspath", "projectPath" : ":solr:server" }, { "configuration" : "solrCore", "projectPath" : ":solr:server" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solr-ref-guide" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solr-ref-guide" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:solrj" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:solrj" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:solrj-streaming" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:solrj-streaming" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj-streaming" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-streaming" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:solrj-zookeeper" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:solrj-zookeeper" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj-zookeeper" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-zookeeper" @@ -12043,10 +12608,6 @@ "configuration" : "solrCore", "projectPath" : ":solr:webapp" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:analysis-extras" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:analysis-extras" @@ -12059,18 +12620,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:analysis-extras" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:analysis-extras" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:analysis-extras" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:clustering" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:clustering" @@ -12083,18 +12636,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:clustering" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:clustering" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:clustering" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:cross-dc" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:cross-dc" @@ -12107,18 +12652,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:cross-dc" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:cross-dc" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:cross-dc" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:extraction" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:extraction" @@ -12131,18 +12668,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:extraction" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:extraction" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:extraction" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:gcs-repository" @@ -12155,18 +12684,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:gcs-repository" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:gcs-repository" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:hadoop-auth" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" @@ -12179,18 +12700,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hadoop-auth" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hadoop-auth" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:hdfs" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hdfs" @@ -12203,18 +12716,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hdfs" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hdfs" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hdfs" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:jwt-auth" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:jwt-auth" @@ -12227,17 +12732,9 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:jwt-auth" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:jwt-auth" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:jwt-auth" - }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:langid" + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:jwt-auth" }, { "configuration" : "runtimeClasspath", @@ -12252,16 +12749,24 @@ "projectPath" : ":solr:modules:langid" }, { - "configuration" : "testCompileClasspath", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:langid" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:langid" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:ltr" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" }, { "configuration" : "runtimeClasspath", @@ -12275,18 +12780,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:ltr" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:ltr" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:ltr" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:opentelemetry" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:opentelemetry" @@ -12299,18 +12796,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:opentelemetry" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:opentelemetry" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:opentelemetry" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:s3-repository" @@ -12323,18 +12812,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:s3-repository" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:s3-repository" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:scripting" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:scripting" @@ -12347,18 +12828,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:scripting" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:scripting" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:scripting" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:sql" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:sql" @@ -12371,58 +12844,20 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:sql" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:sql" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:sql" } ], - "87cc13ff" : [ - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:s3-repository" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:s3-repository" - } - ], - "87cd582a" : [ - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:api" - }, + "92c25c5e" : [ { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:api" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:benchmark" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:benchmark" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:benchmark" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:benchmark" @@ -12447,10 +12882,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:core" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:cross-dc-manager" @@ -12463,10 +12894,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:cross-dc-manager" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" @@ -12475,18 +12902,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:prometheus-exporter" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:prometheus-exporter" }, - { - "configuration" : "libExt", - "projectPath" : ":solr:server" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:server" @@ -12495,66 +12914,34 @@ "configuration" : "solrCore", "projectPath" : ":solr:server" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solr-ref-guide" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solr-ref-guide" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj-streaming" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-streaming" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj-zookeeper" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-zookeeper" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:test-framework" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:test-framework" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:test-framework" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:test-framework" }, - { - "configuration" : "serverLib", - "projectPath" : ":solr:webapp" - }, { "configuration" : "solrCore", "projectPath" : ":solr:webapp" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:analysis-extras" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:analysis-extras" @@ -12567,18 +12954,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:analysis-extras" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:analysis-extras" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:analysis-extras" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:clustering" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:clustering" @@ -12591,18 +12970,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:clustering" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:clustering" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:clustering" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:cross-dc" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:cross-dc" @@ -12615,18 +12986,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:cross-dc" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:cross-dc" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:cross-dc" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:extraction" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:extraction" @@ -12639,18 +13002,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:extraction" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:extraction" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:extraction" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:gcs-repository" @@ -12663,18 +13018,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:gcs-repository" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:gcs-repository" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:hadoop-auth" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" @@ -12687,18 +13034,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hadoop-auth" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hadoop-auth" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:hdfs" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hdfs" @@ -12711,18 +13050,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hdfs" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hdfs" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hdfs" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:jwt-auth" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:jwt-auth" @@ -12735,18 +13066,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:jwt-auth" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:jwt-auth" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:jwt-auth" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:langid" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:langid" @@ -12760,16 +13083,24 @@ "projectPath" : ":solr:modules:langid" }, { - "configuration" : "testCompileClasspath", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:langid" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:langid" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:ltr" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" }, { "configuration" : "runtimeClasspath", @@ -12783,18 +13114,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:ltr" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:ltr" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:ltr" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:opentelemetry" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:opentelemetry" @@ -12807,18 +13130,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:opentelemetry" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:opentelemetry" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:opentelemetry" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:s3-repository" @@ -12840,28 +13155,60 @@ "projectPath" : ":solr:modules:s3-repository" }, { - "configuration" : "compileClasspath", + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:scripting" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:scripting" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:scripting" + }, + { + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:scripting" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:scripting" + "projectPath" : ":solr:modules:sql" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:sql" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:sql" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:sql" + } + ], + "934e1fc5" : [ + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:cross-dc-manager" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:scripting" - }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:scripting" + "projectPath" : ":solr:cross-dc-manager" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:scripting" + "projectPath" : ":solr:cross-dc-manager" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:scripting" + "projectPath" : ":solr:cross-dc-manager" + } + ], + "93acde90" : [ + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solrj-streaming" }, { "configuration" : "compileClasspath", @@ -12875,10 +13222,6 @@ "configuration" : "runtimeLibs", "projectPath" : ":solr:modules:sql" }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:sql" - }, { "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:sql" @@ -12888,7 +13231,13 @@ "projectPath" : ":solr:modules:sql" } ], - "8b517977" : [ + "970f2ee7" : [ + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solrj-streaming" + } + ], + "9a873411" : [ { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:api" @@ -12901,10 +13250,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:benchmark" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:core" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:core" @@ -12913,10 +13258,6 @@ "configuration" : "runtimeLibs", "projectPath" : ":solr:core" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:core" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:core" @@ -12937,6 +13278,14 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:prometheus-exporter" + }, { "configuration" : "solrPlatformLibs", "projectPath" : ":solr:prometheus-exporter" @@ -12945,6 +13294,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:prometheus-exporter" }, + { + "configuration" : "libExt", + "projectPath" : ":solr:server" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:server" @@ -12957,10 +13310,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solr-ref-guide" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj" @@ -12981,6 +13330,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:test-framework" }, + { + "configuration" : "serverLib", + "projectPath" : ":solr:webapp" + }, { "configuration" : "solrCore", "projectPath" : ":solr:webapp" @@ -13129,6 +13482,22 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:ltr" @@ -13173,10 +13542,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:s3-repository" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:s3-repository" @@ -13214,89 +13579,7 @@ "projectPath" : ":solr:modules:sql" } ], - "8ba2f0f7" : [ - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:extraction" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:extraction" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:extraction" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:extraction" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:extraction" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:jwt-auth" - } - ], - "8d0cef4c" : [ - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj-streaming" - }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:extraction" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:extraction" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:extraction" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:extraction" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:extraction" - }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:sql" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:sql" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:sql" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:sql" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:sql" - } - ], - "90aa62e6" : [ - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hdfs" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hdfs" - } - ], - "934e1fc5" : [ + "9bcc8206" : [ { "configuration" : "runtimeClasspath", "projectPath" : ":solr:cross-dc-manager" @@ -13305,48 +13588,32 @@ "configuration" : "runtimeLibs", "projectPath" : ":solr:cross-dc-manager" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" - } - ], - "93acde90" : [ - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj-streaming" }, { "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:sql" + "projectPath" : ":solr:modules:jwt-auth" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:sql" + "projectPath" : ":solr:modules:jwt-auth" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:sql" + "projectPath" : ":solr:modules:jwt-auth" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:sql" + "projectPath" : ":solr:modules:jwt-auth" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:sql" - } - ], - "970f2ee7" : [ - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj-streaming" + "projectPath" : ":solr:modules:jwt-auth" } ], - "99b82a6c" : [ + "9de0bea2" : [ { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:api" @@ -13359,6 +13626,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:benchmark" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:core" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:core" @@ -13423,18 +13694,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-zookeeper" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:test-framework" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:test-framework" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:test-framework" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:test-framework" @@ -13539,10 +13802,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:hdfs" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hdfs" @@ -13555,10 +13814,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hdfs" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hdfs" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hdfs" @@ -13597,117 +13852,99 @@ }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:ltr" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:ltr" - }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:ltr" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:ltr" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:s3-repository" + "projectPath" : ":solr:modules:ltr" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:s3-repository" + "projectPath" : ":solr:modules:ltr" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:s3-repository" + "projectPath" : ":solr:modules:ltr" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:s3-repository" + "projectPath" : ":solr:modules:ltr" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:scripting" + "projectPath" : ":solr:modules:opentelemetry" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:scripting" + "projectPath" : ":solr:modules:opentelemetry" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:scripting" + "projectPath" : ":solr:modules:opentelemetry" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:scripting" + "projectPath" : ":solr:modules:opentelemetry" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:sql" + "projectPath" : ":solr:modules:s3-repository" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:sql" + "projectPath" : ":solr:modules:s3-repository" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:sql" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:sql" - } - ], - "9bcc8206" : [ + "projectPath" : ":solr:modules:s3-repository" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:s3-repository" + }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:scripting" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:scripting" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:cross-dc-manager" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:scripting" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:jwt-auth" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:scripting" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:jwt-auth" + "projectPath" : ":solr:modules:sql" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:jwt-auth" + "projectPath" : ":solr:modules:sql" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:jwt-auth" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:sql" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:jwt-auth" + "projectPath" : ":solr:modules:sql" } ], "9e97e18c" : [ @@ -13748,27 +13985,39 @@ "projectPath" : ":solr:modules:s3-repository" } ], - "a05ffa28" : [ + "a41a091e" : [ { - "configuration" : "testCompileClasspath", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:api" }, { - "configuration" : "compileClasspath", + "configuration" : "runtimeClasspath", "projectPath" : ":solr:benchmark" }, { - "configuration" : "testCompileClasspath", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:benchmark" }, { "configuration" : "compileClasspath", "projectPath" : ":solr:core" }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:core" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:core" + }, { "configuration" : "testCompileClasspath", "projectPath" : ":solr:core" }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:core" + }, { "configuration" : "compileClasspath", "projectPath" : ":solr:cross-dc-manager" @@ -13781,6 +14030,10 @@ "configuration" : "runtimeLibs", "projectPath" : ":solr:cross-dc-manager" }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:cross-dc-manager" + }, { "configuration" : "testCompileClasspath", "projectPath" : ":solr:cross-dc-manager" @@ -13790,72 +14043,120 @@ "projectPath" : ":solr:cross-dc-manager" }, { - "configuration" : "testCompileClasspath", + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:prometheus-exporter" }, { - "configuration" : "testCompileClasspath", + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, + { + "configuration" : "libExt", + "projectPath" : ":solr:server" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:server" + }, + { + "configuration" : "solrCore", + "projectPath" : ":solr:server" + }, + { + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solr-ref-guide" }, { - "configuration" : "testCompileClasspath", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj" }, { - "configuration" : "testCompileClasspath", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-streaming" }, { - "configuration" : "compileClasspath", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-zookeeper" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj-zookeeper" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:test-framework" }, { - "configuration" : "compileClasspath", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:test-framework" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:test-framework" + "configuration" : "serverLib", + "projectPath" : ":solr:webapp" }, { - "configuration" : "compileClasspath", + "configuration" : "solrCore", + "projectPath" : ":solr:webapp" + }, + { + "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:analysis-extras" }, { - "configuration" : "testCompileClasspath", + "configuration" : "runtimeLibs", "projectPath" : ":solr:modules:analysis-extras" }, { - "configuration" : "compileClasspath", + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:analysis-extras" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:analysis-extras" + }, + { + "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:clustering" }, { - "configuration" : "testCompileClasspath", + "configuration" : "runtimeLibs", "projectPath" : ":solr:modules:clustering" }, { - "configuration" : "compileClasspath", + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:clustering" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:clustering" + }, + { + "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:cross-dc" }, { - "configuration" : "testCompileClasspath", + "configuration" : "runtimeLibs", "projectPath" : ":solr:modules:cross-dc" }, { - "configuration" : "compileClasspath", + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:cross-dc" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:cross-dc" + }, + { + "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:extraction" }, { - "configuration" : "testCompileClasspath", + "configuration" : "runtimeLibs", "projectPath" : ":solr:modules:extraction" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:gcs-repository" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:extraction" }, { "configuration" : "runtimeClasspath", @@ -13866,7 +14167,7 @@ "projectPath" : ":solr:modules:gcs-repository" }, { - "configuration" : "testCompileClasspath", + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:gcs-repository" }, { @@ -13874,75 +14175,163 @@ "projectPath" : ":solr:modules:gcs-repository" }, { - "configuration" : "compileClasspath", + "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" }, { - "configuration" : "testCompileClasspath", + "configuration" : "runtimeLibs", "projectPath" : ":solr:modules:hadoop-auth" }, { - "configuration" : "compileClasspath", + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:hadoop-auth" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:hadoop-auth" + }, + { + "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hdfs" }, { - "configuration" : "testCompileClasspath", + "configuration" : "runtimeLibs", "projectPath" : ":solr:modules:hdfs" }, { - "configuration" : "compileClasspath", + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:hdfs" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:hdfs" + }, + { + "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:jwt-auth" }, { - "configuration" : "testCompileClasspath", + "configuration" : "runtimeLibs", "projectPath" : ":solr:modules:jwt-auth" }, { - "configuration" : "compileClasspath", + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:jwt-auth" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:jwt-auth" + }, + { + "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:langid" }, { - "configuration" : "testCompileClasspath", + "configuration" : "runtimeLibs", "projectPath" : ":solr:modules:langid" }, { - "configuration" : "compileClasspath", + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:langid" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:langid" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:ltr" }, { - "configuration" : "testCompileClasspath", + "configuration" : "runtimeLibs", "projectPath" : ":solr:modules:ltr" }, { - "configuration" : "compileClasspath", + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:ltr" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:ltr" + }, + { + "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:opentelemetry" }, { - "configuration" : "testCompileClasspath", + "configuration" : "runtimeLibs", "projectPath" : ":solr:modules:opentelemetry" }, { - "configuration" : "compileClasspath", + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:opentelemetry" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:opentelemetry" + }, + { + "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:s3-repository" }, { - "configuration" : "testCompileClasspath", + "configuration" : "runtimeLibs", "projectPath" : ":solr:modules:s3-repository" }, { - "configuration" : "compileClasspath", + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:s3-repository" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:s3-repository" + }, + { + "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:scripting" }, { - "configuration" : "testCompileClasspath", + "configuration" : "runtimeLibs", "projectPath" : ":solr:modules:scripting" }, { - "configuration" : "compileClasspath", + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:scripting" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:scripting" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:sql" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:sql" + }, + { + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:sql" }, { - "configuration" : "testCompileClasspath", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:sql" } ], @@ -14002,7 +14391,41 @@ "projectPath" : ":solr:modules:sql" } ], - "a6fb6a35" : [ + "a7f96198" : [ + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:gcs-repository" + } + ], + "a97a6cec" : [ { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:api" @@ -14059,10 +14482,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:prometheus-exporter" }, - { - "configuration" : "libExt", - "projectPath" : ":solr:server" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:server" @@ -14075,10 +14494,18 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solr-ref-guide" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:solrj" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:solrj" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj" @@ -14107,10 +14534,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:test-framework" }, - { - "configuration" : "serverLib", - "projectPath" : ":solr:webapp" - }, { "configuration" : "solrCore", "projectPath" : ":solr:webapp" @@ -14163,10 +14586,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:cross-dc" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:extraction" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:extraction" @@ -14179,10 +14598,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:extraction" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:extraction" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:extraction" @@ -14269,270 +14684,112 @@ }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:ltr" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:ltr" - }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:ltr" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:ltr" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:opentelemetry" - }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:opentelemetry" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:s3-repository" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:s3-repository" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:s3-repository" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:s3-repository" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:scripting" + "projectPath" : ":solr:modules:ltr" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:scripting" + "projectPath" : ":solr:modules:ltr" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:scripting" + "projectPath" : ":solr:modules:ltr" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:scripting" + "projectPath" : ":solr:modules:ltr" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:sql" + "projectPath" : ":solr:modules:opentelemetry" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:sql" + "projectPath" : ":solr:modules:opentelemetry" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:sql" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:sql" - } - ], - "a7f96198" : [ - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:opentelemetry" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:gcs-repository" + "projectPath" : ":solr:modules:opentelemetry" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" + "projectPath" : ":solr:modules:s3-repository" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:gcs-repository" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" - } - ], - "a9dcee72" : [ - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:api" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:benchmark" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:core" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:prometheus-exporter" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:server" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:solr-ref-guide" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:solrj" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:solrj-streaming" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:solrj-zookeeper" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:test-framework" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:webapp" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:analysis-extras" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:clustering" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:cross-dc" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:extraction" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:gcs-repository" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:hadoop-auth" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:hdfs" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:jwt-auth" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:langid" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:ltr" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:opentelemetry" - }, - { - "configuration" : "annotationProcessor", "projectPath" : ":solr:modules:s3-repository" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:scripting" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:sql" - } - ], - "aa7a59c6" : [ - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:gcs-repository" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:s3-repository" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" - } - ], - "acc31ef6" : [ + "projectPath" : ":solr:modules:s3-repository" + }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:scripting" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:scripting" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:scripting" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:scripting" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" + "projectPath" : ":solr:modules:sql" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:hadoop-auth" + "projectPath" : ":solr:modules:sql" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:sql" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" + "projectPath" : ":solr:modules:sql" + } + ], + "aa7a59c6" : [ + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:gcs-repository" } ], - "ad8f08d7" : [ + "ac0452bb" : [ { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:api" @@ -14565,6 +14822,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:core" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:cross-dc-manager" @@ -14577,14 +14838,34 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:cross-dc-manager" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:prometheus-exporter" + }, { "configuration" : "solrPlatformLibs", "projectPath" : ":solr:prometheus-exporter" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:prometheus-exporter" @@ -14601,14 +14882,34 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solr-ref-guide" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:solrj" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:solrj" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj" }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:solrj-streaming" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-streaming" }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:solrj-zookeeper" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-zookeeper" @@ -14673,6 +14974,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:cross-dc" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:extraction" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:extraction" @@ -14685,6 +14990,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:extraction" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:extraction" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:extraction" @@ -14749,6 +15058,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:jwt-auth" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:jwt-auth" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:jwt-auth" @@ -14769,6 +15082,30 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:ltr" @@ -14813,6 +15150,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:s3-repository" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:s3-repository" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:s3-repository" @@ -14833,6 +15174,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:scripting" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:sql" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:sql" @@ -14845,12 +15190,42 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:sql" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:sql" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:sql" } ], - "b3b7541b" : [ + "acc31ef6" : [ + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:hadoop-auth" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:hadoop-auth" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:hadoop-auth" + } + ], + "af96d912" : [ { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:api" @@ -14863,10 +15238,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:benchmark" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:core" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:core" @@ -14875,10 +15246,6 @@ "configuration" : "runtimeLibs", "projectPath" : ":solr:core" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:core" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:core" @@ -14931,18 +15298,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-zookeeper" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:test-framework" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:test-framework" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:test-framework" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:test-framework" @@ -15095,6 +15454,22 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:ltr" @@ -15176,68 +15551,42 @@ "projectPath" : ":solr:modules:sql" } ], - "b4755bf3" : [ - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:core" - }, + "b06ec8e0" : [ { "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:analysis-extras" + "projectPath" : ":solr:api" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:analysis-extras" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:analysis-extras" + "projectPath" : ":solr:api" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:analysis-extras" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:analysis-extras" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" + "projectPath" : ":solr:api" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hdfs" + "projectPath" : ":solr:api" }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:sql" - } - ], - "b57e9bf6" : [ { "configuration" : "compileClasspath", - "projectPath" : ":solr:api" + "projectPath" : ":solr:benchmark" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:api" + "projectPath" : ":solr:benchmark" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:api" + "projectPath" : ":solr:benchmark" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:api" - }, - { - "configuration" : "runtimeClasspath", "projectPath" : ":solr:benchmark" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:benchmark" + "configuration" : "compileClasspath", + "projectPath" : ":solr:core" }, { "configuration" : "runtimeClasspath", @@ -15247,10 +15596,18 @@ "configuration" : "runtimeLibs", "projectPath" : ":solr:core" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:core" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:core" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:cross-dc-manager" @@ -15263,10 +15620,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:cross-dc-manager" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:prometheus-exporter" @@ -15279,6 +15644,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:prometheus-exporter" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:prometheus-exporter" @@ -15291,38 +15660,74 @@ "configuration" : "solrCore", "projectPath" : ":solr:server" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solr-ref-guide" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solr-ref-guide" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:solrj" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:solrj" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:solrj-streaming" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:solrj-streaming" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj-streaming" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-streaming" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:solrj-zookeeper" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:solrj-zookeeper" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj-zookeeper" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-zookeeper" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:test-framework" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:test-framework" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:test-framework" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:test-framework" @@ -15331,6 +15736,10 @@ "configuration" : "solrCore", "projectPath" : ":solr:webapp" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:analysis-extras" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:analysis-extras" @@ -15343,10 +15752,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:analysis-extras" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:analysis-extras" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:analysis-extras" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:clustering" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:clustering" @@ -15359,10 +15776,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:clustering" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:clustering" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:clustering" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:cross-dc" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:cross-dc" @@ -15375,10 +15800,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:cross-dc" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:cross-dc" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:cross-dc" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:extraction" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:extraction" @@ -15391,10 +15824,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:extraction" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:extraction" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:extraction" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:gcs-repository" @@ -15407,10 +15848,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:gcs-repository" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:gcs-repository" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:hadoop-auth" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" @@ -15423,10 +15872,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hadoop-auth" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:hadoop-auth" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:hdfs" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hdfs" @@ -15439,10 +15896,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hdfs" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:hdfs" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hdfs" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:jwt-auth" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:jwt-auth" @@ -15455,10 +15920,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:jwt-auth" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:jwt-auth" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:jwt-auth" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:langid" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:langid" @@ -15471,10 +15944,42 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:langid" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:ltr" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:ltr" @@ -15487,10 +15992,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:ltr" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:ltr" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:ltr" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:opentelemetry" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:opentelemetry" @@ -15503,10 +16016,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:opentelemetry" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:opentelemetry" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:opentelemetry" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:s3-repository" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:s3-repository" @@ -15519,10 +16040,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:s3-repository" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:s3-repository" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:s3-repository" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:scripting" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:scripting" @@ -15535,10 +16064,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:scripting" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:scripting" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:scripting" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:sql" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:sql" @@ -15551,31 +16088,51 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:sql" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:sql" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:sql" } ], - "b6a343e2" : [ + "b4755bf3" : [ { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:jwt-auth" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:core" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:jwt-auth" + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:analysis-extras" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:modules:analysis-extras" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:modules:analysis-extras" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:analysis-extras" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:modules:analysis-extras" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:hadoop-auth" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:hdfs" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:sql" } ], "b6f115a3" : [ @@ -15620,15 +16177,31 @@ "projectPath" : ":solr:modules:langid" } ], - "bc8e8214" : [ + "b81650f5" : [ + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:api" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:api" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:api" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:benchmark" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:benchmark" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:benchmark" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:benchmark" @@ -15653,6 +16226,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:core" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:cross-dc-manager" @@ -15665,10 +16242,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:cross-dc-manager" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:prometheus-exporter" @@ -15681,33 +16266,81 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:prometheus-exporter" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:prometheus-exporter" }, { - "configuration" : "libExt", - "projectPath" : ":solr:server" + "configuration" : "libExt", + "projectPath" : ":solr:server" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:server" + }, + { + "configuration" : "serverLib", + "projectPath" : ":solr:server" + }, + { + "configuration" : "solrCore", + "projectPath" : ":solr:server" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solr-ref-guide" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solr-ref-guide" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:solrj" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:solrj" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solrj" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:solrj-streaming" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:server" + "projectPath" : ":solr:solrj-streaming" }, { - "configuration" : "solrCore", - "projectPath" : ":solr:server" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj-streaming" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solr-ref-guide" + "projectPath" : ":solr:solrj-streaming" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj" + "configuration" : "compileClasspath", + "projectPath" : ":solr:solrj-zookeeper" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj-streaming" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:solrj-zookeeper" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj-zookeeper" }, { "configuration" : "testRuntimeClasspath", @@ -15737,6 +16370,10 @@ "configuration" : "solrCore", "projectPath" : ":solr:webapp" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:analysis-extras" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:analysis-extras" @@ -15749,10 +16386,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:analysis-extras" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:analysis-extras" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:analysis-extras" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:clustering" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:clustering" @@ -15765,10 +16410,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:clustering" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:clustering" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:clustering" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:cross-dc" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:cross-dc" @@ -15781,6 +16434,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:cross-dc" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:cross-dc" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:cross-dc" @@ -15809,6 +16466,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:extraction" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:gcs-repository" @@ -15821,10 +16482,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:gcs-repository" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:gcs-repository" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:hadoop-auth" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" @@ -15837,10 +16506,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hadoop-auth" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:hadoop-auth" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:hdfs" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hdfs" @@ -15853,10 +16530,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hdfs" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:hdfs" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hdfs" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:jwt-auth" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:jwt-auth" @@ -15869,10 +16554,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:jwt-auth" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:jwt-auth" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:jwt-auth" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:langid" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:langid" @@ -15885,10 +16578,42 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:langid" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:ltr" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:ltr" @@ -15901,10 +16626,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:ltr" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:ltr" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:ltr" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:opentelemetry" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:opentelemetry" @@ -15917,10 +16650,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:opentelemetry" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:opentelemetry" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:opentelemetry" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:s3-repository" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:s3-repository" @@ -15933,10 +16674,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:s3-repository" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:s3-repository" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:s3-repository" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:scripting" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:scripting" @@ -15949,10 +16698,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:scripting" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:scripting" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:scripting" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:sql" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:sql" @@ -15965,12 +16722,16 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:sql" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:sql" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:sql" } ], - "bddbe009" : [ + "b8a8e11f" : [ { "configuration" : "annotationProcessor", "projectPath" : ":solr:api" @@ -15987,18 +16748,6 @@ "configuration" : "annotationProcessor", "projectPath" : ":solr:cross-dc-manager" }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, { "configuration" : "annotationProcessor", "projectPath" : ":solr:prometheus-exporter" @@ -16051,212 +16800,86 @@ "configuration" : "annotationProcessor", "projectPath" : ":solr:modules:gcs-repository" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:hadoop-auth" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:hdfs" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:jwt-auth" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:langid" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:ltr" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:opentelemetry" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:s3-repository" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:scripting" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:sql" - } - ], - "bf04d2b8" : [ - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:hadoop-auth" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:hadoop-auth" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hadoop-auth" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" - } - ], - "c1e4e901" : [ - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:jwt-auth" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:opentelemetry" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" - } - ], - "c6acb8a9" : [ - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:cross-dc-manager" - }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:gcs-repository" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:gcs-repository" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:cross-dc" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:hadoop-auth" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:cross-dc" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:hdfs" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:cross-dc" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:jwt-auth" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:cross-dc" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:langid" }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:cross-dc" - } - ], - "c718e885" : [ { "configuration" : "annotationProcessor", - "projectPath" : ":solr:benchmark" + "projectPath" : ":solr:modules:llm" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:benchmark" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:ltr" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:benchmark" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:opentelemetry" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:benchmark" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:s3-repository" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:benchmark" - } - ], - "c77c5ec7" : [ + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:scripting" + }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:jwt-auth" + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:sql" } ], - "cef2dbfe" : [ + "bf04d2b8" : [ { "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:gcs-repository" + "projectPath" : ":solr:modules:hadoop-auth" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" + "projectPath" : ":solr:modules:hadoop-auth" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:gcs-repository" + "projectPath" : ":solr:modules:hadoop-auth" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:modules:hadoop-auth" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:modules:hadoop-auth" } ], - "d008b72a" : [ - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:api" - }, + "c1d7515f" : [ { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:api" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:benchmark" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:benchmark" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:benchmark" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:benchmark" @@ -16281,10 +16904,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:core" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:cross-dc-manager" @@ -16298,19 +16917,19 @@ "projectPath" : ":solr:cross-dc-manager" }, { - "configuration" : "testCompileClasspath", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:cross-dc-manager" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:prometheus-exporter" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "runtimeLibs", "projectPath" : ":solr:prometheus-exporter" }, { - "configuration" : "testCompileClasspath", + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:prometheus-exporter" }, { @@ -16318,45 +16937,29 @@ "projectPath" : ":solr:prometheus-exporter" }, { - "configuration" : "runtimeClasspath", + "configuration" : "libExt", "projectPath" : ":solr:server" }, { - "configuration" : "serverLib", + "configuration" : "runtimeClasspath", "projectPath" : ":solr:server" }, { "configuration" : "solrCore", "projectPath" : ":solr:server" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solr-ref-guide" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solr-ref-guide" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj-streaming" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-streaming" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj-zookeeper" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-zookeeper" @@ -16397,10 +17000,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:analysis-extras" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:analysis-extras" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:analysis-extras" @@ -16417,10 +17016,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:clustering" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:clustering" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:clustering" @@ -16438,12 +17033,12 @@ "projectPath" : ":solr:modules:cross-dc" }, { - "configuration" : "testCompileClasspath", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:cross-dc" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:cross-dc" + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:extraction" }, { "configuration" : "runtimeClasspath", @@ -16477,10 +17072,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:gcs-repository" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:gcs-repository" @@ -16497,10 +17088,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hadoop-auth" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hadoop-auth" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" @@ -16517,10 +17104,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hdfs" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hdfs" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hdfs" @@ -16537,10 +17120,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:jwt-auth" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:jwt-auth" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:jwt-auth" @@ -16558,12 +17137,24 @@ "projectPath" : ":solr:modules:langid" }, { - "configuration" : "testCompileClasspath", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:langid" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "runtimeClasspath", @@ -16577,10 +17168,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:ltr" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:ltr" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:ltr" @@ -16597,10 +17184,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:opentelemetry" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:opentelemetry" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:opentelemetry" @@ -16617,10 +17200,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:s3-repository" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:s3-repository" @@ -16637,10 +17216,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:scripting" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:scripting" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:scripting" @@ -16657,22 +17232,104 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:sql" }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:sql" + } + ], + "c1e4e901" : [ + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:jwt-auth" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:opentelemetry" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:opentelemetry" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:opentelemetry" + } + ], + "c6acb8a9" : [ + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:cross-dc" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:cross-dc" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:cross-dc" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:cross-dc" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:cross-dc" + } + ], + "c718e885" : [ + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:benchmark" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:benchmark" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:benchmark" + }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:sql" + "projectPath" : ":solr:benchmark" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:sql" + "projectPath" : ":solr:benchmark" } ], - "d3d191b2" : [ + "c77c5ec7" : [ { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:sql" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:jwt-auth" } ], - "dc28f153" : [ + "c78ca00d" : [ { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:api" @@ -16685,68 +17342,28 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:benchmark" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:core" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:core" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:core" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:core" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:core" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:cross-dc-manager" - }, { "configuration" : "solrPlatformLibs", "projectPath" : ":solr:cross-dc-manager" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:prometheus-exporter" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:prometheus-exporter" }, - { - "configuration" : "libExt", - "projectPath" : ":solr:server" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:server" }, { - "configuration" : "solrCore", + "configuration" : "serverLib", "projectPath" : ":solr:server" }, { @@ -16765,10 +17382,18 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-zookeeper" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:test-framework" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:test-framework" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:test-framework" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:test-framework" @@ -16778,272 +17403,324 @@ "projectPath" : ":solr:webapp" }, { - "configuration" : "solrCore", - "projectPath" : ":solr:webapp" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:analysis-extras" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:analysis-extras" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:clustering" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:analysis-extras" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:cross-dc" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:analysis-extras" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:extraction" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:analysis-extras" + "projectPath" : ":solr:modules:gcs-repository" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:clustering" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:hadoop-auth" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:clustering" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:hdfs" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:clustering" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:jwt-auth" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:clustering" + "projectPath" : ":solr:modules:langid" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:cross-dc" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:cross-dc" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:ltr" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:cross-dc" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:opentelemetry" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:cross-dc" + "projectPath" : ":solr:modules:s3-repository" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:extraction" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:scripting" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:extraction" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:sql" + } + ], + "cca27357" : [ + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:cross-dc-manager" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:extraction" + "projectPath" : ":solr:prometheus-exporter" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:extraction" + "configuration" : "libExt", + "projectPath" : ":solr:server" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" + "projectPath" : ":solr:server" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:gcs-repository" + "configuration" : "serverLib", + "projectPath" : ":solr:webapp" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:gcs-repository" + "projectPath" : ":solr:modules:analysis-extras" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:clustering" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:cross-dc" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:hadoop-auth" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:extraction" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:hadoop-auth" + "projectPath" : ":solr:modules:gcs-repository" }, { - "configuration" : "testRuntimeClasspath", + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hadoop-auth" }, { - "configuration" : "runtimeClasspath", + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hdfs" }, { - "configuration" : "runtimeLibs", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hdfs" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:hdfs" + "projectPath" : ":solr:modules:jwt-auth" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hdfs" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:langid" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:ltr" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:opentelemetry" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:s3-repository" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:scripting" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:sql" + } + ], + "cef2dbfe" : [ + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:gcs-repository" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:jwt-auth" + "projectPath" : ":solr:modules:gcs-repository" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:jwt-auth" + "projectPath" : ":solr:modules:gcs-repository" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:jwt-auth" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:gcs-repository" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:jwt-auth" + "projectPath" : ":solr:modules:gcs-repository" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:langid" + "projectPath" : ":solr:modules:opentelemetry" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:langid" + "projectPath" : ":solr:modules:opentelemetry" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:opentelemetry" + } + ], + "cf56dae9" : [ + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:cross-dc-manager" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:langid" + "projectPath" : ":solr:prometheus-exporter" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:langid" + "configuration" : "libExt", + "projectPath" : ":solr:server" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:ltr" + "projectPath" : ":solr:server" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:ltr" + "configuration" : "serverLib", + "projectPath" : ":solr:webapp" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:ltr" + "projectPath" : ":solr:modules:analysis-extras" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:ltr" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:clustering" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:cross-dc" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:extraction" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:modules:extraction" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:modules:extraction" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:extraction" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:modules:extraction" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:s3-repository" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:hadoop-auth" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:s3-repository" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:hdfs" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:s3-repository" + "projectPath" : ":solr:modules:jwt-auth" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:s3-repository" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:langid" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:scripting" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:scripting" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:ltr" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:scripting" + "projectPath" : ":solr:modules:opentelemetry" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:scripting" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:s3-repository" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:sql" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:s3-repository" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:sql" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:s3-repository" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:sql" + "projectPath" : ":solr:modules:scripting" }, { - "configuration" : "testRuntimeClasspath", + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:sql" } ], - "dd724fae" : [ + "d1cd69a5" : [ { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:api" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:gcs-repository" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:api" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" + "configuration" : "compileClasspath", + "projectPath" : ":solr:benchmark" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:benchmark" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:opentelemetry" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:benchmark" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" - } - ], - "ddc123c8" : [ - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:api" - }, - { - "configuration" : "runtimeClasspath", "projectPath" : ":solr:benchmark" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:benchmark" + "configuration" : "compileClasspath", + "projectPath" : ":solr:core" }, { "configuration" : "runtimeClasspath", @@ -17053,10 +17730,18 @@ "configuration" : "runtimeLibs", "projectPath" : ":solr:core" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:core" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:core" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:cross-dc-manager" @@ -17069,14 +17754,34 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:cross-dc-manager" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:prometheus-exporter" + }, { "configuration" : "solrPlatformLibs", "projectPath" : ":solr:prometheus-exporter" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:prometheus-exporter" @@ -17089,26 +17794,58 @@ "configuration" : "solrCore", "projectPath" : ":solr:server" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solr-ref-guide" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solr-ref-guide" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj-streaming" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-streaming" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:solrj-zookeeper" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:solrj-zookeeper" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj-zookeeper" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-zookeeper" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:test-framework" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:test-framework" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:test-framework" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:test-framework" @@ -17117,6 +17854,10 @@ "configuration" : "solrCore", "projectPath" : ":solr:webapp" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:analysis-extras" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:analysis-extras" @@ -17129,10 +17870,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:analysis-extras" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:analysis-extras" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:analysis-extras" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:clustering" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:clustering" @@ -17145,10 +17894,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:clustering" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:clustering" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:clustering" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:cross-dc" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:cross-dc" @@ -17161,6 +17918,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:cross-dc" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:cross-dc" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:cross-dc" @@ -17189,6 +17950,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:extraction" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:gcs-repository" @@ -17201,10 +17966,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:gcs-repository" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:gcs-repository" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:hadoop-auth" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" @@ -17217,10 +17990,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hadoop-auth" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:hadoop-auth" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:hdfs" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hdfs" @@ -17233,10 +18014,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hdfs" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:hdfs" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hdfs" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:jwt-auth" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:jwt-auth" @@ -17257,6 +18046,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:jwt-auth" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:langid" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:langid" @@ -17269,130 +18062,180 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:langid" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:llm" + }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:ltr" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:ltr" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:ltr" + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:llm" }, { "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "compileClasspath", "projectPath" : ":solr:modules:ltr" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:modules:ltr" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:modules:ltr" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:modules:ltr" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:ltr" }, { "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:ltr" + }, + { + "configuration" : "compileClasspath", "projectPath" : ":solr:modules:opentelemetry" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:s3-repository" + "projectPath" : ":solr:modules:opentelemetry" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:s3-repository" + "projectPath" : ":solr:modules:opentelemetry" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:s3-repository" + "projectPath" : ":solr:modules:opentelemetry" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:opentelemetry" }, { "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:opentelemetry" + }, + { + "configuration" : "compileClasspath", "projectPath" : ":solr:modules:s3-repository" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:scripting" + "projectPath" : ":solr:modules:s3-repository" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:scripting" + "projectPath" : ":solr:modules:s3-repository" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:scripting" + "projectPath" : ":solr:modules:s3-repository" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:s3-repository" }, { "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:s3-repository" + }, + { + "configuration" : "compileClasspath", "projectPath" : ":solr:modules:scripting" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:sql" + "projectPath" : ":solr:modules:scripting" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:sql" + "projectPath" : ":solr:modules:scripting" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:sql" + "projectPath" : ":solr:modules:scripting" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:sql" - } - ], - "debe9836" : [ + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:scripting" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:scripting" + }, { "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:extraction" + "projectPath" : ":solr:modules:sql" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:extraction" + "projectPath" : ":solr:modules:sql" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:extraction" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:extraction" + "projectPath" : ":solr:modules:sql" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:extraction" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:sql" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:s3-repository" + "projectPath" : ":solr:modules:sql" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:s3-repository" + "projectPath" : ":solr:modules:sql" } ], - "e19ba4dc" : [ + "d2bb9bb7" : [ + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:api" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:api" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:benchmark" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:benchmark" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:benchmark" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:benchmark" @@ -17417,6 +18260,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:core" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:cross-dc-manager" @@ -17430,20 +18277,12 @@ "projectPath" : ":solr:cross-dc-manager" }, { - "configuration" : "testRuntimeClasspath", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:cross-dc-manager" }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:prometheus-exporter" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:cross-dc-manager" }, { "configuration" : "solrPlatformLibs", @@ -17457,6 +18296,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:prometheus-exporter" }, + { + "configuration" : "libExt", + "projectPath" : ":solr:server" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:server" @@ -17465,18 +18308,34 @@ "configuration" : "solrCore", "projectPath" : ":solr:server" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solr-ref-guide" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solr-ref-guide" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj-streaming" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-streaming" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:solrj-zookeeper" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-zookeeper" @@ -17497,10 +18356,18 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:test-framework" }, + { + "configuration" : "serverLib", + "projectPath" : ":solr:webapp" + }, { "configuration" : "solrCore", "projectPath" : ":solr:webapp" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:analysis-extras" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:analysis-extras" @@ -17513,10 +18380,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:analysis-extras" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:analysis-extras" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:analysis-extras" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:clustering" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:clustering" @@ -17529,10 +18404,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:clustering" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:clustering" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:clustering" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:cross-dc" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:cross-dc" @@ -17545,10 +18428,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:cross-dc" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:cross-dc" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:cross-dc" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:extraction" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:extraction" @@ -17561,10 +18452,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:extraction" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:extraction" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:extraction" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:gcs-repository" @@ -17577,10 +18476,18 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:gcs-repository" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:gcs-repository" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:hadoop-auth" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" @@ -17593,6 +18500,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hadoop-auth" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:hadoop-auth" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" @@ -17622,325 +18533,205 @@ "projectPath" : ":solr:modules:hdfs" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:jwt-auth" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:jwt-auth" - }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:jwt-auth" - }, - { - "configuration" : "testRuntimeClasspath", + "configuration" : "compileClasspath", "projectPath" : ":solr:modules:jwt-auth" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:langid" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:langid" - }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:langid" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:langid" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:ltr" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:ltr" - }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:ltr" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:ltr" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:opentelemetry" - }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:opentelemetry" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:s3-repository" - }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:s3-repository" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:scripting" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:scripting" - }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:scripting" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:scripting" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:sql" + "projectPath" : ":solr:modules:jwt-auth" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:sql" + "projectPath" : ":solr:modules:jwt-auth" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:sql" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:sql" - } - ], - "e2f3f42e" : [ - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:extraction" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:extraction" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:extraction" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:s3-repository" - } - ], - "e5b524d7" : [ - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:api" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:benchmark" + "projectPath" : ":solr:modules:jwt-auth" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:core" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:jwt-auth" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:cross-dc-manager" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:jwt-auth" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:prometheus-exporter" + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:langid" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:server" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:langid" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:solr-ref-guide" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:langid" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:solrj" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:langid" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:solrj-streaming" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:langid" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:solrj-zookeeper" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:langid" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:test-framework" + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:llm" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:webapp" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:analysis-extras" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:clustering" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:cross-dc" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:llm" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:extraction" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:gcs-repository" + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:ltr" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:hadoop-auth" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:ltr" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:hdfs" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:ltr" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:jwt-auth" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:ltr" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:langid" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:ltr" }, { - "configuration" : "annotationProcessor", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:ltr" }, { - "configuration" : "annotationProcessor", + "configuration" : "compileClasspath", "projectPath" : ":solr:modules:opentelemetry" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:s3-repository" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:opentelemetry" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:scripting" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:opentelemetry" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:sql" - } - ], - "e6d93f27" : [ + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:opentelemetry" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:opentelemetry" + }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:core" + "projectPath" : ":solr:modules:opentelemetry" }, { "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:analysis-extras" + "projectPath" : ":solr:modules:s3-repository" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:analysis-extras" + "projectPath" : ":solr:modules:s3-repository" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:analysis-extras" + "projectPath" : ":solr:modules:s3-repository" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:s3-repository" }, { "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:analysis-extras" + "projectPath" : ":solr:modules:s3-repository" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:analysis-extras" + "projectPath" : ":solr:modules:s3-repository" }, { "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:extraction" + "projectPath" : ":solr:modules:scripting" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:extraction" + "projectPath" : ":solr:modules:scripting" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:extraction" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:extraction" + "projectPath" : ":solr:modules:scripting" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:extraction" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:scripting" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:scripting" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hdfs" + "projectPath" : ":solr:modules:scripting" }, { "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:langid" + "projectPath" : ":solr:modules:sql" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:langid" + "projectPath" : ":solr:modules:sql" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:langid" + "projectPath" : ":solr:modules:sql" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:langid" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:sql" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:langid" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:sql" }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:sql" } ], - "e80f7a3a" : [ + "d3d191b2" : [ { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:api" - }, + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:sql" + } + ], + "d3fc6f71" : [ { "configuration" : "testCompileClasspath", "projectPath" : ":solr:api" @@ -17949,10 +18740,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:api" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:benchmark" - }, { "configuration" : "compileClasspath", "projectPath" : ":solr:benchmark" @@ -17969,10 +18756,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:benchmark" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:core" - }, { "configuration" : "compileClasspath", "projectPath" : ":solr:core" @@ -17993,10 +18776,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:core" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:cross-dc-manager" - }, { "configuration" : "compileClasspath", "projectPath" : ":solr:cross-dc-manager" @@ -18021,10 +18800,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:prometheus-exporter" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:prometheus-exporter" @@ -18045,10 +18820,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:prometheus-exporter" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:server" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:server" @@ -18057,10 +18828,6 @@ "configuration" : "solrCore", "projectPath" : ":solr:server" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:solr-ref-guide" - }, { "configuration" : "testCompileClasspath", "projectPath" : ":solr:solr-ref-guide" @@ -18069,10 +18836,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solr-ref-guide" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:solrj" - }, { "configuration" : "testCompileClasspath", "projectPath" : ":solr:solrj" @@ -18081,10 +18844,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:solrj-streaming" - }, { "configuration" : "testCompileClasspath", "projectPath" : ":solr:solrj-streaming" @@ -18093,10 +18852,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-streaming" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:solrj-zookeeper" - }, { "configuration" : "compileClasspath", "projectPath" : ":solr:solrj-zookeeper" @@ -18113,10 +18868,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-zookeeper" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:test-framework" - }, { "configuration" : "compileClasspath", "projectPath" : ":solr:test-framework" @@ -18133,18 +18884,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:test-framework" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:webapp" - }, { "configuration" : "solrCore", "projectPath" : ":solr:webapp" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:analysis-extras" - }, { "configuration" : "compileClasspath", "projectPath" : ":solr:modules:analysis-extras" @@ -18169,10 +18912,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:analysis-extras" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:clustering" - }, { "configuration" : "compileClasspath", "projectPath" : ":solr:modules:clustering" @@ -18197,10 +18936,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:clustering" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:cross-dc" - }, { "configuration" : "compileClasspath", "projectPath" : ":solr:modules:cross-dc" @@ -18225,10 +18960,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:cross-dc" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:extraction" - }, { "configuration" : "compileClasspath", "projectPath" : ":solr:modules:extraction" @@ -18253,10 +18984,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:extraction" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:gcs-repository" - }, { "configuration" : "compileClasspath", "projectPath" : ":solr:modules:gcs-repository" @@ -18281,10 +19008,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:gcs-repository" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:hadoop-auth" - }, { "configuration" : "compileClasspath", "projectPath" : ":solr:modules:hadoop-auth" @@ -18309,10 +19032,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hadoop-auth" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:hdfs" - }, { "configuration" : "compileClasspath", "projectPath" : ":solr:modules:hdfs" @@ -18337,10 +19056,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hdfs" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:jwt-auth" - }, { "configuration" : "compileClasspath", "projectPath" : ":solr:modules:jwt-auth" @@ -18365,10 +19080,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:jwt-auth" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:langid" - }, { "configuration" : "compileClasspath", "projectPath" : ":solr:modules:langid" @@ -18394,8 +19105,28 @@ "projectPath" : ":solr:modules:langid" }, { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:ltr" + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" }, { "configuration" : "compileClasspath", @@ -18417,13 +19148,9 @@ "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:ltr" }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:ltr" - }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:opentelemetry" + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:ltr" }, { "configuration" : "compileClasspath", @@ -18449,10 +19176,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:opentelemetry" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:s3-repository" - }, { "configuration" : "compileClasspath", "projectPath" : ":solr:modules:s3-repository" @@ -18477,10 +19200,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:s3-repository" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:scripting" - }, { "configuration" : "compileClasspath", "projectPath" : ":solr:modules:scripting" @@ -18505,10 +19224,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:scripting" }, - { - "configuration" : "annotationProcessor", - "projectPath" : ":solr:modules:sql" - }, { "configuration" : "compileClasspath", "projectPath" : ":solr:modules:sql" @@ -18534,47 +19249,7 @@ "projectPath" : ":solr:modules:sql" } ], - "e972cbed" : [ - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:hadoop-auth" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hdfs" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hdfs" - } - ], - "e9990913" : [ - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:core" - }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:solrj" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:jwt-auth" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:jwt-auth" - } - ], - "ebd3db47" : [ + "da3f05dc" : [ { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:api" @@ -18587,6 +19262,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:benchmark" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:core" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:core" @@ -18595,6 +19274,10 @@ "configuration" : "runtimeLibs", "projectPath" : ":solr:core" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:core" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:core" @@ -18707,6 +19390,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:cross-dc" }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:extraction" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:extraction" @@ -18719,6 +19406,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:extraction" }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:extraction" + }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:extraction" @@ -18803,6 +19494,22 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:ltr" @@ -18845,138 +19552,304 @@ }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:s3-repository" + "projectPath" : ":solr:modules:s3-repository" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:s3-repository" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:s3-repository" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:scripting" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:scripting" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:scripting" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:scripting" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:sql" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:sql" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:sql" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:sql" + } + ], + "dd724fae" : [ + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:opentelemetry" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:opentelemetry" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:opentelemetry" + } + ], + "debe9836" : [ + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:s3-repository" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:s3-repository" + } + ], + "ded3e8b1" : [ + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:api" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:benchmark" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:benchmark" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:core" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:prometheus-exporter" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, + { + "configuration" : "libExt", + "projectPath" : ":solr:server" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:server" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solr-ref-guide" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solrj" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solrj-streaming" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solrj-zookeeper" + }, + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:test-framework" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:test-framework" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:test-framework" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:test-framework" + }, + { + "configuration" : "serverLib", + "projectPath" : ":solr:webapp" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:analysis-extras" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:s3-repository" + "projectPath" : ":solr:modules:analysis-extras" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:scripting" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:clustering" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:scripting" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:clustering" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:scripting" + "projectPath" : ":solr:modules:cross-dc" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:scripting" + "projectPath" : ":solr:modules:cross-dc" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:sql" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:extraction" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:sql" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:extraction" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:sql" + "projectPath" : ":solr:modules:gcs-repository" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:sql" - } - ], - "ef8aea8b" : [ + "projectPath" : ":solr:modules:gcs-repository" + }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:core" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:hadoop-auth" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:solrj" + "projectPath" : ":solr:modules:hadoop-auth" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:analysis-extras" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:hdfs" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" + "projectPath" : ":solr:modules:hdfs" }, { - "configuration" : "testRuntimeClasspath", + "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:jwt-auth" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:ltr" + "projectPath" : ":solr:modules:jwt-auth" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:s3-repository" - } - ], - "f493e7bb" : [ - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:cross-dc-manager" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:langid" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:cross-dc-manager" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:langid" }, { "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:llm" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:modules:llm" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:cross-dc" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:ltr" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:cross-dc" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:ltr" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:cross-dc" - } - ], - "f5acb352" : [ + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:opentelemetry" + }, { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:clustering" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:opentelemetry" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:clustering" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:s3-repository" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:clustering" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:s3-repository" }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:clustering" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:scripting" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:clustering" - } - ], - "f7508386" : [ + "projectPath" : ":solr:modules:scripting" + }, { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hadoop-auth" + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:sql" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" + "projectPath" : ":solr:modules:sql" } ], - "f83d8628" : [ + "e0b9f913" : [ { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:api" @@ -18989,10 +19862,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:benchmark" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:core" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:core" @@ -19001,18 +19870,10 @@ "configuration" : "runtimeLibs", "projectPath" : ":solr:core" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:core" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:core" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:cross-dc-manager" @@ -19025,34 +19886,14 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:cross-dc-manager" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:cross-dc-manager" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:prometheus-exporter" - }, { "configuration" : "solrPlatformLibs", "projectPath" : ":solr:prometheus-exporter" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:prometheus-exporter" @@ -19069,34 +19910,14 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solr-ref-guide" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:solrj" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:solrj" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj" }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:solrj-streaming" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-streaming" }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:solrj-zookeeper" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-zookeeper" @@ -19269,6 +20090,22 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:ltr" @@ -19313,10 +20150,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:s3-repository" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:s3-repository" @@ -19337,10 +20170,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:scripting" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:sql" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:sql" @@ -19353,47 +20182,97 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:sql" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:sql" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:sql" } ], - "f9ff6c21" : [ + "e2f3f42e" : [ { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:api" + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:extraction" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:benchmark" + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:extraction" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:benchmark" + "projectPath" : ":solr:modules:extraction" }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:s3-repository" + } + ], + "e972cbed" : [ { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:core" + "projectPath" : ":solr:modules:hadoop-auth" }, { "configuration" : "runtimeLibs", - "projectPath" : ":solr:core" + "projectPath" : ":solr:modules:hadoop-auth" }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:hadoop-auth" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:hdfs" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:hdfs" + } + ], + "ef8aea8b" : [ { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:core" }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solrj" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:analysis-extras" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:hadoop-auth" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:jwt-auth" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:ltr" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:s3-repository" + } + ], + "f0c62c51" : [ + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:api" + }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:cross-dc-manager" + "projectPath" : ":solr:benchmark" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:benchmark" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:cross-dc-manager" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:core" }, { "configuration" : "solrPlatformLibs", @@ -19403,18 +20282,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:prometheus-exporter" - }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:prometheus-exporter" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:prometheus-exporter" @@ -19424,41 +20291,21 @@ "projectPath" : ":solr:server" }, { - "configuration" : "solrCore", + "configuration" : "serverLib", "projectPath" : ":solr:server" }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solr-ref-guide" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:solrj" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:solrj" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj" }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:solrj-streaming" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-streaming" }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:solrj-zookeeper" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-zookeeper" @@ -19472,216 +20319,190 @@ "projectPath" : ":solr:test-framework" }, { - "configuration" : "solrCore", + "configuration" : "serverLib", "projectPath" : ":solr:webapp" }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:analysis-extras" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:analysis-extras" - }, - { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:analysis-extras" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:analysis-extras" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:clustering" - }, - { - "configuration" : "runtimeLibs", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:clustering" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:clustering" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:cross-dc" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:clustering" + "projectPath" : ":solr:modules:extraction" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:cross-dc" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:gcs-repository" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:cross-dc" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:hadoop-auth" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:cross-dc" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:hdfs" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:cross-dc" + "projectPath" : ":solr:modules:jwt-auth" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:extraction" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:langid" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:extraction" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:extraction" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:ltr" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:extraction" + "projectPath" : ":solr:modules:opentelemetry" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:s3-repository" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:gcs-repository" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:scripting" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:gcs-repository" - }, + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:sql" + } + ], + "f10d70d0" : [ { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:gcs-repository" + "projectPath" : ":solr:api" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" + "projectPath" : ":solr:benchmark" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:hadoop-auth" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:benchmark" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:hadoop-auth" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:core" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hadoop-auth" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:hdfs" + "projectPath" : ":solr:core" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:hdfs" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:cross-dc-manager" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:hdfs" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:prometheus-exporter" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:hdfs" + "projectPath" : ":solr:solr-ref-guide" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:jwt-auth" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solrj" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:jwt-auth" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solrj-streaming" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:jwt-auth" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:solrj-zookeeper" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:jwt-auth" + "configuration" : "compileClasspath", + "projectPath" : ":solr:test-framework" }, { "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:langid" + "projectPath" : ":solr:test-framework" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:langid" + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:test-framework" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:langid" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:test-framework" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:langid" + "projectPath" : ":solr:modules:analysis-extras" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:ltr" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:clustering" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:ltr" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:cross-dc" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:ltr" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:extraction" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:ltr" + "projectPath" : ":solr:modules:gcs-repository" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:hadoop-auth" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:opentelemetry" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:hdfs" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:opentelemetry" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:jwt-auth" }, { "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:opentelemetry" + "projectPath" : ":solr:modules:langid" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:s3-repository" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" }, { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:s3-repository" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:ltr" }, { - "configuration" : "solrPlatformLibs", - "projectPath" : ":solr:modules:s3-repository" + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:opentelemetry" }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:s3-repository" }, { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:modules:scripting" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:modules:scripting" - }, - { - "configuration" : "solrPlatformLibs", + "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:scripting" }, { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:modules:scripting" + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:sql" }, { "configuration" : "runtimeClasspath", @@ -19692,7 +20513,7 @@ "projectPath" : ":solr:modules:sql" }, { - "configuration" : "solrPlatformLibs", + "configuration" : "testCompileClasspath", "projectPath" : ":solr:modules:sql" }, { @@ -19700,45 +20521,15 @@ "projectPath" : ":solr:modules:sql" } ], - "fa7556ff" : [ - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, - { - "configuration" : "runtimeClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, - { - "configuration" : "runtimeLibs", - "projectPath" : ":solr:prometheus-exporter" - }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, - { - "configuration" : "testRuntimeClasspath", - "projectPath" : ":solr:prometheus-exporter" - } - ], - "fed35e7f" : [ + "f192e0a0" : [ { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:api" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:benchmark" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:benchmark" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:benchmark" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:benchmark" @@ -19779,10 +20570,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:cross-dc-manager" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:prometheus-exporter" @@ -19795,10 +20582,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:prometheus-exporter" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:prometheus-exporter" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:prometheus-exporter" @@ -19831,18 +20614,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:solrj-streaming" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:solrj-streaming" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:solrj-streaming" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-streaming" @@ -19855,18 +20630,10 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:solrj-zookeeper" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:test-framework" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:test-framework" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:test-framework" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:test-framework" @@ -19907,10 +20674,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:clustering" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:cross-dc" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:cross-dc" @@ -19923,18 +20686,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:cross-dc" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:cross-dc" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:cross-dc" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:extraction" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:extraction" @@ -19947,18 +20702,10 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:extraction" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:extraction" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:extraction" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:gcs-repository" @@ -19971,10 +20718,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:gcs-repository" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:gcs-repository" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:gcs-repository" @@ -20015,10 +20758,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:hdfs" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:hdfs" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:hdfs" @@ -20063,6 +20802,22 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:langid" }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:llm" + }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:ltr" @@ -20095,10 +20850,6 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:opentelemetry" }, - { - "configuration" : "compileClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, { "configuration" : "runtimeClasspath", "projectPath" : ":solr:modules:s3-repository" @@ -20111,10 +20862,6 @@ "configuration" : "solrPlatformLibs", "projectPath" : ":solr:modules:s3-repository" }, - { - "configuration" : "testCompileClasspath", - "projectPath" : ":solr:modules:s3-repository" - }, { "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:s3-repository" @@ -20151,6 +20898,200 @@ "configuration" : "testRuntimeClasspath", "projectPath" : ":solr:modules:sql" } + ], + "f493e7bb" : [ + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "solrPlatformLibs", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:cross-dc" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:cross-dc" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:cross-dc" + } + ], + "f5acb352" : [ + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:modules:clustering" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:modules:clustering" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:modules:clustering" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:clustering" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:clustering" + } + ], + "f7508386" : [ + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:modules:hadoop-auth" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:modules:hadoop-auth" + } + ], + "f7d7775a" : [ + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:api" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:benchmark" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:core" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:cross-dc-manager" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:prometheus-exporter" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:server" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:solr-ref-guide" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:solrj" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:solrj-streaming" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:solrj-zookeeper" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:test-framework" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:webapp" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:analysis-extras" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:clustering" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:cross-dc" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:extraction" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:gcs-repository" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:hadoop-auth" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:hdfs" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:jwt-auth" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:langid" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:llm" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:ltr" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:opentelemetry" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:s3-repository" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:scripting" + }, + { + "configuration" : "annotationProcessor", + "projectPath" : ":solr:modules:sql" + } + ], + "fa7556ff" : [ + { + "configuration" : "compileClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, + { + "configuration" : "runtimeClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, + { + "configuration" : "runtimeLibs", + "projectPath" : ":solr:prometheus-exporter" + }, + { + "configuration" : "testCompileClasspath", + "projectPath" : ":solr:prometheus-exporter" + }, + { + "configuration" : "testRuntimeClasspath", + "projectPath" : ":solr:prometheus-exporter" + } ] } } \ No newline at end of file From 79e6e7dcb33cc3a56eb504e53e5e2fcb28bc787a Mon Sep 17 00:00:00 2001 From: Christos Malliaridis Date: Tue, 19 Nov 2024 18:27:59 +0100 Subject: [PATCH 55/65] Merge langchain4j license and notice files --- .../langchain4j-cohere-LICENSE-ASL.txt | 202 ------------------ solr/licenses/langchain4j-cohere-NOTICE.txt | 13 -- .../langchain4j-hugging-face-LICENSE-ASL.txt | 202 ------------------ .../langchain4j-hugging-face-NOTICE.txt | 13 -- .../langchain4j-mistral-ai-LICENSE-ASL.txt | 202 ------------------ .../langchain4j-open-ai-LICENSE-ASL.txt | 202 ------------------ solr/licenses/langchain4j-open-ai-NOTICE.txt | 13 -- 7 files changed, 847 deletions(-) delete mode 100644 solr/licenses/langchain4j-cohere-LICENSE-ASL.txt delete mode 100644 solr/licenses/langchain4j-cohere-NOTICE.txt delete mode 100644 solr/licenses/langchain4j-hugging-face-LICENSE-ASL.txt delete mode 100644 solr/licenses/langchain4j-hugging-face-NOTICE.txt delete mode 100644 solr/licenses/langchain4j-mistral-ai-LICENSE-ASL.txt delete mode 100644 solr/licenses/langchain4j-open-ai-LICENSE-ASL.txt delete mode 100644 solr/licenses/langchain4j-open-ai-NOTICE.txt diff --git a/solr/licenses/langchain4j-cohere-LICENSE-ASL.txt b/solr/licenses/langchain4j-cohere-LICENSE-ASL.txt deleted file mode 100644 index a12e3073373..00000000000 --- a/solr/licenses/langchain4j-cohere-LICENSE-ASL.txt +++ /dev/null @@ -1,202 +0,0 @@ -Apache License - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/solr/licenses/langchain4j-cohere-NOTICE.txt b/solr/licenses/langchain4j-cohere-NOTICE.txt deleted file mode 100644 index be32f8a2f46..00000000000 --- a/solr/licenses/langchain4j-cohere-NOTICE.txt +++ /dev/null @@ -1,13 +0,0 @@ -The goal of LangChain4j is to simplify integrating LLMs into Java applications. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - https://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. \ No newline at end of file diff --git a/solr/licenses/langchain4j-hugging-face-LICENSE-ASL.txt b/solr/licenses/langchain4j-hugging-face-LICENSE-ASL.txt deleted file mode 100644 index a12e3073373..00000000000 --- a/solr/licenses/langchain4j-hugging-face-LICENSE-ASL.txt +++ /dev/null @@ -1,202 +0,0 @@ -Apache License - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/solr/licenses/langchain4j-hugging-face-NOTICE.txt b/solr/licenses/langchain4j-hugging-face-NOTICE.txt deleted file mode 100644 index be32f8a2f46..00000000000 --- a/solr/licenses/langchain4j-hugging-face-NOTICE.txt +++ /dev/null @@ -1,13 +0,0 @@ -The goal of LangChain4j is to simplify integrating LLMs into Java applications. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - https://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. \ No newline at end of file diff --git a/solr/licenses/langchain4j-mistral-ai-LICENSE-ASL.txt b/solr/licenses/langchain4j-mistral-ai-LICENSE-ASL.txt deleted file mode 100644 index a12e3073373..00000000000 --- a/solr/licenses/langchain4j-mistral-ai-LICENSE-ASL.txt +++ /dev/null @@ -1,202 +0,0 @@ -Apache License - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/solr/licenses/langchain4j-open-ai-LICENSE-ASL.txt b/solr/licenses/langchain4j-open-ai-LICENSE-ASL.txt deleted file mode 100644 index a12e3073373..00000000000 --- a/solr/licenses/langchain4j-open-ai-LICENSE-ASL.txt +++ /dev/null @@ -1,202 +0,0 @@ -Apache License - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/solr/licenses/langchain4j-open-ai-NOTICE.txt b/solr/licenses/langchain4j-open-ai-NOTICE.txt deleted file mode 100644 index be32f8a2f46..00000000000 --- a/solr/licenses/langchain4j-open-ai-NOTICE.txt +++ /dev/null @@ -1,13 +0,0 @@ -The goal of LangChain4j is to simplify integrating LLMs into Java applications. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - https://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. \ No newline at end of file From bc1c5471abdf7ccbaee851da71377fbcb07b325f Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Thu, 21 Nov 2024 08:05:54 +0000 Subject: [PATCH 56/65] fixing tests --- .../llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml b/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml index 030b312b049..2614b8e3f1c 100644 --- a/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml +++ b/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml @@ -14,7 +14,7 @@ ${tests.luceneMatchVersion:LATEST} ${solr.data.dir:} + class="${solr.directoryFactory:solr.MockDirectoryFactory}" /> From 42b54a71dc044ff919a1b7d651fd61b39025f353 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Fri, 29 Nov 2024 12:03:28 +0000 Subject: [PATCH 57/65] Update solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc Co-authored-by: David Smiley --- .../modules/query-guide/pages/embedding-text.adoc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc b/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc index a2388d65d94..7bea7e09fc8 100644 --- a/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc +++ b/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc @@ -16,7 +16,8 @@ // specific language governing permissions and limitations // under the License. -With the *Large Language Model* (or *LLM* for short) module you can interact with Large Language Models in Solr to encode text to vectors at indexing and query time. +This module brings the power of *Large Language Models* (*LLM*s) to Solr. More specifically, it provides a text-to-vector capability, used on documents or queries, via integrating with popular external services that do this. The state-of-the-art of such services use an LLM, hence the name of this module. +_Without_ this module, vectors must be supplied _to_ Solr for indexing & searching, possibly coordinating with such services. == Text Embedding Concepts From ccd9a8b5e5dc463fa581deab88e494c16e3a8776 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Fri, 29 Nov 2024 12:04:37 +0000 Subject: [PATCH 58/65] Update solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc Co-authored-by: David Smiley --- .../modules/query-guide/pages/embedding-text.adoc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc b/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc index 7bea7e09fc8..c631c6594b8 100644 --- a/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc +++ b/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc @@ -24,7 +24,8 @@ _Without_ this module, vectors must be supplied _to_ Solr for indexing & searchi === From Text to Vector -The task of sentence similarity aims to encode text to vector in a way that sentences semantically similar are encoded to vectors close in a vector space (using a vector distance metric). +The task of sentence similarity aims to encode text to numerical vectors in a way that semantically similar sentences are encoded to vectors close in a vector space. +Vector distance metrics (algorithms) compute a pairwise similarity, producing a score. === Large Language Models From efffa95d15837e079e61b0fc20c92ad46b044afe Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Fri, 29 Nov 2024 12:05:25 +0000 Subject: [PATCH 59/65] Update solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc Co-authored-by: David Smiley --- .../modules/query-guide/pages/embedding-text.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc b/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc index c631c6594b8..00de2d4039d 100644 --- a/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc +++ b/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc @@ -30,7 +30,7 @@ Vector distance metrics (algorithms) compute a pairwise similarity, producing a === Large Language Models -Large Language Models can be fine-tuned for such task. +Large Language Models can be fine-tuned for such a task. The resulting model is able to encode text to a numerical vector. For additional information you can refer to this https://sease.io/2021/12/using-bert-to-improve-search-relevance.html[blog post]. From 8760421207ff13781dc15704294987ae4983bce0 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Fri, 29 Nov 2024 13:10:53 +0000 Subject: [PATCH 60/65] fixing tests --- solr/modules/llm/README.md | 2 +- .../llm/embedding/SolrEmbeddingModel.java | 25 ++++++++++++++----- .../modelExamples/dummy-model-ambiguous.json | 8 ++++++ .../dummy-model-unsupported.json | 8 ++++++ .../test/org/apache/solr/llm/TestLlmBase.java | 9 +++++++ .../llm/embedding/DummyEmbeddingModel.java | 16 +++++++++++- .../solr/llm/store/rest/TestModelManager.java | 18 +++++++++++++ .../pages/dense-vector-search.adoc | 2 +- ...mbedding-text.adoc => text-to-vector.adoc} | 2 +- 9 files changed, 80 insertions(+), 10 deletions(-) create mode 100644 solr/modules/llm/src/test-files/modelExamples/dummy-model-ambiguous.json create mode 100644 solr/modules/llm/src/test-files/modelExamples/dummy-model-unsupported.json rename solr/solr-ref-guide/modules/query-guide/pages/{embedding-text.adoc => text-to-vector.adoc} (99%) diff --git a/solr/modules/llm/README.md b/solr/modules/llm/README.md index 10194f5816e..3dde81a2447 100644 --- a/solr/modules/llm/README.md +++ b/solr/modules/llm/README.md @@ -18,4 +18,4 @@ The Large Language Model module for Solr provides a set of mechanisms for plugging in third party LLM implementations. It currently provides embedding models and text vectorisation through langChain4j. -See https://solr.apache.org/guide/solr/latest/query-guide/result-clustering.html (change the link) for how to get started. +See https://solr.apache.org/guide/solr/latest/query-guide/text-to-vector.html for how to get started. diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java index b24395b3800..98bccea72db 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java @@ -43,7 +43,7 @@ public class SolrEmbeddingModel implements Accountable { private final String name; private final Map params; private final EmbeddingModel textToVector; - private final Integer hashCode; + private final int hashCode; public static SolrEmbeddingModel getInstance( SolrResourceLoader solrResourceLoader, @@ -63,12 +63,21 @@ public static SolrEmbeddingModel getInstance( var builder = modelClass.getMethod("builder").invoke(null); if (params != null) { /** - * Some {@link dev.langchain4j.model.embedding.EmbeddingModel} classes have params of - * specific types that must be constructed, for primitive types we can resort to the - * default. N.B. when adding support to new models, pay attention to all the parameters they - * support, some of them may require to be handled in here as separate switch cases + * This block of code has the responsibility of instantiate a {@link + * dev.langchain4j.model.embedding.EmbeddingModel} using the params provided.classes have + * params of The specific implementation of {@link + * dev.langchain4j.model.embedding.EmbeddingModel} is not known beforehand. So we benefit of + * the design choice in langchain4j that each subclass implementing {@link + * dev.langchain4j.model.embedding.EmbeddingModel} uses setters with the same name of the + * param. */ for (String paramName : params.keySet()) { + /* + * When a param is not primitive, we need to instantiate the object explicitly and then call the + * setter method. + * N.B. when adding support to new models, pay attention to all the parameters they + * support, some of them may require to be handled in here as separate switch cases + */ switch (paramName) { case TIMEOUT_PARAM: Duration timeOut = Duration.ofSeconds((Long) params.get(paramName)); @@ -86,6 +95,10 @@ public static SolrEmbeddingModel getInstance( .getMethod(paramName, Integer.class) .invoke(builder, ((Long) params.get(paramName)).intValue()); break; + /* + * For primitive params if there's only one setter available, we call it. + * If there's choice we default to the string one + */ default: ArrayList paramNameMatches = new ArrayList<>(); for (var method : builder.getClass().getMethods()) { @@ -99,7 +112,7 @@ public static SolrEmbeddingModel getInstance( builder .getClass() .getMethod(paramName, String.class) - .invoke(builder, params.get(paramName)); + .invoke(builder, params.get(paramName).toString()); } } } diff --git a/solr/modules/llm/src/test-files/modelExamples/dummy-model-ambiguous.json b/solr/modules/llm/src/test-files/modelExamples/dummy-model-ambiguous.json new file mode 100644 index 00000000000..60a642d97fd --- /dev/null +++ b/solr/modules/llm/src/test-files/modelExamples/dummy-model-ambiguous.json @@ -0,0 +1,8 @@ +{ + "class": "org.apache.solr.llm.embedding.DummyEmbeddingModel", + "name": "dummy-1", + "params": { + "embedding": [1.0, 2.0, 3.0, 4.0], + "ambiguous": 10 + } +} diff --git a/solr/modules/llm/src/test-files/modelExamples/dummy-model-unsupported.json b/solr/modules/llm/src/test-files/modelExamples/dummy-model-unsupported.json new file mode 100644 index 00000000000..14f4e6c8b21 --- /dev/null +++ b/solr/modules/llm/src/test-files/modelExamples/dummy-model-unsupported.json @@ -0,0 +1,8 @@ +{ + "class": "org.apache.solr.llm.embedding.DummyEmbeddingModel", + "name": "dummy-1", + "params": { + "embedding": [1.0, 2.0, 3.0, 4.0], + "unsupported": 10 + } +} diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java b/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java index 779056d64f0..497acd7c317 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java @@ -114,6 +114,15 @@ protected static void loadModel(String name, String className, String params) th assertJPut(ManagedEmbeddingModelStore.REST_END_POINT, model, "/responseHeader/status==0"); } + public static void loadModel(String fileName, String status) throws Exception { + final URL url = TestLlmBase.class.getResource("/modelExamples/" + fileName); + final String multipleModels = Files.readString(Path.of(url.toURI()), StandardCharsets.UTF_8); + + assertJPut( + ManagedEmbeddingModelStore.REST_END_POINT, multipleModels, "/responseHeader/status=="+status); + + } + public static void loadModel(String fileName) throws Exception { final URL url = TestLlmBase.class.getResource("/modelExamples/" + fileName); final String multipleModels = Files.readString(Path.of(url.toURI()), StandardCharsets.UTF_8); diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModel.java b/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModel.java index 1076f5d0bbf..cfc4113fb46 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModel.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModel.java @@ -58,7 +58,7 @@ public static DummyEmbeddingModelBuilder builder() { public static class DummyEmbeddingModelBuilder { private float[] builderEmbeddings; - + private int intValue; public DummyEmbeddingModelBuilder() {} public DummyEmbeddingModelBuilder embedding(ArrayList embeddings) { @@ -69,6 +69,20 @@ public DummyEmbeddingModelBuilder embedding(ArrayList embeddings) { return this; } + public DummyEmbeddingModelBuilder unsupported(Integer input) { + return this; + } + + public DummyEmbeddingModelBuilder ambiguous(int input) { + this.intValue = input; + return this; + } + + public DummyEmbeddingModelBuilder ambiguous(String input) { + this.intValue = Integer.valueOf(input); + return this; + } + public DummyEmbeddingModel build() { return new DummyEmbeddingModel(this.builderEmbeddings); } diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java index 9e784153e1d..64191f9e04f 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java @@ -202,4 +202,22 @@ public void loadModel_huggingface_shouldLoadModelConfig() throws Exception { restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/" + modelName); } + + @Test + public void loadModel_dummyUnsupportedParam_shouldRaiseError() throws Exception { + loadModel("dummy-model-unsupported.json", "400"); + } + + @Test + public void loadModel_dummyAmbiguousParam_shouldDefaultToString() throws Exception { + loadModel("dummy-model-ambiguous.json"); + + final String modelName = "dummy-1"; + assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); + assertJQ( + ManagedEmbeddingModelStore.REST_END_POINT, + "/models/[0]/params/ambiguous==10"); + + restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/" + modelName); + } } diff --git a/solr/solr-ref-guide/modules/query-guide/pages/dense-vector-search.adoc b/solr/solr-ref-guide/modules/query-guide/pages/dense-vector-search.adoc index 08f3e80007c..49c1bc3f637 100644 --- a/solr/solr-ref-guide/modules/query-guide/pages/dense-vector-search.adoc +++ b/solr/solr-ref-guide/modules/query-guide/pages/dense-vector-search.adoc @@ -340,7 +340,7 @@ Here's an example of a simple `text_to_vector` search: The search results retrieved are the k=10 nearest documents to the vector encoded from the query `hello world query`, using the model `a-model`. -For more details on how to work with embedding text in Apache Solr, please refer to the dedicated page: xref:embedding-text.adoc[Embedding Text] +For more details on how to work with embedding text in Apache Solr, please refer to the dedicated page: xref:text-to-vector.adoc[Text to Vector] === vectorSimilarity Query Parser diff --git a/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc b/solr/solr-ref-guide/modules/query-guide/pages/text-to-vector.adoc similarity index 99% rename from solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc rename to solr/solr-ref-guide/modules/query-guide/pages/text-to-vector.adoc index 00de2d4039d..d0a6197d600 100644 --- a/solr/solr-ref-guide/modules/query-guide/pages/embedding-text.adoc +++ b/solr/solr-ref-guide/modules/query-guide/pages/text-to-vector.adoc @@ -1,4 +1,4 @@ -= Embedding Text += Text to Vector // Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information From 5436b82c68ad47200c9564d4a2d802d8316f47ef Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Fri, 29 Nov 2024 16:01:54 +0000 Subject: [PATCH 61/65] thread safety --- .../java/org/apache/solr/llm/store/EmbeddingModelStore.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java b/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java index b6897d91d29..a18be605ece 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java @@ -57,10 +57,9 @@ public SolrEmbeddingModel delete(String modelName) { public void addModel(SolrEmbeddingModel modeldata) throws EmbeddingModelException { final String name = modeldata.getName(); - if (availableModels.containsKey(name)) { + if (availableModels.putIfAbsent(modeldata.getName(), modeldata) != null) { throw new EmbeddingModelException( "model '" + name + "' already exists. Please use a different name"); } - availableModels.put(modeldata.getName(), modeldata); } } From 199ac29ad5e191bfad22be49670a358b56fa642f Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Fri, 29 Nov 2024 16:15:07 +0000 Subject: [PATCH 62/65] test cleanup --- .../test/org/apache/solr/llm/TestLlmBase.java | 22 +------------------ .../rest/TestModelManagerPersistence.java | 20 +++++------------ 2 files changed, 6 insertions(+), 36 deletions(-) diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java b/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java index 497acd7c317..ca5b6d40820 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/TestLlmBase.java @@ -93,27 +93,7 @@ protected static void afterTest() throws Exception { } System.clearProperty("managed.schema.mutable"); } - - /** produces a model encoded in json * */ - public static String getModelInJson(String name, String className, String params) { - final StringBuilder sb = new StringBuilder(); - sb.append("{\n"); - sb.append("\"name\":").append('"').append(name).append('"').append(",\n"); - sb.append("\"class\":").append('"').append(className).append('"').append(",\n"); - if (params != null) { - sb.append(",\n"); - sb.append("\"params\":").append(params); - } - sb.append("\n}\n"); - return sb.toString(); - } - - protected static void loadModel(String name, String className, String params) throws Exception { - final String model = getModelInJson(name, className, params); - log.info("loading model \n{} ", model); - assertJPut(ManagedEmbeddingModelStore.REST_END_POINT, model, "/responseHeader/status==0"); - } - + public static void loadModel(String fileName, String status) throws Exception { final URL url = TestLlmBase.class.getResource("/modelExamples/" + fileName); final String multipleModels = Files.readString(Path.of(url.toURI()), StandardCharsets.UTF_8); diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java index 9daa1bb90e1..44f68f37db6 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java @@ -41,23 +41,13 @@ public void cleanup() throws Exception { @Test public void testModelAreStoredCompact() throws Exception { - loadModel( - "cohere1", - CohereEmbeddingModel.class.getName(), - "{" - + "baseUrl:\"https://api.cohere.ai/v1/\"," - + "apiKey:\"cohereApiKey2\"," - + "modelName:\"embed-english-light-v3.0\"," - + "inputType:\"search_document\"," - + "logRequests:true," - + "logResponses:false" - + "}"); - - final String embeddingModelStoreContent = + loadModel("cohere-model.json"); + + final String JSONOnDisk = Files.readString(embeddingModelStoreFile, StandardCharsets.UTF_8); - Object embeddingModelStoreObject = Utils.fromJSONString(embeddingModelStoreContent); + Object objectFromDisk = Utils.fromJSONString(JSONOnDisk); assertEquals( - new String(Utils.toJSON(embeddingModelStoreObject, -1), UTF_8), embeddingModelStoreContent); + new String(Utils.toJSON(objectFromDisk, -1), UTF_8), JSONOnDisk); } @Test From f798d5d8b4294c89c23bca9810136fd6f8372787 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Fri, 29 Nov 2024 16:16:23 +0000 Subject: [PATCH 63/65] schema version --- .../modules/llm/src/test-files/solr/collection1/conf/schema.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solr/modules/llm/src/test-files/solr/collection1/conf/schema.xml b/solr/modules/llm/src/test-files/solr/collection1/conf/schema.xml index 6699fa60d62..92aa0e76591 100644 --- a/solr/modules/llm/src/test-files/solr/collection1/conf/schema.xml +++ b/solr/modules/llm/src/test-files/solr/collection1/conf/schema.xml @@ -18,7 +18,7 @@ - + From 4567c67ab8c65ce5159038f39569fecaf447fb86 Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Fri, 29 Nov 2024 17:01:54 +0000 Subject: [PATCH 64/65] massive 'embedding' to text-to-vector refactor --- solr/modules/llm/README.md | 2 +- .../model/SolrTextToVectorModel.java} | 28 ++--- .../model}/package-info.java | 4 +- .../search/TextToVectorQParserPlugin.java | 20 ++-- .../search/package-info.java | 4 +- .../store/TextToVectorModelException.java} | 8 +- .../store/TextToVectorModelStore.java} | 26 ++--- .../store/package-info.java | 2 +- .../rest/ManagedTextToVectorModelStore.java} | 60 +++++----- .../store/rest/package-info.java | 2 +- solr/modules/llm/src/java/overview.html | 2 +- .../modelExamples/dummy-model-ambiguous.json | 2 +- .../dummy-model-unsupported.json | 2 +- .../test-files/modelExamples/dummy-model.json | 2 +- .../solr/collection1/conf/solrconfig-llm.xml | 2 +- .../test/org/apache/solr/llm/TestLlmBase.java | 16 +-- .../model}/DummyEmbeddingModel.java | 3 +- .../model}/DummyEmbeddingModelTest.java | 2 +- .../search/TextToVectorQParserTest.java | 6 +- .../store/rest/TestModelManager.java | 104 +++++++++--------- .../rest/TestModelManagerPersistence.java | 69 ++++++------ .../pages/dense-vector-search.adoc | 4 +- .../query-guide/pages/text-to-vector.adoc | 51 ++++----- 23 files changed, 209 insertions(+), 212 deletions(-) rename solr/modules/llm/src/java/org/apache/solr/llm/{embedding/SolrEmbeddingModel.java => texttovector/model/SolrTextToVectorModel.java} (88%) rename solr/modules/llm/src/java/org/apache/solr/llm/{embedding => texttovector/model}/package-info.java (87%) rename solr/modules/llm/src/java/org/apache/solr/llm/{ => texttovector}/search/TextToVectorQParserPlugin.java (87%) rename solr/modules/llm/src/java/org/apache/solr/llm/{ => texttovector}/search/package-info.java (87%) rename solr/modules/llm/src/java/org/apache/solr/llm/{store/EmbeddingModelException.java => texttovector/store/TextToVectorModelException.java} (79%) rename solr/modules/llm/src/java/org/apache/solr/llm/{store/EmbeddingModelStore.java => texttovector/store/TextToVectorModelStore.java} (67%) rename solr/modules/llm/src/java/org/apache/solr/llm/{ => texttovector}/store/package-info.java (94%) rename solr/modules/llm/src/java/org/apache/solr/llm/{store/rest/ManagedEmbeddingModelStore.java => texttovector/store/rest/ManagedTextToVectorModelStore.java} (73%) rename solr/modules/llm/src/java/org/apache/solr/llm/{ => texttovector}/store/rest/package-info.java (94%) rename solr/modules/llm/src/test/org/apache/solr/llm/{embedding => texttovector/model}/DummyEmbeddingModel.java (98%) rename solr/modules/llm/src/test/org/apache/solr/llm/{embedding => texttovector/model}/DummyEmbeddingModelTest.java (97%) rename solr/modules/llm/src/test/org/apache/solr/llm/{ => texttovector}/search/TextToVectorQParserTest.java (98%) rename solr/modules/llm/src/test/org/apache/solr/llm/{ => texttovector}/store/rest/TestModelManager.java (57%) rename solr/modules/llm/src/test/org/apache/solr/llm/{ => texttovector}/store/rest/TestModelManagerPersistence.java (52%) diff --git a/solr/modules/llm/README.md b/solr/modules/llm/README.md index 3dde81a2447..2467434a14b 100644 --- a/solr/modules/llm/README.md +++ b/solr/modules/llm/README.md @@ -16,6 +16,6 @@ --> The Large Language Model module for Solr provides a set of mechanisms for plugging in third party LLM implementations. -It currently provides embedding models and text vectorisation through langChain4j. +It currently provides text vectorisation through langChain4j. See https://solr.apache.org/guide/solr/latest/query-guide/text-to-vector.html for how to get started. diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java b/solr/modules/llm/src/java/org/apache/solr/llm/texttovector/model/SolrTextToVectorModel.java similarity index 88% rename from solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java rename to solr/modules/llm/src/java/org/apache/solr/llm/texttovector/model/SolrTextToVectorModel.java index 98bccea72db..53413b9a3b9 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/SolrEmbeddingModel.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/texttovector/model/SolrTextToVectorModel.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.solr.llm.embedding; +package org.apache.solr.llm.texttovector.model; import dev.langchain4j.data.embedding.Embedding; import dev.langchain4j.model.embedding.EmbeddingModel; @@ -26,16 +26,17 @@ import org.apache.lucene.util.Accountable; import org.apache.lucene.util.RamUsageEstimator; import org.apache.solr.core.SolrResourceLoader; -import org.apache.solr.llm.store.EmbeddingModelException; -import org.apache.solr.llm.store.rest.ManagedEmbeddingModelStore; +import org.apache.solr.llm.texttovector.store.TextToVectorModelException; +import org.apache.solr.llm.texttovector.store.rest.ManagedTextToVectorModelStore; /** * This object wraps a {@link dev.langchain4j.model.embedding.EmbeddingModel} to encode text to - * vector. It's meant to be used as a managed resource with the {@link ManagedEmbeddingModelStore} + * vector. It's meant to be used as a managed resource with the {@link + * ManagedTextToVectorModelStore} */ -public class SolrEmbeddingModel implements Accountable { +public class SolrTextToVectorModel implements Accountable { private static final long BASE_RAM_BYTES = - RamUsageEstimator.shallowSizeOfInstance(SolrEmbeddingModel.class); + RamUsageEstimator.shallowSizeOfInstance(SolrTextToVectorModel.class); private static final String TIMEOUT_PARAM = "timeout"; private static final String MAX_SEGMENTS_PER_BATCH_PARAM = "maxSegmentsPerBatch"; private static final String MAX_RETRIES_PARAM = "maxRetries"; @@ -45,12 +46,12 @@ public class SolrEmbeddingModel implements Accountable { private final EmbeddingModel textToVector; private final int hashCode; - public static SolrEmbeddingModel getInstance( + public static SolrTextToVectorModel getInstance( SolrResourceLoader solrResourceLoader, String className, String name, Map params) - throws EmbeddingModelException { + throws TextToVectorModelException { try { /* * The idea here is to build a {@link dev.langchain4j.model.embedding.EmbeddingModel} using inversion @@ -118,13 +119,14 @@ public static SolrEmbeddingModel getInstance( } } textToVector = (EmbeddingModel) builder.getClass().getMethod("build").invoke(builder); - return new SolrEmbeddingModel(name, textToVector, params); + return new SolrTextToVectorModel(name, textToVector, params); } catch (final Exception e) { - throw new EmbeddingModelException("Model loading failed for " + className, e); + throw new TextToVectorModelException("Model loading failed for " + className, e); } } - public SolrEmbeddingModel(String name, EmbeddingModel textToVector, Map params) { + public SolrTextToVectorModel( + String name, EmbeddingModel textToVector, Map params) { this.name = name; this.textToVector = textToVector; this.params = params; @@ -164,8 +166,8 @@ private int calculateHashCode() { @Override public boolean equals(Object obj) { if (this == obj) return true; - if (!(obj instanceof SolrEmbeddingModel)) return false; - final SolrEmbeddingModel other = (SolrEmbeddingModel) obj; + if (!(obj instanceof SolrTextToVectorModel)) return false; + final SolrTextToVectorModel other = (SolrTextToVectorModel) obj; return Objects.equals(textToVector, other.textToVector) && Objects.equals(name, other.name); } diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/package-info.java b/solr/modules/llm/src/java/org/apache/solr/llm/texttovector/model/package-info.java similarity index 87% rename from solr/modules/llm/src/java/org/apache/solr/llm/embedding/package-info.java rename to solr/modules/llm/src/java/org/apache/solr/llm/texttovector/model/package-info.java index 2ee3a566b99..64e50f6f88b 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/embedding/package-info.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/texttovector/model/package-info.java @@ -15,5 +15,5 @@ * limitations under the License. */ -/** APIs and classes for implementing embedding logic. */ -package org.apache.solr.llm.embedding; +/** APIs and classes for implementing text to vector logic. */ +package org.apache.solr.llm.texttovector.model; diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/search/TextToVectorQParserPlugin.java b/solr/modules/llm/src/java/org/apache/solr/llm/texttovector/search/TextToVectorQParserPlugin.java similarity index 87% rename from solr/modules/llm/src/java/org/apache/solr/llm/search/TextToVectorQParserPlugin.java rename to solr/modules/llm/src/java/org/apache/solr/llm/texttovector/search/TextToVectorQParserPlugin.java index 7a85f3fc53e..17749eba7b6 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/search/TextToVectorQParserPlugin.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/texttovector/search/TextToVectorQParserPlugin.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.solr.llm.search; +package org.apache.solr.llm.texttovector.search; import java.io.IOException; import org.apache.lucene.index.VectorEncoding; @@ -26,8 +26,8 @@ import org.apache.solr.common.params.SolrParams; import org.apache.solr.common.util.NamedList; import org.apache.solr.core.SolrResourceLoader; -import org.apache.solr.llm.embedding.SolrEmbeddingModel; -import org.apache.solr.llm.store.rest.ManagedEmbeddingModelStore; +import org.apache.solr.llm.texttovector.model.SolrTextToVectorModel; +import org.apache.solr.llm.texttovector.store.rest.ManagedTextToVectorModelStore; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.rest.ManagedResource; import org.apache.solr.rest.ManagedResourceObserver; @@ -46,7 +46,7 @@ public class TextToVectorQParserPlugin extends QParserPlugin implements ResourceLoaderAware, ManagedResourceObserver { public static final String EMBEDDING_MODEL_PARAM = "model"; - private ManagedEmbeddingModelStore modelStore = null; + private ManagedTextToVectorModelStore modelStore = null; @Override public QParser createParser( @@ -57,14 +57,14 @@ public QParser createParser( @Override public void inform(ResourceLoader loader) throws IOException { final SolrResourceLoader solrResourceLoader = (SolrResourceLoader) loader; - ManagedEmbeddingModelStore.registerManagedEmbeddingModelStore(solrResourceLoader, this); + ManagedTextToVectorModelStore.registerManagedTextToVectorModelStore(solrResourceLoader, this); } @Override public void onManagedResourceInitialized(NamedList args, ManagedResource res) throws SolrException { - if (res instanceof ManagedEmbeddingModelStore) { - modelStore = (ManagedEmbeddingModelStore) res; + if (res instanceof ManagedTextToVectorModelStore) { + modelStore = (ManagedTextToVectorModelStore) res; } if (modelStore != null) { modelStore.loadStoredModels(); @@ -83,7 +83,7 @@ public Query parse() throws SyntaxError { checkParam(qstr, "Query string is empty, nothing to vectorise"); final String embeddingModelName = localParams.get(EMBEDDING_MODEL_PARAM); checkParam(embeddingModelName, "The 'model' parameter is missing"); - SolrEmbeddingModel textToVector = modelStore.getModel(embeddingModelName); + SolrTextToVectorModel textToVector = modelStore.getModel(embeddingModelName); if (textToVector != null) { final SchemaField schemaField = req.getCore().getLatestSchema().getField(getFieldName()); @@ -103,7 +103,7 @@ public Query parse() throws SyntaxError { default: throw new SolrException( SolrException.ErrorCode.SERVER_ERROR, - "Vector Encoding not supported in automatic text embedding: " + vectorEncoding); + "Vector Encoding not supported : " + vectorEncoding); } } else { throw new SolrException( @@ -111,7 +111,7 @@ public Query parse() throws SyntaxError { "The model requested '" + embeddingModelName + "' can't be found in the store: " - + ManagedEmbeddingModelStore.REST_END_POINT); + + ManagedTextToVectorModelStore.REST_END_POINT); } } } diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/search/package-info.java b/solr/modules/llm/src/java/org/apache/solr/llm/texttovector/search/package-info.java similarity index 87% rename from solr/modules/llm/src/java/org/apache/solr/llm/search/package-info.java rename to solr/modules/llm/src/java/org/apache/solr/llm/texttovector/search/package-info.java index 1cc706fc433..9fbf84e62c6 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/search/package-info.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/texttovector/search/package-info.java @@ -15,5 +15,5 @@ * limitations under the License. */ -/** APIs and classes for implementing embedding QueryParsers. */ -package org.apache.solr.llm.search; +/** APIs and classes for implementing text to vector QueryParsers. */ +package org.apache.solr.llm.texttovector.search; diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelException.java b/solr/modules/llm/src/java/org/apache/solr/llm/texttovector/store/TextToVectorModelException.java similarity index 79% rename from solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelException.java rename to solr/modules/llm/src/java/org/apache/solr/llm/texttovector/store/TextToVectorModelException.java index b31a7bbffbc..076f2b45f9b 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelException.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/texttovector/store/TextToVectorModelException.java @@ -14,17 +14,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.solr.llm.store; +package org.apache.solr.llm.texttovector.store; -public class EmbeddingModelException extends RuntimeException { +public class TextToVectorModelException extends RuntimeException { private static final long serialVersionUID = 1L; - public EmbeddingModelException(String message) { + public TextToVectorModelException(String message) { super(message); } - public EmbeddingModelException(String message, Exception cause) { + public TextToVectorModelException(String message, Exception cause) { super(message, cause); } } diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java b/solr/modules/llm/src/java/org/apache/solr/llm/texttovector/store/TextToVectorModelStore.java similarity index 67% rename from solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java rename to solr/modules/llm/src/java/org/apache/solr/llm/texttovector/store/TextToVectorModelStore.java index a18be605ece..00887de6beb 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/store/EmbeddingModelStore.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/texttovector/store/TextToVectorModelStore.java @@ -14,25 +14,25 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.solr.llm.store; +package org.apache.solr.llm.texttovector.store; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import org.apache.solr.llm.embedding.SolrEmbeddingModel; +import org.apache.solr.llm.texttovector.model.SolrTextToVectorModel; -/** Simple store to manage CRUD operations on the {@link SolrEmbeddingModel} */ -public class EmbeddingModelStore { +/** Simple store to manage CRUD operations on the {@link SolrTextToVectorModel} */ +public class TextToVectorModelStore { - private final Map availableModels; + private final Map availableModels; - public EmbeddingModelStore() { + public TextToVectorModelStore() { availableModels = Collections.synchronizedMap(new LinkedHashMap<>()); } - public SolrEmbeddingModel getModel(String name) { + public SolrTextToVectorModel getModel(String name) { return availableModels.get(name); } @@ -40,9 +40,9 @@ public void clear() { availableModels.clear(); } - public List getModels() { - final List availableModelsValues = - new ArrayList(availableModels.values()); + public List getModels() { + final List availableModelsValues = + new ArrayList(availableModels.values()); return Collections.unmodifiableList(availableModelsValues); } @@ -51,14 +51,14 @@ public String toString() { return "ModelStore [availableModels=" + availableModels.keySet() + "]"; } - public SolrEmbeddingModel delete(String modelName) { + public SolrTextToVectorModel delete(String modelName) { return availableModels.remove(modelName); } - public void addModel(SolrEmbeddingModel modeldata) throws EmbeddingModelException { + public void addModel(SolrTextToVectorModel modeldata) throws TextToVectorModelException { final String name = modeldata.getName(); if (availableModels.putIfAbsent(modeldata.getName(), modeldata) != null) { - throw new EmbeddingModelException( + throw new TextToVectorModelException( "model '" + name + "' already exists. Please use a different name"); } } diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/package-info.java b/solr/modules/llm/src/java/org/apache/solr/llm/texttovector/store/package-info.java similarity index 94% rename from solr/modules/llm/src/java/org/apache/solr/llm/store/package-info.java rename to solr/modules/llm/src/java/org/apache/solr/llm/texttovector/store/package-info.java index c5da1c50aa2..630ac6085a8 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/store/package-info.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/texttovector/store/package-info.java @@ -16,4 +16,4 @@ */ /** Contains model store related classes. */ -package org.apache.solr.llm.store; +package org.apache.solr.llm.texttovector.store; diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java b/solr/modules/llm/src/java/org/apache/solr/llm/texttovector/store/rest/ManagedTextToVectorModelStore.java similarity index 73% rename from solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java rename to solr/modules/llm/src/java/org/apache/solr/llm/texttovector/store/rest/ManagedTextToVectorModelStore.java index ce4cad9a269..0652ec54d77 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/ManagedEmbeddingModelStore.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/texttovector/store/rest/ManagedTextToVectorModelStore.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.solr.llm.store.rest; +package org.apache.solr.llm.texttovector.store.rest; import java.lang.invoke.MethodHandles; import java.util.LinkedHashMap; @@ -26,9 +26,9 @@ import org.apache.solr.common.util.NamedList; import org.apache.solr.core.SolrCore; import org.apache.solr.core.SolrResourceLoader; -import org.apache.solr.llm.embedding.SolrEmbeddingModel; -import org.apache.solr.llm.store.EmbeddingModelException; -import org.apache.solr.llm.store.EmbeddingModelStore; +import org.apache.solr.llm.texttovector.model.SolrTextToVectorModel; +import org.apache.solr.llm.texttovector.store.TextToVectorModelException; +import org.apache.solr.llm.texttovector.store.TextToVectorModelStore; import org.apache.solr.response.SolrQueryResponse; import org.apache.solr.rest.BaseSolrResource; import org.apache.solr.rest.ManagedResource; @@ -37,14 +37,14 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -/** Managed Resource wrapper for the the {@link EmbeddingModelStore} to expose it via REST */ +/** Managed Resource wrapper for the the {@link TextToVectorModelStore} to expose it via REST */ @ThreadSafe -public class ManagedEmbeddingModelStore extends ManagedResource +public class ManagedTextToVectorModelStore extends ManagedResource implements ManagedResource.ChildResourceSupport { private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); /** the model store rest endpoint */ - public static final String REST_END_POINT = "/schema/embedding-model-store"; + public static final String REST_END_POINT = "/schema/text-to-vector-model-store"; /** Managed model store: the name of the attribute containing all the models of a model store */ private static final String MODELS_JSON_FIELD = "models"; @@ -58,16 +58,16 @@ public class ManagedEmbeddingModelStore extends ManagedResource /** name of the attribute containing parameters */ static final String PARAMS_KEY = "params"; - public static void registerManagedEmbeddingModelStore( + public static void registerManagedTextToVectorModelStore( SolrResourceLoader solrResourceLoader, ManagedResourceObserver managedResourceObserver) { solrResourceLoader .getManagedResourceRegistry() .registerManagedResource( - REST_END_POINT, ManagedEmbeddingModelStore.class, managedResourceObserver); + REST_END_POINT, ManagedTextToVectorModelStore.class, managedResourceObserver); } - public static ManagedEmbeddingModelStore getManagedModelStore(SolrCore core) { - return (ManagedEmbeddingModelStore) core.getRestManager().getManagedResource(REST_END_POINT); + public static ManagedTextToVectorModelStore getManagedModelStore(SolrCore core) { + return (ManagedTextToVectorModelStore) core.getRestManager().getManagedResource(REST_END_POINT); } /** @@ -77,23 +77,23 @@ public static ManagedEmbeddingModelStore getManagedModelStore(SolrCore core) { * * @return the available models as a list of Maps objects */ - private static List modelsAsManagedResources(List models) { + private static List modelsAsManagedResources(List models) { return models.stream() - .map(ManagedEmbeddingModelStore::toEmbeddingModelMap) + .map(ManagedTextToVectorModelStore::toModelMap) .collect(Collectors.toList()); } @SuppressWarnings("unchecked") - public static SolrEmbeddingModel fromEmbeddingModelMap( + public static SolrTextToVectorModel fromModelMap( SolrResourceLoader solrResourceLoader, Map embeddingModel) { - return SolrEmbeddingModel.getInstance( + return SolrTextToVectorModel.getInstance( solrResourceLoader, (String) embeddingModel.get(CLASS_KEY), // modelClassName (String) embeddingModel.get(NAME_KEY), // modelName (Map) embeddingModel.get(PARAMS_KEY)); } - private static LinkedHashMap toEmbeddingModelMap(SolrEmbeddingModel model) { + private static LinkedHashMap toModelMap(SolrTextToVectorModel model) { final LinkedHashMap modelMap = new LinkedHashMap<>(5, 1.0f); modelMap.put(NAME_KEY, model.getName()); modelMap.put(CLASS_KEY, model.getEmbeddingModelClassName()); @@ -101,14 +101,14 @@ private static LinkedHashMap toEmbeddingModelMap(SolrEmbeddingMo return modelMap; } - private final EmbeddingModelStore store; + private final TextToVectorModelStore store; private Object managedData; - public ManagedEmbeddingModelStore( + public ManagedTextToVectorModelStore( String resourceId, SolrResourceLoader loader, ManagedResourceStorage.StorageIO storageIO) throws SolrException { super(resourceId, loader, storageIO); - store = new EmbeddingModelStore(); + store = new TextToVectorModelStore(); } @Override @@ -129,28 +129,28 @@ public void loadStoredModels() { if ((managedData != null) && (managedData instanceof List)) { @SuppressWarnings({"unchecked"}) - final List> embeddingModels = (List>) managedData; - for (final Map embeddingModel : embeddingModels) { - addModelFromMap(embeddingModel); + final List> textToVectorModels = (List>) managedData; + for (final Map textToVectorModel : textToVectorModels) { + addModelFromMap(textToVectorModel); } } } private void addModelFromMap(Map modelMap) { try { - addModel(fromEmbeddingModelMap(solrResourceLoader, modelMap)); - } catch (final EmbeddingModelException e) { + addModel(fromModelMap(solrResourceLoader, modelMap)); + } catch (final TextToVectorModelException e) { throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, e); } } - public void addModel(SolrEmbeddingModel model) throws EmbeddingModelException { + public void addModel(SolrTextToVectorModel model) throws TextToVectorModelException { try { if (log.isInfoEnabled()) { log.info("adding model {}", model.getName()); } store.addModel(model); - } catch (final EmbeddingModelException e) { + } catch (final TextToVectorModelException e) { throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, e); } } @@ -159,9 +159,9 @@ public void addModel(SolrEmbeddingModel model) throws EmbeddingModelException { @Override protected Object applyUpdatesToManagedData(Object updates) { if (updates instanceof List) { - final List> embeddingModels = (List>) updates; - for (final Map embeddingModel : embeddingModels) { - addModelFromMap(embeddingModel); + final List> textToVectorModels = (List>) updates; + for (final Map textToVectorModel : textToVectorModels) { + addModelFromMap(textToVectorModel); } } @@ -189,7 +189,7 @@ public void doGet(BaseSolrResource endpoint, String childId) { response.add(MODELS_JSON_FIELD, modelsAsManagedResources(store.getModels())); } - public SolrEmbeddingModel getModel(String modelName) { + public SolrTextToVectorModel getModel(String modelName) { return store.getModel(modelName); } diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/package-info.java b/solr/modules/llm/src/java/org/apache/solr/llm/texttovector/store/rest/package-info.java similarity index 94% rename from solr/modules/llm/src/java/org/apache/solr/llm/store/rest/package-info.java rename to solr/modules/llm/src/java/org/apache/solr/llm/texttovector/store/rest/package-info.java index be6ec479768..56ae30f2ebe 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/store/rest/package-info.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/texttovector/store/rest/package-info.java @@ -16,4 +16,4 @@ */ /** Contains the {@link org.apache.solr.rest.ManagedResource} that encapsulate the model stores. */ -package org.apache.solr.llm.store.rest; +package org.apache.solr.llm.texttovector.store.rest; diff --git a/solr/modules/llm/src/java/overview.html b/solr/modules/llm/src/java/overview.html index 88667ef55f3..29daef11a7b 100644 --- a/solr/modules/llm/src/java/overview.html +++ b/solr/modules/llm/src/java/overview.html @@ -16,6 +16,6 @@ --> -Apache Solr Search Server: text embedding module +Apache Solr Search Server: text to vector module diff --git a/solr/modules/llm/src/test-files/modelExamples/dummy-model-ambiguous.json b/solr/modules/llm/src/test-files/modelExamples/dummy-model-ambiguous.json index 60a642d97fd..43de925cf9d 100644 --- a/solr/modules/llm/src/test-files/modelExamples/dummy-model-ambiguous.json +++ b/solr/modules/llm/src/test-files/modelExamples/dummy-model-ambiguous.json @@ -1,5 +1,5 @@ { - "class": "org.apache.solr.llm.embedding.DummyEmbeddingModel", + "class": "org.apache.solr.llm.texttovector.model.DummyEmbeddingModel", "name": "dummy-1", "params": { "embedding": [1.0, 2.0, 3.0, 4.0], diff --git a/solr/modules/llm/src/test-files/modelExamples/dummy-model-unsupported.json b/solr/modules/llm/src/test-files/modelExamples/dummy-model-unsupported.json index 14f4e6c8b21..9af02f14003 100644 --- a/solr/modules/llm/src/test-files/modelExamples/dummy-model-unsupported.json +++ b/solr/modules/llm/src/test-files/modelExamples/dummy-model-unsupported.json @@ -1,5 +1,5 @@ { - "class": "org.apache.solr.llm.embedding.DummyEmbeddingModel", + "class": "org.apache.solr.llm.texttovector.model.DummyEmbeddingModel", "name": "dummy-1", "params": { "embedding": [1.0, 2.0, 3.0, 4.0], diff --git a/solr/modules/llm/src/test-files/modelExamples/dummy-model.json b/solr/modules/llm/src/test-files/modelExamples/dummy-model.json index 527b86db5f2..00603b8369b 100644 --- a/solr/modules/llm/src/test-files/modelExamples/dummy-model.json +++ b/solr/modules/llm/src/test-files/modelExamples/dummy-model.json @@ -1,5 +1,5 @@ { - "class": "org.apache.solr.llm.embedding.DummyEmbeddingModel", + "class": "org.apache.solr.llm.texttovector.model.DummyEmbeddingModel", "name": "dummy-1", "params": { "embedding": [1.0, 2.0, 3.0, 4.0] diff --git a/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml b/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml index 2614b8e3f1c..6fdce82a8bc 100644 --- a/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml +++ b/solr/modules/llm/src/test-files/solr/collection1/conf/solrconfig-llm.xml @@ -23,7 +23,7 @@ + class="org.apache.solr.llm.texttovector.search.TextToVectorQParserPlugin" /> embeddings) { diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModelTest.java b/solr/modules/llm/src/test/org/apache/solr/llm/texttovector/model/DummyEmbeddingModelTest.java similarity index 97% rename from solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModelTest.java rename to solr/modules/llm/src/test/org/apache/solr/llm/texttovector/model/DummyEmbeddingModelTest.java index 3aca97d7e42..823f591fb95 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/embedding/DummyEmbeddingModelTest.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/texttovector/model/DummyEmbeddingModelTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.solr.llm.embedding; +package org.apache.solr.llm.texttovector.model; import org.apache.solr.SolrTestCase; import org.junit.Test; diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/search/TextToVectorQParserTest.java b/solr/modules/llm/src/test/org/apache/solr/llm/texttovector/search/TextToVectorQParserTest.java similarity index 98% rename from solr/modules/llm/src/test/org/apache/solr/llm/search/TextToVectorQParserTest.java rename to solr/modules/llm/src/test/org/apache/solr/llm/texttovector/search/TextToVectorQParserTest.java index 73e9090a3e7..b97a27d2090 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/search/TextToVectorQParserTest.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/texttovector/search/TextToVectorQParserTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.solr.llm.search; +package org.apache.solr.llm.texttovector.search; import java.util.Arrays; import org.apache.solr.client.solrj.SolrQuery; @@ -38,7 +38,7 @@ public void notExistentModel_shouldThrowException() throws Exception { assertJQ( "/query" + query.toQueryString(), - "/error/msg=='The model requested \\'not-exist\\' can\\'t be found in the store: /schema/embedding-model-store'", + "/error/msg=='The model requested \\'not-exist\\' can\\'t be found in the store: /schema/text-to-vector-model-store'", "/error/code==400"); } @@ -104,7 +104,7 @@ public void vectorByteEncodingField_shouldRaiseException() throws Exception { assertJQ( "/query" + query.toQueryString(), - "/error/msg=='Vector Encoding not supported in automatic text embedding: BYTE'", + "/error/msg=='Vector Encoding not supported : BYTE'", "/error/code==500"); } diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java b/solr/modules/llm/src/test/org/apache/solr/llm/texttovector/store/rest/TestModelManager.java similarity index 57% rename from solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java rename to solr/modules/llm/src/test/org/apache/solr/llm/texttovector/store/rest/TestModelManager.java index 64191f9e04f..f8605c02c1c 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManager.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/texttovector/store/rest/TestModelManager.java @@ -14,13 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.solr.llm.store.rest; +package org.apache.solr.llm.texttovector.store.rest; import dev.langchain4j.model.cohere.CohereEmbeddingModel; import org.apache.solr.common.util.NamedList; import org.apache.solr.core.SolrResourceLoader; import org.apache.solr.llm.TestLlmBase; -import org.apache.solr.llm.search.TextToVectorQParserPlugin; +import org.apache.solr.llm.texttovector.search.TextToVectorQParserPlugin; import org.apache.solr.rest.ManagedResource; import org.apache.solr.rest.ManagedResourceStorage; import org.apache.solr.rest.RestManager; @@ -44,7 +44,7 @@ public void test() throws Exception { final String resourceId = "/schema/mstore1"; registry.registerManagedResource( - resourceId, ManagedEmbeddingModelStore.class, new TextToVectorQParserPlugin()); + resourceId, ManagedTextToVectorModelStore.class, new TextToVectorQParserPlugin()); final NamedList initArgs = new NamedList<>(); @@ -52,7 +52,7 @@ public void test() throws Exception { restManager.init(loader, initArgs, new ManagedResourceStorage.InMemoryStorageIO()); final ManagedResource res = restManager.getManagedResource(resourceId); - assertTrue(res instanceof ManagedEmbeddingModelStore); + assertTrue(res instanceof ManagedTextToVectorModelStore); assertEquals(res.getResourceId(), resourceId); } @@ -65,7 +65,7 @@ public void testRestManagerEndpoints() throws Exception { // Add models String model = "{ \"name\":\"testModel1\", \"class\":\"" + cohereModelClassName + "\"}"; // fails since it does not have params - assertJPut(ManagedEmbeddingModelStore.REST_END_POINT, model, "/responseHeader/status==400"); + assertJPut(ManagedTextToVectorModelStore.REST_END_POINT, model, "/responseHeader/status==400"); // success model = "{ name:\"testModel2\", class:\"" @@ -79,7 +79,7 @@ public void testRestManagerEndpoints() throws Exception { + "logRequests:true," + "logResponses:false" + "}}"; - assertJPut(ManagedEmbeddingModelStore.REST_END_POINT, model, "/responseHeader/status==0"); + assertJPut(ManagedTextToVectorModelStore.REST_END_POINT, model, "/responseHeader/status==0"); // success final String multipleModels = "[{ name:\"testModel3\", class:\"" @@ -103,21 +103,21 @@ public void testRestManagerEndpoints() throws Exception { + "logResponses:false" + "}}]"; assertJPut( - ManagedEmbeddingModelStore.REST_END_POINT, multipleModels, "/responseHeader/status==0"); - final String qryResult = JQ(ManagedEmbeddingModelStore.REST_END_POINT); + ManagedTextToVectorModelStore.REST_END_POINT, multipleModels, "/responseHeader/status==0"); + final String qryResult = JQ(ManagedTextToVectorModelStore.REST_END_POINT); assertTrue( qryResult.contains("\"name\":\"testModel2\"") && qryResult.contains("\"name\":\"testModel3\"") && qryResult.contains("\"name\":\"testModel4\"")); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='testModel2'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[1]/name=='testModel3'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[2]/name=='testModel4'"); - restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/testModel2"); - restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/testModel3"); - restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/testModel4"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models==[]'"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/name=='testModel2'"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[1]/name=='testModel3'"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[2]/name=='testModel4'"); + restTestHarness.delete(ManagedTextToVectorModelStore.REST_END_POINT + "/testModel2"); + restTestHarness.delete(ManagedTextToVectorModelStore.REST_END_POINT + "/testModel3"); + restTestHarness.delete(ManagedTextToVectorModelStore.REST_END_POINT + "/testModel4"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models==[]'"); } @Test @@ -125,23 +125,23 @@ public void loadModel_cohere_shouldLoadModelConfig() throws Exception { loadModel("cohere-model.json"); final String modelName = "cohere-1"; - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); assertJQ( - ManagedEmbeddingModelStore.REST_END_POINT, + ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/baseUrl=='https://api.cohere.ai/v1/'"); assertJQ( - ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-cohere'"); + ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-cohere'"); assertJQ( - ManagedEmbeddingModelStore.REST_END_POINT, + ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/modelName=='embed-english-light-v3.0'"); assertJQ( - ManagedEmbeddingModelStore.REST_END_POINT, + ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/inputType=='search_document'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/timeout==60"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logRequests==true"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logResponses==true"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/timeout==60"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/logRequests==true"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/logResponses==true"); - restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/" + modelName); + restTestHarness.delete(ManagedTextToVectorModelStore.REST_END_POINT + "/" + modelName); } @Test @@ -149,21 +149,21 @@ public void loadModel_openAi_shouldLoadModelConfig() throws Exception { loadModel("openai-model.json"); final String modelName = "openai-1"; - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); assertJQ( - ManagedEmbeddingModelStore.REST_END_POINT, + ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/baseUrl=='https://api.openai.com/v1'"); assertJQ( - ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-openAI'"); + ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-openAI'"); assertJQ( - ManagedEmbeddingModelStore.REST_END_POINT, + ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/modelName=='text-embedding-3-small'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/timeout==60"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logRequests==true"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logResponses==true"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/maxRetries==5"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/timeout==60"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/logRequests==true"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/logResponses==true"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/maxRetries==5"); - restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/" + modelName); + restTestHarness.delete(ManagedTextToVectorModelStore.REST_END_POINT + "/" + modelName); } @Test @@ -171,20 +171,22 @@ public void loadModel_mistralAi_shouldLoadModelConfig() throws Exception { loadModel("mistralai-model.json"); final String modelName = "mistralai-1"; - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); assertJQ( - ManagedEmbeddingModelStore.REST_END_POINT, + ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/baseUrl=='https://api.mistral.ai/v1'"); assertJQ( - ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-mistralAI'"); + ManagedTextToVectorModelStore.REST_END_POINT, + "/models/[0]/params/apiKey=='apiKey-mistralAI'"); assertJQ( - ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/modelName=='mistral-embed'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/timeout==60"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logRequests==true"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logResponses==true"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/maxRetries==5"); - - restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/" + modelName); + ManagedTextToVectorModelStore.REST_END_POINT, + "/models/[0]/params/modelName=='mistral-embed'"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/timeout==60"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/logRequests==true"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/logResponses==true"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/maxRetries==5"); + + restTestHarness.delete(ManagedTextToVectorModelStore.REST_END_POINT + "/" + modelName); } @Test @@ -192,15 +194,15 @@ public void loadModel_huggingface_shouldLoadModelConfig() throws Exception { loadModel("huggingface-model.json"); final String modelName = "huggingface-1"; - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); assertJQ( - ManagedEmbeddingModelStore.REST_END_POINT, + ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/accessToken=='apiKey-huggingface'"); assertJQ( - ManagedEmbeddingModelStore.REST_END_POINT, + ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/modelId=='sentence-transformers/all-MiniLM-L6-v2'"); - restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/" + modelName); + restTestHarness.delete(ManagedTextToVectorModelStore.REST_END_POINT + "/" + modelName); } @Test @@ -213,11 +215,9 @@ public void loadModel_dummyAmbiguousParam_shouldDefaultToString() throws Excepti loadModel("dummy-model-ambiguous.json"); final String modelName = "dummy-1"; - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); - assertJQ( - ManagedEmbeddingModelStore.REST_END_POINT, - "/models/[0]/params/ambiguous==10"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/ambiguous==10"); - restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/" + modelName); + restTestHarness.delete(ManagedTextToVectorModelStore.REST_END_POINT + "/" + modelName); } } diff --git a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java b/solr/modules/llm/src/test/org/apache/solr/llm/texttovector/store/rest/TestModelManagerPersistence.java similarity index 52% rename from solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java rename to solr/modules/llm/src/test/org/apache/solr/llm/texttovector/store/rest/TestModelManagerPersistence.java index 44f68f37db6..798e2f091b6 100644 --- a/solr/modules/llm/src/test/org/apache/solr/llm/store/rest/TestModelManagerPersistence.java +++ b/solr/modules/llm/src/test/org/apache/solr/llm/texttovector/store/rest/TestModelManagerPersistence.java @@ -14,11 +14,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.solr.llm.store.rest; +package org.apache.solr.llm.texttovector.store.rest; import static java.nio.charset.StandardCharsets.UTF_8; -import dev.langchain4j.model.cohere.CohereEmbeddingModel; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import org.apache.solr.common.util.Utils; @@ -42,87 +41,85 @@ public void cleanup() throws Exception { @Test public void testModelAreStoredCompact() throws Exception { loadModel("cohere-model.json"); - - final String JSONOnDisk = - Files.readString(embeddingModelStoreFile, StandardCharsets.UTF_8); + + final String JSONOnDisk = Files.readString(embeddingModelStoreFile, StandardCharsets.UTF_8); Object objectFromDisk = Utils.fromJSONString(JSONOnDisk); - assertEquals( - new String(Utils.toJSON(objectFromDisk, -1), UTF_8), JSONOnDisk); + assertEquals(new String(Utils.toJSON(objectFromDisk, -1), UTF_8), JSONOnDisk); } @Test public void testModelStorePersistence() throws Exception { // check models are empty - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/==[]"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/==[]"); // load models and features from files loadModel("cohere-model.json"); final String modelName = "cohere-1"; - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); assertJQ( - ManagedEmbeddingModelStore.REST_END_POINT, + ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/baseUrl=='https://api.cohere.ai/v1/'"); assertJQ( - ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-cohere'"); + ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-cohere'"); assertJQ( - ManagedEmbeddingModelStore.REST_END_POINT, + ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/modelName=='embed-english-light-v3.0'"); assertJQ( - ManagedEmbeddingModelStore.REST_END_POINT, + ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/inputType=='search_document'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/timeout==60"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logRequests==true"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logResponses==true"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/timeout==60"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/logRequests==true"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/logResponses==true"); // check persistence after reload restTestHarness.reload(); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); assertJQ( - ManagedEmbeddingModelStore.REST_END_POINT, + ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/baseUrl=='https://api.cohere.ai/v1/'"); assertJQ( - ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-cohere'"); + ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-cohere'"); assertJQ( - ManagedEmbeddingModelStore.REST_END_POINT, + ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/modelName=='embed-english-light-v3.0'"); assertJQ( - ManagedEmbeddingModelStore.REST_END_POINT, + ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/inputType=='search_document'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/timeout==60"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logRequests==true"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logResponses==true"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/timeout==60"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/logRequests==true"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/logResponses==true"); // check persistence after restart getJetty().stop(); getJetty().start(); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/name=='" + modelName + "'"); assertJQ( - ManagedEmbeddingModelStore.REST_END_POINT, + ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/baseUrl=='https://api.cohere.ai/v1/'"); assertJQ( - ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-cohere'"); + ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/apiKey=='apiKey-cohere'"); assertJQ( - ManagedEmbeddingModelStore.REST_END_POINT, + ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/modelName=='embed-english-light-v3.0'"); assertJQ( - ManagedEmbeddingModelStore.REST_END_POINT, + ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/inputType=='search_document'"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/timeout==60"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logRequests==true"); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/[0]/params/logResponses==true"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/timeout==60"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/logRequests==true"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/[0]/params/logResponses==true"); // delete loaded models and features - restTestHarness.delete(ManagedEmbeddingModelStore.REST_END_POINT + "/" + modelName); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/==[]"); + restTestHarness.delete(ManagedTextToVectorModelStore.REST_END_POINT + "/" + modelName); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/==[]"); // check persistence after reload restTestHarness.reload(); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/==[]"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/==[]"); // check persistence after restart getJetty().stop(); getJetty().start(); - assertJQ(ManagedEmbeddingModelStore.REST_END_POINT, "/models/==[]"); + assertJQ(ManagedTextToVectorModelStore.REST_END_POINT, "/models/==[]"); } } diff --git a/solr/solr-ref-guide/modules/query-guide/pages/dense-vector-search.adoc b/solr/solr-ref-guide/modules/query-guide/pages/dense-vector-search.adoc index 49c1bc3f637..53c3385d9ae 100644 --- a/solr/solr-ref-guide/modules/query-guide/pages/dense-vector-search.adoc +++ b/solr/solr-ref-guide/modules/query-guide/pages/dense-vector-search.adoc @@ -322,7 +322,7 @@ In addition to the parameters in common with the other dense-retrieval query par s|Required |Default: none |=== + -The model to use to encode the text to a vector. Must reference an existing model loaded into the `/schema/embedding-model-store`. +The model to use to encode the text to a vector. Must reference an existing model loaded into the `/schema/text-to-vector-model-store`. `topK`:: + @@ -340,7 +340,7 @@ Here's an example of a simple `text_to_vector` search: The search results retrieved are the k=10 nearest documents to the vector encoded from the query `hello world query`, using the model `a-model`. -For more details on how to work with embedding text in Apache Solr, please refer to the dedicated page: xref:text-to-vector.adoc[Text to Vector] +For more details on how to work with vectorise text in Apache Solr, please refer to the dedicated page: xref:text-to-vector.adoc[Text to Vector] === vectorSimilarity Query Parser diff --git a/solr/solr-ref-guide/modules/query-guide/pages/text-to-vector.adoc b/solr/solr-ref-guide/modules/query-guide/pages/text-to-vector.adoc index d0a6197d600..be85d007479 100644 --- a/solr/solr-ref-guide/modules/query-guide/pages/text-to-vector.adoc +++ b/solr/solr-ref-guide/modules/query-guide/pages/text-to-vector.adoc @@ -20,22 +20,21 @@ This module brings the power of *Large Language Models* (*LLM*s) to Solr. More _Without_ this module, vectors must be supplied _to_ Solr for indexing & searching, possibly coordinating with such services. -== Text Embedding Concepts +== Main Concepts === From Text to Vector -The task of sentence similarity aims to encode text to numerical vectors in a way that semantically similar sentences are encoded to vectors close in a vector space. -Vector distance metrics (algorithms) compute a pairwise similarity, producing a score. +The aim of encoding text to numerical vectors is to represent text in a way that semantically similar sentences are encoded to vectors close in a vector space. +Vector distance metrics (algorithms) can then be used to compute a pairwise similarity, producing a score. === Large Language Models -Large Language Models can be fine-tuned for such a task. -The resulting model is able to encode text to a numerical vector. +Specific Large Language Models are able to encode text to a numerical vector. For additional information you can refer to this https://sease.io/2021/12/using-bert-to-improve-search-relevance.html[blog post]. -==== Embedding Services +==== Text to Vector Online Services Training, fine-tuning and operating such Large Language Models is expensive. @@ -45,7 +44,10 @@ Apache Solr uses https://github.com/langchain4j/langchain4j[LangChain4j] to conn [IMPORTANT] ==== -At the moment a subset of the embedding models supported by LangChain4j is supported by Solr. +This module sends your documents and queries off to some hosted service on the internet. +There are cost, privacy, performance, and service availability implications on such a strong dependency that should be diligently examined before employing this module in a serious way. + +At the moment a subset of the text vectorisation services supported by LangChain4j is supported by Solr. *Disclaimer*: Apache Solr is *in no way* affiliated to any of these corporations or services. @@ -58,11 +60,6 @@ If you want to add support for additional services or improve the support for th This is provided via the `llm` xref:configuration-guide:solr-modules.adoc[Solr Module] that needs to be enabled before use. -At the moment the only supported way to interact with Large Language Models is via embedding text. - -In the future additional components to empower Solr with LLM will be added. - - == LLM Configuration Large-Language-Model is a module and therefore its plugins must be configured in `solrconfig.xml`. @@ -73,18 +70,18 @@ Large-Language-Model is a module and therefore its plugins must be configured in + [source,xml] ---- - + ---- -== Text Embedding Lifecycle +== Text Vectorisation Lifecycle === Models * A model encodes text to a vector. -* A model in Solr is a reference to an external API that runs the Large Language Model responsible for text embedding. +* A model in Solr is a reference to an external API that runs the Large Language Model responsible for text vectorisation. -*N.B.* the Solr embedding model specifies the parameters to access the APIs, the model doesn't run internally in Solr +*N.B.* the Solr vectorisation model specifies the parameters to access the APIs, the model doesn't run internally in Solr A model is described by these parameters: @@ -123,11 +120,11 @@ The identifier of your model, this is used by any component that intends to use |=== + Each model class has potentially different params. -Many are shared but for the full set of parameters of the model you are interested in please refer to the official documentation of the LangChain4j version included in Solr: https://docs.langchain4j.dev/category/embedding-models[Embedding Models in LangChain4j]. +Many are shared but for the full set of parameters of the model you are interested in please refer to the official documentation of the LangChain4j version included in Solr: https://docs.langchain4j.dev/category/embedding-models[Vectorisationm Models in LangChain4j]. === Supported Models -Apache Solr uses https://github.com/langchain4j/langchain4j[LangChain4j] to support text embedding. +Apache Solr uses https://github.com/langchain4j/langchain4j[LangChain4j] to support text vectorisation. The models currently supported are: [tabs#supported-models] @@ -143,7 +140,7 @@ Hugging Face:: "name": "", "params": { "accessToken": "", - "modelId": "" + "modelId": "" } } ---- @@ -160,7 +157,7 @@ MistralAI:: "params": { "baseUrl": "https://api.mistral.ai/v1", "apiKey": "", - "modelName": "", + "modelName": "", "timeout": 60, "logRequests": true, "logResponses": true, @@ -181,7 +178,7 @@ OpenAI:: "params": { "baseUrl": "https://api.openai.com/v1", "apiKey": "", - "modelName": "", + "modelName": "", "timeout": 60, "logRequests": true, "logResponses": true, @@ -202,7 +199,7 @@ Cohere:: "params": { "baseUrl": "https://api.cohere.ai/v1/", "apiKey": "", - "modelName": "", + "modelName": "", "inputType": "search_document", "timeout": 60, "logRequests": true, @@ -219,27 +216,27 @@ To upload the model in a `/path/myModel.json` file, please run: [source,bash] ---- -curl -XPUT 'http://localhost:8983/solr/techproducts/schema/embedding-model-store' --data-binary "@/path/myModel.json" -H 'Content-type:application/json' +curl -XPUT 'http://localhost:8983/solr/techproducts/schema/vectorisation-model-store' --data-binary "@/path/myModel.json" -H 'Content-type:application/json' ---- To view all models: [source,text] -http://localhost:8983/solr/techproducts/schema/embedding-model-store +http://localhost:8983/solr/techproducts/schema/vectorisation-model-store To delete the `currentModel` model: [source,bash] ---- -curl -XDELETE 'http://localhost:8983/solr/techproducts/schema/embedding-model-store/currentModel' +curl -XDELETE 'http://localhost:8983/solr/techproducts/schema/vectorisation-model-store/currentModel' ---- To view the model you just uploaded please open the following URL in a browser: [source,text] -http://localhost:8983/solr/techproducts/schema/embedding-model-store +http://localhost:8983/solr/techproducts/schema/vectorisation-model-store .Example: /path/myModel.json [source,json] @@ -260,7 +257,7 @@ http://localhost:8983/solr/techproducts/schema/embedding-model-store ---- -=== Running an embedding Query +=== Running an Text to Vector Query To run a query that embeds your query text, using a model you previously uploaded is simple: [source,text] From 139f895793c683176c553cd6d5aa71f55d7fdffb Mon Sep 17 00:00:00 2001 From: Alessandro Benedetti Date: Fri, 29 Nov 2024 17:23:06 +0000 Subject: [PATCH 65/65] sync read --- .../texttovector/store/TextToVectorModelStore.java | 8 +++++--- .../modules/query-guide/pages/text-to-vector.adoc | 14 ++++++++------ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/solr/modules/llm/src/java/org/apache/solr/llm/texttovector/store/TextToVectorModelStore.java b/solr/modules/llm/src/java/org/apache/solr/llm/texttovector/store/TextToVectorModelStore.java index 00887de6beb..cf1db239d44 100644 --- a/solr/modules/llm/src/java/org/apache/solr/llm/texttovector/store/TextToVectorModelStore.java +++ b/solr/modules/llm/src/java/org/apache/solr/llm/texttovector/store/TextToVectorModelStore.java @@ -41,9 +41,11 @@ public void clear() { } public List getModels() { - final List availableModelsValues = - new ArrayList(availableModels.values()); - return Collections.unmodifiableList(availableModelsValues); + synchronized (availableModels) { + final List availableModelsValues = + new ArrayList(availableModels.values()); + return Collections.unmodifiableList(availableModelsValues); + } } @Override diff --git a/solr/solr-ref-guide/modules/query-guide/pages/text-to-vector.adoc b/solr/solr-ref-guide/modules/query-guide/pages/text-to-vector.adoc index be85d007479..d1c04f2d70d 100644 --- a/solr/solr-ref-guide/modules/query-guide/pages/text-to-vector.adoc +++ b/solr/solr-ref-guide/modules/query-guide/pages/text-to-vector.adoc @@ -47,6 +47,8 @@ Apache Solr uses https://github.com/langchain4j/langchain4j[LangChain4j] to conn This module sends your documents and queries off to some hosted service on the internet. There are cost, privacy, performance, and service availability implications on such a strong dependency that should be diligently examined before employing this module in a serious way. +==== + At the moment a subset of the text vectorisation services supported by LangChain4j is supported by Solr. *Disclaimer*: Apache Solr is *in no way* affiliated to any of these corporations or services. @@ -54,7 +56,6 @@ At the moment a subset of the text vectorisation services supported by LangChain If you want to add support for additional services or improve the support for the existing ones, feel free to contribute: * https://github.com/apache/solr/blob/main/CONTRIBUTING.md[Contributing to Solr] -==== == Module @@ -62,9 +63,7 @@ This is provided via the `llm` xref:configuration-guide:solr-modules.adoc[Solr M == LLM Configuration -Large-Language-Model is a module and therefore its plugins must be configured in `solrconfig.xml`. - -=== Minimum Requirements +You need to register / configure the plugins provided by the LLM module that you want to use. This is done in `solrconfig.xml`. * Declaration of the `text_to_vector` query parser. + @@ -73,7 +72,7 @@ Large-Language-Model is a module and therefore its plugins must be configured in ---- -== Text Vectorisation Lifecycle +== Text to Vector Lifecycle === Models @@ -81,8 +80,11 @@ Large-Language-Model is a module and therefore its plugins must be configured in * A model encodes text to a vector. * A model in Solr is a reference to an external API that runs the Large Language Model responsible for text vectorisation. -*N.B.* the Solr vectorisation model specifies the parameters to access the APIs, the model doesn't run internally in Solr +[IMPORTANT] +==== +the Solr vectorisation model specifies the parameters to access the APIs, the model doesn't run internally in Solr +==== A model is described by these parameters: