---
sourceDocument: Xanadu 대화형 인터페이스
sourceDocumentLink: https://servicenow-prod.fluidtopics.net/r/ko-KR/xanadu/conversational-interfaces

 Release :

    - xanadu

ft:locale :

    - ko-KR

ft:publication_title :

    - Xanadu 대화형 인터페이스

ft:clusterId :

    - convint

bundleId :

    - convint

workflow :

    - Platform


---

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

# 가상 에이전트 작업 스크립트 {#ariaid-title1}

* 릴리스 버전: Xanadu
* 
* 업데이트 날짜 2024년 08월 01일
* 
* ![](https://www.servicenow.com/docs/portal-asset/ico-clock) 소요 시간: 18분

사용자 데이터를 VACS에 전달하고, 변환을 적용하고, 응답을 채팅 인터페이스 엔드포인트로 다시 전송하려면 필수 워크플로우 스튜디오 작업 및 하위 플로우 스크립트 세트를 작성해야 합니다.

## 제공자 및 인바운드/아웃바운드 스크립트 {#va-action-scripts__section_c5w_qcb_xlb}

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

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

| 스크립트 이름 | 목적 | 필수(Y/N) |
|-|-|-|
| 제공자 속성 | 제공자 인증 토큰, 사용자 식별자, 사용자 입력 및 컨텍스트 변수를 포함합니다. | Y |
| 보낸 사람 작업 | 요청을 번들로 묶고 또는 Integration Hub를 통해 워크플로우 스튜디오 비동기적으로 응답을 보냅니다. | Y |
| 응답 프로세서 | 아웃바운드 메시지에 대해 받은 응답을 기반으로 하는 플랫폼 작업(예: 메시지 상태 업데이트)을 수행합니다. | N |
| 상황별 작업 | 상황별 작업을 지원합니다. | N |
| 계정 작업 연결 | 계정 연결의 성공 여부에 대한 콜백을 제공합니다. | N |
| 아웃바운드 변환기 | 채팅 서버의 지원되는 컨트롤을 채팅 인터페이스별 렌더링으로 변환합니다. | Y |
| 인바운드 변환기 | 옵션입니다. 기본 리치 컨트롤이 채팅 제공자에게 적용되는 경우 이를 사용할 수 있습니다. 각 입력 컨트롤에 대해 별도의 인바운드 변환을 제공할 필요가 없습니다. 기본 동작이 작동하지 않는 경우 특정 가상 에이전트 서버 컨트롤에 대한 고유한 인바운드 변환으로 기본값을 재정의할 수 있습니다. | Y |
[표 1. 스크립트]

{#va-action-scripts__table_qnf_xdb_xlb}

## 제공자 속성 동작 스크립트 {#va-action-scripts__section_jqc_y2b_xlb}

제공자 속성 동작 스크립트는 들어오는 메시지에서 데이터를 추출합니다. 스크립트는 대화형 사용자 지정 채팅 통합 프로토콜에 대해 알고 있으며 수신 메시지의 내용, 보낸 사람의 사용자 ID 및 선택적 인증 토큰을 출력합니다.  
주:  
공급자 속성 작업 스크립트에 상황별 작업이 있는 경우 사용자 입력(상황별 작업과 일치)이 대본에 포함되도록 스크립트에 request_context.contextual_action 및 request_context.typed_value가 모두 있어야 합니다. request_context.typed_value를 설정하지 않으면 해당 메시지 내용이 대화 내용에 표시되지 않습니다.
{#va-action-scripts__table_dtk_5fb_xlb__entry__2}

| 입력 | 출력 |
|-|-|
| * 헤더(JSON) - 요청 헤더 * 페이로드(JSON) - 요청 본문 {#va-action-scripts__ul_gkf_dgb_xlb} | * 토큰(문자열) - 인증 토큰입니다. * 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"};)". {#va-action-scripts__ul_sqy_pgb_xlb} {#va-action-scripts__ul_rgm_hgb_xlb} |
[표 2. 제공자 속성 작업 스크립트 입력/출력]

{#va-action-scripts__table_dtk_5fb_xlb}  
그림 1. 예: 워크플로우 스튜디오 헤더 및 페이로드를 포함한 제공자 속성 작업 스크립트 입력  
그림 2. 예: 워크플로우 스튜디오 토큰, 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에서 해제됨, 보낸 사람 하위 플로우 참조) {#va-action-scripts__section_vwt_ljb_xlb}

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

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

{#va-action-scripts__table_tb3_qjb_xlb}

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

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

## 보낸 사람 하위 플로우 스크립트 {#va-action-scripts__section_y2f_3m4_h4b}

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

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

## 상황별 동작 스크립트 {#va-action-scripts__section_avl_hkb_xlb}

상황별 동작 스크립트는 주제 내에서 가상 에이전트<kbd class="ph userinput">에이전트</kbd> 입력과 같은 특수 키워드 동작을 수행하여 라이브 에이전트에 즉시 전달되도록 합니다.
{#va-action-scripts__table_bvl_hkb_xlb__entry__2}

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

{#va-action-scripts__table_bvl_hkb_xlb}

예: 상황별 동작 스크립트

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

## 계정 작업 스크립트 연결 {#va-action-scripts__section_mvv_skb_xlb}

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

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

{#va-action-scripts__table_nvv_skb_xlb}

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

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

## 응답 프로세서 작업 스크립트 {#va-action-scripts__section_lwm_dlb_xlb}

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

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

{#va-action-scripts__table_mwm_dlb_xlb}

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

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

## 아웃바운드 변환기 스크립트 {#va-action-scripts__section_sjb_qlb_xlb}

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

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

출력.

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

| 아웃바운드 변환기 이름 | 스크립트 예시 |
|-|-|
| 가상 에이전트 - 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); |
[표 7. 예: 아웃바운드 변환기 스크립트]

{#va-action-scripts__table_tjb_qlb_xlb}

## 인바운드 변환기 스크립트 {#va-action-scripts__section_j2g_cmb_xlb}

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

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

출력.  
result(JSON) - 서버에서 예상한 결과입니다 가상 에이전트 . 요청자가 주제 선택기에 응답하는 경우 주제의 sys_id입니다. 요청자가 입력 텍스트에 응답하는 경우 이는 텍스트 응답입니다.

* 값 - sys_id 또는 텍스트 값입니다.
* search_text - 요청자가 예상치 못한 것을 선택한 경우 사용되는 텍스트입니다. 예를 들어, 사용자가 주제 선택기 구성요소에 대한 응답으로 "이 옵션 중 어느 것도 내가 원하는 것과 일치하지 않습니다"와 같이 NLU가 지원할 수 있는 항목을 입력했습니다.
{#va-action-scripts__ul_dz1_bg4_xlb}
{#va-action-scripts__table_k2g_cmb_xlb__entry__2}

| 인바운드 변환기 이름 | 스크립트 예시 |
|-|-|
| 가상 에이전트 - 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); |
[표 8. 예: 인바운드 변환기 스크립트]

{#va-action-scripts__table_k2g_cmb_xlb}

