Skip to content

Commit e16b93f

Browse files
authored
Merge branch 'opensearch-project:main' into main
2 parents 6f6eaa4 + 72312d6 commit e16b93f

File tree

157 files changed

+12057
-3510
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

157 files changed

+12057
-3510
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ ml-algorithms/build/
1010
plugin/build/
1111
.DS_Store
1212
*/bin/
13+
**/*.factorypath

common/build.gradle

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ dependencies {
2323
testImplementation "org.opensearch.test:framework:${opensearch_version}"
2424

2525
compileOnly group: 'org.apache.commons', name: 'commons-text', version: '1.10.0'
26-
compileOnly group: 'com.google.code.gson', name: 'gson', version: '2.13.2'
26+
compileOnly group: 'com.google.code.gson', name: 'gson', version: "${versions.gson}"
2727
compileOnly group: 'org.json', name: 'json', version: '20231013'
2828
testImplementation group: 'org.json', name: 'json', version: '20231013'
2929
implementation('com.google.guava:guava:32.1.3-jre') {
@@ -43,6 +43,10 @@ dependencies {
4343
compileOnly group: 'com.networknt' , name: 'json-schema-validator', version: '1.4.0'
4444
// Multi-tenant SDK Client
4545
compileOnly "org.opensearch:opensearch-remote-metadata-sdk:${opensearch_build}"
46+
compileOnly (group: 'software.amazon.awssdk', name: 'netty-nio-client', version: "${versions.aws}") {
47+
exclude(group: 'org.reactivestreams', module: 'reactive-streams')
48+
exclude(group: 'org.slf4j', module: 'slf4j-api')
49+
}
4650
}
4751

4852
lombok {

common/src/main/java/org/opensearch/ml/common/CommonValue.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ public class CommonValue {
8686
public static final Version VERSION_2_19_0 = Version.fromString("2.19.0");
8787
public static final Version VERSION_3_0_0 = Version.fromString("3.0.0");
8888
public static final Version VERSION_3_1_0 = Version.fromString("3.1.0");
89+
public static final Version VERSION_3_2_0 = Version.fromString("3.2.0");
90+
public static final Version VERSION_3_3_0 = Version.fromString("3.3.0");
8991

9092
// Connector Constants
9193
public static final String NAME_FIELD = "name";
@@ -112,7 +114,9 @@ public class CommonValue {
112114
public static final String MCP_CONNECTORS_FIELD = "mcp_connectors";
113115
public static final String MCP_CONNECTOR_ID_FIELD = "mcp_connector_id";
114116
public static final String MCP_DEFAULT_SSE_ENDPOINT = "/sse";
115-
public static final String SSE_ENDPOINT_FILED = "sse_endpoint";
117+
public static final String SSE_ENDPOINT_FIELD = "sse_endpoint";
118+
public static final String MCP_DEFAULT_STREAMABLE_HTTP_ENDPOINT = "/mcp/";
119+
public static final String ENDPOINT_FIELD = "endpoint";
116120

117121
// TOOL Constants
118122
public static final String TOOL_INPUT_SCHEMA_FIELD = "input_schema";
@@ -121,4 +125,16 @@ public class CommonValue {
121125
public static final long INDEX_INSIGHT_GENERATING_TIMEOUT = 3 * 60 * 1000;
122126
public static final long INDEX_INSIGHT_UPDATE_INTERVAL = 24 * 60 * 60 * 1000;
123127

128+
// JSON-RPC Error Codes
129+
public static final int JSON_RPC_PARSE_ERROR = -32700;
130+
public static final int JSON_RPC_INTERNAL_ERROR = -32603;
131+
public static final int JSON_RPC_SERVER_NOT_READY_ERROR = -32000;
132+
133+
// MCP Server response fields
134+
public static final String ACKNOWLEDGE_FIELD = "acknowledged";
135+
public static final String MCP_RESPONSE_FIELD = "mcp_response";
136+
public static final String ERROR_FIELD = "error";
137+
public static final String MESSAGE_FIELD = "message";
138+
public static final String ID_FIELD = "id";
139+
public static final String ERROR_CODE_FIELD = "error_code";
124140
}

common/src/main/java/org/opensearch/ml/common/connector/ConnectorProtocols.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@ public class ConnectorProtocols {
1313
public static final String HTTP = "http";
1414
public static final String AWS_SIGV4 = "aws_sigv4";
1515
public static final String MCP_SSE = "mcp_sse";
16+
public static final String MCP_STREAMABLE_HTTP = "mcp_streamable_http";
1617

17-
public static final List<String> VALID_PROTOCOLS = Arrays.asList(AWS_SIGV4, HTTP, MCP_SSE);
18+
public static final List<String> VALID_PROTOCOLS = Arrays.asList(AWS_SIGV4, HTTP, MCP_SSE, MCP_STREAMABLE_HTTP);
1819

1920
public static void validateProtocol(String protocol) {
2021
if (protocol == null) {

common/src/main/java/org/opensearch/ml/common/connector/HttpConnector.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,14 @@
1919
import java.util.ArrayList;
2020
import java.util.HashMap;
2121
import java.util.List;
22+
import java.util.Locale;
2223
import java.util.Map;
2324
import java.util.Optional;
2425
import java.util.function.BiFunction;
2526
import java.util.regex.Matcher;
2627
import java.util.regex.Pattern;
2728

29+
import org.apache.commons.text.StringEscapeUtils;
2830
import org.apache.commons.text.StringSubstitutor;
2931
import org.opensearch.Version;
3032
import org.opensearch.common.io.stream.BytesStreamOutput;
@@ -36,6 +38,9 @@
3638
import org.opensearch.ml.common.AccessMode;
3739
import org.opensearch.ml.common.transport.connector.MLCreateConnectorInput;
3840

41+
import com.google.gson.JsonObject;
42+
import com.google.gson.JsonParser;
43+
3944
import lombok.Builder;
4045
import lombok.EqualsAndHashCode;
4146
import lombok.NoArgsConstructor;
@@ -351,12 +356,41 @@ public <T> T createPayload(String action, Map<String, String> parameters) {
351356

352357
if (!isJson(payload)) {
353358
throw new IllegalArgumentException("Invalid payload: " + payload);
359+
} else if (neededStreamParameterInPayload(parameters)) {
360+
JsonObject jsonObject = JsonParser.parseString(payload).getAsJsonObject();
361+
jsonObject.addProperty("stream", true);
362+
payload = jsonObject.toString();
354363
}
355364
return (T) payload;
356365
}
357366
return (T) parameters.get("http_body");
358367
}
359368

369+
private boolean neededStreamParameterInPayload(Map<String, String> parameters) {
370+
if (parameters == null) {
371+
return false;
372+
}
373+
374+
boolean isStream = parameters.containsKey("stream");
375+
if (!isStream) {
376+
return false;
377+
}
378+
379+
String llmInterface = parameters.get("_llm_interface");
380+
if (llmInterface.isBlank()) {
381+
return false;
382+
}
383+
384+
llmInterface = llmInterface.trim().toLowerCase(Locale.ROOT);
385+
llmInterface = StringEscapeUtils.unescapeJava(llmInterface);
386+
switch (llmInterface) {
387+
case "openai/v1/chat/completions":
388+
return true;
389+
default:
390+
return false;
391+
}
392+
}
393+
360394
protected String fillNullParameters(Map<String, String> parameters, String payload) {
361395
List<String> bodyParams = findStringParametersWithNullDefaultValue(payload);
362396
String newPayload = payload;

common/src/main/java/org/opensearch/ml/common/connector/McpConnector.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,9 @@ public void update(MLCreateConnectorInput updateContent, BiFunction<String, Stri
358358
if (updateContent.getConnectorClientConfig() != null) {
359359
this.connectorClientConfig = updateContent.getConnectorClientConfig();
360360
}
361+
if (updateContent.getUrl() != null && updateContent.getUrl().isBlank()) {
362+
throw new IllegalArgumentException("MCP Connector url is blank");
363+
}
361364
if (updateContent.getUrl() != null) {
362365
this.url = updateContent.getUrl();
363366
}

0 commit comments

Comments
 (0)