{
  "tello_export": "1.2",
  "kind": "scenario_bundle",
  "exported_at": "2026-09-15T00:00:00.000Z",
  "scenario": {
    "name": "도시가스 고객센터",
    "keywords": [
      "도시가스",
      "가스 요금",
      "가스비",
      "전입 신청",
      "자가검침",
      "고객센터"
    ],
    "flow_config": {
      "$schema": "tello-scenario-v1",
      "meta": {
        "name": "도시가스 고객센터",
        "trigger_description": "도시가스 요금 조회, 전입 신청, 자가검침, 상담원 연결 중 하나를 원할 때"
      },
      "nodes": [
        {
          "id": "start",
          "type": "initial",
          "data": {
            "task_messages": [
              {
                "role": "system",
                "content": "시작 노드입니다. 안내 문장(\"도시가스 고객센터입니다\")은 이미 자동으로 재생됐으니 다시 말하지 마세요. 고객이 이 용건을 원하면 아무 말 없이 곧바로 open_menu을 호출하세요. 다음 단계 안내는 자동으로 나옵니다. 다른 용건이면 짧게 답한 뒤 이 용건을 도와드릴지 물어보세요."
              }
            ],
            "functions": [
              {
                "name": "open_menu",
                "description": "고객이 도시가스 요금·전입·검침·상담원 연결 등 고객센터 용건을 말한 경우",
                "properties": {},
                "required": [],
                "next_node_id": "menu"
              }
            ],
            "respond_immediately": true,
            "pre_actions": [
              {
                "type": "tts_say",
                "text": "도시가스 고객센터입니다."
              }
            ]
          }
        },
        {
          "id": "menu",
          "type": "node",
          "data": {
            "task_messages": [
              {
                "role": "system",
                "content": "키패드 메뉴 안내 멘트는 자동으로 재생되니 같은 안내를 다시 말하지 마세요. 고객이 번호를 누르면 자동으로 갈래가 정해집니다. 고객이 번호 대신 말로 용건을 말하면 알맞은 route 함수를 호출하세요."
              }
            ],
            "functions": [
              {
                "name": "route_bill",
                "description": "요금·가스비·미납 금액을 알고 싶은 경우(1번)",
                "properties": {},
                "required": [],
                "next_node_id": "bill_name"
              },
              {
                "name": "route_move",
                "description": "이사로 새집에서 가스를 쓰려고 전입 신청을 하려는 경우(2번)",
                "properties": {},
                "required": [],
                "next_node_id": "move_info"
              },
              {
                "name": "route_reading",
                "description": "계량기 지침을 직접 알려주는 자가검침을 하려는 경우(3번)",
                "properties": {},
                "required": [],
                "next_node_id": "reading_no"
              },
              {
                "name": "route_agent",
                "description": "상담원 연결을 원하는 경우(0번)",
                "properties": {},
                "required": [],
                "next_node_id": "agent"
              }
            ],
            "dtmf": {
              "menu": {
                "1": "route_bill",
                "2": "route_move",
                "3": "route_reading",
                "0": "route_agent"
              },
              "prompt": "요금 조회는 1번, 전입 신청은 2번, 자가검침 등록은 3번, 상담원 연결은 0번을 눌러주세요.",
              "timeout_sec": 8,
              "max_retries": 2
            },
            "barge_in": false
          }
        },
        {
          "id": "bill_name",
          "type": "node",
          "data": {
            "task_messages": [
              {
                "role": "system",
                "content": "고객에게 \"요금 조회를 위해 고객님 성함을 말씀해 주세요.\"라고 물어보세요. 고객이 정보를 일부만 말하거나 나눠 말하면 이미 받은 부분은 그대로 두고 빠진 부분만 이어서 물어보세요. 고객이 값을 말하기 전에는 수집 함수를 부르지 마세요."
              }
            ],
            "functions": [
              {
                "name": "collect_customer_name",
                "description": "고객이 이름을 말하면 수집",
                "properties": {
                  "customer_name": {
                    "type": "string",
                    "description": "고객 이름"
                  }
                },
                "required": [
                  "customer_name"
                ],
                "next_node_id": "bill_phone"
              }
            ]
          }
        },
        {
          "id": "bill_phone",
          "type": "node",
          "data": {
            "task_messages": [
              {
                "role": "system",
                "content": "키패드 입력 안내 멘트는 자동으로 재생되니 같은 안내를 다시 말하지 마세요. 고객이 키패드로 누르면 자동으로 수집됩니다. 고객이 번호를 말로 불러주면 숫자만 모아 수집 함수를 호출하세요. 고객이 정보를 일부만 말하거나 나눠 말하면 이미 받은 부분은 그대로 두고 빠진 부분만 이어서 물어보세요. 고객이 값을 말하기 전에는 수집 함수를 부르지 마세요."
              }
            ],
            "functions": [
              {
                "name": "collect_phone",
                "description": "고객이 휴대폰 번호를 입력하거나 말하면 수집",
                "properties": {
                  "phone": {
                    "type": "string",
                    "description": "고객 휴대폰 번호. 숫자만"
                  }
                },
                "required": [
                  "phone"
                ],
                "next_node_id": "bill_lookup"
              }
            ],
            "dtmf": {
              "function": "collect_phone",
              "param": "phone",
              "prompt": "휴대폰 번호를 누르신 후 우물 정 자를 눌러 주세요. 다시 입력하시려면 별표를 눌러 주세요.",
              "min_digits": 10,
              "max_digits": 11,
              "terminator": "#",
              "timeout_sec": 6,
              "max_retries": 2,
              "readback": "입력하신 번호 {value} 맞으신가요?"
            }
          }
        },
        {
          "id": "bill_lookup",
          "type": "node",
          "data": {
            "task_messages": [
              {
                "role": "system",
                "content": "수집된 정보로 연결된 API를 호출하세요."
              }
            ],
            "functions": [
              {
                "name": "lookup_bill",
                "description": "수집 완료된 파라미터로 연결 Tool 실행",
                "properties": {},
                "required": [],
                "call_tool": true,
                "tool_id": 1,
                "error_text": "죄송합니다, 요금 조회 중 문제가 발생했습니다. 성함과 번호를 다시 한번 확인해 주시겠어요?",
                "next_node_id": "end"
              }
            ],
            "pre_actions": [
              {
                "type": "tts_say",
                "text": "요금을 조회하고 있습니다. 잠시만 기다려주세요."
              }
            ]
          }
        },
        {
          "id": "move_info",
          "type": "node",
          "data": {
            "task_messages": [
              {
                "role": "system",
                "content": "전입 신청에 필요한 신청인 성함, 휴대폰 번호, 새 주소, 이사 희망일을 차례로 물어보세요. 이사 희망일은 YYYY-MM-DD 형식으로 정리해 수집하고, move_type 은 항상 전입으로 채우세요. 고객이 정보를 일부만 말하거나 나눠 말하면 이미 받은 부분은 그대로 두고 빠진 부분만 이어서 물어보세요. 고객이 값을 말하기 전에는 수집 함수를 부르지 마세요."
              }
            ],
            "functions": [
              {
                "name": "collect_move_info",
                "description": "전입 신청 정보(성함·휴대폰 번호·새 주소·이사 희망일)를 모두 받으면 수집",
                "properties": {
                  "move_type": {
                    "type": "string",
                    "description": "이사 유형. 항상 전입",
                    "enum": [
                      "전입"
                    ]
                  },
                  "customer_name": {
                    "type": "string",
                    "description": "신청인 이름"
                  },
                  "phone": {
                    "type": "string",
                    "description": "신청인 휴대폰 번호"
                  },
                  "address": {
                    "type": "string",
                    "description": "도시가스를 새로 사용할 주소"
                  },
                  "move_date": {
                    "type": "string",
                    "description": "이사 희망일 YYYY-MM-DD"
                  }
                },
                "required": [
                  "move_type",
                  "customer_name",
                  "phone",
                  "address",
                  "move_date"
                ],
                "next_node_id": "move_submit"
              }
            ]
          }
        },
        {
          "id": "move_submit",
          "type": "node",
          "data": {
            "task_messages": [
              {
                "role": "system",
                "content": "수집된 정보로 연결된 API를 호출하세요."
              }
            ],
            "functions": [
              {
                "name": "submit_move_in",
                "description": "수집 완료된 파라미터로 연결 Tool 실행",
                "properties": {},
                "required": [],
                "call_tool": true,
                "tool_id": 2,
                "error_text": "죄송합니다, 전입 신청 접수 중 문제가 발생했습니다. 입력하신 정보를 다시 한번 확인해 주시겠어요?",
                "next_node_id": "end"
              }
            ],
            "pre_actions": [
              {
                "type": "tts_say",
                "text": "전입 신청을 접수하겠습니다."
              }
            ]
          }
        },
        {
          "id": "reading_no",
          "type": "node",
          "data": {
            "task_messages": [
              {
                "role": "system",
                "content": "키패드 입력 안내 멘트는 자동으로 재생되니 같은 안내를 다시 말하지 마세요. 고객이 키패드로 누르면 자동으로 수집됩니다. 고객이 번호를 말로 불러주면 숫자만 모아 수집 함수를 호출하세요. 고객이 정보를 일부만 말하거나 나눠 말하면 이미 받은 부분은 그대로 두고 빠진 부분만 이어서 물어보세요. 고객이 값을 말하기 전에는 수집 함수를 부르지 마세요."
              }
            ],
            "functions": [
              {
                "name": "collect_customer_no",
                "description": "고객이 고객번호를 입력하거나 말하면 수집",
                "properties": {
                  "customer_no": {
                    "type": "string",
                    "description": "도시가스 고객번호 10자리"
                  }
                },
                "required": [
                  "customer_no"
                ],
                "next_node_id": "reading_value"
              }
            ],
            "dtmf": {
              "function": "collect_customer_no",
              "param": "customer_no",
              "prompt": "고지서에 적힌 고객번호 열 자리를 누르신 후 우물 정 자를 눌러 주세요.",
              "min_digits": 10,
              "max_digits": 10,
              "terminator": "#",
              "timeout_sec": 6,
              "max_retries": 2,
              "readback": "입력하신 고객번호 {value} 맞으신가요?"
            }
          }
        },
        {
          "id": "reading_value",
          "type": "node",
          "data": {
            "task_messages": [
              {
                "role": "system",
                "content": "키패드 입력 안내 멘트는 자동으로 재생되니 같은 안내를 다시 말하지 마세요. 고객이 키패드로 누르면 자동으로 수집됩니다. 고객이 번호를 말로 불러주면 숫자만 모아 수집 함수를 호출하세요. 고객이 정보를 일부만 말하거나 나눠 말하면 이미 받은 부분은 그대로 두고 빠진 부분만 이어서 물어보세요. 고객이 값을 말하기 전에는 수집 함수를 부르지 마세요."
              }
            ],
            "functions": [
              {
                "name": "collect_reading_value",
                "description": "고객이 계량기 지침을 입력하거나 말하면 수집",
                "properties": {
                  "reading_value": {
                    "type": "integer",
                    "description": "계량기에 표시된 지침(누적 수치)"
                  }
                },
                "required": [
                  "reading_value"
                ],
                "next_node_id": "reading_submit"
              }
            ],
            "dtmf": {
              "function": "collect_reading_value",
              "param": "reading_value",
              "prompt": "계량기에 표시된 숫자를 누르신 후 우물 정 자를 눌러 주세요.",
              "min_digits": 1,
              "max_digits": 8,
              "terminator": "#",
              "timeout_sec": 8,
              "max_retries": 2,
              "readback": "입력하신 지침 {value} 맞으신가요?"
            }
          }
        },
        {
          "id": "reading_submit",
          "type": "node",
          "data": {
            "task_messages": [
              {
                "role": "system",
                "content": "수집된 정보로 연결된 API를 호출하세요."
              }
            ],
            "functions": [
              {
                "name": "submit_reading",
                "description": "수집 완료된 파라미터로 연결 Tool 실행",
                "properties": {},
                "required": [],
                "call_tool": true,
                "tool_id": 3,
                "error_text": "죄송합니다, 검침 등록 중 문제가 발생했습니다. 고객번호와 지침을 다시 한번 확인해 주시겠어요?",
                "next_node_id": "end"
              }
            ],
            "pre_actions": [
              {
                "type": "tts_say",
                "text": "검침 값을 등록하겠습니다."
              }
            ]
          }
        },
        {
          "id": "agent",
          "type": "node",
          "data": {
            "task_messages": [
              {
                "role": "system",
                "content": "상담원 연결을 처리하는 중입니다. 연결이 어렵다는 안내가 나간 경우에만 고객에게 다른 도움이 필요한지 물어보고, 고객이 마무리를 원하면 finish_agent 를 호출하세요."
              }
            ],
            "functions": [
              {
                "name": "finish_agent",
                "description": "상담원 연결 안내가 끝나 마무리하는 경우",
                "properties": {},
                "required": [],
                "next_node_id": "end"
              }
            ],
            "pre_actions": [
              {
                "type": "tts_say",
                "text": "상담원에게 연결해드리겠습니다. 잠시만 기다려주세요."
              },
              {
                "type": "hold_music"
              },
              {
                "type": "transfer_call",
                "wait_sec": 5
              }
            ],
            "barge_in": false,
            "respond_immediately": false
          }
        },
        {
          "id": "end",
          "type": "end",
          "data": {
            "task_messages": [
              {
                "role": "system",
                "content": "방금 실행한 도구의 결과([도구 실행 결과])에 고객이 요청한 값이 있으면 그 값을 먼저 정확히 안내하세요. 결과에 없는 값은 지어내지 말고, 숫자·날짜·금액은 이름이 _ko 로 끝나는 값을 그대로 읽으세요. 고객이 묻지 않은 내부 식별자(고객번호·계량기번호·청구번호 등)는 읽지 마세요. 그 다음 \"도시가스 고객센터 안내를 마쳤습니다.\"라고 마무리하고 다른 문의가 있는지 물어보세요."
              }
            ]
          }
        }
      ]
    },
    "default_ref": "tool_1",
    "completion_message": "도시가스 고객센터 안내를 마쳤습니다.",
    "fallback_message": "고객센터 안내를 취소했습니다."
  },
  "tools": [
    {
      "ref": "tool_1",
      "function_name": "mock_get_gas_bill",
      "name": "[도시가스] 요금 조회",
      "tool_type": "api_request",
      "endpoint_url": "https://api-mock.telloai.io/gas/bills/summary",
      "http_method": "GET",
      "auth_type": "none",
      "request_schema": {
        "type": "object",
        "required": [
          "customer_name",
          "phone"
        ],
        "properties": {
          "customer_name": {
            "type": "string",
            "description": "고객 이름"
          },
          "phone": {
            "type": "string",
            "description": "고객 휴대폰 번호. 숫자만"
          }
        }
      },
      "description": "고객 이름과 휴대폰 번호로 이번 달 도시가스 청구 금액·사용량·납기일·미납 내역을 조회한다.",
      "timeout_sec": 15,
      "config": {
        "url": "https://api-mock.telloai.io/gas/bills/summary",
        "body": {
          "type": "object",
          "required": [
            "customer_name",
            "phone"
          ],
          "properties": {
            "customer_name": {
              "type": "string",
              "description": "고객 이름"
            },
            "phone": {
              "type": "string",
              "description": "고객 휴대폰 번호. 숫자만"
            }
          }
        },
        "method": "GET",
        "timeoutSec": 15,
        "variableExtraction": {
          "schema": {
            "type": "object",
            "properties": {
              "data": {
                "type": "object",
                "properties": {
                  "found": {
                    "type": "boolean",
                    "description": "고객을 찾았는지"
                  },
                  "history": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "status": {
                          "type": "string",
                          "description": ""
                        },
                        "due_date": {
                          "type": "string",
                          "description": ""
                        },
                        "usage_m3": {
                          "type": "integer",
                          "description": ""
                        },
                        "bill_month": {
                          "type": "string",
                          "description": ""
                        },
                        "total_amount": {
                          "type": "integer",
                          "description": ""
                        }
                      }
                    },
                    "description": "최근 청구 이력"
                  },
                  "customer": {
                    "type": "object",
                    "properties": {
                      "phone": {
                        "type": "string",
                        "description": ""
                      },
                      "address": {
                        "type": "string",
                        "description": ""
                      },
                      "customer_no": {
                        "type": "string",
                        "description": "고객번호"
                      },
                      "contract_type": {
                        "type": "string",
                        "description": "계약종별"
                      },
                      "customer_name": {
                        "type": "string",
                        "description": "고객 이름"
                      },
                      "discount_type": {
                        "type": "string",
                        "description": "요금경감 유형"
                      },
                      "supply_status": {
                        "type": "string",
                        "description": "공급상태"
                      },
                      "payment_method": {
                        "type": "string",
                        "description": "납부방법"
                      }
                    }
                  },
                  "latest_bill": {
                    "type": "object",
                    "properties": {
                      "status": {
                        "type": "string",
                        "description": "청구상태"
                      },
                      "bill_no": {
                        "type": "string",
                        "description": "청구번호"
                      },
                      "due_date": {
                        "type": "string",
                        "description": "납기일 YYYY-MM-DD"
                      },
                      "usage_m3": {
                        "type": "integer",
                        "description": "사용량(㎥)"
                      },
                      "bill_month": {
                        "type": "string",
                        "description": "청구월 YYYY-MM"
                      },
                      "paid_amount": {
                        "type": "integer",
                        "description": "납부액(원)"
                      },
                      "total_amount": {
                        "type": "integer",
                        "description": "청구금액(원)"
                      }
                    },
                    "description": "이번 달 청구"
                  },
                  "unpaid_count": {
                    "type": "integer",
                    "description": "미납 건수"
                  },
                  "unpaid_amount": {
                    "type": "integer",
                    "description": "미납 합계(원)"
                  }
                }
              },
              "error": {
                "type": "object",
                "properties": {
                  "code": {
                    "type": "string",
                    "description": ""
                  },
                  "hint": {
                    "type": "string",
                    "description": ""
                  }
                },
                "description": "실패 시에만. code·hint"
              },
              "message": {
                "type": "string",
                "description": "사람이 읽는 결과 한 문장"
              },
              "status_code": {
                "type": "integer",
                "description": "HTTP 상태 코드(200/201 성공)"
              }
            }
          },
          "aliases": [
            {
              "key": "고객번호",
              "value": "$.data.customer.customer_no"
            },
            {
              "key": "청구월",
              "value": "$.data.latest_bill.bill_month"
            },
            {
              "key": "청구금액",
              "value": "$.data.latest_bill.total_amount"
            },
            {
              "key": "사용량",
              "value": "$.data.latest_bill.usage_m3"
            },
            {
              "key": "납기일",
              "value": "$.data.latest_bill.due_date"
            },
            {
              "key": "미납건수",
              "value": "$.data.unpaid_count"
            },
            {
              "key": "미납금액",
              "value": "$.data.unpaid_amount"
            },
            {
              "key": "결과메시지",
              "value": "$.message"
            }
          ]
        }
      }
    },
    {
      "ref": "tool_2",
      "function_name": "mock_create_gas_move_in",
      "name": "[도시가스] 전입 신청",
      "tool_type": "api_request",
      "endpoint_url": "https://api-mock.telloai.io/gas/moves",
      "http_method": "POST",
      "auth_type": "none",
      "request_schema": {
        "type": "object",
        "required": [
          "move_type",
          "customer_name",
          "phone",
          "address",
          "move_date"
        ],
        "properties": {
          "move_type": {
            "type": "string",
            "description": "이사 유형. 전입 신청이므로 항상 전입",
            "enum": [
              "전입"
            ]
          },
          "customer_name": {
            "type": "string",
            "description": "신청인 이름"
          },
          "phone": {
            "type": "string",
            "description": "신청인 휴대폰 번호"
          },
          "address": {
            "type": "string",
            "description": "도시가스를 새로 사용할 주소"
          },
          "move_date": {
            "type": "string",
            "description": "이사 희망일 YYYY-MM-DD"
          }
        }
      },
      "description": "새 주소에서 도시가스 사용을 시작하는 전입 신청을 접수한다.",
      "timeout_sec": 15,
      "config": {
        "url": "https://api-mock.telloai.io/gas/moves",
        "body": {
          "type": "object",
          "required": [
            "move_type",
            "customer_name",
            "phone",
            "address",
            "move_date"
          ],
          "properties": {
            "move_type": {
              "type": "string",
              "description": "이사 유형. 전입 신청이므로 항상 전입",
              "enum": [
                "전입"
              ]
            },
            "customer_name": {
              "type": "string",
              "description": "신청인 이름"
            },
            "phone": {
              "type": "string",
              "description": "신청인 휴대폰 번호"
            },
            "address": {
              "type": "string",
              "description": "도시가스를 새로 사용할 주소"
            },
            "move_date": {
              "type": "string",
              "description": "이사 희망일 YYYY-MM-DD"
            }
          }
        },
        "method": "POST",
        "timeoutSec": 15,
        "variableExtraction": {
          "schema": {
            "type": "object",
            "properties": {
              "data": {
                "type": "object",
                "properties": {
                  "result": {
                    "type": "object",
                    "properties": {
                      "phone": {
                        "type": "string",
                        "description": ""
                      },
                      "status": {
                        "type": "string",
                        "description": "처리상태(접수완료 등)"
                      },
                      "address": {
                        "type": "string",
                        "description": "전입 주소"
                      },
                      "move_date": {
                        "type": "string",
                        "description": "이사 희망일 YYYY-MM-DD"
                      },
                      "move_type": {
                        "type": "string",
                        "description": "전입/전출"
                      },
                      "created_at": {
                        "type": "string",
                        "description": ""
                      },
                      "request_no": {
                        "type": "string",
                        "description": "접수번호(서버 발급, MOV-YYYYMMDD-NNNN)"
                      },
                      "visit_slot": {
                        "type": "string",
                        "description": "방문 시간대(배정 시)"
                      },
                      "customer_name": {
                        "type": "string",
                        "description": ""
                      }
                    },
                    "description": "접수된 이사신청"
                  }
                }
              },
              "error": {
                "type": "object",
                "properties": {
                  "code": {
                    "type": "string",
                    "description": ""
                  },
                  "hint": {
                    "type": "string",
                    "description": ""
                  }
                },
                "description": "실패 시에만. code·hint"
              },
              "message": {
                "type": "string",
                "description": "사람이 읽는 결과 한 문장"
              },
              "status_code": {
                "type": "integer",
                "description": "HTTP 상태 코드(200/201 성공)"
              }
            }
          },
          "aliases": [
            {
              "key": "신청번호",
              "value": "$.data.result.request_no"
            },
            {
              "key": "이사일",
              "value": "$.data.result.move_date"
            },
            {
              "key": "상태",
              "value": "$.data.result.status"
            },
            {
              "key": "주소",
              "value": "$.data.result.address"
            },
            {
              "key": "결과메시지",
              "value": "$.message"
            }
          ]
        }
      }
    },
    {
      "ref": "tool_3",
      "function_name": "mock_create_gas_reading",
      "name": "[도시가스] 자가검침 등록",
      "tool_type": "api_request",
      "endpoint_url": "https://api-mock.telloai.io/gas/readings",
      "http_method": "POST",
      "auth_type": "none",
      "request_schema": {
        "type": "object",
        "required": [
          "customer_no",
          "reading_value"
        ],
        "properties": {
          "customer_no": {
            "type": "string",
            "description": "도시가스 고객번호 10자리"
          },
          "reading_value": {
            "type": "integer",
            "description": "계량기에 표시된 지침(누적 수치)"
          }
        }
      },
      "description": "고객번호와 계량기 지침을 등록하고 직전 지침과 비교한 사용량·예상 청구 금액을 돌려준다.",
      "timeout_sec": 15,
      "config": {
        "url": "https://api-mock.telloai.io/gas/readings",
        "body": {
          "type": "object",
          "required": [
            "customer_no",
            "reading_value"
          ],
          "properties": {
            "customer_no": {
              "type": "string",
              "description": "도시가스 고객번호 10자리"
            },
            "reading_value": {
              "type": "integer",
              "description": "계량기에 표시된 지침(누적 수치)"
            }
          }
        },
        "method": "POST",
        "timeoutSec": 15,
        "variableExtraction": {
          "schema": {
            "type": "object",
            "properties": {
              "data": {
                "type": "object",
                "properties": {
                  "result": {
                    "type": "object",
                    "properties": {
                      "source": {
                        "type": "string"
                      },
                      "meter_no": {
                        "type": "string"
                      },
                      "usage_m3": {
                        "type": "integer"
                      },
                      "created_at": {
                        "type": "string"
                      },
                      "reading_no": {
                        "type": "string"
                      },
                      "customer_no": {
                        "type": "string"
                      },
                      "prev_reading": {
                        "type": "integer"
                      },
                      "reading_date": {
                        "type": "string"
                      },
                      "reading_value": {
                        "type": "integer"
                      }
                    }
                  },
                  "estimated_bill": {
                    "type": "object",
                    "properties": {
                      "경감금액": {
                        "type": "integer"
                      },
                      "기본요금": {
                        "type": "integer"
                      },
                      "사용량_m3": {
                        "type": "integer"
                      },
                      "사용요금": {
                        "type": "integer"
                      },
                      "부가가치세": {
                        "type": "integer"
                      },
                      "예상청구금액": {
                        "type": "integer"
                      }
                    }
                  }
                },
                "description": "엔드포인트별 응답 데이터"
              },
              "message": {
                "oneOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                ],
                "description": "한국어 한 줄 요약(또는 검증 오류 다건). 음성 에이전트가 그대로 읽어줄 수 있다."
              },
              "status_code": {
                "type": "integer",
                "description": "HTTP 상태 코드와 동일"
              }
            }
          },
          "aliases": [
            {
              "key": "할인금액",
              "value": "{{ $.data.estimated_bill.경감금액 }}"
            },
            {
              "key": "기본요금",
              "value": "{{ $.data.estimated_bill.기본요금 }}"
            },
            {
              "key": "부가세",
              "value": "{{ $.data.estimated_bill.부가가치세 }}"
            },
            {
              "key": "예상_사용량",
              "value": "{{ $.data.estimated_bill.사용량_m3 }}"
            },
            {
              "key": "사용요금",
              "value": "{{ $.data.estimated_bill.사용요금 }}"
            },
            {
              "key": "예상청구금액",
              "value": "{{ $.data.estimated_bill.예상청구금액 }}"
            },
            {
              "key": "검침번호",
              "value": "{{ $.data.result.reading_no }}"
            },
            {
              "key": "고객번호",
              "value": "{{ $.data.result.customer_no }}"
            },
            {
              "key": "계량기번호",
              "value": "{{ $.data.result.meter_no }}"
            },
            {
              "key": "지침값",
              "value": "{{ $.data.result.reading_value }}"
            },
            {
              "key": "전월지침",
              "value": "{{ $.data.result.prev_reading }}"
            },
            {
              "key": "사용량",
              "value": "{{ $.data.result.usage_m3 }}"
            },
            {
              "key": "검침일",
              "value": "{{ $.data.result.reading_date }}"
            },
            {
              "key": "출처",
              "value": "{{ $.data.result.source }}"
            },
            {
              "key": "생성일시",
              "value": "{{ $.data.result.created_at }}"
            }
          ]
        }
      }
    }
  ],
  "tool_refs": {
    "1": "tool_1",
    "2": "tool_2",
    "3": "tool_3"
  }
}
