Skip to content
Open
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CONFIGURATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ Other Quarkus properties that are specifically relevant for the service:
| `stargate.jsonapi.operations.database-config.ddl-retry-delay-millis` | `int` | `1000` | Delay time in seconds for DDL timeout. |
| `stargate.jsonapi.operations.database-config.ddl-delay-millis` | `int` | `2000` | Delay between create table and create index to get the schema sync. |
| `stargate.jsonapi.operations.vectorize-enabled` | `boolean` | `false` | Flag to enable server side vectorization. |
| `stargate.jsonapi.operations.return-deprecated-models` | `boolean` | `false` | Flag to indicate whether to return deprecated models in the FindEmbeddingProvidersCommand's response or not. |


## Jsonapi metering configuration
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,13 @@ interface ConsistencyConfig {
@WithDefault("false")
boolean vectorizeEnabled();

/**
* @return Flag to indicate whether to return deprecated models in the
* FindEmbeddingProvidersCommand's response.
*/
@WithDefault("false")
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should we default true?

boolean returnDeprecatedModels();

/** Offline mode configuration. */
@NotNull
@Valid
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
* Operation that list all available and enabled vector providers into the {@link
* CommandStatus#EXISTING_VECTOR_PROVIDERS} command status.
*/
public record FindEmbeddingProvidersOperation(EmbeddingProvidersConfig config)
implements Operation {
public record FindEmbeddingProvidersOperation(
EmbeddingProvidersConfig config, boolean returnDeprecatedModels) implements Operation {
@Override
public Uni<Supplier<CommandResult>> execute(
DataApiRequestInfo dataApiRequestInfo, QueryExecutor queryExecutor) {
Expand All @@ -29,7 +29,9 @@ public Uni<Supplier<CommandResult>> execute(
.collect(
Collectors.toMap(
Map.Entry::getKey,
entry -> EmbeddingProviderResponse.provider(entry.getValue())));
entry ->
EmbeddingProviderResponse.provider(
entry.getValue(), returnDeprecatedModels)));
return new Result(embeddingProviders);
});
}
Expand Down Expand Up @@ -57,7 +59,7 @@ public CommandResult get() {
* @param parameters Customizable parameters for the provider's service.
* @param models Model configurations available from the provider.
*/
private record EmbeddingProviderResponse(
protected record EmbeddingProviderResponse(
String displayName,
Optional<String> url,
Map<
Expand All @@ -67,10 +69,16 @@ private record EmbeddingProviderResponse(
List<EmbeddingProvidersConfig.EmbeddingProviderConfig.ParameterConfig> parameters,
List<ModelConfigResponse> models) {
private static EmbeddingProviderResponse provider(
EmbeddingProvidersConfig.EmbeddingProviderConfig embeddingProviderConfig) {
EmbeddingProvidersConfig.EmbeddingProviderConfig embeddingProviderConfig,
boolean returnDeprecatedModels) {
ArrayList<ModelConfigResponse> modelsRemoveProperties = new ArrayList<>();
for (EmbeddingProvidersConfig.EmbeddingProviderConfig.ModelConfig model :
embeddingProviderConfig.models()) {
if (!returnDeprecatedModels) {
if (model.deprecated().orElse(false)) {
continue;
}
}
ModelConfigResponse returnModel =
ModelConfigResponse.returnModelConfigResponse(
model.name(), model.vectorDimension(), model.parameters());
Expand All @@ -94,7 +102,7 @@ private static EmbeddingProviderResponse provider(
* @param vectorDimension vector dimension of the model.
* @param parameters Parameters for customizing the model.
*/
private record ModelConfigResponse(
protected record ModelConfigResponse(
String name, Optional<Integer> vectorDimension, List<ParameterConfigResponse> parameters) {
private static ModelConfigResponse returnModelConfigResponse(
String name,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ public Operation resolveDatabaseCommand(
if (!operationsConfig.vectorizeEnabled()) {
throw ErrorCodeV1.VECTORIZE_FEATURE_NOT_AVAILABLE.toApiException();
}
return new FindEmbeddingProvidersOperation(embeddingProvidersConfig);
return new FindEmbeddingProvidersOperation(
embeddingProvidersConfig, operationsConfig.returnDeprecatedModels());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
package io.stargate.sgv2.jsonapi.service.operation.embeddings;

import static org.assertj.core.api.Assertions.assertThat;

import com.fasterxml.jackson.databind.ObjectMapper;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.TestProfile;
import io.smallrye.mutiny.helpers.test.UniAssertSubscriber;
import io.stargate.sgv2.jsonapi.api.model.command.CommandResult;
import io.stargate.sgv2.jsonapi.api.model.command.CommandStatus;
import io.stargate.sgv2.jsonapi.service.embedding.configuration.EmbeddingProvidersConfig;
import io.stargate.sgv2.jsonapi.service.embedding.configuration.EmbeddingProvidersConfigImpl;
import io.stargate.sgv2.jsonapi.service.operation.collections.OperationTestBase;
import io.stargate.sgv2.jsonapi.testresource.NoGlobalResourcesTestProfile;
import jakarta.inject.Inject;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Supplier;
import javax.annotation.Nullable;
import org.junit.jupiter.api.Test;

@QuarkusTest
@TestProfile(NoGlobalResourcesTestProfile.Impl.class)
public class FindEmbeddingProvidersOperationTest extends OperationTestBase {
@Inject ObjectMapper objectMapper;

@Test
public void testDoNotReturnDeprecatedModels() {
CommandResult result = executeFindEmbeddingProvidersOperation(false);
Map<String, FindEmbeddingProvidersOperation.EmbeddingProviderResponse> configMap =
(Map<String, FindEmbeddingProvidersOperation.EmbeddingProviderResponse>)
result.status().get(CommandStatus.EXISTING_VECTOR_PROVIDERS);
assertThat(configMap).hasSize(1);
FindEmbeddingProvidersOperation.EmbeddingProviderResponse providerConfig =
configMap.get("provider1");
assertThat(providerConfig.models()).hasSize(1);
assertThat(providerConfig.models().getFirst().name()).isEqualTo("supported-model");
}

@Test
public void testReturnDeprecatedModels() {
CommandResult result = executeFindEmbeddingProvidersOperation(true);
Map<String, FindEmbeddingProvidersOperation.EmbeddingProviderResponse> configMap =
(Map<String, FindEmbeddingProvidersOperation.EmbeddingProviderResponse>)
result.status().get(CommandStatus.EXISTING_VECTOR_PROVIDERS);
assertThat(configMap).hasSize(1);
FindEmbeddingProvidersOperation.EmbeddingProviderResponse providerConfig =
configMap.get("provider1");
assertThat(providerConfig.models()).hasSize(2);
assertThat(providerConfig.models().getFirst().name()).isEqualTo("supported-model");
assertThat(providerConfig.models().getLast().name()).isEqualTo("deprecated-model");
}

private CommandResult executeFindEmbeddingProvidersOperation(boolean returnDeprecatedModels) {
FindEmbeddingProvidersOperation findEmbeddingProvidersOperation =
new FindEmbeddingProvidersOperation(
getTestEmbeddingProvidersConfig(), returnDeprecatedModels);
Supplier<CommandResult> execute =
findEmbeddingProvidersOperation
.execute(null, null)
.subscribe()
.withSubscriber(UniAssertSubscriber.create())
.awaitItem()
.getItem();
return execute.get();
}

private EmbeddingProvidersConfig getTestEmbeddingProvidersConfig() {
return new EmbeddingProvidersConfig() {
@Override
public Map<String, EmbeddingProviderConfig> providers() {
List<EmbeddingProviderConfig.ModelConfig> modelConfigs =
List.of(
new EmbeddingProvidersConfigImpl.EmbeddingProviderConfigImpl.ModelConfigImpl(
"supported-model",
Optional.of(1),
List.of(),
Map.of(),
Optional.of(false),
Optional.of("url1")),
new EmbeddingProvidersConfigImpl.EmbeddingProviderConfigImpl.ModelConfigImpl(
"deprecated-model",
Optional.of(1),
List.of(),
Map.of(),
Optional.of(true),
Optional.of("url1")));
EmbeddingProviderConfig providerConfig =
new EmbeddingProvidersConfigImpl.EmbeddingProviderConfigImpl(
"provider1", true, Optional.of("url1"), Map.of(), List.of(), null, modelConfigs);
return Map.of("provider1", providerConfig);
}

@Override
public @Nullable CustomConfig custom() {
return null;
}
};
}
}