From 3f05cc1414f81a6e4918bd4f9a9aa63626eaa142 Mon Sep 17 00:00:00 2001 From: Aliaksandr Stsiapanay Date: Mon, 14 Sep 2026 15:51:46 +0300 Subject: [PATCH] feat: introduce skillsSupported feature flag #1975 --- .../com/epam/aidial/core/config/Features.java | 4 ++++ docs/open_api_core.yaml | 4 ++++ .../aidial/core/server/data/FeaturesData.java | 5 +++++ .../server/ApplicationDeploymentApiTest.java | 11 ++++++++++ .../core/server/CustomApplicationApiTest.java | 21 +++++++++++++++++++ .../epam/aidial/core/server/ListingTest.java | 14 ++++++------- .../aidial/core/server/ToolSetApiTest.java | 7 +++++++ 7 files changed, 59 insertions(+), 7 deletions(-) diff --git a/config/src/main/java/com/epam/aidial/core/config/Features.java b/config/src/main/java/com/epam/aidial/core/config/Features.java index f52186816..4cd03e2c4 100644 --- a/config/src/main/java/com/epam/aidial/core/config/Features.java +++ b/config/src/main/java/com/epam/aidial/core/config/Features.java @@ -72,6 +72,9 @@ public class Features { @JsonAlias({"customTemperatureSupported", "custom_temperature_supported"}) private Boolean customTemperatureSupported; + @JsonAlias({"skillsSupported", "skills_supported"}) + private Boolean skillsSupported; + @JsonAlias({"reasoningEfforts", "reasoning_efforts"}) private List reasoningEfforts; @@ -109,6 +112,7 @@ public static Features merge(Features base, Features overrides) { merged.maxTokensSupported = override(base.maxTokensSupported, overrides.maxTokensSupported); merged.maxCompletionTokensSupported = override(base.maxCompletionTokensSupported, overrides.maxCompletionTokensSupported); merged.customTemperatureSupported = override(base.customTemperatureSupported, overrides.customTemperatureSupported); + merged.skillsSupported = override(base.skillsSupported, overrides.skillsSupported); List efforts = override(base.reasoningEfforts, overrides.reasoningEfforts); merged.reasoningEfforts = efforts == null ? null : List.copyOf(efforts); return merged; diff --git a/docs/open_api_core.yaml b/docs/open_api_core.yaml index efc20d6f8..ce32cc32f 100644 --- a/docs/open_api_core.yaml +++ b/docs/open_api_core.yaml @@ -16034,6 +16034,8 @@ components: type: string url_attachments_supported: type: boolean + skills_supported: + type: boolean FeaturesData: type: object properties: @@ -16087,6 +16089,8 @@ components: type: boolean url_attachments: type: boolean + skills_supported: + type: boolean FileConfigControllerItemsResponseFileConfigControllerNamedEntity: type: object properties: diff --git a/server/src/main/java/com/epam/aidial/core/server/data/FeaturesData.java b/server/src/main/java/com/epam/aidial/core/server/data/FeaturesData.java index 5715405c0..02fa966ef 100644 --- a/server/src/main/java/com/epam/aidial/core/server/data/FeaturesData.java +++ b/server/src/main/java/com/epam/aidial/core/server/data/FeaturesData.java @@ -40,6 +40,7 @@ public class FeaturesData { private boolean maxTokensSupported = true; private boolean maxCompletionTokensSupported = false; private boolean customTemperatureSupported = true; + private boolean skillsSupported = false; private List reasoningEfforts = List.of(); /** @@ -141,6 +142,10 @@ public static FeaturesData createFeatures(Features features) { data.setCustomTemperatureSupported(features.getCustomTemperatureSupported()); } + if (features.getSkillsSupported() != null) { + data.setSkillsSupported(features.getSkillsSupported()); + } + if (features.getReasoningEfforts() != null && !features.getReasoningEfforts().isEmpty()) { data.setReasoningEfforts(List.copyOf(features.getReasoningEfforts())); } diff --git a/server/src/test/java/com/epam/aidial/core/server/ApplicationDeploymentApiTest.java b/server/src/test/java/com/epam/aidial/core/server/ApplicationDeploymentApiTest.java index 2f442ae5a..49f0a247d 100644 --- a/server/src/test/java/com/epam/aidial/core/server/ApplicationDeploymentApiTest.java +++ b/server/src/test/java/com/epam/aidial/core/server/ApplicationDeploymentApiTest.java @@ -1033,6 +1033,7 @@ void testOpenAiApi() { "max_tokens_supported": true, "max_completion_tokens_supported": false, "custom_temperature_supported": true, + "skills_supported": false, "reasoning_efforts": [] }, "defaults" : { }, @@ -1065,6 +1066,7 @@ void testOpenAiApi() { "max_tokens_supported" : true, "max_completion_tokens_supported" : false, "custom_temperature_supported" : true, + "skills_supported" : false, "reasoning_efforts" : [ ] }, "defaults" : { }, @@ -1131,6 +1133,7 @@ void testOpenAiApi() { "max_tokens_supported" : true, "max_completion_tokens_supported" : false, "custom_temperature_supported" : true, + "skills_supported" : false, "reasoning_efforts" : [ ] }, "defaults" : { }, @@ -1163,6 +1166,7 @@ void testOpenAiApi() { "max_tokens_supported" : true, "max_completion_tokens_supported" : false, "custom_temperature_supported" : true, + "skills_supported" : false, "reasoning_efforts" : [ ] }, "defaults" : { }, @@ -1208,6 +1212,7 @@ void testOpenAiApi() { "max_tokens_supported" : true, "max_completion_tokens_supported" : false, "custom_temperature_supported" : true, + "skills_supported" : false, "reasoning_efforts" : [ ] }, "defaults" : { }, @@ -1240,6 +1245,7 @@ void testOpenAiApi() { "max_tokens_supported" : true, "max_completion_tokens_supported" : false, "custom_temperature_supported" : true, + "skills_supported" : false, "reasoning_efforts" : [ ] }, "defaults" : { }, @@ -1294,6 +1300,7 @@ void testOpenAiApi() { "max_tokens_supported" : true, "max_completion_tokens_supported" : false, "custom_temperature_supported" : true, + "skills_supported" : false, "reasoning_efforts" : [ ] }, "defaults" : { }, @@ -1326,6 +1333,7 @@ void testOpenAiApi() { "max_tokens_supported" : true, "max_completion_tokens_supported" : false, "custom_temperature_supported" : true, + "skills_supported" : false, "reasoning_efforts" : [ ] }, "defaults" : { }, @@ -1356,6 +1364,7 @@ void testOpenAiApi() { "max_tokens_supported" : true, "max_completion_tokens_supported" : false, "custom_temperature_supported" : true, + "skills_supported" : false, "reasoning_efforts" : [ ] }, "defaults" : { }, @@ -1400,6 +1409,7 @@ void testOpenAiApi() { "max_tokens_supported" : true, "max_completion_tokens_supported" : false, "custom_temperature_supported" : true, + "skills_supported" : false, "reasoning_efforts" : [ ] }, "defaults" : { }, @@ -1432,6 +1442,7 @@ void testOpenAiApi() { "max_tokens_supported" : true, "max_completion_tokens_supported" : false, "custom_temperature_supported" : true, + "skills_supported" : false, "reasoning_efforts" : [ ] }, "defaults" : { }, diff --git a/server/src/test/java/com/epam/aidial/core/server/CustomApplicationApiTest.java b/server/src/test/java/com/epam/aidial/core/server/CustomApplicationApiTest.java index 09aeae960..9aa1358f2 100644 --- a/server/src/test/java/com/epam/aidial/core/server/CustomApplicationApiTest.java +++ b/server/src/test/java/com/epam/aidial/core/server/CustomApplicationApiTest.java @@ -597,6 +597,7 @@ void testOpenAiApplicationListing() { "max_tokens_supported" : true, "max_completion_tokens_supported" : false, "custom_temperature_supported" : true, + "skills_supported" : false, "reasoning_efforts" : [ ] }, "defaults" : { }, @@ -629,6 +630,7 @@ void testOpenAiApplicationListing() { "max_tokens_supported" : true, "max_completion_tokens_supported" : false, "custom_temperature_supported" : true, + "skills_supported" : false, "reasoning_efforts" : [ ] }, "defaults" : { }, @@ -674,6 +676,7 @@ void testOpenAiApplicationListing() { "max_tokens_supported" : true, "max_completion_tokens_supported" : false, "custom_temperature_supported" : true, + "skills_supported" : false, "reasoning_efforts" : [ ] }, "defaults" : { }, @@ -706,6 +709,7 @@ void testOpenAiApplicationListing() { "max_tokens_supported" : true, "max_completion_tokens_supported" : false, "custom_temperature_supported" : true, + "skills_supported" : false, "reasoning_efforts" : [ ] }, "defaults" : { }, @@ -760,6 +764,7 @@ void testOpenAiApplicationListing() { "max_tokens_supported" : true, "max_completion_tokens_supported" : false, "custom_temperature_supported" : true, + "skills_supported" : false, "reasoning_efforts" : [ ] }, "defaults" : { }, @@ -792,6 +797,7 @@ void testOpenAiApplicationListing() { "max_tokens_supported" : true, "max_completion_tokens_supported" : false, "custom_temperature_supported" : true, + "skills_supported" : false, "reasoning_efforts" : [ ] }, "defaults" : { }, @@ -822,6 +828,7 @@ void testOpenAiApplicationListing() { "max_tokens_supported" : true, "max_completion_tokens_supported" : false, "custom_temperature_supported" : true, + "skills_supported" : false, "reasoning_efforts" : [ ] }, "defaults" : { }, @@ -887,6 +894,7 @@ void testOpenAiApplicationListing() { "max_tokens_supported": true, "max_completion_tokens_supported": false, "custom_temperature_supported": true, + "skills_supported": false, "reasoning_efforts": [] }, "defaults":{}, @@ -921,6 +929,7 @@ void testOpenAiApplicationListing() { "max_tokens_supported" : true, "max_completion_tokens_supported" : false, "custom_temperature_supported" : true, + "skills_supported" : false, "reasoning_efforts" : [ ] }, "defaults" : { }, @@ -974,6 +983,7 @@ void testOpenAiApplicationListing() { "max_tokens_supported" : true, "max_completion_tokens_supported" : false, "custom_temperature_supported" : true, + "skills_supported" : false, "reasoning_efforts" : [ ] }, "defaults" : { }, @@ -1006,6 +1016,7 @@ void testOpenAiApplicationListing() { "max_tokens_supported" : true, "max_completion_tokens_supported" : false, "custom_temperature_supported" : true, + "skills_supported" : false, "reasoning_efforts" : [ ] }, "defaults" : { }, @@ -1051,6 +1062,7 @@ void testOpenAiApplicationListing() { "max_tokens_supported" : true, "max_completion_tokens_supported" : false, "custom_temperature_supported" : true, + "skills_supported" : false, "reasoning_efforts" : [ ] }, "defaults" : { }, @@ -1083,6 +1095,7 @@ void testOpenAiApplicationListing() { "max_tokens_supported" : true, "max_completion_tokens_supported" : false, "custom_temperature_supported" : true, + "skills_supported" : false, "reasoning_efforts" : [ ] }, "defaults" : { }, @@ -1137,6 +1150,7 @@ void testOpenAiApplicationListing() { "max_tokens_supported" : true, "max_completion_tokens_supported" : false, "custom_temperature_supported" : true, + "skills_supported" : false, "reasoning_efforts" : [ ] }, "defaults" : { }, @@ -1169,6 +1183,7 @@ void testOpenAiApplicationListing() { "max_tokens_supported" : true, "max_completion_tokens_supported" : false, "custom_temperature_supported" : true, + "skills_supported" : false, "reasoning_efforts" : [ ] }, "defaults" : { }, @@ -1199,6 +1214,7 @@ void testOpenAiApplicationListing() { "max_tokens_supported" : true, "max_completion_tokens_supported" : false, "custom_temperature_supported" : true, + "skills_supported" : false, "reasoning_efforts" : [ ] }, "defaults" : { }, @@ -1243,6 +1259,7 @@ void testOpenAiApplicationListing() { "max_tokens_supported" : true, "max_completion_tokens_supported" : false, "custom_temperature_supported" : true, + "skills_supported" : false, "reasoning_efforts" : [ ] }, "defaults" : { }, @@ -1275,6 +1292,7 @@ void testOpenAiApplicationListing() { "max_tokens_supported" : true, "max_completion_tokens_supported" : false, "custom_temperature_supported" : true, + "skills_supported" : false, "reasoning_efforts" : [ ] }, "defaults" : { }, @@ -1551,6 +1569,7 @@ void testApplicationWithTypeSchemaCreation_Ok_FilesAccessible() { "max_tokens_supported" : true, "max_completion_tokens_supported" : false, "custom_temperature_supported" : true, + "skills_supported" : false, "reasoning_efforts" : [ ] }, "defaults" : { }, @@ -1583,6 +1602,7 @@ void testApplicationWithTypeSchemaCreation_Ok_FilesAccessible() { "max_tokens_supported" : true, "max_completion_tokens_supported" : false, "custom_temperature_supported" : true, + "skills_supported" : false, "reasoning_efforts" : [ ] }, "defaults" : { }, @@ -1934,6 +1954,7 @@ void testOpenAiApplicationWithTypeSchemaGet_ReturnedInvalid_WhenAppDoesNotConfor "max_tokens_supported": true, "max_completion_tokens_supported": false, "custom_temperature_supported": true, + "skills_supported": false, "reasoning_efforts": [] }, "defaults" : { }, diff --git a/server/src/test/java/com/epam/aidial/core/server/ListingTest.java b/server/src/test/java/com/epam/aidial/core/server/ListingTest.java index c92d32ca1..8c5c55e75 100644 --- a/server/src/test/java/com/epam/aidial/core/server/ListingTest.java +++ b/server/src/test/java/com/epam/aidial/core/server/ListingTest.java @@ -67,7 +67,7 @@ void testFeaturesEmbedding(Vertx vertx, VertxTestContext context) { "assistant_attachments_in_request": false, "mcp" : false, "chat_completion": false, "responses_api": false, "max_tokens_supported": true, "max_completion_tokens_supported": false, - "custom_temperature_supported": true, "reasoning_efforts": [] + "custom_temperature_supported": true, "skills_supported": false, "reasoning_efforts": [] } """)); } @@ -84,7 +84,7 @@ void testFeaturesModel(Vertx vertx, VertxTestContext context) { "assistant_attachments_in_request": false, "mcp" : false, "chat_completion": true, "responses_api": false, "max_tokens_supported": true, "max_completion_tokens_supported": false, - "custom_temperature_supported": true, "reasoning_efforts": [] + "custom_temperature_supported": true, "skills_supported": false, "reasoning_efforts": [] } """)); } @@ -101,7 +101,7 @@ void testFeaturesApplication(Vertx vertx, VertxTestContext context) { "assistant_attachments_in_request": false, "mcp" : false, "chat_completion": true, "responses_api": false, "max_tokens_supported": true, "max_completion_tokens_supported": false, - "custom_temperature_supported": true, "reasoning_efforts": [] + "custom_temperature_supported": true, "skills_supported": false, "reasoning_efforts": [] } """)); } @@ -118,7 +118,7 @@ void testFeaturesModelResponsesApi(Vertx vertx, VertxTestContext context) { "assistant_attachments_in_request": false, "mcp" : false, "chat_completion": true, "responses_api": true, "max_tokens_supported": true, "max_completion_tokens_supported": false, - "custom_temperature_supported": true, "reasoning_efforts": [] + "custom_temperature_supported": true, "skills_supported": false, "reasoning_efforts": [] } """)); } @@ -135,7 +135,7 @@ void testFeaturesApplicationResponsesApi(Vertx vertx, VertxTestContext context) "assistant_attachments_in_request": false, "mcp" : false, "chat_completion": true, "responses_api": true, "max_tokens_supported": true, "max_completion_tokens_supported": false, - "custom_temperature_supported": true, "reasoning_efforts": [] + "custom_temperature_supported": true, "skills_supported": false, "reasoning_efforts": [] } """)); } @@ -152,7 +152,7 @@ void testFeaturesModelInterfacesOnly(Vertx vertx, VertxTestContext context) { "assistant_attachments_in_request": false, "mcp" : false, "chat_completion": true, "responses_api": true, "max_tokens_supported": true, "max_completion_tokens_supported": false, - "custom_temperature_supported": true, "reasoning_efforts": [] + "custom_temperature_supported": true, "skills_supported": false, "reasoning_efforts": [] } """)); } @@ -169,7 +169,7 @@ void testFeaturesModelAnthropicInterfaceOnly(Vertx vertx, VertxTestContext conte "assistant_attachments_in_request": false, "mcp" : false, "chat_completion": false, "responses_api": false, "max_tokens_supported": true, "max_completion_tokens_supported": false, - "custom_temperature_supported": true, "reasoning_efforts": [] + "custom_temperature_supported": true, "skills_supported": false, "reasoning_efforts": [] } """)); } diff --git a/server/src/test/java/com/epam/aidial/core/server/ToolSetApiTest.java b/server/src/test/java/com/epam/aidial/core/server/ToolSetApiTest.java index f8a20ae4a..419bc14d2 100644 --- a/server/src/test/java/com/epam/aidial/core/server/ToolSetApiTest.java +++ b/server/src/test/java/com/epam/aidial/core/server/ToolSetApiTest.java @@ -212,6 +212,7 @@ private static String extractJsonRpcId(String body) { "max_tokens_supported": true, "max_completion_tokens_supported": false, "custom_temperature_supported": true, + "skills_supported": false, "reasoning_efforts": [] }, "description_keywords" : [ ], @@ -258,6 +259,7 @@ private static String extractJsonRpcId(String body) { "max_tokens_supported": true, "max_completion_tokens_supported": false, "custom_temperature_supported": true, + "skills_supported": false, "reasoning_efforts": [] }, "description_keywords" : [ ], @@ -305,6 +307,7 @@ private static String extractJsonRpcId(String body) { "max_tokens_supported": true, "max_completion_tokens_supported": false, "custom_temperature_supported": true, + "skills_supported": false, "reasoning_efforts": [] }, "description_keywords" : [ ], @@ -361,6 +364,7 @@ private static String extractJsonRpcId(String body) { "max_tokens_supported": true, "max_completion_tokens_supported": false, "custom_temperature_supported": true, + "skills_supported": false, "reasoning_efforts": [] }, "description_keywords" : [ ], @@ -501,6 +505,7 @@ void testToolSetListing() { "max_tokens_supported": true, "max_completion_tokens_supported": false, "custom_temperature_supported": true, + "skills_supported": false, "reasoning_efforts": [] }, "description_keywords": [], @@ -556,6 +561,7 @@ void testToolSetListing() { "max_tokens_supported": true, "max_completion_tokens_supported": false, "custom_temperature_supported": true, + "skills_supported": false, "reasoning_efforts": [] }, "description_keywords" : [ ], @@ -604,6 +610,7 @@ void testToolSetListing() { "max_tokens_supported": true, "max_completion_tokens_supported": false, "custom_temperature_supported": true, + "skills_supported": false, "reasoning_efforts": [] }, "description_keywords" : [ ],