From 205323c7217b444e564fe6db3d29ba4702e419bc Mon Sep 17 00:00:00 2001 From: Savindu Dimal Date: Thu, 19 Sep 2024 10:56:45 +0530 Subject: [PATCH] Add REST API changes for backend rate limiting --- .../api/TokenBaseThrottlingCountHolder.java | 48 ++++---- .../org/wso2/carbon/apimgt/api/model/API.java | 18 +++ .../handlers/throttling/ThrottleHandler.java | 64 ++++++++++ .../wso2/carbon/apimgt/impl/APIConstants.java | 6 + .../apimgt/persistence/APIConstants.java | 9 ++ .../apimgt/persistence/dto/PublisherAPI.java | 19 +++ .../utils/RegistryPersistenceUtil.java | 61 ++++++++++ .../src/main/resources/publisher-api.yaml | 18 +++ ...nfigurationThrottlingConfigurationDTO.java | 3 +- .../api/publisher/v1/dto/APIMaxTpsDTO.java | 110 +++++++++++++++++- .../v1/common/TemplateBuilderUtil.java | 45 +++++++ .../v1/common/mappings/APIMappingUtil.java | 46 ++++++++ .../common/mappings/PublisherCommonUtils.java | 85 +++++++++----- .../src/main/resources/publisher-api.yaml | 18 +++ 14 files changed, 494 insertions(+), 56 deletions(-) diff --git a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/TokenBaseThrottlingCountHolder.java b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/TokenBaseThrottlingCountHolder.java index 06ec62a6f901..fb8ce308ed1c 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/TokenBaseThrottlingCountHolder.java +++ b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/TokenBaseThrottlingCountHolder.java @@ -20,21 +20,21 @@ public class TokenBaseThrottlingCountHolder { - private Long productionMaxPromptTokenCount = -1L; - private Long productionMaxCompletionTokenCount = -1L; - private Long productionMaxTotalTokenCount = -1L; - private Long sandboxMaxPromptTokenCount = -1L; - private Long sandboxMaxCompletionTokenCount = -1L; - private Long sandboxMaxTotalTokenCount = -1L; - private boolean isTokenBasedThrottlingEnabled = false; + private String productionMaxPromptTokenCount; + private String productionMaxCompletionTokenCount; + private String productionMaxTotalTokenCount; + private String sandboxMaxPromptTokenCount; + private String sandboxMaxCompletionTokenCount; + private String sandboxMaxTotalTokenCount; + private Boolean isTokenBasedThrottlingEnabled = false; public TokenBaseThrottlingCountHolder() { } - public TokenBaseThrottlingCountHolder(Long productionMaxPromptTokenCount, Long productionMaxCompletionTokenCount, - Long productionMaxTotalTokenCount, Long sandboxMaxPromptTokenCount, - Long sandboxMaxCompletionTokenCount, Long sandboxMaxTotalTokenCount, + public TokenBaseThrottlingCountHolder(String productionMaxPromptTokenCount, String productionMaxCompletionTokenCount, + String productionMaxTotalTokenCount, String sandboxMaxPromptTokenCount, + String sandboxMaxCompletionTokenCount, String sandboxMaxTotalTokenCount, boolean isTokenBasedThrottlingEnabled) { this.productionMaxPromptTokenCount = productionMaxPromptTokenCount; this.productionMaxCompletionTokenCount = productionMaxCompletionTokenCount; @@ -45,59 +45,59 @@ public TokenBaseThrottlingCountHolder(Long productionMaxPromptTokenCount, Long p this.isTokenBasedThrottlingEnabled = isTokenBasedThrottlingEnabled; } - public Long getProductionMaxPromptTokenCount() { + public String getProductionMaxPromptTokenCount() { return productionMaxPromptTokenCount; } - public void setProductionMaxPromptTokenCount(Long productionMaxPromptTokenCount) { + public void setProductionMaxPromptTokenCount(String productionMaxPromptTokenCount) { this.productionMaxPromptTokenCount = productionMaxPromptTokenCount; } - public Long getProductionMaxCompletionTokenCount() { + public String getProductionMaxCompletionTokenCount() { return productionMaxCompletionTokenCount; } - public void setProductionMaxCompletionTokenCount(Long productionMaxCompletionTokenCount) { + public void setProductionMaxCompletionTokenCount(String productionMaxCompletionTokenCount) { this.productionMaxCompletionTokenCount = productionMaxCompletionTokenCount; } - public Long getProductionMaxTotalTokenCount() { + public String getProductionMaxTotalTokenCount() { return productionMaxTotalTokenCount; } - public void setProductionMaxTotalTokenCount(Long productionMaxTotalTokenCount) { + public void setProductionMaxTotalTokenCount(String productionMaxTotalTokenCount) { this.productionMaxTotalTokenCount = productionMaxTotalTokenCount; } - public Long getSandboxMaxPromptTokenCount() { + public String getSandboxMaxPromptTokenCount() { return sandboxMaxPromptTokenCount; } - public void setSandboxMaxPromptTokenCount(Long sandboxMaxPromptTokenCount) { + public void setSandboxMaxPromptTokenCount(String sandboxMaxPromptTokenCount) { this.sandboxMaxPromptTokenCount = sandboxMaxPromptTokenCount; } - public Long getSandboxMaxCompletionTokenCount() { + public String getSandboxMaxCompletionTokenCount() { return sandboxMaxCompletionTokenCount; } - public void setSandboxMaxCompletionTokenCount(Long sandboxMaxCompletionTokenCount) { + public void setSandboxMaxCompletionTokenCount(String sandboxMaxCompletionTokenCount) { this.sandboxMaxCompletionTokenCount = sandboxMaxCompletionTokenCount; } - public Long getSandboxMaxTotalTokenCount() { + public String getSandboxMaxTotalTokenCount() { return sandboxMaxTotalTokenCount; } - public void setSandboxMaxTotalTokenCount(Long sandboxMaxTotalTokenCount) { + public void setSandboxMaxTotalTokenCount(String sandboxMaxTotalTokenCount) { this.sandboxMaxTotalTokenCount = sandboxMaxTotalTokenCount; } - public boolean isTokenBasedThrottlingEnabled() { + public Boolean isTokenBasedThrottlingEnabled() { return isTokenBasedThrottlingEnabled; } - public void setTokenBasedThrottlingEnabled(boolean tokenBasedThrottlingEnabled) { + public void setTokenBasedThrottlingEnabled(Boolean tokenBasedThrottlingEnabled) { isTokenBasedThrottlingEnabled = tokenBasedThrottlingEnabled; } } \ No newline at end of file diff --git a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/API.java b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/API.java index 15d71f4cbb75..f9247bfe47ff 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/API.java +++ b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/API.java @@ -93,7 +93,9 @@ public class API implements Serializable { // Used for keeping Production & Sandbox Throttling limits. private String productionMaxTps; + private String productionTimeUnit = "1000"; private String sandboxMaxTps; + private String sandboxTimeUnit = "1000"; private String visibility; private String visibleRoles; @@ -484,10 +486,26 @@ public void setProductionMaxTps(String productionMaxTps) { this.productionMaxTps = productionMaxTps; } + public String getProductionTimeUnit() { + return productionTimeUnit; + } + + public void setProductionTimeUnit(String productionTimeUnit) { + this.productionTimeUnit = productionTimeUnit; + } + public String getSandboxMaxTps() { return sandboxMaxTps; } + public String getSandboxTimeUnit() { + return sandboxTimeUnit; + } + + public void setSandboxTimeUnit(String sandboxTimeUnit) { + this.sandboxTimeUnit = sandboxTimeUnit; + } + public void setSandboxMaxTps(String sandboxMaxTps) { this.sandboxMaxTps = sandboxMaxTps; } diff --git a/components/apimgt/org.wso2.carbon.apimgt.gateway/src/main/java/org/wso2/carbon/apimgt/gateway/handlers/throttling/ThrottleHandler.java b/components/apimgt/org.wso2.carbon.apimgt.gateway/src/main/java/org/wso2/carbon/apimgt/gateway/handlers/throttling/ThrottleHandler.java index ba82aa0e6f15..b1fc4cac42b6 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.gateway/src/main/java/org/wso2/carbon/apimgt/gateway/handlers/throttling/ThrottleHandler.java +++ b/components/apimgt/org.wso2.carbon.apimgt.gateway/src/main/java/org/wso2/carbon/apimgt/gateway/handlers/throttling/ThrottleHandler.java @@ -127,6 +127,13 @@ public class ThrottleHandler extends AbstractHandler implements ManagedLifecycle private String productionUnitTime = "1000"; private String sandboxMaxCount; private String productionMaxCount; + private String isTokenBasedThrottlingEnabled = "false"; + private String productionMaxPromptTokenCount; + private String productionMaxCompletionTokenCount; + private String productionMaxTotalTokenCount; + private String sandboxMaxPromptTokenCount; + private String sandboxMaxCompletionTokenCount; + private String sandboxMaxTotalTokenCount; private RoleBasedAccessRateController roleBasedAccessController; public ThrottleHandler() { @@ -1288,6 +1295,63 @@ public void setProductionUnitTime(String productionUnitTime) { this.productionUnitTime = productionUnitTime; } + public String getIsTokenBasedThrottlingEnabled() { + return isTokenBasedThrottlingEnabled; + } + + public void setIsTokenBasedThrottlingEnabled(String isTokenBasedThrottlingEnabled) { + this.isTokenBasedThrottlingEnabled = isTokenBasedThrottlingEnabled; + } + + public String getProductionMaxPromptTokenCount() { + return productionMaxPromptTokenCount; + } + + public void setProductionMaxPromptTokenCount(String productionMaxPromptTokenCount) { + this.productionMaxPromptTokenCount = productionMaxPromptTokenCount; + } + + public String getProductionMaxCompletionTokenCount() { + return productionMaxCompletionTokenCount; + } + + public void setProductionMaxCompletionTokenCount(String productionMaxCompletionTokenCount) { + this.productionMaxCompletionTokenCount = productionMaxCompletionTokenCount; + } + + public String getProductionMaxTotalTokenCount() { + return productionMaxTotalTokenCount; + } + + public void setProductionMaxTotalTokenCount(String productionMaxTotalTokenCount) { + this.productionMaxTotalTokenCount = productionMaxTotalTokenCount; + } + + public String getSandboxMaxPromptTokenCount() { + return sandboxMaxPromptTokenCount; + } + + public void setSandboxMaxPromptTokenCount(String sandboxMaxPromptTokenCount) { + this.sandboxMaxPromptTokenCount = sandboxMaxPromptTokenCount; + } + + public String getSandboxMaxCompletionTokenCount() { + return sandboxMaxCompletionTokenCount; + } + + public void setSandboxMaxCompletionTokenCount(String sandboxMaxCompletionTokenCount) { + this.sandboxMaxCompletionTokenCount = sandboxMaxCompletionTokenCount; + } + + public String getSandboxMaxTotalTokenCount() { + return sandboxMaxTotalTokenCount; + } + + public void setSandboxMaxTotalTokenCount(String sandboxMaxTotalTokenCount) { + this.sandboxMaxTotalTokenCount = sandboxMaxTotalTokenCount; + } + + public void init(SynapseEnvironment synapseEnvironment) { initThrottleForHardLimitThrottling(); } diff --git a/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIConstants.java b/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIConstants.java index 8cecca69ff0d..fe3b60c7d8b1 100755 --- a/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIConstants.java +++ b/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIConstants.java @@ -366,6 +366,12 @@ public final class APIConstants { public static final String PROTOTYPE_OVERVIEW_IMPLEMENTATION = "overview_implementation"; public static final String API_PRODUCTION_THROTTLE_MAXTPS = "overview_productionTps"; public static final String API_SANDBOX_THROTTLE_MAXTPS = "overview_sandboxTps"; + public static final String API_BACKEND_THROTTLE_TIMEUNIT_SECOND = "SECOND"; + public static final String API_BACKEND_THROTTLE_TIMEUNIT_SECOND_MS = "1000"; + public static final String API_BACKEND_THROTTLE_TIMEUNIT_MINUTE = "MINUTE"; + public static final String API_BACKEND_THROTTLE_TIMEUNIT_MINUTE_MS = "60000"; + public static final String API_BACKEND_THROTTLE_TIMEUNIT_HOUR = "HOUR"; + public static final String API_BACKEND_THROTTLE_TIMEUNIT_HOUR_MS = "3600000"; public static final String IMPLEMENTATION_TYPE_ENDPOINT = "ENDPOINT"; public static final String IMPLEMENTATION_TYPE_INLINE = "INLINE"; diff --git a/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/APIConstants.java b/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/APIConstants.java index 48334184b9e9..34317eaea699 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/APIConstants.java +++ b/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/APIConstants.java @@ -112,7 +112,16 @@ public final class APIConstants { public static final String API_OVERVIEW_TESTKEY = "overview_testKey"; public static final String API_PRODUCTION_THROTTLE_MAXTPS = "overview_productionTps"; + public static final String API_PRODUCTION_THROTTLE_TIMEUNIT = "overview_productionTimeUnit"; public static final String API_SANDBOX_THROTTLE_MAXTPS = "overview_sandboxTps"; + public static final String API_SANDBOX_THROTTLE_TIMEUNIT = "overview_sandboxTimeUnit"; + public static final String AI_PRODUCTION_MAX_PROMPT_TOKEN_COUNT = "overview_aiProductionMaxPromptTokenCount"; + public static final String AI_PRODUCTION_MAX_COMPLETION_TOKEN_COUNT = "overview_aiProductionMaxCompletionTokenCount"; + public static final String AI_PRODUCTION_MAX_TOTAL_TOKEN_COUNT = "overview_aiProductionMaxTotalTokenCount"; + public static final String AI_SANDBOX_MAX_PROMPT_TOKEN_COUNT = "overview_aiSandboxMaxPromptTokenCount"; + public static final String AI_SANDBOX_MAX_COMPLETION_TOKEN_COUNT = "overview_aiSandboxMaxCompletionTokenCount"; + public static final String AI_SANDBOX_MAX_TOTAL_TOKEN_COUNT = "overview_aiSandboxMaxTotalTokenCount"; + public static final String AI_TOKEN_BASED_THROTTLING_ENABLED = "overview_aiTokenBasedThrottlingEnabled"; public static final String SUPER_TENANT_DOMAIN = "carbon.super"; public static final String VERSION_PLACEHOLDER = "{version}"; public static final String TENANT_PREFIX = "/t/"; diff --git a/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/dto/PublisherAPI.java b/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/dto/PublisherAPI.java index de413666c5d8..4f95041d1021 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/dto/PublisherAPI.java +++ b/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/dto/PublisherAPI.java @@ -64,7 +64,9 @@ public class PublisherAPI extends PublisherAPIInfo { private String subscriptionAvailableOrgs; // subscriptionAvailableTenants; private String implementation; private String productionMaxTps; + private String productionTimeUnit; private String sandboxMaxTps; + private String sandboxTimeUnit; private String authorizationHeader; private String apiKeyHeader; private String apiSecurity; // ?check whether same to private List securityScheme = new ArrayList<>(); @@ -362,6 +364,23 @@ public void setSandboxMaxTps(String sandboxMaxTps) { this.sandboxMaxTps = sandboxMaxTps; } + + public String getProductionTimeUnit() { + return productionTimeUnit; + } + + public void setProductionTimeUnit(String productionTimeUnit) { + this.productionTimeUnit = productionTimeUnit; + } + + public String getSandboxTimeUnit() { + return sandboxTimeUnit; + } + + public void setSandboxTimeUnit(String sandboxTimeUnit) { + this.sandboxTimeUnit = sandboxTimeUnit; + } + public String getAuthorizationHeader() { return authorizationHeader; } diff --git a/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/utils/RegistryPersistenceUtil.java b/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/utils/RegistryPersistenceUtil.java index 7561d912bf2e..3c26a5b6fad6 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/utils/RegistryPersistenceUtil.java +++ b/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/utils/RegistryPersistenceUtil.java @@ -28,6 +28,8 @@ import org.json.simple.parser.ParseException; import org.wso2.carbon.CarbonConstants; import org.wso2.carbon.apimgt.api.APIManagementException; +import org.wso2.carbon.apimgt.api.TokenBaseThrottlingCountHolder; +import org.wso2.carbon.apimgt.api.model.AIConfiguration; import org.wso2.carbon.apimgt.api.model.API; import org.wso2.carbon.apimgt.api.model.APICategory; import org.wso2.carbon.apimgt.api.model.APIIdentifier; @@ -167,7 +169,9 @@ public static GenericArtifact createAPIArtifactContent(GenericArtifact artifact, artifact.setAttribute(APIConstants.PROTOTYPE_OVERVIEW_IMPLEMENTATION, api.getImplementation()); artifact.setAttribute(APIConstants.API_PRODUCTION_THROTTLE_MAXTPS, api.getProductionMaxTps()); + artifact.setAttribute(APIConstants.API_PRODUCTION_THROTTLE_TIMEUNIT, api.getProductionTimeUnit()); artifact.setAttribute(APIConstants.API_SANDBOX_THROTTLE_MAXTPS, api.getSandboxMaxTps()); + artifact.setAttribute(APIConstants.API_SANDBOX_THROTTLE_TIMEUNIT, api.getSandboxTimeUnit()); artifact.setAttribute(APIConstants.API_OVERVIEW_AUTHORIZATION_HEADER, api.getAuthorizationHeader()); artifact.setAttribute(APIConstants.API_OVERVIEW_API_KEY_HEADER, api.getApiKeyHeader()); artifact.setAttribute(APIConstants.API_OVERVIEW_API_SECURITY, api.getApiSecurity()); @@ -206,6 +210,40 @@ public static GenericArtifact createAPIArtifactContent(GenericArtifact artifact, policyBuilder.append("||"); } + if (api.getAiConfiguration() != null + && api.getAiConfiguration().getTokenBasedThrottlingConfiguration() != null + && api.getAiConfiguration().getTokenBasedThrottlingConfiguration() + .isTokenBasedThrottlingEnabled()) { + TokenBaseThrottlingCountHolder tokenBaseThrottlingCountHolder = api.getAiConfiguration() + .getTokenBasedThrottlingConfiguration(); + artifact.setAttribute(APIConstants.AI_TOKEN_BASED_THROTTLING_ENABLED, + tokenBaseThrottlingCountHolder.isTokenBasedThrottlingEnabled().toString()); + if (tokenBaseThrottlingCountHolder.getProductionMaxPromptTokenCount() != null) { + artifact.setAttribute(APIConstants.AI_PRODUCTION_MAX_PROMPT_TOKEN_COUNT, + tokenBaseThrottlingCountHolder.getProductionMaxPromptTokenCount()); + } + if (tokenBaseThrottlingCountHolder.getProductionMaxCompletionTokenCount() != null) { + artifact.setAttribute(APIConstants.AI_PRODUCTION_MAX_COMPLETION_TOKEN_COUNT, + tokenBaseThrottlingCountHolder.getProductionMaxCompletionTokenCount()); + } + if (tokenBaseThrottlingCountHolder.getProductionMaxTotalTokenCount() != null) { + artifact.setAttribute(APIConstants.AI_PRODUCTION_MAX_TOTAL_TOKEN_COUNT, + tokenBaseThrottlingCountHolder.getProductionMaxTotalTokenCount()); + } + if (tokenBaseThrottlingCountHolder.getSandboxMaxPromptTokenCount() != null) { + artifact.setAttribute(APIConstants.AI_SANDBOX_MAX_PROMPT_TOKEN_COUNT, + tokenBaseThrottlingCountHolder.getSandboxMaxPromptTokenCount()); + } + if (tokenBaseThrottlingCountHolder.getSandboxMaxCompletionTokenCount() != null) { + artifact.setAttribute(APIConstants.AI_SANDBOX_MAX_COMPLETION_TOKEN_COUNT, + tokenBaseThrottlingCountHolder.getSandboxMaxCompletionTokenCount()); + } + if (tokenBaseThrottlingCountHolder.getSandboxMaxTotalTokenCount() != null) { + artifact.setAttribute(APIConstants.AI_SANDBOX_MAX_TOTAL_TOKEN_COUNT, + tokenBaseThrottlingCountHolder.getSandboxMaxTotalTokenCount()); + } + } + String policies = policyBuilder.toString(); if (!"".equals(policies)) { @@ -622,7 +660,30 @@ public static API getAPI(GovernanceArtifact artifact, Registry registry) api.setImplementation(artifact.getAttribute(APIConstants.PROTOTYPE_OVERVIEW_IMPLEMENTATION)); api.setType(artifact.getAttribute(APIConstants.API_OVERVIEW_TYPE)); api.setProductionMaxTps(artifact.getAttribute(APIConstants.API_PRODUCTION_THROTTLE_MAXTPS)); + api.setProductionTimeUnit(artifact.getAttribute(APIConstants.API_PRODUCTION_THROTTLE_TIMEUNIT)); api.setSandboxMaxTps(artifact.getAttribute(APIConstants.API_SANDBOX_THROTTLE_MAXTPS)); + api.setSandboxTimeUnit(artifact.getAttribute(APIConstants.API_SANDBOX_THROTTLE_TIMEUNIT)); + + if (artifact.getAttribute(APIConstants.AI_TOKEN_BASED_THROTTLING_ENABLED) != null && Boolean.parseBoolean( + artifact.getAttribute(APIConstants.AI_TOKEN_BASED_THROTTLING_ENABLED))) { + TokenBaseThrottlingCountHolder aiThrottlingConfiguration = new TokenBaseThrottlingCountHolder(); + aiThrottlingConfiguration.setTokenBasedThrottlingEnabled(true); + aiThrottlingConfiguration.setProductionMaxPromptTokenCount( + artifact.getAttribute(APIConstants.AI_PRODUCTION_MAX_PROMPT_TOKEN_COUNT)); + aiThrottlingConfiguration.setProductionMaxCompletionTokenCount( + artifact.getAttribute(APIConstants.AI_PRODUCTION_MAX_COMPLETION_TOKEN_COUNT)); + aiThrottlingConfiguration.setProductionMaxTotalTokenCount( + artifact.getAttribute(APIConstants.AI_PRODUCTION_MAX_TOTAL_TOKEN_COUNT)); + aiThrottlingConfiguration.setSandboxMaxPromptTokenCount( + artifact.getAttribute(APIConstants.AI_SANDBOX_MAX_PROMPT_TOKEN_COUNT)); + aiThrottlingConfiguration.setSandboxMaxCompletionTokenCount( + artifact.getAttribute(APIConstants.AI_SANDBOX_MAX_COMPLETION_TOKEN_COUNT)); + aiThrottlingConfiguration.setSandboxMaxTotalTokenCount( + artifact.getAttribute(APIConstants.AI_SANDBOX_MAX_TOTAL_TOKEN_COUNT)); + AIConfiguration aiConfiguration = new AIConfiguration(); + aiConfiguration.setTokenBasedThrottlingConfiguration(aiThrottlingConfiguration); + api.setAiConfiguration(aiConfiguration); + } api.setGatewayVendor(artifact.getAttribute(APIConstants.API_OVERVIEW_GATEWAY_VENDOR)); api.setAsyncTransportProtocols(artifact.getAttribute(APIConstants.ASYNC_API_TRANSPORT_PROTOCOLS)); diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.common/src/main/resources/publisher-api.yaml b/components/apimgt/org.wso2.carbon.apimgt.rest.api.common/src/main/resources/publisher-api.yaml index 69f7db689074..f3722a10165b 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.common/src/main/resources/publisher-api.yaml +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.common/src/main/resources/publisher-api.yaml @@ -10104,6 +10104,8 @@ components: type: string throttlingConfiguration: type: object + required: + - isTokenBasedThrottlingEnabled properties: productionMaxPromptTokenCount: type: integer @@ -11717,10 +11719,26 @@ components: type: integer format: int64 example: 1000 + productionTimeUnit: + type: string + description: "Time unit for the production in milliseconds. Possible values are 1sec, 1min, 1hour" + default: SECOND + enum: + - SECOND + - MINUTE + - HOUR sandbox: type: integer format: int64 example: 1000 + sandboxTimeUnit: + type: string + description: "Time unit for the sandbox in milliseconds. Possible values are 1sec, 1min, 1hour" + default: SECOND + enum: + - SECOND + - MINUTE + - HOUR APIBusinessInformation: type: object properties: diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1.common/src/gen/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/dto/APIAiConfigurationThrottlingConfigurationDTO.java b/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1.common/src/gen/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/dto/APIAiConfigurationThrottlingConfigurationDTO.java index f9a47825c239..989b34f00343 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1.common/src/gen/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/dto/APIAiConfigurationThrottlingConfigurationDTO.java +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1.common/src/gen/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/dto/APIAiConfigurationThrottlingConfigurationDTO.java @@ -145,8 +145,9 @@ public APIAiConfigurationThrottlingConfigurationDTO isTokenBasedThrottlingEnable } - @ApiModelProperty(value = "Whether token-based throttling is enabled") + @ApiModelProperty(required = true, value = "Whether token-based throttling is enabled") @JsonProperty("isTokenBasedThrottlingEnabled") + @NotNull public Boolean isIsTokenBasedThrottlingEnabled() { return isTokenBasedThrottlingEnabled; } diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1.common/src/gen/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/dto/APIMaxTpsDTO.java b/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1.common/src/gen/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/dto/APIMaxTpsDTO.java index 64f9d449dcd6..8a47222723c2 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1.common/src/gen/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/dto/APIMaxTpsDTO.java +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1.common/src/gen/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/dto/APIMaxTpsDTO.java @@ -21,8 +21,74 @@ public class APIMaxTpsDTO { private Long production = null; + + @XmlType(name="ProductionTimeUnitEnum") + @XmlEnum(String.class) + public enum ProductionTimeUnitEnum { + SECOND("SECOND"), + MINUTE("MINUTE"), + HOUR("HOUR"); + private String value; + + ProductionTimeUnitEnum (String v) { + value = v; + } + + public String value() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static ProductionTimeUnitEnum fromValue(String v) { + for (ProductionTimeUnitEnum b : ProductionTimeUnitEnum.values()) { + if (String.valueOf(b.value).equals(v)) { + return b; + } + } +return null; + } + } + private ProductionTimeUnitEnum productionTimeUnit = ProductionTimeUnitEnum.SECOND; private Long sandbox = null; + @XmlType(name="SandboxTimeUnitEnum") + @XmlEnum(String.class) + public enum SandboxTimeUnitEnum { + SECOND("SECOND"), + MINUTE("MINUTE"), + HOUR("HOUR"); + private String value; + + SandboxTimeUnitEnum (String v) { + value = v; + } + + public String value() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static SandboxTimeUnitEnum fromValue(String v) { + for (SandboxTimeUnitEnum b : SandboxTimeUnitEnum.values()) { + if (String.valueOf(b.value).equals(v)) { + return b; + } + } +return null; + } + } + private SandboxTimeUnitEnum sandboxTimeUnit = SandboxTimeUnitEnum.SECOND; + /** **/ public APIMaxTpsDTO production(Long production) { @@ -40,6 +106,24 @@ public void setProduction(Long production) { this.production = production; } + /** + * Time unit for the production in milliseconds. Possible values are 1sec, 1min, 1hour + **/ + public APIMaxTpsDTO productionTimeUnit(ProductionTimeUnitEnum productionTimeUnit) { + this.productionTimeUnit = productionTimeUnit; + return this; + } + + + @ApiModelProperty(value = "Time unit for the production in milliseconds. Possible values are 1sec, 1min, 1hour") + @JsonProperty("productionTimeUnit") + public ProductionTimeUnitEnum getProductionTimeUnit() { + return productionTimeUnit; + } + public void setProductionTimeUnit(ProductionTimeUnitEnum productionTimeUnit) { + this.productionTimeUnit = productionTimeUnit; + } + /** **/ public APIMaxTpsDTO sandbox(Long sandbox) { @@ -57,6 +141,24 @@ public void setSandbox(Long sandbox) { this.sandbox = sandbox; } + /** + * Time unit for the sandbox in milliseconds. Possible values are 1sec, 1min, 1hour + **/ + public APIMaxTpsDTO sandboxTimeUnit(SandboxTimeUnitEnum sandboxTimeUnit) { + this.sandboxTimeUnit = sandboxTimeUnit; + return this; + } + + + @ApiModelProperty(value = "Time unit for the sandbox in milliseconds. Possible values are 1sec, 1min, 1hour") + @JsonProperty("sandboxTimeUnit") + public SandboxTimeUnitEnum getSandboxTimeUnit() { + return sandboxTimeUnit; + } + public void setSandboxTimeUnit(SandboxTimeUnitEnum sandboxTimeUnit) { + this.sandboxTimeUnit = sandboxTimeUnit; + } + @Override public boolean equals(java.lang.Object o) { @@ -68,12 +170,14 @@ public boolean equals(java.lang.Object o) { } APIMaxTpsDTO apIMaxTps = (APIMaxTpsDTO) o; return Objects.equals(production, apIMaxTps.production) && - Objects.equals(sandbox, apIMaxTps.sandbox); + Objects.equals(productionTimeUnit, apIMaxTps.productionTimeUnit) && + Objects.equals(sandbox, apIMaxTps.sandbox) && + Objects.equals(sandboxTimeUnit, apIMaxTps.sandboxTimeUnit); } @Override public int hashCode() { - return Objects.hash(production, sandbox); + return Objects.hash(production, productionTimeUnit, sandbox, sandboxTimeUnit); } @Override @@ -82,7 +186,9 @@ public String toString() { sb.append("class APIMaxTpsDTO {\n"); sb.append(" production: ").append(toIndentedString(production)).append("\n"); + sb.append(" productionTimeUnit: ").append(toIndentedString(productionTimeUnit)).append("\n"); sb.append(" sandbox: ").append(toIndentedString(sandbox)).append("\n"); + sb.append(" sandboxTimeUnit: ").append(toIndentedString(sandboxTimeUnit)).append("\n"); sb.append("}"); return sb.toString(); } diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1.common/src/main/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/common/TemplateBuilderUtil.java b/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1.common/src/main/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/common/TemplateBuilderUtil.java index 6773e1606ed6..c8fa7794f51c 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1.common/src/main/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/common/TemplateBuilderUtil.java +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1.common/src/main/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/common/TemplateBuilderUtil.java @@ -32,6 +32,7 @@ import org.wso2.carbon.apimgt.api.APIDefinition; import org.wso2.carbon.apimgt.api.APIDefinitionValidationResponse; import org.wso2.carbon.apimgt.api.APIManagementException; +import org.wso2.carbon.apimgt.api.TokenBaseThrottlingCountHolder; import org.wso2.carbon.apimgt.api.dto.ClientCertificateDTO; import org.wso2.carbon.apimgt.api.gateway.CredentialDto; import org.wso2.carbon.apimgt.api.gateway.GatewayAPIDTO; @@ -280,6 +281,50 @@ public static APITemplateBuilderImpl getAPITemplateBuilder(API api, String tenan properties.put("sandboxMaxCount", api.getSandboxMaxTps()); } + if (api.getProductionTimeUnit() != null) { + properties.put("productionUnitTime", api.getProductionTimeUnit()); + } + + if (api.getSandboxTimeUnit() != null) { + properties.put("sandboxUnitTime", api.getSandboxTimeUnit()); + } + + if (api.getAiConfiguration() != null + && api.getAiConfiguration().getTokenBasedThrottlingConfiguration() != null + && api.getAiConfiguration().getTokenBasedThrottlingConfiguration() + .isTokenBasedThrottlingEnabled()) { + + TokenBaseThrottlingCountHolder tokenBaseThrottlingCountHolder = api.getAiConfiguration() + .getTokenBasedThrottlingConfiguration(); + properties.put("isTokenBasedThrottlingEnabled", + tokenBaseThrottlingCountHolder.isTokenBasedThrottlingEnabled().toString()); + if (tokenBaseThrottlingCountHolder.getProductionMaxPromptTokenCount() != null) { + properties.put("productionMaxPromptTokenCount", + tokenBaseThrottlingCountHolder.getProductionMaxPromptTokenCount().toString()); + } + if (tokenBaseThrottlingCountHolder.getProductionMaxCompletionTokenCount() != null) { + properties.put("productionMaxCompletionTokenCount", + tokenBaseThrottlingCountHolder.getProductionMaxCompletionTokenCount().toString()); + } + if (tokenBaseThrottlingCountHolder.getProductionMaxTotalTokenCount() != null) { + properties.put("productionMaxTotalTokenCount", + tokenBaseThrottlingCountHolder.getProductionMaxTotalTokenCount().toString()); + } + if (tokenBaseThrottlingCountHolder.getSandboxMaxPromptTokenCount() != null) { + properties.put("sandboxMaxPromptTokenCount", + tokenBaseThrottlingCountHolder.getSandboxMaxPromptTokenCount().toString()); + } + if (tokenBaseThrottlingCountHolder.getSandboxMaxCompletionTokenCount() != null) { + properties.put("sandboxMaxCompletionTokenCount", + tokenBaseThrottlingCountHolder.getSandboxMaxCompletionTokenCount().toString()); + } + if (tokenBaseThrottlingCountHolder.getSandboxMaxTotalTokenCount() != null) { + properties.put("sandboxMaxTotalTokenCount", + tokenBaseThrottlingCountHolder.getSandboxMaxTotalTokenCount().toString()); + } + } + + vtb.addHandler("org.wso2.carbon.apimgt.gateway.handlers.throttling.ThrottleHandler" , properties); diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1.common/src/main/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/common/mappings/APIMappingUtil.java b/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1.common/src/main/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/common/mappings/APIMappingUtil.java index 09343bb34f4d..04524d430e8e 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1.common/src/main/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/common/mappings/APIMappingUtil.java +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1.common/src/main/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/common/mappings/APIMappingUtil.java @@ -979,9 +979,47 @@ private static void setMaxTpsFromApiDTOToModel(APIDTO dto, API api) { if (maxTpsDTO.getProduction() != null) { api.setProductionMaxTps(maxTpsDTO.getProduction().toString()); } + if (maxTpsDTO.getProductionTimeUnit() != null) { + api.setProductionTimeUnit(getTimeUnitInMilliseconds(maxTpsDTO.getProductionTimeUnit().toString())); + } if (maxTpsDTO.getSandbox() != null) { api.setSandboxMaxTps(maxTpsDTO.getSandbox().toString()); } + if (maxTpsDTO.getSandboxTimeUnit() != null) { + api.setSandboxTimeUnit(getTimeUnitInMilliseconds(maxTpsDTO.getSandboxTimeUnit().toString())); + } + } + } + + /** + * Retrieves millisecond value for pre-defined time units. + * @param timeUnit String value of the time unit + * @return Millisecond value of the time unit + */ + private static String getTimeUnitInMilliseconds(String timeUnit) { + switch(timeUnit) { + case APIConstants.API_BACKEND_THROTTLE_TIMEUNIT_MINUTE: + return APIConstants.API_BACKEND_THROTTLE_TIMEUNIT_MINUTE_MS; + case APIConstants.API_BACKEND_THROTTLE_TIMEUNIT_HOUR: + return APIConstants.API_BACKEND_THROTTLE_TIMEUNIT_HOUR_MS; + default: + return APIConstants.API_BACKEND_THROTTLE_TIMEUNIT_SECOND_MS; + } + } + + /** + * Retrieved predefined strings for millisecond value. + * @param timeUnitInMillis Time in milliseconds + * @return Time unit string for the given milliseconds value + */ + private static String convertFromMilliseconds(String timeUnitInMillis) { + switch(timeUnitInMillis) { + case APIConstants.API_BACKEND_THROTTLE_TIMEUNIT_MINUTE_MS: + return APIConstants.API_BACKEND_THROTTLE_TIMEUNIT_MINUTE; + case APIConstants.API_BACKEND_THROTTLE_TIMEUNIT_HOUR_MS: + return APIConstants.API_BACKEND_THROTTLE_TIMEUNIT_HOUR; + default: + return APIConstants.API_BACKEND_THROTTLE_TIMEUNIT_SECOND; } } @@ -1599,6 +1637,14 @@ private static void setMaxTpsFromModelToApiDTO(API api, APIDTO dto) { if (!StringUtils.isBlank(api.getSandboxMaxTps())) { maxTpsDTO.setSandbox(Long.parseLong(api.getSandboxMaxTps())); } + if (!StringUtils.isBlank(api.getProductionTimeUnit())) { + maxTpsDTO.setProductionTimeUnit(APIMaxTpsDTO.ProductionTimeUnitEnum.valueOf( + convertFromMilliseconds(api.getProductionTimeUnit()))); + } + if (!StringUtils.isBlank(api.getSandboxTimeUnit())) { + maxTpsDTO.setSandboxTimeUnit(APIMaxTpsDTO.SandboxTimeUnitEnum.valueOf( + convertFromMilliseconds(api.getSandboxTimeUnit()))); + } dto.setMaxTps(maxTpsDTO); } catch (NumberFormatException e) { //logs the error and continues as this is not a blocker diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1.common/src/main/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/common/mappings/PublisherCommonUtils.java b/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1.common/src/main/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/common/mappings/PublisherCommonUtils.java index 11b8a9e3e828..648d0a517392 100755 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1.common/src/main/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/common/mappings/PublisherCommonUtils.java +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1.common/src/main/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/common/mappings/PublisherCommonUtils.java @@ -1400,7 +1400,8 @@ public static AIConfiguration convertToAiConfiguration(APIAiConfigurationDTO dto AIEndpointConfiguration endpointConfiguration = buildEndpointConfiguration(dto); aiConfiguration.setAiEndpointConfiguration(endpointConfiguration); } - if (dto.getThrottlingConfiguration() != null) { + if (dto.getThrottlingConfiguration() != null + && dto.getThrottlingConfiguration().isIsTokenBasedThrottlingEnabled()) { TokenBaseThrottlingCountHolder throttlingConfig = buildThrottlingConfiguration(dto); aiConfiguration.setTokenBasedThrottlingConfiguration(throttlingConfig); } @@ -1435,18 +1436,30 @@ private static TokenBaseThrottlingCountHolder buildThrottlingConfiguration(APIAi APIAiConfigurationThrottlingConfigurationDTO throttlingConfigDTO = dto.getThrottlingConfiguration(); TokenBaseThrottlingCountHolder throttlingConfig = new TokenBaseThrottlingCountHolder(); - throttlingConfig.setProductionMaxPromptTokenCount(throttlingConfigDTO - .getProductionMaxPromptTokenCount()); - throttlingConfig.setProductionMaxCompletionTokenCount(throttlingConfigDTO - .getProductionMaxCompletionTokenCount()); - throttlingConfig.setProductionMaxTotalTokenCount(throttlingConfigDTO - .getProductionMaxTotalTokenCount()); - throttlingConfig.setSandboxMaxPromptTokenCount(throttlingConfigDTO - .getSandboxMaxPromptTokenCount()); - throttlingConfig.setSandboxMaxCompletionTokenCount(throttlingConfigDTO - .getSandboxMaxCompletionTokenCount()); - throttlingConfig.setSandboxMaxTotalTokenCount(throttlingConfigDTO - .getSandboxMaxTotalTokenCount()); + if (throttlingConfigDTO.getProductionMaxPromptTokenCount() != null) { + throttlingConfig.setProductionMaxPromptTokenCount( + throttlingConfigDTO.getProductionMaxPromptTokenCount().toString()); + } + if (throttlingConfigDTO.getProductionMaxCompletionTokenCount() != null) { + throttlingConfig.setProductionMaxCompletionTokenCount( + throttlingConfigDTO.getProductionMaxCompletionTokenCount().toString()); + } + if (throttlingConfigDTO.getProductionMaxTotalTokenCount() != null) { + throttlingConfig.setProductionMaxTotalTokenCount( + throttlingConfigDTO.getProductionMaxTotalTokenCount().toString()); + } + if (throttlingConfigDTO.getSandboxMaxPromptTokenCount() != null) { + throttlingConfig.setSandboxMaxPromptTokenCount( + throttlingConfigDTO.getSandboxMaxPromptTokenCount().toString()); + } + if (throttlingConfigDTO.getSandboxMaxCompletionTokenCount() != null) { + throttlingConfig.setSandboxMaxCompletionTokenCount( + throttlingConfigDTO.getSandboxMaxCompletionTokenCount().toString()); + } + if (throttlingConfigDTO.getSandboxMaxTotalTokenCount() != null) { + throttlingConfig.setSandboxMaxTotalTokenCount( + throttlingConfigDTO.getSandboxMaxTotalTokenCount().toString()); + } throttlingConfig.setTokenBasedThrottlingEnabled(throttlingConfigDTO .isIsTokenBasedThrottlingEnabled()); @@ -1508,22 +1521,36 @@ private static APIAiConfigurationThrottlingConfigurationDTO buildThrottlingConfi APIAiConfigurationThrottlingConfigurationDTO throttlingConfigurationsDTO = new APIAiConfigurationThrottlingConfigurationDTO(); - - throttlingConfigurationsDTO.setProductionMaxPromptTokenCount(throttlingConfig - .getProductionMaxPromptTokenCount()); - throttlingConfigurationsDTO.setProductionMaxCompletionTokenCount(throttlingConfig - .getProductionMaxCompletionTokenCount()); - throttlingConfigurationsDTO.setProductionMaxTotalTokenCount(throttlingConfig - .getProductionMaxTotalTokenCount()); - throttlingConfigurationsDTO.setSandboxMaxPromptTokenCount(throttlingConfig - .getSandboxMaxPromptTokenCount()); - throttlingConfigurationsDTO.setSandboxMaxCompletionTokenCount(throttlingConfig - .getSandboxMaxCompletionTokenCount()); - throttlingConfigurationsDTO.setSandboxMaxTotalTokenCount(throttlingConfig - .getSandboxMaxTotalTokenCount()); - throttlingConfigurationsDTO.setIsTokenBasedThrottlingEnabled(throttlingConfig - .isTokenBasedThrottlingEnabled()); - + try { + if (throttlingConfig.getProductionMaxPromptTokenCount() != null) { + throttlingConfigurationsDTO.setProductionMaxPromptTokenCount( + Long.parseLong(throttlingConfig.getProductionMaxPromptTokenCount())); + } + if (throttlingConfig.getProductionMaxCompletionTokenCount() != null) { + throttlingConfigurationsDTO.setProductionMaxCompletionTokenCount( + Long.parseLong(throttlingConfig.getProductionMaxCompletionTokenCount())); + } + if (throttlingConfig.getProductionMaxTotalTokenCount() != null) { + throttlingConfigurationsDTO.setProductionMaxTotalTokenCount( + Long.parseLong(throttlingConfig.getProductionMaxTotalTokenCount())); + } + if (throttlingConfig.getSandboxMaxPromptTokenCount() != null) { + throttlingConfigurationsDTO.setSandboxMaxPromptTokenCount( + Long.parseLong(throttlingConfig.getSandboxMaxPromptTokenCount())); + } + if (throttlingConfig.getSandboxMaxCompletionTokenCount() != null) { + throttlingConfigurationsDTO.setSandboxMaxCompletionTokenCount( + Long.parseLong(throttlingConfig.getSandboxMaxCompletionTokenCount())); + } + if (throttlingConfig.getSandboxMaxTotalTokenCount() != null) { + throttlingConfigurationsDTO.setSandboxMaxTotalTokenCount( + Long.parseLong(throttlingConfig.getSandboxMaxTotalTokenCount())); + } + throttlingConfigurationsDTO.setIsTokenBasedThrottlingEnabled( + throttlingConfig.isTokenBasedThrottlingEnabled()); + } catch (NumberFormatException e) { + log.error("Cannot convert to Long format when setting AI throttling configurations for API", e); + } return throttlingConfigurationsDTO; } diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1/src/main/resources/publisher-api.yaml b/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1/src/main/resources/publisher-api.yaml index 69f7db689074..f3722a10165b 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1/src/main/resources/publisher-api.yaml +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1/src/main/resources/publisher-api.yaml @@ -10104,6 +10104,8 @@ components: type: string throttlingConfiguration: type: object + required: + - isTokenBasedThrottlingEnabled properties: productionMaxPromptTokenCount: type: integer @@ -11717,10 +11719,26 @@ components: type: integer format: int64 example: 1000 + productionTimeUnit: + type: string + description: "Time unit for the production in milliseconds. Possible values are 1sec, 1min, 1hour" + default: SECOND + enum: + - SECOND + - MINUTE + - HOUR sandbox: type: integer format: int64 example: 1000 + sandboxTimeUnit: + type: string + description: "Time unit for the sandbox in milliseconds. Possible values are 1sec, 1min, 1hour" + default: SECOND + enum: + - SECOND + - MINUTE + - HOUR APIBusinessInformation: type: object properties: