Commit d679a3c6 authored by Kostis Trantzas's avatar Kostis Trantzas
Browse files

Merge branch...

Merge branch '37-create-a-new-functionality-for-lcm-rules-to-delegate-a-text-to-another-service-e-g-an-llm-agent' into 'develop'

Resolve "Create a new functionality for LCM rules to delegate a text to another service (e.g. an LLM agent) and get a response"

See merge request !31
parents dd426cae 0e5adf3a
Loading
Loading
Loading
Loading
Loading
+66 −0
Original line number Diff line number Diff line
package org.etsi.osl.osom.lcm;

import org.springframework.stereotype.Service;
import lombok.extern.slf4j.Slf4j;
import org.apache.camel.CamelExecutionException;
import org.apache.camel.ExchangeTimedOutException;
import org.apache.camel.ProducerTemplate;

@Service
@Slf4j
public class ChatClient {

  

      private static final int MAX_ATTEMPTS = 3;

      private final ProducerTemplate producerTemplate;

      public ChatClient(ProducerTemplate producerTemplate) {
          this.producerTemplate = producerTemplate;
      }

      /**
       * Sends a String message to ActiveMQ and waits for a String reply.
       * Retries up to 3 times in case of timeout.
       * 
       * @param payload the request payload
       * @return the response String, or "" if all attempts time out or fail
       */
      public String ask(String agentName, String payload, String defaultText, Integer timeOut) {
          for (int attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {
              try {
                String ENDPOINT_URI =
                    "jms:queue:agents/" + agentName
                    + "?exchangePattern=InOut"
                    + "&requestTimeout=" + timeOut ; // x milliseconds timeout per attempt
                
                  String response = producerTemplate.requestBody(
                          ENDPOINT_URI,
                          payload,
                          String.class);

                  // If response is non-null, return it
                  if (response != null) {
                      return response;
                  }
              } catch (CamelExecutionException ex) {
                  // Check if the underlying cause is a timeout
                  if (ex.getCause() instanceof ExchangeTimedOutException) {
                      log.warn("Timeout on attempt {} for payload {}", attempt, payload, ex);
                  } else {
                      // Non-timeout error; break or handle differently
                      log.error("Non-timeout error on attempt {}", attempt, ex);
                      break;
                  }
              } catch (Exception ex) {
                  log.error("Unexpected error on attempt {}", attempt, ex);
                  break;
              }
          }

          // All attempts failed or timed out
          return "";
      }
 
}
+15 −0
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ import org.etsi.osl.tmf.so641.model.ServiceOrder;
import org.etsi.osl.tmf.so641.model.ServiceOrderCreate;
import org.etsi.osl.tmf.so641.model.ServiceOrderItemRelationship;
import org.etsi.osl.tmf.so641.model.ServiceOrderStateType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatusCode;
@@ -1157,6 +1158,18 @@ public abstract class LcmBaseExecutor {
		return "";
	}
	
	public String askAgent(String agentName,String payload, String defaultText, Integer timeOut) {	  
	  ChatClient chatClient = this.vars.getServiceOrderManager().getChatClient(agentName);
	   if ( chatClient !=null ) {
	     if (timeOut == null) {
	       timeOut = 60000;
	     }
	     return chatClient.ask(agentName, payload, defaultText, timeOut);
	   }else {
	     return defaultText;
	   }
	}

	static <T> T toJsonObj(String content, TypeReference<T> typeReference) throws IOException {
		ObjectMapper mapper = new ObjectMapper();
		mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
@@ -1168,4 +1181,6 @@ public abstract class LcmBaseExecutor {
		mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
		return mapper.writeValueAsString(object);
	}
	
	
}
+9 −0
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import org.apache.commons.logging.LogFactory;
import org.etsi.osl.model.nfv.DeploymentDescriptor;
import org.etsi.osl.model.nfv.NetworkServiceDescriptor;
import org.etsi.osl.model.nfv.ScaleDescriptor;
import org.etsi.osl.osom.lcm.ChatClient;
import org.etsi.osl.osom.serviceactions.NSActionRequestPayload;
import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJob;
import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJobFVO;
@@ -204,6 +205,9 @@ public class ServiceOrderManager {
	@Value("${PM_MEASUREMENT_COLLECTION_JOB_UPDATE}")
	private String PM_MEASUREMENT_COLLECTION_JOB_UPDATE;

    @Autowired
	private ChatClient chatClient;

    
	@Transactional
	public void processOrder(ServiceOrder serviceOrder) {
@@ -1204,6 +1208,11 @@ public class ServiceOrderManager {
		return null;
	}

  public ChatClient getChatClient(String agentName) {
    
    return chatClient;
  }

  


+7 −4
Original line number Diff line number Diff line
@@ -67,7 +67,10 @@ public class AutomaticallyHandleAction implements JavaDelegate {
	            ResourceRef rr = aService.getSupportingResource().stream().findFirst().get();
	            
	            Resource relatedResource = serviceOrderManager.retrieveResource( rr.getId() );
	            
	            if ( relatedResource == null ) {
	              serviceOrderManager.deleteServiceActionQueueItem( item );     
	              return;
	            }
	            ResourceUpdate aResourceUpdate = resourceToResourceUpdate(relatedResource);
	            
	            //pass characteristic values from services to resource
@@ -118,7 +121,7 @@ public class AutomaticallyHandleAction implements JavaDelegate {
	                    
	                  }            
	                } else {

	                  //metric deletion arrives here also
	                  response = createNewResourceDeleteRequest(aService, 
	                        relatedResource, aResourceUpdate,  
	                        serviceOrderID );  
@@ -156,11 +159,11 @@ public class AutomaticallyHandleAction implements JavaDelegate {
	
	
    private ResourceUpdate resourceToResourceUpdate(Resource source) {
      ResourceUpdate resourceUpdate = new ResourceUpdate();
      if ( source == null ) {
          return null;
          return resourceUpdate;
      }

      ResourceUpdate resourceUpdate = new ResourceUpdate();

      resourceUpdate.setCategory( source.getCategory() );
      resourceUpdate.setDescription( source.getDescription() );