Skip to content

Commit 10a0b9b

Browse files
authored
[ML] Fix Get DeepSeek Model (#124802)
When secrets are null, we should allow the model to return for the Get Model API.
1 parent 9f6042a commit 10a0b9b

File tree

4 files changed

+26
-33
lines changed

4 files changed

+26
-33
lines changed

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/external/deepseek/DeepSeekChatCompletionRequest.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import org.apache.http.HttpHeaders;
1111
import org.apache.http.client.methods.HttpPost;
1212
import org.apache.http.entity.ByteArrayEntity;
13+
import org.apache.logging.log4j.LogManager;
14+
import org.apache.logging.log4j.Logger;
1315
import org.elasticsearch.ElasticsearchException;
1416
import org.elasticsearch.common.Strings;
1517
import org.elasticsearch.xcontent.ToXContent;
@@ -29,6 +31,7 @@
2931
import static org.elasticsearch.xpack.inference.external.request.RequestUtils.createAuthBearerHeader;
3032

3133
public class DeepSeekChatCompletionRequest implements Request {
34+
private static final Logger logger = LogManager.getLogger(DeepSeekChatCompletionRequest.class);
3235
private static final String MODEL_FIELD = "model";
3336
private static final String MAX_TOKENS = "max_tokens";
3437

@@ -47,7 +50,11 @@ public HttpRequest createHttpRequest() {
4750
httpPost.setEntity(createEntity());
4851

4952
httpPost.setHeader(HttpHeaders.CONTENT_TYPE, XContentType.JSON.mediaType());
50-
httpPost.setHeader(createAuthBearerHeader(model.apiKey()));
53+
model.apiKey()
54+
.ifPresentOrElse(
55+
apiKey -> httpPost.setHeader(createAuthBearerHeader(apiKey)),
56+
() -> logger.debug("No auth token present in request, sending without auth...")
57+
);
5158

5259
return new HttpRequest(httpPost, getInferenceEntityId());
5360
}

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/deepseek/DeepSeekChatCompletionModel.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.elasticsearch.common.io.stream.StreamInput;
1515
import org.elasticsearch.common.io.stream.StreamOutput;
1616
import org.elasticsearch.common.settings.SecureString;
17+
import org.elasticsearch.core.Nullable;
1718
import org.elasticsearch.inference.EmptyTaskSettings;
1819
import org.elasticsearch.inference.Model;
1920
import org.elasticsearch.inference.ModelConfigurations;
@@ -30,6 +31,7 @@
3031
import java.util.List;
3132
import java.util.Map;
3233
import java.util.Objects;
34+
import java.util.Optional;
3335

3436
import static org.elasticsearch.xpack.inference.services.ServiceFields.MODEL_ID;
3537
import static org.elasticsearch.xpack.inference.services.ServiceFields.URL;
@@ -63,6 +65,7 @@ public class DeepSeekChatCompletionModel extends Model {
6365

6466
private static final URI DEFAULT_URI = URI.create("https://api.deepseek.com/chat/completions");
6567
private final DeepSeekServiceSettings serviceSettings;
68+
@Nullable
6669
private final DefaultSecretSettings secretSettings;
6770

6871
public static List<NamedWriteableRegistry.Entry> namedWriteables() {
@@ -126,7 +129,7 @@ public static DeepSeekChatCompletionModel readFromStorage(
126129

127130
private DeepSeekChatCompletionModel(
128131
DeepSeekServiceSettings serviceSettings,
129-
DefaultSecretSettings secretSettings,
132+
@Nullable DefaultSecretSettings secretSettings,
130133
ModelConfigurations configurations,
131134
ModelSecrets secrets
132135
) {
@@ -135,8 +138,8 @@ private DeepSeekChatCompletionModel(
135138
this.secretSettings = secretSettings;
136139
}
137140

138-
public SecureString apiKey() {
139-
return secretSettings.apiKey();
141+
public Optional<SecureString> apiKey() {
142+
return Optional.ofNullable(secretSettings).map(DefaultSecretSettings::apiKey);
140143
}
141144

142145
public String model() {

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/deepseek/DeepSeekService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,8 @@ public Model parsePersistedConfigWithSecrets(
150150

151151
@Override
152152
public Model parsePersistedConfig(String modelId, TaskType taskType, Map<String, Object> config) {
153-
return parsePersistedConfigWithSecrets(modelId, taskType, config, config);
153+
var serviceSettingsMap = removeFromMapOrThrowIfNull(config, ModelConfigurations.SERVICE_SETTINGS);
154+
return DeepSeekChatCompletionModel.readFromStorage(modelId, taskType, NAME, serviceSettingsMap, null);
154155
}
155156

156157
@Override

x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/deepseek/DeepSeekServiceTests.java

Lines changed: 10 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import java.nio.charset.StandardCharsets;
4545
import java.util.List;
4646
import java.util.Map;
47+
import java.util.Optional;
4748
import java.util.concurrent.TimeUnit;
4849

4950
import static org.elasticsearch.ExceptionsHelper.unwrapCause;
@@ -90,7 +91,7 @@ public void testParseRequestConfig() throws IOException, URISyntaxException {
9091
}
9192
""", webServer.getUri(null).toString()), assertNoFailureListener(model -> {
9293
if (model instanceof DeepSeekChatCompletionModel deepSeekModel) {
93-
assertThat(deepSeekModel.apiKey().getChars(), equalTo("12345".toCharArray()));
94+
assertThat(deepSeekModel.apiKey().get().getChars(), equalTo("12345".toCharArray()));
9495
assertThat(deepSeekModel.model(), equalTo("some-cool-model"));
9596
assertThat(deepSeekModel.uri(), equalTo(webServer.getUri(null)));
9697
} else {
@@ -158,13 +159,10 @@ public void testParsePersistedConfig() throws IOException {
158159
{
159160
"service_settings": {
160161
"model_id": "some-cool-model"
161-
},
162-
"secret_settings": {
163-
"api_key": "12345"
164162
}
165163
}
166164
""");
167-
assertThat(deepSeekModel.apiKey().getChars(), equalTo("12345".toCharArray()));
165+
assertThat(deepSeekModel.apiKey(), equalTo(Optional.empty()));
168166
assertThat(deepSeekModel.model(), equalTo("some-cool-model"));
169167
}
170168

@@ -174,33 +172,14 @@ public void testParsePersistedConfigWithUrl() throws IOException {
174172
"service_settings": {
175173
"model_id": "some-cool-model",
176174
"url": "http://localhost:989"
177-
},
178-
"secret_settings": {
179-
"api_key": "12345"
180175
}
181176
}
182177
""");
183-
assertThat(deepSeekModel.apiKey().getChars(), equalTo("12345".toCharArray()));
178+
assertThat(deepSeekModel.apiKey(), equalTo(Optional.empty()));
184179
assertThat(deepSeekModel.model(), equalTo("some-cool-model"));
185180
assertThat(deepSeekModel.uri(), equalTo(URI.create("http://localhost:989")));
186181
}
187182

188-
public void testParsePersistedConfigWithoutApiKey() {
189-
assertThrows(
190-
"Validation Failed: 1: [secret_settings] does not contain the required setting [api_key];",
191-
ValidationException.class,
192-
() -> parsePersistedConfig("""
193-
{
194-
"service_settings": {
195-
"model_id": "some-cool-model"
196-
},
197-
"secret_settings": {
198-
}
199-
}
200-
""")
201-
);
202-
}
203-
204183
public void testParsePersistedConfigWithoutModel() {
205184
assertThrows(
206185
"Validation Failed: 1: [service_settings] does not contain the required setting [model];",
@@ -424,17 +403,20 @@ private InferenceEventsAssertion doUnifiedCompletionInfer() throws Exception {
424403
}
425404

426405
private DeepSeekChatCompletionModel createModel(DeepSeekService service, TaskType taskType) throws URISyntaxException, IOException {
427-
var model = service.parsePersistedConfig("inference-id", taskType, map(Strings.format("""
406+
var model = service.parsePersistedConfigWithSecrets("inference-id", taskType, map(Strings.format("""
428407
{
429408
"service_settings": {
430409
"model_id": "some-cool-model",
431410
"url": "%s"
432-
},
411+
}
412+
}
413+
""", webServer.getUri(null).toString())), map("""
414+
{
433415
"secret_settings": {
434416
"api_key": "12345"
435417
}
436418
}
437-
""", webServer.getUri(null).toString())));
419+
"""));
438420
assertThat(model, isA(DeepSeekChatCompletionModel.class));
439421
return (DeepSeekChatCompletionModel) model;
440422
}

0 commit comments

Comments
 (0)