{
  "agent_id": "",
  "channel": "voice",
  "agent_name": "Voice Booking Agent — Starter",
  "response_engine": {
    "type": "conversation-flow",
    "version": 0,
    "conversation_flow_id": "conversation_flow_voice_booking_starter"
  },
  "language": "en-US",
  "data_storage_setting": "basic_attributes_only",
  "opt_in_signed_url": false,
  "version": 0,
  "assigned_tags": [],
  "is_published": false,
  "post_call_analysis_model": "gpt-4.1",
  "pii_config": {
    "mode": "post_call",
    "categories": []
  },
  "handbook_config": {
    "default_personality": true,
    "ai_disclosure": true
  },
  "voice_id": "retell-Cimo",
  "max_call_duration_ms": 480000,
  "interruption_sensitivity": 0.8,
  "allow_user_dtmf": true,
  "user_dtmf_options": {},
  "conversationFlow": {
    "conversation_flow_id": "conversation_flow_voice_booking_starter",
    "version": 0,
    "nodes": [
      {
        "id": "voice-welcome",
        "type": "conversation",
        "name": "AI Disclosure and Intent",
        "start_speaker": "agent",
        "instruction": {
          "type": "static_text",
          "text": "Hi, you’ve reached the automated booking assistant for [BUSINESS NAME]. I can answer approved service questions or help you book a consultation. How may I help?"
        },
        "edges": [
          {
            "id": "edge-welcome-book",
            "transition_condition": {
              "type": "prompt",
              "prompt": "The caller wants to check availability or make a new booking."
            },
            "destination_node_id": "voice-booking"
          },
          {
            "id": "edge-welcome-faq",
            "transition_condition": {
              "type": "prompt",
              "prompt": "The caller asks a general question about the business or service."
            },
            "destination_node_id": "voice-faq"
          },
          {
            "id": "edge-welcome-end",
            "transition_condition": {
              "type": "prompt",
              "prompt": "The caller is finished, declines help, or asks to end the call."
            },
            "destination_node_id": "voice-end"
          }
        ],
        "display_position": {
          "x": 280,
          "y": 260
        }
      },
      {
        "id": "voice-faq",
        "type": "conversation",
        "name": "Approved FAQ",
        "instruction": {
          "type": "prompt",
          "text": "Answer only with facts in the approved business knowledge. Never invent price, policy, availability, guarantees, or confidential information. If the answer is not approved, say you do not have that information and offer owner follow-up. Keep answers brief and ask whether the caller would like to book."
        },
        "edges": [
          {
            "id": "edge-faq-book",
            "transition_condition": {
              "type": "prompt",
              "prompt": "The caller wants to book or check availability."
            },
            "destination_node_id": "voice-booking"
          },
          {
            "id": "edge-faq-end",
            "transition_condition": {
              "type": "prompt",
              "prompt": "The question is resolved or the caller is finished."
            },
            "destination_node_id": "voice-end"
          }
        ],
        "display_position": {
          "x": 700,
          "y": 80
        }
      },
      {
        "id": "voice-booking",
        "type": "subagent",
        "name": "Live Availability and Booking",
        "instruction": {
          "type": "prompt",
          "text": "Handle one new consultation booking. Gather the caller's name, email address, timezone, preferred date or range, and preferred time. Ask one question at a time. Spell the email back. Once a useful time range is known, call check_availability_cal and offer no more than three returned slots in the caller's timezone. Never invent a slot. After the caller selects a slot, repeat the date, time, timezone, name, and email and ask for explicit confirmation. Only after an unambiguous yes should you call book_appointment_cal. Never claim success unless the booking tool returns success. If either calendar tool fails, retry once; after a second failure, apologize, say no booking was completed, and offer owner follow-up. Do not collect payment or sensitive data."
        },
        "tools": [
          {
            "name": "check_availability_cal",
            "description": "Check authoritative availability for the configured Cal.com event type after the caller supplies a useful date or time range.",
            "tool_id": "tool-voice-check-availability",
            "event_type_id": 0,
            "cal_api_key": "SET_CAL_API_KEY",
            "type": "check_availability_cal"
          },
          {
            "name": "book_appointment_cal",
            "description": "Book the explicitly confirmed slot using the caller's verified name, email, and timezone. Never invoke before confirmation.",
            "tool_id": "tool-voice-book-appointment",
            "event_type_id": 0,
            "cal_api_key": "SET_CAL_API_KEY",
            "type": "book_appointment_cal"
          }
        ],
        "edges": [
          {
            "id": "edge-booking-complete",
            "transition_condition": {
              "type": "prompt",
              "prompt": "The booking tool returned success and the confirmed appointment details have been stated."
            },
            "destination_node_id": "voice-end"
          },
          {
            "id": "edge-booking-followup",
            "transition_condition": {
              "type": "prompt",
              "prompt": "A calendar tool failed twice, the caller needs unsupported help, or owner follow-up is required."
            },
            "destination_node_id": "voice-followup"
          },
          {
            "id": "edge-booking-cancel",
            "transition_condition": {
              "type": "prompt",
              "prompt": "The caller no longer wants to book."
            },
            "destination_node_id": "voice-end"
          }
        ],
        "display_position": {
          "x": 700,
          "y": 340
        }
      },
      {
        "id": "voice-followup",
        "type": "conversation",
        "name": "Honest Failure and Follow-up",
        "instruction": {
          "type": "prompt",
          "text": "State clearly that no booking was completed. Collect only a concise message and the caller's preferred contact method if they want owner follow-up. Do not promise a response time unless it is in approved business knowledge."
        },
        "edges": [
          {
            "id": "edge-followup-end",
            "transition_condition": {
              "type": "prompt",
              "prompt": "The follow-up request is captured or the caller declines."
            },
            "destination_node_id": "voice-end"
          }
        ],
        "display_position": {
          "x": 1120,
          "y": 340
        }
      },
      {
        "id": "voice-end",
        "type": "end",
        "name": "Polite End",
        "instruction": {
          "type": "prompt",
          "text": "Briefly confirm the truthful outcome, thank the caller, and end the call. Do not imply a booking exists unless the booking tool returned success."
        },
        "display_position": {
          "x": 1500,
          "y": 220
        }
      }
    ],
    "start_node_id": "voice-welcome",
    "start_speaker": "agent",
    "tools": [],
    "model_choice": {
      "type": "cascading",
      "model": "gpt-4.1-mini",
      "high_priority": false
    },
    "model_temperature": 0.2,
    "tool_call_strict_mode": true,
    "knowledge_base_ids": [],
    "kb_config": {
      "top_k": 3,
      "filter_score": 0.6
    },
    "global_prompt": "You are a calm, concise AI booking assistant. Never invent business facts, calendar availability, or booking success. Ask one question at a time and keep spoken turns short.",
    "begin_tag_display_position": {
      "x": 100,
      "y": 220
    },
    "notes": [
      {
        "id": "note-before-test",
        "content": "Before testing: run prepare-retell-import.mjs with your own CAL_API_KEY and CAL_EVENT_TYPE_ID, import the generated ready file, replace [BUSINESS NAME], and add approved business knowledge.",
        "display_position": {
          "x": 270,
          "y": 620
        },
        "size": {
          "width": 460,
          "height": 170
        }
      }
    ],
    "is_published": false,
    "flex_mode": false,
    "is_transfer_cf": false
  }
}
