diff --git a/.gcp.env b/.gcp.env index baad2ae3..62781601 100644 --- a/.gcp.env +++ b/.gcp.env @@ -1,4 +1,4 @@ -SENTRIUS_VERSION=1.0.33 +SENTRIUS_VERSION=1.0.34 SENTRIUS_SSH_VERSION=1.0.3 SENTRIUS_KEYCLOAK_VERSION=1.0.4 -SENTRIUS_AGENT_VERSION=1.0.14 \ No newline at end of file +SENTRIUS_AGENT_VERSION=1.0.15 \ No newline at end of file diff --git a/api/src/main/java/io/sentrius/sso/controllers/api/RuleApiController.java b/api/src/main/java/io/sentrius/sso/controllers/api/RuleApiController.java index 4015a222..ba92b966 100644 --- a/api/src/main/java/io/sentrius/sso/controllers/api/RuleApiController.java +++ b/api/src/main/java/io/sentrius/sso/controllers/api/RuleApiController.java @@ -4,6 +4,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import io.sentrius.sso.core.annotations.LimitAccess; @@ -181,7 +182,12 @@ public ResponseEntity assignConfig(HttpServletRequest request, HttpServl Set selectedHostGroups = new HashSet<>(); for(var groupId : (List)hostGroups){ + var group = hostGroupService.getHostGroupWithHostSystems(user, Long.parseLong(groupId)); + // for application managers they should have the ability to assign groups + if (!group.isPresent() && AccessUtil.canAccess(user, ApplicationAccessEnum.CAN_MANAGE_APPLICATION)) { + group = Optional.of( hostGroupService.getHostGroup(Long.parseLong(groupId)) ); + } if (group.isPresent()) { log.info("Assigning group {}", group.get().getName()); selectedHostGroups.add(group.get()); diff --git a/api/src/main/java/io/sentrius/sso/controllers/api/SystemApiController.java b/api/src/main/java/io/sentrius/sso/controllers/api/SystemApiController.java index 0e9e582a..e1ed2188 100644 --- a/api/src/main/java/io/sentrius/sso/controllers/api/SystemApiController.java +++ b/api/src/main/java/io/sentrius/sso/controllers/api/SystemApiController.java @@ -117,6 +117,7 @@ public String setOption(HttpServletRequest request, HttpServletResponse response results.add(systemOptions.setValue(option.getName(), entry.getValue()[0], false)); break; case "java.lang.Boolean": + log.info("Setting boolean value: {}", entry.getValue()[0]); results.add(systemOptions.setValue(option.getName(), Boolean.valueOf(entry.getValue()[0]), false)); break; case "java.lang.Integer": diff --git a/api/src/main/java/io/sentrius/sso/websocket/TerminalWSHandler.java b/api/src/main/java/io/sentrius/sso/websocket/TerminalWSHandler.java index b7e6418c..3134df09 100644 --- a/api/src/main/java/io/sentrius/sso/websocket/TerminalWSHandler.java +++ b/api/src/main/java/io/sentrius/sso/websocket/TerminalWSHandler.java @@ -87,7 +87,6 @@ protected void handleTextMessage(WebSocketSession session, TextMessage message) byte[] messageBytes = Base64.getDecoder().decode(message.getPayload()); Session.TerminalMessage auditLog = Session.TerminalMessage.parseFrom(messageBytes); - log.info("got message {}; {}; {}", uri,sessionId, auditLog.getCommand()); // Decrypt the session ID // var sessionIdStr = cryptoService.decrypt(sessionId); // var sessionIdLong = Long.parseLong(sessionIdStr); @@ -96,7 +95,7 @@ protected void handleTextMessage(WebSocketSession session, TextMessage message) var sys = sessionTrackingService.getEncryptedConnectedSession(lookupId); if (null != sys ) { boolean allNoAction = true; - log.info("**** Processing message for session ID: {} with {} actions", sessionId, + log.debug("**** Processing message for session ID: {} with {} actions", sessionId, sys.getSessionStartupActions().size()); for (var action : sys.getSessionStartupActions()) { var trigger = action.onMessage(auditLog); @@ -104,13 +103,13 @@ protected void handleTextMessage(WebSocketSession session, TextMessage message) allNoAction = false; // drop the message sys.getTerminalAuditor().setSessionTrigger(trigger.get()); - log.info("**** Setting JIT Trigger: {}", trigger.get()); + log.debug("**** Setting JIT Trigger: {}", trigger.get()); sessionTrackingService.addSystemTrigger(sys, trigger.get()); return; } else if (trigger.get().getAction() == TriggerAction.WARN_ACTION) { allNoAction = false; // send the message - log.info("**** Setting WARN Trigger: {}", trigger.get()); + log.debug("**** Setting WARN Trigger: {}", trigger.get()); sys.getTerminalAuditor().setSessionTrigger(trigger.get()); sessionTrackingService.addSystemTrigger(sys, trigger.get()); } else if (trigger.get().getAction() == TriggerAction.PROMPT_ACTION) { diff --git a/api/src/main/resources/templates/sso/system_settings.html b/api/src/main/resources/templates/sso/system_settings.html index 0787f067..120d9cbb 100755 --- a/api/src/main/resources/templates/sso/system_settings.html +++ b/api/src/main/resources/templates/sso/system_settings.html @@ -136,7 +136,16 @@ - + +
+ +
+
+ +
diff --git a/core/src/main/java/io/sentrius/sso/automation/auditing/AccessTokenEvaluator.java b/core/src/main/java/io/sentrius/sso/automation/auditing/AccessTokenEvaluator.java index 6da96ca9..171fdfa2 100644 --- a/core/src/main/java/io/sentrius/sso/automation/auditing/AccessTokenEvaluator.java +++ b/core/src/main/java/io/sentrius/sso/automation/auditing/AccessTokenEvaluator.java @@ -1,6 +1,7 @@ package io.sentrius.sso.automation.auditing; import java.util.Optional; +import io.sentrius.sso.core.config.SystemOptions; import io.sentrius.sso.core.model.ConnectedSystem; import io.sentrius.sso.core.services.terminal.SessionTrackingService; @@ -12,7 +13,7 @@ public abstract class AccessTokenEvaluator { public abstract Optional trigger(String text); - public abstract boolean configure(String configuration); + public abstract boolean configure(SystemOptions systemOptions, String configuration); public abstract TriggerAction describeAction(); @@ -29,5 +30,7 @@ public void setConnectedSystem(ConnectedSystem connectedSystem) { public void setTrackingService(SessionTrackingService sessionTrackingService){ this.sessionTrackingService = sessionTrackingService; } + + } // diff --git a/core/src/main/java/io/sentrius/sso/automation/auditing/AllowedExecution.java b/core/src/main/java/io/sentrius/sso/automation/auditing/AllowedExecution.java index ae83ed9e..b9781ff9 100644 --- a/core/src/main/java/io/sentrius/sso/automation/auditing/AllowedExecution.java +++ b/core/src/main/java/io/sentrius/sso/automation/auditing/AllowedExecution.java @@ -1,6 +1,7 @@ package io.sentrius.sso.automation.auditing; import java.util.Optional; +import io.sentrius.sso.core.config.SystemOptions; public class AllowedExecution extends AccessTokenEvaluator { @@ -38,7 +39,7 @@ public Optional trigger(String text) { } @Override - public boolean configure(String configuration) { + public boolean configure(SystemOptions systemOptions, String configuration) { String[] commandSplit = configuration.split(":"); diff --git a/core/src/main/java/io/sentrius/sso/automation/auditing/RuleFactory.java b/core/src/main/java/io/sentrius/sso/automation/auditing/RuleFactory.java index 8dd7daa1..f4256cd9 100644 --- a/core/src/main/java/io/sentrius/sso/automation/auditing/RuleFactory.java +++ b/core/src/main/java/io/sentrius/sso/automation/auditing/RuleFactory.java @@ -3,6 +3,7 @@ import java.lang.reflect.InvocationTargetException; import java.util.List; import java.util.Map; +import io.sentrius.sso.core.config.SystemOptions; import io.sentrius.sso.core.model.ConnectedSystem; import io.sentrius.sso.core.model.auditing.Rule; import io.sentrius.sso.core.services.PluggableServices; @@ -14,6 +15,7 @@ public class RuleFactory { public static void createRules( + SystemOptions systemOptions, ConnectedSystem connectedSystem, SessionTrackingService sessionTrackingService, List initialRules, List synchronousRules, List beforeAndAfterRules, @@ -24,7 +26,7 @@ public static void createRules( Class newRuleClass = Class.forName(rule.getRuleClass()).asSubclass(AccessTokenEvaluator.class); AccessTokenEvaluator newRule = newRuleClass.getConstructor().newInstance(); - newRule.configure(rule.getRuleConfig()); + newRule.configure(systemOptions, rule.getRuleConfig()); newRule.setConnectedSystem(connectedSystem); newRule.setTrackingService(sessionTrackingService); if (newRule instanceof SessionTokenEvaluator) { diff --git a/core/src/main/java/io/sentrius/sso/automation/auditing/rules/AllowedCommandsRule.java b/core/src/main/java/io/sentrius/sso/automation/auditing/rules/AllowedCommandsRule.java index 254d7de6..f43259aa 100644 --- a/core/src/main/java/io/sentrius/sso/automation/auditing/rules/AllowedCommandsRule.java +++ b/core/src/main/java/io/sentrius/sso/automation/auditing/rules/AllowedCommandsRule.java @@ -4,6 +4,7 @@ import io.sentrius.sso.automation.auditing.AccessTokenEvaluator; import io.sentrius.sso.automation.auditing.Trigger; import io.sentrius.sso.automation.auditing.TriggerAction; +import io.sentrius.sso.core.config.SystemOptions; import org.apache.commons.collections4.trie.PatriciaTrie; public class AllowedCommandsRule extends AccessTokenEvaluator { @@ -29,7 +30,7 @@ public Optional trigger(String text) { } @Override - public boolean configure(String configuration) { + public boolean configure(SystemOptions systemOptions, String configuration) { String[] commandGroup = configuration.split(""); diff --git a/core/src/main/java/io/sentrius/sso/automation/auditing/rules/CommandEvaluator.java b/core/src/main/java/io/sentrius/sso/automation/auditing/rules/CommandEvaluator.java index 5547bbc5..8b08e860 100644 --- a/core/src/main/java/io/sentrius/sso/automation/auditing/rules/CommandEvaluator.java +++ b/core/src/main/java/io/sentrius/sso/automation/auditing/rules/CommandEvaluator.java @@ -4,6 +4,7 @@ import io.sentrius.sso.automation.auditing.AccessTokenEvaluator; import io.sentrius.sso.automation.auditing.Trigger; import io.sentrius.sso.automation.auditing.TriggerAction; +import io.sentrius.sso.core.config.SystemOptions; public class CommandEvaluator extends AccessTokenEvaluator { @@ -43,7 +44,7 @@ public Optional trigger(String text) { } @Override - public boolean configure(String configuration) { + public boolean configure(SystemOptions systemOptions, String configuration) { String[] commandSplit = configuration.split(":"); diff --git a/core/src/main/java/io/sentrius/sso/automation/auditing/rules/OpenAISessionRule.java b/core/src/main/java/io/sentrius/sso/automation/auditing/rules/OpenAISessionRule.java index 3732950c..51046e9e 100644 --- a/core/src/main/java/io/sentrius/sso/automation/auditing/rules/OpenAISessionRule.java +++ b/core/src/main/java/io/sentrius/sso/automation/auditing/rules/OpenAISessionRule.java @@ -8,6 +8,7 @@ import io.sentrius.sso.automation.auditing.SessionTokenEvaluator; import io.sentrius.sso.automation.auditing.Trigger; import io.sentrius.sso.automation.auditing.TriggerAction; +import io.sentrius.sso.core.config.SystemOptions; import io.sentrius.sso.protobuf.Session; import io.sentrius.sso.core.model.ConnectedSystem; import io.sentrius.sso.core.services.openai.OpenAITerminalService; @@ -23,6 +24,9 @@ public class OpenAISessionRule extends SessionTokenEvaluator { private ConnectedSystem connectedSystem; private SessionTrackingService sessionTrackingService; + private long buffer = 10; + private long commandsToEvaluate = 5; + // Rolling list of last 10 commands private final Queue recentCommands = new LinkedList<>(); @@ -49,13 +53,13 @@ public Optional trigger(String command) { return Optional.of(trg); } // Add command to the rolling list - if (recentCommands.size() >= 10) { + if (recentCommands.size() >= buffer) { recentCommands.poll(); // Remove the oldest command } recentCommands.offer(command); - if (recentCommands.size() < 5) { + if (recentCommands.size() < commandsToEvaluate) { log.info("Insufficient commands for analysis"); Trigger trg = new Trigger(TriggerAction.NO_ACTION, ""); return Optional.of(trg); @@ -89,7 +93,7 @@ public Optional trigger(String command) { } @Override - public boolean configure(String configuration) { + public boolean configure(SystemOptions systemOptions, String configuration) { return false; } diff --git a/core/src/main/java/io/sentrius/sso/automation/auditing/rules/TicketSessionRule.java b/core/src/main/java/io/sentrius/sso/automation/auditing/rules/TicketSessionRule.java index 3ea47605..1188d54d 100644 --- a/core/src/main/java/io/sentrius/sso/automation/auditing/rules/TicketSessionRule.java +++ b/core/src/main/java/io/sentrius/sso/automation/auditing/rules/TicketSessionRule.java @@ -4,6 +4,7 @@ import io.sentrius.sso.automation.auditing.SessionTokenEvaluator; import io.sentrius.sso.automation.auditing.Trigger; import io.sentrius.sso.automation.auditing.TriggerAction; +import io.sentrius.sso.core.config.SystemOptions; import io.sentrius.sso.protobuf.Session; import io.sentrius.sso.core.model.ConnectedSystem; import io.sentrius.sso.core.services.terminal.SessionTrackingService; @@ -43,7 +44,7 @@ public Optional trigger(String text) { } @Override - public boolean configure(String configuration) { + public boolean configure(SystemOptions systemOptions, String configuration) { return false; } diff --git a/core/src/main/java/io/sentrius/sso/automation/auditing/rules/TwoPartyAIMonitor.java b/core/src/main/java/io/sentrius/sso/automation/auditing/rules/TwoPartyAIMonitor.java index eb5d30fa..9d9e3235 100644 --- a/core/src/main/java/io/sentrius/sso/automation/auditing/rules/TwoPartyAIMonitor.java +++ b/core/src/main/java/io/sentrius/sso/automation/auditing/rules/TwoPartyAIMonitor.java @@ -9,6 +9,8 @@ import io.sentrius.sso.automation.auditing.SessionTokenEvaluator; import io.sentrius.sso.automation.auditing.Trigger; import io.sentrius.sso.automation.auditing.TriggerAction; +import io.sentrius.sso.core.config.SystemOptions; +import io.sentrius.sso.core.model.dto.SystemOption; import io.sentrius.sso.protobuf.Session; import io.sentrius.sso.core.model.ConnectedSystem; import io.sentrius.sso.core.services.openai.OpenAITwoPartyMonitorService; @@ -25,6 +27,10 @@ public class TwoPartyAIMonitor extends SessionTokenEvaluator { private ConnectedSystem connectedSystem; private SessionTrackingService sessionTrackingService; + private long buffer = 10; + private long commandsToEvaluate = 5; + private double aiRiskThreshold = 0.8; + private boolean enableLLMQuestions = false; // Rolling list of last 10 commands private final Queue recentCommands = new LinkedList<>(); @@ -47,7 +53,6 @@ public void setTrackingService(SessionTrackingService sessionTrackingService) { @Override public Optional trigger(String cmd) { - log.info("Received command: {}", cmd); var command = cmd.trim(); if (command.isEmpty()) { log.info("Empty command No analysis"); @@ -61,13 +66,13 @@ public Optional trigger(String cmd) { return Optional.of(trg); } // Add command to the rolling list - if (recentCommands.size() >= 10) { + if (recentCommands.size() >= buffer) { recentCommands.poll(); // Remove the oldest command } recentCommands.offer(command); - if (recentCommands.size() < 5) { + if (recentCommands.size() < commandsToEvaluate) { log.info("Insufficient commands for analysis"); Trigger trg = new Trigger(TriggerAction.PERSISTENT_MESSAGE, llmResponse.get() != null ? llmResponse.get() : ""); return Optional.of(trg); @@ -86,13 +91,13 @@ public Optional trigger(String cmd) { // Merge recent commands into a single payload String mergedCommands = String.join("\n", recentCommands); - log.info("merged commands: {}", mergedCommands); + log.debug("merged commands: {}", mergedCommands); // Submit merged commands for asynchronous analysis CompletableFuture analysis = ((OpenAITwoPartyMonitorService)openAi).analyzeTerminalLogs(TwoPartyRequest.builder().userInput(mergedCommands).build()).thenAccept(response -> { log.info("OpenAI analysis completed. Malicious: {}", response); if (response != null) { - flaggedAsMalicious = response.getScore()>0.8; + flaggedAsMalicious = response.getScore()> aiRiskThreshold; llmResponse.set(response.getResponse()); if (response.getQuestion() != null && !flaggedAsMalicious && response.getScore()>=0.75){ llmQuestion.set(response.getQuestion()); @@ -126,8 +131,13 @@ public Optional trigger(String cmd) { } @Override - public boolean configure(String configuration) { - return false; + public boolean configure(SystemOptions systemOptions, String configuration) { + commandsToEvaluate = systemOptions.getCommandsToEvaluate(); + buffer = systemOptions.getCommandsToBuffer(); + aiRiskThreshold = systemOptions.getAiRiskThreshold(); + enableLLMQuestions = systemOptions.getEnableLLMQuestions(); + return true; + } @Override @@ -160,7 +170,7 @@ public Optional onMessage(Session.TerminalMessage text) { if (response != null) { flaggedAsMalicious = response.getScore()>0.8; llmResponse.set(response.getResponse()); - if (response.getQuestion() != null && !flaggedAsMalicious && response.getScore()>=0.75){ + if (response.getQuestion() != null && !flaggedAsMalicious && response.getScore()>=0.75 && enableLLMQuestions) { llmQuestion.set(response.getQuestion()); } else { diff --git a/core/src/main/java/io/sentrius/sso/automation/auditing/rules/TwoPartySessionRule.java b/core/src/main/java/io/sentrius/sso/automation/auditing/rules/TwoPartySessionRule.java index a9ac2ee2..5f1ad270 100644 --- a/core/src/main/java/io/sentrius/sso/automation/auditing/rules/TwoPartySessionRule.java +++ b/core/src/main/java/io/sentrius/sso/automation/auditing/rules/TwoPartySessionRule.java @@ -4,6 +4,7 @@ import io.sentrius.sso.automation.auditing.SessionTokenEvaluator; import io.sentrius.sso.automation.auditing.Trigger; import io.sentrius.sso.automation.auditing.TriggerAction; +import io.sentrius.sso.core.config.SystemOptions; import io.sentrius.sso.protobuf.Session; import io.sentrius.sso.core.model.ConnectedSystem; import io.sentrius.sso.core.services.terminal.SessionTrackingService; @@ -37,8 +38,9 @@ public Optional trigger(String text) { } @Override - public boolean configure(String configuration) { - return false; + public boolean configure(SystemOptions systemOptions, String configuration) { + + return true; } @Override diff --git a/core/src/main/java/io/sentrius/sso/core/config/SystemOptions.java b/core/src/main/java/io/sentrius/sso/core/config/SystemOptions.java index 953650c4..92b9a335 100644 --- a/core/src/main/java/io/sentrius/sso/core/config/SystemOptions.java +++ b/core/src/main/java/io/sentrius/sso/core/config/SystemOptions.java @@ -12,10 +12,12 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** Purpose: Centralizes a POJO for options with sensible defaults. */ +@Slf4j @Builder @Getter @NoArgsConstructor @@ -113,9 +115,22 @@ public class SystemOptions { public Boolean allowUploadSystemConfiguration = false; + @Updatable(description = "Allows LLM to ask questions of the user") + public Boolean enableLLMQuestions = false; + public Boolean sshEnabled = true; + @Updatable(description = "AI risk score before user sessions are halted. Changes won't apply to currently running " + + "sessions") + public Double aiRiskThreshold = 0.8; + + @Updatable(description = "This is the number of commands to buffer for AI monitoring.") + public Integer commandsToBuffer = 10; + + @Updatable(description = "This is the number of commands to evaluate for AI monitoring.") + public Integer commandsToEvaluate = 5; + /** * Purely for testing mode */ @@ -171,16 +186,19 @@ public boolean setValue(String fieldName, Object fieldValue, boolean save){ Field[] fields = this.getClass().getDeclaredFields(); for (var field : fields) { if (field.getName().equalsIgnoreCase(fieldName)) { + log.info("Setting field {} to {}", fieldName, fieldValue); try { field.set(this, fieldValue); // Update the AppConfig with the new field value dynamicPropertiesService.updateProperty(fieldName, fieldValue.toString()); - + log.info("Set field {} to {}", fieldName, fieldValue); return true; } catch (IllegalAccessException e) { + log.error("Failed to update field {}", fieldName); return false; } catch (IOException e) { + log.error("Failed to update field {}", fieldName); throw new RuntimeException(e); } } @@ -218,6 +236,8 @@ public Map getOptions() throws IllegalAccessException { String fieldName = field.getName(); Object fieldValue = field.get(this); + log.info("Field: {} Value: {}", fieldName, fieldValue); + // Create a SystemOption object with the field details var sysOpt = SystemOption.builder() .name(fieldName) diff --git a/core/src/main/java/io/sentrius/sso/core/services/HostGroupService.java b/core/src/main/java/io/sentrius/sso/core/services/HostGroupService.java index 06d3ac45..41544e11 100644 --- a/core/src/main/java/io/sentrius/sso/core/services/HostGroupService.java +++ b/core/src/main/java/io/sentrius/sso/core/services/HostGroupService.java @@ -57,16 +57,6 @@ public Optional getHostGroupWithHostSystems(User user, Long hostGroup return Optional.of(hostGroup); } - @Transactional - public List getHostGroupWithHostSystems(User user) { - List hostGroups = hostGroupRepository.findAllByUserId(user.getId()); - - for(HostGroup hostGroup : hostGroups) { - hostGroup.getHostSystemList().size(); // Forces initialization of the hostSystemList - } - - return hostGroups; - } @Transactional public Optional getHostSystem(Long hostId) { diff --git a/core/src/main/java/io/sentrius/sso/core/services/TerminalService.java b/core/src/main/java/io/sentrius/sso/core/services/TerminalService.java index c9f092fa..459d910c 100644 --- a/core/src/main/java/io/sentrius/sso/core/services/TerminalService.java +++ b/core/src/main/java/io/sentrius/sso/core/services/TerminalService.java @@ -168,7 +168,8 @@ public ConnectedSystem openTerminal( // rules that are ONLY before a session begins. List definedSessionRules = new ArrayList<>(); - RuleFactory.createRules(schSession, sessionTrackingService, rules.stream().collect(Collectors.toList()), + RuleFactory.createRules(systemOptions, schSession, sessionTrackingService, + rules.stream().collect(Collectors.toList()), synchronousRules, definedSessionRules, services); diff --git a/core/src/main/java/io/sentrius/sso/core/utils/SecureShellTask.java b/core/src/main/java/io/sentrius/sso/core/utils/SecureShellTask.java index 7f3f0bc2..916af55c 100644 --- a/core/src/main/java/io/sentrius/sso/core/utils/SecureShellTask.java +++ b/core/src/main/java/io/sentrius/sso/core/utils/SecureShellTask.java @@ -33,7 +33,6 @@ public void execute(SessionOutput sessionOutput, InputStream outFromChannel) { while (!Thread.currentThread().isInterrupted() && !sessionOutput.getConnectedSystem().getSession().getClosed()) { if (br.ready() && (read = br.read(buff)) != -1) { - log.info("Read {} bytes from channel {}", read, new String(buff,0,read)); sessionOutputService.addToOutput( sessionOutput.getConnectedSystem(), buff, 0, read); } diff --git a/core/src/main/java/io/sentrius/sso/genai/GenerativeAPI.java b/core/src/main/java/io/sentrius/sso/genai/GenerativeAPI.java index 15b0b37e..c559d6c1 100644 --- a/core/src/main/java/io/sentrius/sso/genai/GenerativeAPI.java +++ b/core/src/main/java/io/sentrius/sso/genai/GenerativeAPI.java @@ -74,7 +74,7 @@ public String sample(final ApiEndPointRequest apiRequest) throws HttpException { RequestBody body = RequestBody.create(buildRequestBody(apiRequest), MediaType.get("application/json; charset=utf-8")); Request request = new Request.Builder().url(apiRequest.getEndpoint()).header("Authorization", "Bearer " + authToken.getToken()).post(body).build(); - log.info("making request to {}", apiRequest.getEndpoint()); + try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) { if (response.body() == null) { diff --git a/core/src/main/java/io/sentrius/sso/genai/Response.java b/core/src/main/java/io/sentrius/sso/genai/Response.java index c573e906..8de21bdd 100644 --- a/core/src/main/java/io/sentrius/sso/genai/Response.java +++ b/core/src/main/java/io/sentrius/sso/genai/Response.java @@ -38,6 +38,9 @@ public class Response { @JsonProperty(value = "usage") public Usage usage; + @JsonProperty(value = "service_tier", required = false) + public String serviceTier; + /** * Response class is responsible for collecting and storing user responses. It provides a string * concatenation method to combine all responses. Use the 'addResponse' method to collect user