← Files vox.aiARCHIVED FILE

references/flow-ars-skeleton.json

11.7 KB · Nov 7, 2026 · 06:13 UTC

↓ Download file

{
  "nodes": [
    {"id": "begin", "type": "begin", "position": {"x": 0, "y": 0}, "data": {"name": "시작", "first_line_type": "aiFirst"}},
    {"id": "gate_hours", "type": "condition", "position": {"x": 300, "y": 0}, "data": {"name": "영업시간 판단"}},
    {"id": "main_open", "type": "conversation", "position": {"x": 600, "y": -150}, "data": {"name": "M0 메인(영업 중)", "prompt_type": "static", "is_allow_interruption": true, "static_sentence": "예시가구 중앙점입니다. 영업시간은 일 번, 오시는 길은 이 번, 직원 연결은 구 번을 눌러 주세요. 다시 들으시려면 영 번, 처음으로는 별표를 눌러 주세요."}},
    {"id": "main_closed", "type": "conversation", "position": {"x": 600, "y": 150}, "data": {"name": "M0 메인(영업시간 외)", "prompt_type": "static", "is_allow_interruption": true, "static_sentence": "예시가구 중앙점입니다. 지금은 영업시간이 아닙니다. 영업시간은 일 번, 오시는 길은 이 번을 눌러 주세요. 상담은 영업시간에 다시 전화 주세요."}},
    {"id": "classify", "type": "extraction", "position": {"x": 900, "y": 0}, "data": {"name": "메뉴 분류", "is_skip_user_response": true, "tool_call_sound": "none", "extraction_configuration": {"extraction_prompt": "직전 메뉴: {{last_menu}} / 직전 미분류 횟수: {{unknown_count}}\n가장 최근 USER 입력 하나만 분류해 requested_menu, last_menu, unknown_count를 모두 출력한다. 코드는 MAIN, HOURS, DIRECTIONS, TRANSFER, UNKNOWN_REPROMPT, END만 쓴다.\n입력이 <entered_dtmf_digits>N</entered_dtmf_digits> 또는 '[DTMF] N'이면 키패드 입력이다. 9=TRANSFER, *=MAIN, 0=last_menu 그대로. MAIN 문맥에서 1=HOURS, 2=DIRECTIONS. 그 밖의 키나 여러 자리는 MAIN.\n음성은 뜻으로 분류한다(영업시간=HOURS, 위치·주소=DIRECTIONS, 직원·상담원=TRANSFER, 처음으로=MAIN, 다시 들려줘=last_menu, 명확한 종료=END). 사람이 말한 '일 번'은 같은 키로 본다.\n분류 불가 음성: unknown_count가 0이면 UNKNOWN_REPROMPT와 unknown_count=1, 1 이상이면 TRANSFER와 unknown_count=0. 그 외 입력은 unknown_count=0.\nrequested_menu가 MAIN/HOURS/DIRECTIONS이면 last_menu도 같은 값, 아니면 last_menu는 유지한다.", "variables": [{"variable_name": "requested_menu", "variable_type": "string", "variable_description": "MAIN/HOURS/DIRECTIONS/TRANSFER/UNKNOWN_REPROMPT/END 중 하나"}, {"variable_name": "last_menu", "variable_type": "string", "variable_description": "마지막으로 실제 안내한 메뉴 코드"}, {"variable_name": "unknown_count", "variable_type": "number", "variable_description": "연속 미분류 음성 횟수"}]}}},
    {"id": "route", "type": "condition", "position": {"x": 1200, "y": 0}, "data": {"name": "메뉴 라우터"}},
    {"id": "m1_hours", "type": "conversation", "position": {"x": 1500, "y": -300}, "data": {"name": "M1 영업시간", "prompt_type": "static", "is_allow_interruption": true, "static_sentence": "영업시간은 오전 열 시부터 오후 여섯 시까지이며, 매주 일요일은 쉽니다. 다시 들으시려면 영 번, 직원 연결은 구 번, 처음으로는 별표를 눌러 주세요."}},
    {"id": "sms_dir", "type": "sendSms", "position": {"x": 1500, "y": -100}, "data": {"name": "오시는 길 문자", "response_mode": "fire_and_forget", "prompt_type": "static", "tool_call_sound": "none", "static_title": "예시가구 중앙점 오시는 길", "static_sentence": "[예시가구 중앙점] 오시는 길\n예시시 중앙로 123, 2층"}},
    {"id": "m2_dir", "type": "conversation", "position": {"x": 1800, "y": -100}, "data": {"name": "M2 오시는 길", "prompt_type": "static", "is_allow_interruption": true, "static_sentence": "매장은 예시시 중앙로 백이십삼, 이 층에 있습니다. 주소를 문자로 보내 드리겠습니다. 다시 들으시려면 영 번, 직원 연결은 구 번, 처음으로는 별표를 눌러 주세요."}},
    {"id": "gate_transfer", "type": "condition", "position": {"x": 1500, "y": 100}, "data": {"name": "직원 연결 시간 판단"}},
    {"id": "transfer", "type": "transferCall", "position": {"x": 1800, "y": 100}, "data": {"name": "M9 직원 연결", "prompt_type": "static", "static_sentence": "직원을 연결해 드리겠습니다. 잠시만 기다려 주세요.", "transfer_type": "warm", "transfer_message_type": "static", "warm_transfer_static_sentence": "예시가구 ARS에서 고객님이 직원 연결을 요청하셨습니다.", "transfer_configuration": {"transfer_type": "phone", "transfer_to": "+821000000000"}}},
    {"id": "sms_missed", "type": "sendSms", "position": {"x": 2100, "y": 100}, "data": {"name": "부재중 문자", "response_mode": "wait", "prompt_type": "static", "tool_call_sound": "none", "static_title": "예시가구 부재중 안내", "static_sentence": "[예시가구 중앙점] 지금은 통화가 어려워 전화를 받지 못했습니다. 이 번호로 문의를 남겨 주시면 순서대로 연락드리겠습니다."}},
    {"id": "end_missed", "type": "endCall", "position": {"x": 2400, "y": 100}, "data": {"name": "부재중 종료", "prompt_type": "static", "static_sentence": "지금은 직원 연결이 어려워 문자로 안내를 보내 드렸습니다. 이용해 주셔서 감사합니다."}},
    {"id": "reprompt", "type": "conversation", "position": {"x": 1500, "y": 300}, "data": {"name": "미분류 되묻기", "prompt_type": "static", "is_allow_interruption": true, "static_sentence": "죄송합니다. 원하시는 내용을 한 번 더 말씀해 주시거나, 처음으로 돌아가시려면 별표를 눌러 주세요."}},
    {"id": "end", "type": "endCall", "position": {"x": 1500, "y": 500}, "data": {"name": "통화 종료", "prompt_type": "static", "static_sentence": "이용해 주셔서 감사합니다."}}
  ],
  "edges": [
    {"id": "e_begin", "source": "begin", "target": "gate_hours", "condition": {"type": "fallback"}},
    {"id": "e_gh_closed_day", "source": "gate_hours", "target": "main_closed", "condition": {"type": "logic", "operator": "||", "equations": [{"left": "current_time", "operator": "contains", "right": "(Sun)"}, {"left": "current_time", "operator": "contains", "right": "2026-12-25 "}]}},
    {"id": "e_gh_open", "source": "gate_hours", "target": "main_open", "condition": {"type": "logic", "operator": "||", "equations": [{"left": "current_time", "operator": "contains", "right": " 10:"}, {"left": "current_time", "operator": "contains", "right": " 11:"}, {"left": "current_time", "operator": "contains", "right": " 12:"}, {"left": "current_time", "operator": "contains", "right": " 13:"}, {"left": "current_time", "operator": "contains", "right": " 14:"}, {"left": "current_time", "operator": "contains", "right": " 15:"}, {"left": "current_time", "operator": "contains", "right": " 16:"}, {"left": "current_time", "operator": "contains", "right": " 17:"}]}},
    {"id": "e_gh_else", "source": "gate_hours", "target": "main_closed", "condition": {"type": "fallback"}},
    {"id": "e_mo_replay", "source": "main_open", "target": "main_open", "condition": {"type": "ai", "prompt": "고객이 키패드로 0을 눌렀다(<entered_dtmf_digits>0</entered_dtmf_digits> 또는 [DTMF] 0)."}},
    {"id": "e_mo_input", "source": "main_open", "target": "classify", "condition": {"type": "ai", "prompt": "그 밖의 모든 입력: 0 이외의 키를 눌렀거나 무엇이든 말했다."}},
    {"id": "e_mc_replay", "source": "main_closed", "target": "main_closed", "condition": {"type": "ai", "prompt": "고객이 키패드로 0을 눌렀다(<entered_dtmf_digits>0</entered_dtmf_digits> 또는 [DTMF] 0)."}},
    {"id": "e_mc_input", "source": "main_closed", "target": "classify", "condition": {"type": "ai", "prompt": "그 밖의 모든 입력: 0 이외의 키를 눌렀거나 무엇이든 말했다."}},
    {"id": "e_classify", "source": "classify", "target": "route", "condition": {"type": "ai", "prompt": "메뉴 분류를 마쳤다."}, "skip_user_response": true},
    {"id": "e_r_main", "source": "route", "target": "gate_hours", "condition": {"type": "logic", "operator": "&&", "equations": [{"left": "requested_menu", "operator": "equals", "right": "MAIN"}]}},
    {"id": "e_r_hours", "source": "route", "target": "m1_hours", "condition": {"type": "logic", "operator": "&&", "equations": [{"left": "requested_menu", "operator": "equals", "right": "HOURS"}]}},
    {"id": "e_r_dir", "source": "route", "target": "sms_dir", "condition": {"type": "logic", "operator": "&&", "equations": [{"left": "requested_menu", "operator": "equals", "right": "DIRECTIONS"}]}},
    {"id": "e_r_transfer", "source": "route", "target": "gate_transfer", "condition": {"type": "logic", "operator": "&&", "equations": [{"left": "requested_menu", "operator": "equals", "right": "TRANSFER"}]}},
    {"id": "e_r_unknown", "source": "route", "target": "reprompt", "condition": {"type": "logic", "operator": "&&", "equations": [{"left": "requested_menu", "operator": "equals", "right": "UNKNOWN_REPROMPT"}]}},
    {"id": "e_r_end", "source": "route", "target": "end", "condition": {"type": "logic", "operator": "&&", "equations": [{"left": "requested_menu", "operator": "equals", "right": "END"}]}},
    {"id": "e_r_else", "source": "route", "target": "gate_hours", "condition": {"type": "fallback"}},
    {"id": "e_m1_replay", "source": "m1_hours", "target": "m1_hours", "condition": {"type": "ai", "prompt": "고객이 키패드로 0을 눌렀다(<entered_dtmf_digits>0</entered_dtmf_digits> 또는 [DTMF] 0)."}},
    {"id": "e_m1_input", "source": "m1_hours", "target": "classify", "condition": {"type": "ai", "prompt": "그 밖의 모든 입력: 0 이외의 키를 눌렀거나 무엇이든 말했다."}},
    {"id": "e_sd_ok", "source": "sms_dir", "target": "m2_dir", "condition": {"type": "ai", "prompt": "요청 성공 시"}},
    {"id": "e_sd_fail", "source": "sms_dir", "target": "m2_dir", "condition": {"type": "fallback"}},
    {"id": "e_m2_replay", "source": "m2_dir", "target": "m2_dir", "condition": {"type": "ai", "prompt": "고객이 키패드로 0을 눌렀다(<entered_dtmf_digits>0</entered_dtmf_digits> 또는 [DTMF] 0)."}},
    {"id": "e_m2_input", "source": "m2_dir", "target": "classify", "condition": {"type": "ai", "prompt": "그 밖의 모든 입력: 0 이외의 키를 눌렀거나 무엇이든 말했다."}},
    {"id": "e_gt_closed_day", "source": "gate_transfer", "target": "main_closed", "condition": {"type": "logic", "operator": "||", "equations": [{"left": "current_time", "operator": "contains", "right": "(Sun)"}, {"left": "current_time", "operator": "contains", "right": "2026-12-25 "}]}},
    {"id": "e_gt_open", "source": "gate_transfer", "target": "transfer", "condition": {"type": "logic", "operator": "||", "equations": [{"left": "current_time", "operator": "contains", "right": " 10:"}, {"left": "current_time", "operator": "contains", "right": " 11:"}, {"left": "current_time", "operator": "contains", "right": " 12:"}, {"left": "current_time", "operator": "contains", "right": " 13:"}, {"left": "current_time", "operator": "contains", "right": " 14:"}, {"left": "current_time", "operator": "contains", "right": " 15:"}, {"left": "current_time", "operator": "contains", "right": " 16:"}, {"left": "current_time", "operator": "contains", "right": " 17:"}]}},
    {"id": "e_gt_else", "source": "gate_transfer", "target": "main_closed", "condition": {"type": "fallback"}},
    {"id": "e_tr_fail", "source": "transfer", "target": "sms_missed", "condition": {"type": "fallback"}},
    {"id": "e_sm_ok", "source": "sms_missed", "target": "end_missed", "condition": {"type": "ai", "prompt": "요청 성공 시"}},
    {"id": "e_sm_fail", "source": "sms_missed", "target": "end_missed", "condition": {"type": "fallback"}},
    {"id": "e_rp_input", "source": "reprompt", "target": "classify", "condition": {"type": "ai", "prompt": "고객이 무엇이든 말하거나 키를 눌렀다."}}
  ]
}

SHA-256: 3d4a5baadc694bd78cfaa3f7e0831d19099fadbf51feea77e6a5f37e404c6c82