Skip to content

Commit abd8b32

Browse files
authored
[ML] Migrate Alibaba Senders to SenderExecutableAction (elastic#134515)
- Remove AlibabaCloudSearch*Action classes in favour of using SenderExecutableAction in AlibabaCloudSearchActionCreator - Consolidate redundant GoogleDiscoveryEngineRateLimitServiceSettings and GoogleVertexAiEmbeddingsRateLimitServiceSettings interfaces with GoogleVertexAiRateLimitServiceSettings - Rename fields on CustomRequestManager.RateLimitGrouping and AlibabaCloudSearchRequestManager.RateLimitGrouping to better reflect what they actually are - Add tests for AlibabaCloudSearchActionCreator - Migrate some existing tests to AlibabaCloudSearchCompletionRequestManagerTests
1 parent 630d529 commit abd8b32

22 files changed

+522
-449
lines changed

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/external/action/SenderExecutableAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
import static org.elasticsearch.xpack.inference.external.action.ActionUtils.wrapFailuresInElasticsearchException;
2020

21-
public class SenderExecutableAction implements ExecutableAction {
21+
public sealed class SenderExecutableAction implements ExecutableAction permits SingleInputSenderExecutableAction {
2222

2323
private final Sender sender;
2424
private final RequestManager requestManager;

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/external/action/SingleInputSenderExecutableAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
import java.util.Objects;
2020

21-
public class SingleInputSenderExecutableAction extends SenderExecutableAction {
21+
public final class SingleInputSenderExecutableAction extends SenderExecutableAction {
2222
private final String requestTypeForInputValidationError;
2323

2424
public SingleInputSenderExecutableAction(

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchCompletionRequestManager.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@
99

1010
import org.apache.logging.log4j.LogManager;
1111
import org.apache.logging.log4j.Logger;
12+
import org.elasticsearch.ElasticsearchStatusException;
1213
import org.elasticsearch.action.ActionListener;
1314
import org.elasticsearch.inference.InferenceServiceResults;
15+
import org.elasticsearch.rest.RestStatus;
1416
import org.elasticsearch.threadpool.ThreadPool;
1517
import org.elasticsearch.xpack.inference.external.http.retry.RequestSender;
1618
import org.elasticsearch.xpack.inference.external.http.retry.ResponseHandler;
@@ -71,6 +73,16 @@ public void execute(
7173
ActionListener<InferenceServiceResults> listener
7274
) {
7375
List<String> input = inferenceInputs.castTo(ChatCompletionInput.class).getInputs();
76+
if (input.size() % 2 == 0) {
77+
listener.onFailure(
78+
new ElasticsearchStatusException(
79+
"Alibaba Completion's inputs must be an odd number. The last input is the current query, "
80+
+ "all preceding inputs are the completion history as pairs of user input and the assistant's response.",
81+
RestStatus.BAD_REQUEST
82+
)
83+
);
84+
return;
85+
}
7486
AlibabaCloudSearchCompletionRequest request = new AlibabaCloudSearchCompletionRequest(account, input, model);
7587
execute(new ExecutableInferenceRequest(requestSender, logger, request, HANDLER, hasRequestCompletedFunction, listener));
7688
}

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchRequestManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ protected AlibabaCloudSearchRequestManager(ThreadPool threadPool, AlibabaCloudSe
1818
super(threadPool, model.getInferenceEntityId(), RateLimitGrouping.of(model), model.rateLimitServiceSettings().rateLimitSettings());
1919
}
2020

21-
record RateLimitGrouping(int apiKeyHash) {
21+
record RateLimitGrouping(int serviceSettingsHash) {
2222
public static RateLimitGrouping of(AlibabaCloudSearchModel model) {
2323
Objects.requireNonNull(model);
2424

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/action/AlibabaCloudSearchActionCreator.java

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,14 @@
88
package org.elasticsearch.xpack.inference.services.alibabacloudsearch.action;
99

1010
import org.elasticsearch.xpack.inference.external.action.ExecutableAction;
11+
import org.elasticsearch.xpack.inference.external.action.SenderExecutableAction;
1112
import org.elasticsearch.xpack.inference.external.http.sender.Sender;
1213
import org.elasticsearch.xpack.inference.services.ServiceComponents;
14+
import org.elasticsearch.xpack.inference.services.alibabacloudsearch.AlibabaCloudSearchAccount;
15+
import org.elasticsearch.xpack.inference.services.alibabacloudsearch.AlibabaCloudSearchCompletionRequestManager;
16+
import org.elasticsearch.xpack.inference.services.alibabacloudsearch.AlibabaCloudSearchEmbeddingsRequestManager;
17+
import org.elasticsearch.xpack.inference.services.alibabacloudsearch.AlibabaCloudSearchRerankRequestManager;
18+
import org.elasticsearch.xpack.inference.services.alibabacloudsearch.AlibabaCloudSearchSparseRequestManager;
1319
import org.elasticsearch.xpack.inference.services.alibabacloudsearch.completion.AlibabaCloudSearchCompletionModel;
1420
import org.elasticsearch.xpack.inference.services.alibabacloudsearch.embeddings.AlibabaCloudSearchEmbeddingsModel;
1521
import org.elasticsearch.xpack.inference.services.alibabacloudsearch.rerank.AlibabaCloudSearchRerankModel;
@@ -18,6 +24,8 @@
1824
import java.util.Map;
1925
import java.util.Objects;
2026

27+
import static org.elasticsearch.xpack.inference.external.action.ActionUtils.constructFailedToSendRequestMessage;
28+
2129
/**
2230
* Provides a way to construct an {@link ExecutableAction} using the visitor pattern based on the alibaba cloud search model type.
2331
*/
@@ -33,28 +41,40 @@ public AlibabaCloudSearchActionCreator(Sender sender, ServiceComponents serviceC
3341
@Override
3442
public ExecutableAction create(AlibabaCloudSearchEmbeddingsModel model, Map<String, Object> taskSettings) {
3543
var overriddenModel = AlibabaCloudSearchEmbeddingsModel.of(model, taskSettings);
44+
var account = new AlibabaCloudSearchAccount(overriddenModel.getSecretSettings().apiKey());
45+
var requestManager = AlibabaCloudSearchEmbeddingsRequestManager.of(account, overriddenModel, serviceComponents.threadPool());
46+
var failedToSendRequestErrorMessage = constructFailedToSendRequestMessage("AlibabaCloud Search text embeddings");
3647

37-
return new AlibabaCloudSearchEmbeddingsAction(sender, overriddenModel, serviceComponents);
48+
return new SenderExecutableAction(sender, requestManager, failedToSendRequestErrorMessage);
3849
}
3950

4051
@Override
4152
public ExecutableAction create(AlibabaCloudSearchSparseModel model, Map<String, Object> taskSettings) {
4253
var overriddenModel = AlibabaCloudSearchSparseModel.of(model, taskSettings);
54+
var account = new AlibabaCloudSearchAccount(overriddenModel.getSecretSettings().apiKey());
55+
var requestManager = AlibabaCloudSearchSparseRequestManager.of(account, overriddenModel, serviceComponents.threadPool());
56+
var failedToSendRequestErrorMessage = constructFailedToSendRequestMessage("AlibabaCloud Search sparse embeddings");
4357

44-
return new AlibabaCloudSearchSparseAction(sender, overriddenModel, serviceComponents);
58+
return new SenderExecutableAction(sender, requestManager, failedToSendRequestErrorMessage);
4559
}
4660

4761
@Override
4862
public ExecutableAction create(AlibabaCloudSearchRerankModel model, Map<String, Object> taskSettings) {
4963
var overriddenModel = AlibabaCloudSearchRerankModel.of(model, taskSettings);
64+
var account = new AlibabaCloudSearchAccount(overriddenModel.getSecretSettings().apiKey());
65+
var requestManager = AlibabaCloudSearchRerankRequestManager.of(account, overriddenModel, serviceComponents.threadPool());
66+
var failedToSendRequestErrorMessage = constructFailedToSendRequestMessage("AlibabaCloud Search rerank");
5067

51-
return new AlibabaCloudSearchRerankAction(sender, overriddenModel, serviceComponents);
68+
return new SenderExecutableAction(sender, requestManager, failedToSendRequestErrorMessage);
5269
}
5370

5471
@Override
5572
public ExecutableAction create(AlibabaCloudSearchCompletionModel model, Map<String, Object> taskSettings) {
5673
var overriddenModel = AlibabaCloudSearchCompletionModel.of(model, taskSettings);
74+
var account = new AlibabaCloudSearchAccount(overriddenModel.getSecretSettings().apiKey());
75+
var requestManager = AlibabaCloudSearchCompletionRequestManager.of(account, overriddenModel, serviceComponents.threadPool());
76+
var failedToSendRequestErrorMessage = constructFailedToSendRequestMessage("AlibabaCloud Search completion");
5777

58-
return new AlibabaCloudSearchCompletionAction(sender, overriddenModel, serviceComponents);
78+
return new SenderExecutableAction(sender, requestManager, failedToSendRequestErrorMessage);
5979
}
6080
}

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/action/AlibabaCloudSearchCompletionAction.java

Lines changed: 0 additions & 72 deletions
This file was deleted.

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/action/AlibabaCloudSearchEmbeddingsAction.java

Lines changed: 0 additions & 53 deletions
This file was deleted.

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/action/AlibabaCloudSearchRerankAction.java

Lines changed: 0 additions & 57 deletions
This file was deleted.

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/action/AlibabaCloudSearchSparseAction.java

Lines changed: 0 additions & 57 deletions
This file was deleted.

0 commit comments

Comments
 (0)