11package io .sentrius .agent .analysis .agents .verbs ;
22
3+ import java .io .FileInputStream ;
4+ import java .io .FileReader ;
35import java .io .IOException ;
46import java .io .InputStream ;
57import java .util .ArrayList ;
1214import com .fasterxml .jackson .databind .ObjectMapper ;
1315import com .fasterxml .jackson .databind .node .ArrayNode ;
1416import com .fasterxml .jackson .dataformat .yaml .YAMLFactory ;
17+ import com .google .common .collect .Maps ;
1518import io .sentrius .agent .analysis .agents .agents .AgentConfig ;
1619import io .sentrius .agent .analysis .agents .agents .PromptBuilder ;
1720import io .sentrius .agent .analysis .agents .agents .VerbRegistry ;
21+ import io .sentrius .agent .analysis .agents .interpreters .AsessmentListInterpreter ;
1822import io .sentrius .agent .analysis .agents .interpreters .ObjectListInterpreter ;
1923import io .sentrius .agent .analysis .agents .interpreters .ZtatOutputInterpreter ;
24+ import io .sentrius .agent .analysis .model .Assessment ;
25+ import io .sentrius .agent .analysis .model .ZtatAsessment ;
2026import io .sentrius .sso .core .dto .JITTrackerDTO ;
2127import io .sentrius .sso .core .dto .ztat .AgentExecution ;
2228import io .sentrius .sso .core .dto .ztat .AtatRequest ;
2329import io .sentrius .sso .core .dto .ztat .TokenDTO ;
30+ import io .sentrius .sso .core .dto .ztat .ZtatRequestDTO ;
2431import io .sentrius .sso .core .exceptions .ZtatException ;
2532import io .sentrius .sso .core .model .verbs .Verb ;
2633import io .sentrius .sso .core .services .agents .AgentClientService ;
2936import io .sentrius .sso .core .utils .JsonUtil ;
3037import io .sentrius .sso .genai .Message ;
3138import io .sentrius .sso .genai .Response ;
32- import io .sentrius .sso .genai .model .ChatRequest ;
39+ import io .sentrius .sso .genai .model .LLMRequest ;
3340import lombok .extern .slf4j .Slf4j ;
3441import org .springframework .beans .factory .annotation .Value ;
3542import org .springframework .stereotype .Service ;
@@ -98,7 +105,7 @@ public ArrayNode promptAgent(AgentExecution execution, Map<String, Object> args)
98105
99106 messages .add (Message .builder ().role ("system" ).content (prompt ).build ());
100107
101- ChatRequest chatRequest = ChatRequest .builder ().model ("gpt-4o" ).messages (messages ).build ();
108+ LLMRequest chatRequest = LLMRequest .builder ().model ("gpt-4o" ).messages (messages ).build ();
102109 var resp = llmService .askQuestion (execution , chatRequest );
103110 execution .addMessages ( messages );
104111 Response response = JsonUtil .MAPPER .readValue (resp , Response .class );
@@ -132,22 +139,27 @@ public ArrayNode promptAgent(AgentExecution execution, Map<String, Object> args)
132139 */
133140 @ Verb (name = "justify_operations" , description = "Chats with an agent to justify operations." , isAiCallable =
134141 false , requiresTokenManagement = true )
135- public String justifyAgent (AgentExecution execution , String ztatRequest , String reason ) throws ZtatException ,
136- IOException {
137- InputStream is = getClass ().getClassLoader ().getResourceAsStream (agentConfigFile );
138- if (is == null ) {
139- throw new RuntimeException ("assessor-config.yaml not found on classpath" );
140- }
141- AgentConfig config = new ObjectMapper (new YAMLFactory ()).readValue (is , AgentConfig .class );
142+ public String justifyAgent (AgentExecution execution , ZtatRequestDTO ztatRequest , String reason ) throws ZtatException ,
143+ IOException , InterruptedException {
142144
143- log .info ("Agent config loaded: {}" , config );
144- PromptBuilder promptBuilder = new PromptBuilder (verbRegistry , config );
145- var prompt = promptBuilder .buildPrompt ();
146- List <Message > messages = new ArrayList <>();
147145
148- messages .add (Message .builder ().role ("system" ).content (prompt ).build ());
149146
150- ChatRequest chatRequest = ChatRequest .builder ().model ("gpt-4o" ).messages (messages ).build ();
147+ var status = zeroTrustClientService .getTokenStatus (execution , execution .getUser (), ztatRequest .getRequestId ());
148+ log .info ("Status: {} for {} " , status , ztatRequest );
149+ if ("approved" .equals (status .get ("status" ).asText ())) {
150+ return status .get ("ztat_token" ).asText ();
151+ }
152+
153+ while (!status .equals ("approved" )) {
154+
155+ Thread .sleep (5_000 );
156+
157+ status = zeroTrustClientService .getTokenStatus (execution , execution .getUser (), ztatRequest .getRequestId ());
158+ log .info ("Status: {} for {} " , status , ztatRequest );
159+ if ("approved" .equals (status .get ("status" ).asText ())) {
160+ return status .get ("ztat_token" ).asText ();
161+ }
162+ }
151163
152164 return null ;
153165 // return llmService.askQuestion(chatRequest);
@@ -164,9 +176,10 @@ public String justifyAgent(AgentExecution execution, String ztatRequest, String
164176 @ Verb (name = "assess_data" , returnType = ArrayNode .class , description = "Accepts api server data based on the " +
165177 "context and seeks" +
166178 " to perform the assessment by prompting the LLM. Can be used to assess data or request information from users and/or agents." ,
179+ outputInterpreter = AsessmentListInterpreter .class ,
167180 inputInterpreter =
168181 ObjectListInterpreter .class , requiresTokenManagement = true )
169- public ArrayNode assessData (AgentExecution execution , List <?> objectList ) throws ZtatException , IOException {
182+ public List < Assessment > assessData (AgentExecution execution , List <?> objectList ) throws ZtatException , IOException {
170183 InputStream is = getClass ().getClassLoader ().getResourceAsStream (agentConfigFile );
171184 if (is == null ) {
172185 throw new RuntimeException ("assessor-config.yaml not found on classpath" );
@@ -175,7 +188,7 @@ public ArrayNode assessData(AgentExecution execution, List<?> objectList) throws
175188
176189 log .info ("Agent config loaded: {}" , config );
177190
178- var responses = JsonUtil . MAPPER . createArrayNode ();
191+ List < Assessment > responses = new ArrayList <> ();
179192 log .info ("Object list is {}" , objectList );
180193 for (var obj : objectList ) {
181194 List <Message > messages = new ArrayList <>();
@@ -184,7 +197,7 @@ public ArrayNode assessData(AgentExecution execution, List<?> objectList) throws
184197 messages .add (Message .builder ().role ("user" ).content (obj .toString ()).build ());
185198 messages .add (Message .builder ().role ("system" ).content (context ).build ());
186199
187- ChatRequest chatRequest = ChatRequest .builder ().model ("gpt-4o" ).messages (messages ).build ();
200+ LLMRequest chatRequest = LLMRequest .builder ().model ("gpt-4o" ).messages (messages ).build ();
188201 execution .addMessages ( messages );
189202 var resp = llmService .askQuestion (execution , chatRequest );
190203 Response response = JsonUtil .MAPPER .readValue (resp , Response .class );
@@ -194,7 +207,10 @@ public ArrayNode assessData(AgentExecution execution, List<?> objectList) throws
194207 if (content .startsWith ("```json" )) {
195208 content = content .substring (7 , content .length () - 3 );
196209 }
197- responses .add (JsonUtil .MAPPER .readTree (content ));
210+
211+
212+ responses .add ( JsonUtil .MAPPER .readValue (content , Assessment .class ) );
213+ //responses.add(JsonUtil.MAPPER.readTree(content));
198214 log .info ("content is {}" , content );
199215 }
200216 log .info ("Object is {}" , obj );
@@ -204,7 +220,7 @@ public ArrayNode assessData(AgentExecution execution, List<?> objectList) throws
204220
205221 @ Verb (name = "list_ztat_requests" , returnType = ArrayNode .class , description = "Lists zero trust access tokens to" +
206222 " review. Does not review access token requests." , outputInterpreter = ZtatOutputInterpreter .class , requiresTokenManagement = true )
207- public List <AtatRequest > getWork (TokenDTO token , Map <String ,Object > args ) throws ZtatException , IOException {
223+ public List <AtatRequest > getWork (AgentExecution token , Map <String ,Object > args ) throws ZtatException , IOException {
208224 List <AtatRequest > requests = new ArrayList <>();
209225
210226 var atatRequests = agentClientService .getAtatRequests (token );
@@ -214,19 +230,90 @@ public List<AtatRequest> getWork(TokenDTO token, Map<String,Object> args) throws
214230 for (var dto : dtos ) {
215231 var request = new AtatRequest ();
216232 request .setRequestId (dto .getId ().toString ());
217- // for each request7
218- /*request.set
219- request.setStatus(dto.getStatus());
220- request.setCreatedAt(dto.getCreatedAt());
221- request.setUpdatedAt(dto.getUpdatedAt());
222- request.setAgentId(dto.getAgentId());
223- requests.add(request);
224- *
225- */
233+ // get messages
234+ request .setRequestedAction ( dto .getSummary ());
235+
236+ var communications = zeroTrustClientService .callGetOnApi (token ,"agent/communications/id" ,
237+ Maps .immutableEntry ("communicationId" , List .of (token .getCommunicationId ())));
238+ var messages = JsonUtil .MAPPER .readTree (communications );
239+ List <Message > communicationMessages = new ArrayList <>();
240+ for (JsonNode message : messages ) {
241+ if (message .has ("payload" ) && message .has ("messageType" )) {
242+ var type = message .get ("messageType" ).asText ();
243+ if (type .equalsIgnoreCase ("chat_request" )) {
244+ try {
245+ Message msg = JsonUtil .MAPPER .readValue (message .get ("payload" ).asText (), Message .class );
246+ communicationMessages .add (msg );
247+ } catch (JsonProcessingException e ) {
248+ throw new RuntimeException (e );
249+ }
250+ }
251+ }
252+ }
253+ request .setMessages (communicationMessages );
226254 }
227255
228256
229257 return requests ;
230258 }
231259
260+ @ Verb (name = "assess_ztat_requests" , returnType = ArrayNode .class , description = "Analyzes ztats according to the" +
261+ " context." ,
262+ inputInterpreter = ZtatOutputInterpreter .class , requiresTokenManagement = true )
263+ public List <ZtatAsessment > analyzeAtatRequests (AgentExecution execution , List <AtatRequest > requests ) throws ZtatException ,
264+ IOException {
265+ // set up context
266+ InputStream is = getClass ().getClassLoader ().getResourceAsStream (agentConfigFile );
267+ if (is == null ) {
268+ throw new RuntimeException ("assessor-config.yaml not found on classpath" );
269+
270+ }
271+
272+ InputStream assessZtatStream = getClass ().getClassLoader ().getResourceAsStream ("assess-ztat.json" );
273+ if (assessZtatStream == null ) {
274+ throw new RuntimeException ("assessor-config.yaml not found on classpath" );
275+
276+ }
277+ String assessZtat = new String (assessZtatStream .readAllBytes ());
278+
279+ AgentConfig config = new ObjectMapper (new YAMLFactory ()).readValue (is , AgentConfig .class );
280+ log .info ("Agent config loaded: {}" , config );
281+ List <ZtatAsessment > responses = new ArrayList <>();
282+ for (var request : requests ) {
283+ List <Message > messages = new ArrayList <>();
284+ var context = config .getContext ();
285+
286+ messages .add (Message .builder ().role ("system" ).content (context ).build ());
287+ messages .add (Message .builder ().role ("system" ).content ("Ensure your response adheres to the following " +
288+ "json format:" + assessZtat ).build ());
289+ messages .addAll (execution .getMessages ());
290+ messages .addAll (request .getMessages ());
291+
292+ LLMRequest chatRequest = LLMRequest .builder ().model ("gpt-4o" ).messages (messages ).build ();
293+ var resp = llmService .askQuestion (execution , chatRequest );
294+ Response response = JsonUtil .MAPPER .readValue (resp , Response .class );
295+ log .info ("Response is {}" , resp );
296+ for (Response .Choice choice : response .getChoices ()) {
297+ var content = choice .getMessage ().getContent ();
298+ if (content .startsWith ("```json" )) {
299+ content = content .substring (7 , content .length () - 3 );
300+ }
301+ log .info ("content is {}" , content );
302+ var ztat = JsonUtil .MAPPER .readValue (content , ZtatAsessment .class );
303+ if (ztat .isApproved ()) {
304+ zeroTrustClientService .approveZtat (execution , request .getRequestId ());
305+ }
306+ else {
307+ if (null != ztat .getQuestionToUser () &&
308+ ztat .getQuestionToUser ().isEmpty ()){
309+ // ask a question of the user
310+ }
311+ }
312+ responses .add (ztat );
313+
314+ }
315+ }
316+ return responses ;
317+ }
318+
232319}
0 commit comments