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

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

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

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

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

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

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

    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);

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

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

    표 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);

    보낸 사람 하위 플로우

    스크립트 대신 보낸 사람 하위 플로우가 제공자에게 메시지를 보내는 프로세스를 처리합니다. 메시지는 하위 플로우의 일부로 문자열에 포함됩니다 payload . 발신자에는 및 service_urlorigin_service_url가 있고 아웃바운드 URL은 제공자에 따라 다릅니다. 예를 들어 MS Teams를 통해 전송된 메시지는 다음 값을 tenant_id사용합니다. 가상 에이전트가 옵션이 포함된 메시지를 보내면 수신자는 옵션을 선택합니다. 하위 플로우는 선택에 따라 메시지 표시를 업데이트하고 옵션을 제거합니다. 사용자가 선택한 옵션에 따라 대화가 계속됩니다. 는 가상 에이전트 외부 요청을 보내지 않고 메시지 처리를 계속할 수 있습니다. 하위 플로우를 생성할 때 작업이 없습니다. 하위 플로우 내에서 작업을 호출합니다. 하위 플로우에 대한 자세한 내용은 다음 문서를 참조하십시오 Subflows and actions.

    상황별 작업 스크립트

    상황별 작업 스크립트는 주제 내에서 가상 에이전트에이전트를 입력하는 등의 특수 키워드 작업을 수행하여 라이브 에이전트에 즉시 전달됩니다.

    표 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(문자열) - 수신된 본문입니다.
    • 상태 코드(정수) - 수신된 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(String) - 보낼 제공자에 적합한 구성요소 메시지입니다.

    표 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) - 원래 "질문"을 포함하는 요청자에게 전송된 마지막 서식 있는 컨트롤입니다.

    출력.

    결과(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);