가상 에이전트 작업 스크립트

  • 릴리스 버전: Xanadu
  • 업데이트 날짜 2024년 08월 01일
  • 읽기18분
  • 사용자 데이터를 VACS에 전달하고, 변환을 적용하고, 응답을 채팅 인터페이스 엔드포인트로 다시 전송하려면 필수 워크플로우 스튜디오 작업 및 하위 플로우 스크립트 세트를 작성해야 합니다.

    제공자 및 인바운드/아웃바운드 스크립트

    Twilio와 같은 제공자는 채팅 기능을 제공합니다. 사용자 작업 스크립트는 제공자 작업은 물론 챗봇 또는 사용자 지정 대화에 대한 인바운드 및 아웃바운드 변환기 작업에 대한 대화형 사용자 지정 채팅 통합 구성을 수행합니다. 각 스크립트의 예가 제공됩니다. 여기에는 각 스크립트가 수행하는 작업에 대한 설명과 작업 입력 및 작업 출력이 포함됩니다. 스크립트 JSON의 예도 볼 수 있습니다.

    서버 및 클라이언트 메시지를 변환하기 위해 이러한 스크립트를 작성하는 데 사용합니다 워크플로우 스튜디오 . 제공자, 발신자 및 인바운드/아웃바운드 변환기 스크립트가 필요합니다. 추가 스크립트를 사용하여 채팅에 더 많은 기능을 추가할 수 있습니다.

    표 1. 스크립트
    스크립트 이름 목적 필수(Y/N)
    제공자 속성 제공자 인증 토큰, 사용자 식별자, 사용자 입력 및 컨텍스트 변수를 포함합니다. Y
    보낸 사람 작업

    요청을 번들로 묶고 또는 Integration Hub를 통해 워크플로우 스튜디오 비동기적으로 응답을 보냅니다.

    Y
    응답 프로세서 아웃바운드 메시지에 대해 받은 응답을 기반으로 하는 플랫폼 작업(예: 메시지 상태 업데이트)을 수행합니다. N
    상황별 작업 상황별 작업을 지원합니다. N
    계정 작업 연결 계정 연결의 성공 여부에 대한 콜백을 제공합니다. N
    아웃바운드 변환기 채팅 서버의 지원되는 컨트롤을 채팅 인터페이스별 렌더링으로 변환합니다. Y
    인바운드 변환기 옵션입니다. 기본 리치 컨트롤이 채팅 제공자에게 적용되는 경우 이를 사용할 수 있습니다. 각 입력 컨트롤에 대해 별도의 인바운드 변환을 제공할 필요가 없습니다. 기본 동작이 작동하지 않는 경우 특정 가상 에이전트 서버 컨트롤에 대한 고유한 인바운드 변환으로 기본값을 재정의할 수 있습니다. Y

    제공자 속성 동작 스크립트

    제공자 속성 동작 스크립트는 들어오는 메시지에서 데이터를 추출합니다. 스크립트는 대화형 사용자 지정 채팅 통합 프로토콜에 대해 알고 있으며 수신 메시지의 내용, 보낸 사람의 사용자 ID 및 선택적 인증 토큰을 출력합니다.
    주:
    공급자 속성 작업 스크립트에 상황별 작업이 있는 경우 사용자 입력(상황별 작업과 일치)이 대본에 포함되도록 스크립트에 request_context.contextual_action 및 request_context.typed_value가 모두 있어야 합니다. request_context.typed_value를 설정하지 않으면 해당 메시지 내용이 대화 내용에 표시되지 않습니다.
    표 2. 제공자 속성 작업 스크립트 입력/출력
    입력 출력
    • 헤더(JSON) - 요청 헤더
    • 페이로드(JSON) - 요청 본문
    • 토큰(문자열) - 인증 토큰입니다.
    • provider_user_id(문자열) - 보낸 사람의 이름(예: Slack 메시지의 사용자 이름)입니다.
    • request_context(JSON) - 실제 컨텐츠가 수신되었습니다.
      • typed_value - 질문에 대한 답변과 같은 입력된 컨텐츠입니다.
      • attachment_value.url - 첨부 파일의 URL입니다.
      • attachment_value.content_type - 첨부 파일의 콘텐츠 유형입니다.
      • attachment_value.name - 첨부 파일의 이름입니다.
      • 상황별 작업 - 수행할 작업입니다(예: END_CONVERSATION, START_CONVERSATION, AGENT). 이 스크립트는 들어오는 메시지를 확인합니다. 인식된 키워드가 있는 경우 outputs.request_context.contextual_action = "END_CONVERSATION";과 같은 작업 중 하나를 설정할 수 있습니다. 프레임워크는 이 키워드를 인식하고 상황별 동작 스크립트를 호출합니다.
      • context_vars - 대화에 전달할 컨텍스트 변수(예: "outputs.request_context.context_vars = {language: "en"};)".
    그림 1. 예: 워크플로우 스튜디오 헤더 및 페이로드를 포함한 제공자 속성 작업 스크립트 입력
    JSON을 사용하도록 설정된 헤더 및 페이로드가 있는 워크플로우 스튜디오 작업 입력입니다.
    그림 2. 예: 워크플로우 스튜디오 토큰, request_context 및 provider_user_id 포함한 제공자 속성 작업 스크립트 출력
    의 워크플로우 스튜디오 작업 출력은 토큰, request_context 및 provider_user_id 값을 지정합니다.

    예: 제공자 속성 작업 스크립트.

    (function execute(inputs, outputs) {
        var headers = (inputs.headers);
        var payload = (inputs.payload);
    
        // check if an authentication token was included. this is optional.
        var smsUtil = new VASMSTwilioUtil();
        outputs.token = JSON.stringify(smsUtil.getToken(headers, payload));
    
        var data = payload.data;
        var request_context = {}; 
        // inspect the actual message. it could be an MMS (attachment) or raw text
        if (data['MediaUrl0']) {
            var attachment_value = {};
            attachment_value.url = data['MediaUrl0'];
            attachment_value.content_type = data['MediaContentType0'];
            attachment_value.name = smsUtil.getFileName(attachment_value.url , attachment_value.content_type);
            request_context.attachment_value = attachment_value;
        } else {
           request_context.typed_value = data['Body'];
        }
    
        // set the mandatory outputs
        outputs.request_context = request_context;
        outputs.provider_user_id = data.From;
    })(inputs, outputs);

    보낸 사람 작업 스크립트(Quebec에서 해제됨, 보낸 사람 하위 플로우 참조)

    보낸 사람 작업 스크립트는 공급자에게 메시지를 보내는 방법을 알고 있습니다. 스크립트는 a 워크플로우 스튜디오 또는 Integration Hub subflow를 비동기식으로 호출해야 합니다. 가상 에이전트 외부 요청을 보내려고 시도하지 않고 메시지를 계속 처리할 수 있습니다.

    표 3. 보낸 사람 작업 스크립트 입력
    입력 출력
    • 결과(JSON) - 보낼 메시지의 배열입니다.
    • 페이로드(JSON) - 요청자로부터 받은 마지막 페이로드입니다.
    • app_inbound_id(문자열) - SMS 케이스의 "보낸 사람" 전화 번호와 같은 보낸 사람의 식별자입니다.
    • channel_user_id(문자열) - SMS 케이스의 "받는 사람" 전화 번호와 같은 수신자의 식별자입니다.
    없음

    예: 보낸 사람 작업 스크립트.

    (function execute(inputs, outputs) {
        var results = inputs.results;
        // transform the inputs to something this custom subflow knows about
        var sendInputs = {
            app_inbound_id : inputs["app_inbound_id"],
            channel_user_id: inputs["channel_user_id"],
            messages: JSON.stringify(results)
        };
    
        // invoke an asynchronous subflow which will send the external request. so this sender script will immediately return,
        // freeing up the chat server thread to do further message processing while putting the external request work on the
        // Workflow Studio/Integration Hub
        sn_fd.FlowAPI.startSubflowQuick('sn_va_sms_twilio.va_sms_twilio_adapter_send_sms', sendInputs);
    })(inputs, outputs);

    보낸 사람 하위 플로우 스크립트

    보낸 사람 하위 플로우 스크립트는 제공자에게 메시지를 보내는 방법을 알고 있습니다. 스크립트는 a 워크플로우 스튜디오 또는 Integration Hub subflow를 비동기식으로 호출해야 합니다. 가상 에이전트 외부 요청을 보내려고 시도하지 않고 메시지를 계속 처리할 수 있습니다. 하위 플로우를 만들 때 하위 플로우 내에서 동작을 호출하는 동작을 갖지 마십시오.

    }else{
      outputs.sendmessage = true;
      messages = inputs.results.results;
      outputs.from = from;
      outputs.to = to;
      outputs.messages = getMessages(messages);
    }

    상황별 동작 스크립트

    상황별 동작 스크립트는 주제 내에서 가상 에이전트에이전트 입력과 같은 특수 키워드 동작을 수행하여 라이브 에이전트에 즉시 전달되도록 합니다.

    표 4. 상황별 동작 스크립트 입력
    입력 출력
    • conversation_id(문자열) - 대화 ID입니다.
    • request_context(JSON) - 수행할 작업이 포함된 제공자 속성 스크립트에서 전달된 요청입니다(예: (END_CONVERSATION, START_CONVERSATION, AGENT).
    없음

    예: 상황별 동작 스크립트

    (function execute(inputs, outputs) {
      var contextual_action = inputs.request_context.contextual_action;
      if (contextual_action === "END_CONVERSATION") {
        sn_cs.VASystemObject.endConversation(inputs.conversation_id);
      } else if (contextual_action === "AGENT") {
        sn_cs.VASystemObject.switchToLiveAgent(inputs.conversation_id);
      } else if (contextual_action === "START_CONVERSATION") {
        sn_cs.VASystemObject.startConversation(inputs.conversation_id);
      }
    })(inputs, outputs);

    계정 작업 스크립트 연결

    링크 계정 작업 스크립트에는 연결하는 사용자의 식별자가 포함되어 있습니다. 스크립트에는 연결된 계정도 포함되어 있습니다.

    표 5. 계정 작업 스크립트 연결 입력
    입력 출력
    • provider_user_id(문자열) - SMS 케이스의 전화 번호와 같이 연결하는 사용자의 식별자입니다.
    • status(문자열) - 성공/실패입니다.
    • user_id(문자열) - 연결된 계정에 대한 ServiceNow user_sys_id입니다.
    없음

    예: 계정 작업 스크립트 연결.

    (function execute(inputs, outputs) {
      
      var richControl = (inputs.rich_control);
      var value = richControl.value;
      outputs.result = richControl.header + ': ' + value.action;
      
    })(inputs, outputs);

    응답 프로세서 작업 스크립트

    응답 프로세서 작업 스크립트는 메시지 보내기 요청에 대한 응답에 따라 특수 작업을 수행합니다. 프레임워크는 이미 기본 메시지 상태 추적을 수행합니다.

    표 6. 응답 프로세서 계정 작업 스크립트 입력
    입력 출력
    • message_id(문자열) - 이 응답과 연결된 sys_cs_message 기록의 식별자입니다.
    • 헤더(JSON) - 수신된 헤더입니다.
    • body(String) - 수신된 본문입니다.
    • 상태 코드(정수) - 수신된 HTTP 상태 코드입니다.
    없음

    예: 응답 프로세서 작업 스크립트.

    (function execute(inputs, outputs) {
        gs.debug("Response from provider: message_id = " + inputs.message_id + ", status_code = " +
          inputs.status_code + ", headers = " + JSON.stringify(inputs.headers) + ", body = " + inputs.body);
    })(inputs, outputs);

    아웃바운드 변환기 스크립트

    아웃바운드 변환기 스크립트는 발신 가상 에이전트 메시지를 대화형 사용자 지정 채팅 통합과 관련된 프로토콜로 변환합니다.

    입력.

    • rich_control(JSON) - 가상 에이전트 변환해야 하는 서버 리치 컨트롤 구성요소입니다.
    • 페이로드(JSON) - 요청자로부터 받은 마지막 응답입니다.

    출력.

    result(문자열) - 보낼 공급자에 적합한 구성 요소 메시지입니다.

    표 7. 예: 아웃바운드 변환기 스크립트
    아웃바운드 변환기 이름 스크립트 예시
    가상 에이전트 - SMS Twilio 어댑터 기본 텍스트 아웃바운드 변환기
    (function execute(inputs, outputs) {
      var rich_control = inputs.rich_control;
      outputs.result = rich_control['label'];
    })(inputs, outputs);
    가상 에이전트 - SMS Twilio 어댑터 기본 링크 아웃바운드 변환기
    (function execute(inputs, outputs) {
      var richControl = (inputs.rich_control);
      var value = richControl.value;
      outputs.result = richControl.header + ': ' + value.action;
    })(inputs, outputs);
    가상 에이전트 - SMS Twilio 어댑터 기본 선택기 아웃바운드 변환기
    (function execute(inputs, outputs) {
      var rich_control = inputs.rich_control;
      var options = rich_control['options'];
      if (options && options.length > 0) {
          var optionsLength = options.length;
          var picker = rich_control['label'] || "";
          for (var x = 0; x < optionsLength; x++) {
              picker += "\n" + (x+1) +  ": " + options[x].label;
          }
      }
      outputs.text_message = picker;
    })(inputs, outputs);
    가상 에이전트 - SMS Twilio 어댑터 기본 멀티링크 아웃바운드 변환기
    (function execute(inputs, outputs) {
      var rich_control = inputs.rich_control;
      var linkResult = rich_control['header'];
      var totalValues = rich_control['values'].length;
      for (var i = 0; i < totalValues; i++) {
        linkResult = linkResult + '\n';
        var linkValue = rich_control['values'][i];
        linkResult = linkResult + '\n' + linkValue['description'] + ': ' + linkValue['action'];
      }
      outputs.result  = linkResult;
    })(inputs, outputs);
    가상 에이전트 - SMS Twilio 어댑터 기본 카드 아웃바운드 변환기
    (function execute(inputs, outputs) {
      var richControl = (inputs.rich_control);
      var data = JSON.parse(richControl.data);    
      var tableTitle = data.title;
      var fields = data.fields;
      var subtitle = data.subtitle;
      var url = data.url;    
      var message = subtitle ? getCardLine(tableTitle, subtitle) : tableTitle + "\n";
      for (var i= 0; i<fields.length; i++) {
         message += getCardLine(fields[i].fieldLabel, fields[i].fieldValue);
      }
      message += url;
      outputs.result = message;
    
      function getCardLine(key, value) {
          if (value == '' || value == null || key == '' || key == null)
              return;
          return key + ": " + value + "\n";
      }
    })(inputs, outputs);

    인바운드 변환기 스크립트

    인바운드 변환기 스크립트는 들어오는 대화형 사용자 지정 채팅 통합 메시지를 인식 가상 에이전트 하는 프로토콜로 변환합니다. 사용자에게 제공되는 리치 컨트롤에 삽입하는 데 필요한 값을 결정합니다.

    입력.

    • request_context(JSON) - 제공자 속성 스크립트에서 전달된 요청입니다.
    • rich_control(JSON) - 원래 "질문"이 포함된 요청자에게 전송된 마지막 서식 있는 컨트롤입니다.

    출력.

    result(JSON) - 서버에서 예상한 결과입니다 가상 에이전트 . 요청자가 주제 선택기에 응답하는 경우 주제의 sys_id입니다. 요청자가 입력 텍스트에 응답하는 경우 이는 텍스트 응답입니다.
    • 값 - sys_id 또는 텍스트 값입니다.
    • search_text - 요청자가 예상치 못한 것을 선택한 경우 사용되는 텍스트입니다. 예를 들어, 사용자가 주제 선택기 구성요소에 대한 응답으로 "이 옵션 중 어느 것도 내가 원하는 것과 일치하지 않습니다"와 같이 NLU가 지원할 수 있는 항목을 입력했습니다.
    표 8. 예: 인바운드 변환기 스크립트
    인바운드 변환기 이름 스크립트 예시
    가상 에이전트 - SMS Twilio 어댑터 기본 텍스트 인바운드 변환기

    목적: 제기된 InputText 질문에 대한 텍스트 응답을 찾습니다.

    (function execute(inputs, outputs) {
      var requestContext = inputs.request_context;
      var richControl = inputs.rich_control;
      var typedValue = requestContext['typed_value'];
      var attachmentValue = requestContext['attachment_value'];
      var smsUtil = new VASMSTwilioUtil();
      var result = {};
      if(richControl['itemType'] == 'image' || richControl['itemType'] == 'file')	{
        if (attachmentValue && attachmentValue.content_type.includes('image')) {
          result.url = attachmentValue.url;
          result.content_type = attachmentValue.content_type;
          result.name = attachmentValue.name;
          result.headers = attachmentValue.headers;
        } else if (typedValue) {
          result.url = typedValue;
          var contentType = smsUtil.getContentType(typedValue);
          if (typeof contentType === 'undefined')
            gs.error('Please enter a valid image link. Inbound image link: {0}', typedValue);
          else
            result.content_type = contentType;
        } else {
          gs.error('Please upload an image or enter a valid image link.');
        }
      }
      result['value'] = typedValue;
      result['search_text'] = '';
      outputs.result = result;
    })(inputs, outputs);
    가상 에이전트 - SMS Twilio 어댑터 기본 선택기 인바운드 변환기

    목적: 사용자가 이 선택기 질문에 대해 선택한 옵션의 sys_id 찾습니다. 이 스크립트는 아웃바운드 변환기와 동일한 알고리즘을 사용합니다. 옵션을 선택하지 않고 사용자가 대신 입력한 경우 이 인스턴스에서 사용하도록 설정된 경우 "search_text"이 설정되고 NLU에 공급됩니다.

    (function execute(inputs, outputs) {
      var request_context = inputs.request_context;
      var rich_control = inputs.rich_control;
      var selectedValue = request_context["typed_value"];
      var result = {};
      result["value"] = "";
      result["search_text"] = "";
      if (rich_control['options']) {
        var options = rich_control['options'];
        var optionsLength = options.length;
        selectedValue === Number(selectedValue)
        if (selectedValue > 0 && selectedValue <= optionsLength) {
            var selectedOption = options[selectedValue - 1];
            result["value"] = selectedOption.value;
        } else {
            result["search_text"] = request_context["typed_value"];
        }
      }
      outputs.result = result;
    })(inputs, outputs);