Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
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;
}
};
}
}
Loading